返回列表 发帖

[站长原创] Linux设备驱动程序开发 - Linux MTD 子系统分析

[站长原创] Linux设备驱动程序开发 - Linux MTD 子系统分析

嵌入式开发联盟

www.mcuos.com

Osboy站长原创

QQ:82475491

Mcuos.com@gmail.com




Linux MTD子系统研究        1
1.        MTD基础        1
2.        从分析makefile开始        2
3.        认识几个重要的数据结构        3
4.        Mtdblock.c和mtd_blkdevs.c        10
5.        以MTD Ram为例分析NOR驱动        19
6.        NAND驱动子系统分析        28



1.MTD对象(文件mtkcore.c)

有一个全局变量mtd_table[MAX_MTD_DEVICES]结构,有mtd_table_mutex保护,通过函数add_mtd_device/del_mtd_device操作。用来保存系统中所有的mtd_info。注册mtd一个主要功能是添加notify处理。register_mtd_user/unregister_mtd_user用来操作notify函数。get_mtd_device/put_mtd_device用来操作mtd_info机构,mtd_info的引用计数相应增/1

2. MTD分区(文件mtdpart.c)
有一个全局链表头mtd_partitions,通过add_mtd_partitons/del_mtd_partitions来添加/删除MTD分区。注册是根据分区信息和MTD对象信息(mtd_info类型的master结构)填充全局变量并将结构连接到全局变量mtd_partitions中。分区信息例如下所示:
{ .name = "bootloader env",
.size = 0x40000,
.offset = 0x740000,
.mask_flags = MTD_WRITEABLE, /* force read-only */ }等;然后根据partitions的信息填充处理函数,这些处理函数是公用,不局限于特定MTD对象。例如part_readpart_write等;这些函数最终调用mtd_info结构中对应函数,并统一返回结果处理信息。注每个分区都有mtd_info结构。mtd_info结构中有一个numeraseregions用来指示一个mtd对象上的不同功能区间,注册的时候利用这些信息来计算参擦除块的大小。如果分区有自己的mtd_info,那么注册到mtd_table中。

3. MTD块设备(文件mtd_blkdevs.c,mtdblock.c)

内核利用通用块层和块设备交互,通过发送(transfer)请求数据开始io操作,每个io操作有一个bio结构来传递,bio中包含底层设备操作所需要的细节信息。通用块层下面是io调度器,调度器负责聚合请求的数据。
文件mtd_blkdevs.c定义了mtd块设备的上层接口,同样块层通过该文件定义的接口和mtd设备交互。主要函数有register_mtd_blktrans,blktrans_open/release/getgeo/ioctlmtd_blktrans_thread/request。其中request分读写请求。mtd_blkdevs将上层传来的请求翻译成具体的底层设备操作,交给mtdblock.c处理。


FTLNFTL

FTLNFTL做为块设备,在MTD系统中,和前面所述的mtdblock.c处在同一层。下面分别是注册块设备是使用的结构:

static struct mtd_blktrans_ops mtdblock_tr = {
    .name         ="mtdblock",                       .major       = 31,
    .part_bits    =0,                                                .blksize       = 512,
    .open          =mtdblock_open,                          .flush        = mtdblock_flush,
    .release      =mtdblock_release,                     .readsect   = mtdblock_readsect,
    .writesect    =mtdblock_writesect,                   .add_mtd   = mtdblock_add_mtd,
    .remove_dev    =mtdblock_remove_dev,         .owner    = THIS_MODULE,
};


static struct mtd_blktrans_ops nftl_tr = {
    .name         ="nftl",                                         .major       = NFTL_MAJOR,
    .part_bits    =NFTL_PARTN_BITS,                 .blksize     = 512,
    .getgeo       =nftl_getgeo,                               .readsect   = nftl_readblock,
    .writesect    =nftl_writeblock,                           .add_mtd   = nftl_add_mtd,
    .remove_dev    =nftl_remove_dev,                 .owner       = THIS_MODULE,
}; 2.
从分析makefile开始



本帖隐藏的内容需要回复才可以浏览


分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

看看吧,最近很重要的事刚忙完。继续努力!

TOP

好好看看啊,谢谢

TOP

很好的内容,谢谢

TOP

xuexi yixia

TOP

了解一下,谢谢

TOP

谢谢师傅分享

TOP

好好看看啊,谢谢

TOP

学习学习!!!

TOP

学习学习了…………

TOP

忙了一晚上,终于可以来看看文章里

TOP

感谢分享

TOP

感谢分享

TOP

看下,学习新东西

TOP

good thanks

TOP

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服