19.4 NorFlash驱动实例:S3C6410 外围的 NOR Flash 驱动
针对 S3C2410、S3C6410 等平台,外接 NOR Flash 的情况下,由于该 NOR Flash 直接映射在 CPU 的内存空间上,可以直接使用通用的 drivers/mtd/maps/physmap.c 驱动,在内核配置时应该使能 MTD_PHYSMAP。为了使用 NOR Flash,只需在 BSP 的板文件中添加相应的信息,如 NOR Flash 所在的物理地址和大小、分区信息、总线宽度等,这些信息以platform 资源和数据的形式呈现,如代码清单 19.13。
代码清单 19.13 S3C6410 外围 NOR Flash 的 platform 数据
static struct resource ldd6410_nor_resource = {
.start = LDD6410_NOR_BASE,
.end = LDD6410_NOR_BASE + 0x200000 - 1,
.flags = IORESOURCE_MEM,
};
static struct mtd_partition ldd6410_mtd_partitions[] = { /* struct mtd_partition 数组*/
{
.name = "System",
.size = 0x40000,
.offset = 0,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
{
.name = "Data",.size = 0x1C0000,
.offset = MTDPART_OFS_APPEND,
},
};
static struct physmap_flash_data ldd6410_flash_data = {
.width = 2,
.parts = ldd6410_mtd_partitions,
.nr_parts = ARRAY_SIZE(ldd6410_mtd_partitions),
};
static struct platform_device ldd6410_device_nor = {
.name = "physmap-flash",
.id = 0,
.dev = {
.platform_data = &ldd6410_flash_data,
},
.num_resources = 1,
.resource = &ldd6410_nor_resource,
};
分析:
上述代码指定 platform 设备的名称为“physmap-flash”,这和对应 platform 驱动
drivers/mtd/maps/physmap.c 中定义的名称是一致的。