123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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);
|