1 分析如何写norflash驱动
1.1先来回忆下之前的nandflsh驱动:
nandflsh驱动会放在内核的mtd设备中,而mtd设备知道如何通过命令/地址/数据来操作nandflash,所以我们之前的nandflash驱动只实现了硬件相关的操作(构造mtd_info,nand_chip结构体、启动nand控制器等)。
同样地,norflash驱动也是放在内核的mtd设备中,mtd设备也知道对nor如何来读写擦除,只是不知道norflash的位宽(数据线个数),基地址等,所以我们的norflash驱动同样要实现硬件相关的操作,供给mtd设备调用。
1.2参考内核自带的nor驱动:drivers/mtd/maps/physmap.c
进入它的init函数:
发现注册了两个platform平台设备驱动,进入physmap_flash结构体中:
发现3个未定义的变量:
CONFIG_MTD_PHYSMAP_BANKWIDTH: nandflash的字节位宽;
CONFIG_MTD_PHYSMAP_START:nandflash的物理基地址;
CONFIG_MTD_PHYSMAP_LEN: nandflash的容量长度;
这3个变量是通过linux的menuconfig菜单配置出来的,若自己填入值,就不需要用menuconfig菜单配置了。
1.3接下来我们就来配置内核,然后挂载这个内核自带的norflash驱动实验一番
1.4首先make menuconfig,配置上面3个变量,然后设为模块
-> Device Drivers
-> Memory Technology Device (MTD) support
-> Mapping drivers for chip access //进入映射驱动
CFI Flash device in physical memory map //将支持cfi的norflash设置为模块
(0x0) Physical start address of flash mapping // 设置物理基地址
(0x1000000) Physical length of flash mapping // 设置容量长度,必须大于等于自身nor的2MB
(2) Bank width in octets (NEW) // 设置字节位宽,因为nor为16位,所以等于2
1.5make modules 编译模块
如下图所示,可以看到physmap.c编译成.ko模块了:
1.6然后放在nfs目录下,启动开发板
如下图所示,insmod后打印了一串信息:
如下图所示,可以看到创建了2个mtd0字符设备,一个mtd0块设备:
2.接下来我们便分析physmap.c,如何写出norflash驱动的
其中physmap.c的probe函数如下:
struct physmap_flash_info {
struct mtd_info *mtd; //实现对flash的读写擦除等操作
struct map_info map; //存放硬件相关的结构体
struct resource *res;
#ifdef CONFIG_MTD_PARTITIONS
int nr_parts;
struct mtd_partition *parts;
#endif
};
static const char *rom_probe_types[] = {
"cfi_probe", "jedec_probe", "map_rom", NULL }; //芯片名称
... ...
static int physmap_flash_probe(struct platform_device *dev)
{
const char **probe_type;
... ...