unsik Kim | 3fbed4c | 2009-04-02 12:50:58 -0700 | [diff] [blame] | 1 | This document describes m[g]flash support in linux. |
| 2 | |
| 3 | Contents |
| 4 | 1. Overview |
| 5 | 2. Reserved area configuration |
| 6 | 3. Example of mflash platform driver registration |
| 7 | |
| 8 | 1. Overview |
| 9 | |
| 10 | Mflash and gflash are embedded flash drive. The only difference is mflash is |
| 11 | MCP(Multi Chip Package) device. These two device operate exactly same way. |
| 12 | So the rest mflash repersents mflash and gflash altogether. |
| 13 | |
| 14 | Internally, mflash has nand flash and other hardware logics and supports |
| 15 | 2 different operation (ATA, IO) modes. ATA mode doesn't need any new |
| 16 | driver and currently works well under standard IDE subsystem. Actually it's |
| 17 | one chip SSD. IO mode is ATA-like custom mode for the host that doesn't have |
| 18 | IDE interface. |
| 19 | |
| 20 | Followings are brief descriptions about IO mode. |
| 21 | A. IO mode based on ATA protocol and uses some custom command. (read confirm, |
| 22 | write confirm) |
| 23 | B. IO mode uses SRAM bus interface. |
| 24 | C. IO mode supports 4kB boot area, so host can boot from mflash. |
| 25 | |
| 26 | 2. Reserved area configuration |
| 27 | If host boot from mflash, usually needs raw area for boot loader image. All of |
| 28 | the mflash's block device operation will be taken this value as start offset. |
| 29 | Note that boot loader's size of reserved area and kernel configuration value |
| 30 | must be same. |
| 31 | |
| 32 | 3. Example of mflash platform driver registration |
| 33 | Working mflash is very straight forward. Adding platform device stuff to board |
| 34 | configuration file is all. Here is some pseudo example. |
| 35 | |
| 36 | static struct mg_drv_data mflash_drv_data = { |
| 37 | /* If you want to polling driver set to 1 */ |
| 38 | .use_polling = 0, |
| 39 | /* device attribution */ |
| 40 | .dev_attr = MG_BOOT_DEV |
| 41 | }; |
| 42 | |
| 43 | static struct resource mg_mflash_rsc[] = { |
| 44 | /* Base address of mflash */ |
| 45 | [0] = { |
| 46 | .start = 0x08000000, |
| 47 | .end = 0x08000000 + SZ_64K - 1, |
| 48 | .flags = IORESOURCE_MEM |
| 49 | }, |
| 50 | /* mflash interrupt pin */ |
| 51 | [1] = { |
| 52 | .start = IRQ_GPIO(84), |
| 53 | .end = IRQ_GPIO(84), |
| 54 | .flags = IORESOURCE_IRQ |
| 55 | }, |
| 56 | /* mflash reset pin */ |
| 57 | [2] = { |
| 58 | .start = 43, |
| 59 | .end = 43, |
| 60 | .name = MG_RST_PIN, |
| 61 | .flags = IORESOURCE_IO |
| 62 | }, |
| 63 | /* mflash reset-out pin |
| 64 | * If you use mflash as storage device (i.e. other than MG_BOOT_DEV), |
| 65 | * should assign this */ |
| 66 | [3] = { |
| 67 | .start = 51, |
| 68 | .end = 51, |
| 69 | .name = MG_RSTOUT_PIN, |
| 70 | .flags = IORESOURCE_IO |
| 71 | } |
| 72 | }; |
| 73 | |
| 74 | static struct platform_device mflash_dev = { |
| 75 | .name = MG_DEV_NAME, |
| 76 | .id = -1, |
| 77 | .dev = { |
| 78 | .platform_data = &mflash_drv_data, |
| 79 | }, |
| 80 | .num_resources = ARRAY_SIZE(mg_mflash_rsc), |
| 81 | .resource = mg_mflash_rsc |
| 82 | }; |
| 83 | |
| 84 | platform_device_register(&mflash_dev); |