MTD层次、MTD设备驱动接口、Nor Flash/Nand Flash驱动

来源:互联网 发布:矩阵a与b相似,其中a= 编辑:程序博客网 时间:2024/05/16 04:41

Flash设备驱动及接口分为4层:设备节点,MTD设备层、MTD原始设备层(属于内核的子系统)和硬件驱动层

块设备与文件系统的关系:

(1)MTD+MTDblock+fat

(2)MTD+NFTL+fat

(3)SD(flash)+硬件翻译层+fat

(4)MTD+MTDblock+yaffs或jffs2

yaffs:文件系统只针对Nand flash它会占用00b,需要修改U-boot

jffs2:Nand flash和Nor flash均可

 

用于描述MTD原始设备的数据结构是mtd_info,它类似于字符设备的cdev和块设备的gendisk

struct mtd_info

{

    u_char type;//内存技术的类型

    u_int32_t flags;//标志位

    u_int32_t erasesize;//主要的擦除块大小(同一个mtd设备可能有数种不同的eraseize)

    u_int32_t oobblock;//oob导体小大

    u_int32_t ecctype;//ecc类型

    u_int32_t eccsize;//ecc工作的范围

}

注册和注销MTD设备

注册:int add_mtd_device(struct mtd_info* mtd)

注销:int del_mtd_device(struct mtd_info* mtd);

 

mtd_partition结构体

struct mtd_partition

{

    char *name;//标识字符串

    u_int32_t size;//分区大小

    u_int32_t offset;//主MTD空间内的偏移

    u_int32_t mask_flags;//掩码标志

}

 

另外,还需要配置内核使其支持MTD字符设备与块设备及MTD分区

注:在一个mtd_info上,将mtd_info分成几个小的mtd_info,分别对各个小的mtd_info进行注册,即分别逐一注册各个小的mtd_info结构体

 

 

Nor flash驱动

在Linux系统中,实现了针对cfi、jedec等接口的通用NOR驱动,这一层的驱动直接面向mtd_info的成员函数,这使得NOR的芯片级驱动变得十分简单,只需要定义具体的内存映射情况结构体map_info并使用指定接口类型调用do_map_probe()

 

Nor flash驱动结构

MTD --> CFI、JEDEC等NOR Flash通用驱动(mtd_info) --> CFI、JEDEC等NOR Flash底层驱动

 

Map_info结构体

struct map_info

{

    char *name;

    unsigned long size;//大小

    unsigned long phys;//物理地址

    void __iomem *virt;

    void *cached;

    int bankwidth;//总线宽度

}

 

CFI、JEDEC等通用接口驱动实际上已经支持了市场上的90%的flash驱动,因此我们可以通过它来探测是否支持我们要使用的flash,如果支持的话则由这个通用驱动来构建MTD驱动。工作重点:

(1)构建map_info看是否支持Nor flash芯片(一般都能支持90%)

(2)如果不支持则需要修改内核的相应驱动程序,修改方法见实验手册。

如果驱动支持这种芯片,只要完成mtd.info,调用do_map_probe(mtd_info),然后调用add_mtd_device(mtd_info),add_mtd_partitions();

 

以下是一个Nor flash驱动实验:

实验内容:为fs2410平台添加nor flash驱动,并在flash上制作jffs2文件系统

步骤:

(1)断开跳线,选择Nor flash启动方式

 (2)打开MDK环境,将一个可以从nor flash启动的uboot烧写到开发板.

 (3)复位,设置uboot参数(相关的uboot命令要掌握)

 (4)将zImage和根文件系统分别放至/tftp及/source/rootfs中

 (5)启动系统,进入终端

 (6)将s3c2410_nor.c  nor flash驱动程序编译成s3c2410_nor.ko模块文件入到source/rootfs中(编译前要修改一个东东:为JEDEC_TYPE)

 (7)insmod s3c2410_nor.ko

 (8)查看cat /proc/mtd

 (9)如果系统没有加载udev还必须手动创建设备结点:mknod /dev/mtdblock6 b 30 6

 (10)建立挂载目录:mkdir /tmp/udisk

 (11)在mtdblock6上挂载jffs2文件系统:mount -t jffs2 /dev/mtdblock6 /tmp/udisk

 (12)在/tmp/udisk中存储文件,然后复位,重新开启后挂载文件系统,查看文件是否存在,或存在则成功

 

Nor flash的uboot擦写命令

可以查看帮助:help erase

格式:erase 起始地址   结束地址-1

如:  erase 0x0     0x3fff//结束地址为0x4000

原创粉丝点击