| This document describes m[g]flash support in linux. | |
| Contents | |
| 1. Overview | |
| 2. Reserved area configuration | |
| 3. Example of mflash platform driver registration | |
| 1. Overview | |
| Mflash and gflash are embedded flash drive. The only difference is mflash is | |
| MCP(Multi Chip Package) device. These two device operate exactly same way. | |
| So the rest mflash repersents mflash and gflash altogether. | |
| Internally, mflash has nand flash and other hardware logics and supports | |
| 2 different operation (ATA, IO) modes. ATA mode doesn't need any new | |
| driver and currently works well under standard IDE subsystem. Actually it's | |
| one chip SSD. IO mode is ATA-like custom mode for the host that doesn't have | |
| IDE interface. | |
| Followings are brief descriptions about IO mode. | |
| A. IO mode based on ATA protocol and uses some custom command. (read confirm, | |
| write confirm) | |
| B. IO mode uses SRAM bus interface. | |
| C. IO mode supports 4kB boot area, so host can boot from mflash. | |
| 2. Reserved area configuration | |
| If host boot from mflash, usually needs raw area for boot loader image. All of | |
| the mflash's block device operation will be taken this value as start offset. | |
| Note that boot loader's size of reserved area and kernel configuration value | |
| must be same. | |
| 3. Example of mflash platform driver registration | |
| Working mflash is very straight forward. Adding platform device stuff to board | |
| configuration file is all. Here is some pseudo example. | |
| static struct mg_drv_data mflash_drv_data = { | |
| /* If you want to polling driver set to 1 */ | |
| .use_polling = 0, | |
| /* device attribution */ | |
| .dev_attr = MG_BOOT_DEV | |
| }; | |
| static struct resource mg_mflash_rsc[] = { | |
| /* Base address of mflash */ | |
| [0] = { | |
| .start = 0x08000000, | |
| .end = 0x08000000 + SZ_64K - 1, | |
| .flags = IORESOURCE_MEM | |
| }, | |
| /* mflash interrupt pin */ | |
| [1] = { | |
| .start = IRQ_GPIO(84), | |
| .end = IRQ_GPIO(84), | |
| .flags = IORESOURCE_IRQ | |
| }, | |
| /* mflash reset pin */ | |
| [2] = { | |
| .start = 43, | |
| .end = 43, | |
| .name = MG_RST_PIN, | |
| .flags = IORESOURCE_IO | |
| }, | |
| /* mflash reset-out pin | |
| * If you use mflash as storage device (i.e. other than MG_BOOT_DEV), | |
| * should assign this */ | |
| [3] = { | |
| .start = 51, | |
| .end = 51, | |
| .name = MG_RSTOUT_PIN, | |
| .flags = IORESOURCE_IO | |
| } | |
| }; | |
| static struct platform_device mflash_dev = { | |
| .name = MG_DEV_NAME, | |
| .id = -1, | |
| .dev = { | |
| .platform_data = &mflash_drv_data, | |
| }, | |
| .num_resources = ARRAY_SIZE(mg_mflash_rsc), | |
| .resource = mg_mflash_rsc | |
| }; | |
| platform_device_register(&mflash_dev); |