MTD的层次关系主要如下:
文件系统
|
根文件系统
|
设备节点 [mknod创建相应的设备节点 ]
|
MTD设备层 [mtdchar.c, mtdblock.c mtdblock_ro.c, mtd_blkdevs.c]
|
MTD原始设备层 [mtdcore.c, mtdpart.c]
|
Nand/Nor/CFI driver [your_nand_driver.c]
|
Nand/Nor/CFI Hardware [ .... ]
在上面的层西关系当中,其实没有严格意义的区分,就是函数调用关系,分一个层次来,更容易理解代码。
一、nand的驱动
其实就是在准备一个master,完成nand的相关信息的提取完成对结构提struct mtd_info master, struct nand_chip chip的初始化,如OOB,ECC相关的操作函数,nand的读、写、擦除操作。.扫描nand的坏块,写BBT等之类的操作。向bus上注册platform设备和platform驱动,向MTD原始设备层注册nand每一个分区(设备),注册相关资源,如DMA,MEM resource;
二、MTD原始设备层
原始设备层提供了很多MTD core的函数,如nand驱动注册分区用的add_mtd_partition()就是在mtdpart.c里面的定义的,在mtdpart.c的add_mtd_partition函数将根据在nand驱动里面形成的master来注册每一个分区设备到mtdcore中的全局变量struct mtd_info mtd_table[16]中。
三、MTD设备层
在该层主要包行了字符设备和块设备。前者主要用nand的读、写和擦除操作,后者则是用来作为块设备为文件系统mount使用。此层是一个独立的层次,单独的一个字符设备和块设备,可以作为一个参考开发的实例。mtd_blkdevs.c提供给块设注册用的函数register_mtd_blktrans(),这个函数的注册比较复杂,设计块设备层gdisk注册,BIO操作,Request操作,文件系统层。register_mtd_blktrans()在注册时候带一个参数struct mtd_blktrans_ops mtdblock_tr, 在注册玩块设备和request线程之后,会回调mtdblock_tr.add_mtd来注册mtd_blktrans_dev设备(add_mtd_blktrans_dev()次函数注册),-->add_disk(),block/genhd.c -->register_disk(), fs/partition/check.c -->_blkdev_get, fs/block_dev.c ....搞到文件系统里面去。过程很复杂,有时间就去可以研究研究。
四、设备节点
创建设备节点字符设备,块设备
五、根文件系统
当kernel启动时,调用/arch/arm/mach-xxx/arch_xxx.c, MACHINE_START{.fixup}MACHINE_END其中的fixup会将根文件系统挂载
六、文件系统
当内核启动后,通过Mount命令将flash的各个分区挂载到相应的挂载点上;
阅读(643) | 评论(0) | 转发(0) |