nandflash驱动框架
nandflash驱动框架 最上层肯定是应用程 —————————— app: open read write ________________ 文件系统:文件系统是将对文件的读写转换为对块设备的读写 ————————— 块设备驱动 块设备 : 知道怎么优化 —————— nandflash协议层:知道发什么来读写,擦除,识别 —————— 硬件相关的代码 ?:知道怎么发命令,发地址,读写数据 ———————— —————————— 硬件 我们来看看内核的启动信息,从内核的启动信息我们找到那个文件,从那个文件分析 搜索s3c nand driver这句话 我们就从这个文件里面一路分析进去 我们可以从上面的图片看出,它先注册了一个平台驱动,根据总线设备驱动模型,在内核里面有个同名的平台设备 如果有就会调用probe函数 进入probe函数 初始化硬件 初始化芯片 会有个nand_scan_ident扫描 扫描完之后add_partition添加分区, 我们进入add_partition这个函数,它调用下面这个函数 我们来看看nand_scan_iden这个函数怎么扫描的 设置默认函数 获得flash类型 看看别人是怎么获得的 选中芯片 然后复位芯片,然后读芯片的ID 发什么命令呢 发NAND_CMD_READID,这个等于多少呢??? 跟我们前面弄的一样的 然后读数据,第一个读到厂家ID,第二个读到设备ID 在这个nand_flash_ids数组里面比较这个id,我们来看看这个数组 我们可以看到我们的DC在这里面 我们nand_scan_ident是在 ? //driver/mtd/nand/nand_base.c里面实现的 这个文件是通用的,所有的nandflash都要发命令读到这些东西 我们在来看看我们的添加分区 在这里面又调用了 这个函数 我们看一下开发板下面的驱动 有字符设备,也有块设备。所以我们这个nandflash可以当作字符设备也可以当作块设备 我们只需要做硬件操作那块就行了,其余的别个已经帮我们做好了 以我们写了那么多驱动应该知道了 1.分配某个结构体 2.设置 3.硬件相关的设置 4.使用 这个结构体我们现在还不知道是什么东西,但我们可以看看例子程序,看看probe函数,三星写到代码都太啰嗦了,我们看atmel-nand.c的nandflash驱动 它是一个好的例子 这里有个nand_chip结构体 接着他又设置了这个结构体。这就是我们要找的结构体 所以我们的驱动就是 分配 设置nand_chip结构体 使用就用nand_scan_ident这个函数 扫描完之后在添加分区add_mtd_partitions,最后还是会到我们的add_mtd_device 对链表里的每一项,调用add函数。那mtd_notifiers这个链表在哪里设置 在这个函数里面注册 register_mtd_user 这个函数又被谁调用呢??? 被mtdchar.c和mtdblock.c 这两个函数都注册了一个user 将mtdchar_notifier这个放到那个链表里面去,当它发现一个mtd设备的时候会调用链表里面的add函数 在mtdchar.c是这个函数被调用 在mtdblock.c是下面的函数被调用 我们先看mtdchar_notify_add这个函数,看看它做了什么事情,然而发现它是个空函数 但是看整个文件,其实就是一个字符设备驱动 然后看看块设备的add函数,看它做了什么事情 这里又有一个链表,对应链表里面每个成员,调用add_mtd,但是这个blktrans_majors又在哪里设置 在register_mtd_blktrans这个函数里面 注册mtd块传输 然后mtdblock.c又调用这个函数 mtdblock_ro.c也调用了 从名字上可以看 ro是只读的意思 我们看mtdblock.c就好了 这里有个add_mtd函数 这个函数有调用了下面这个函数 add_mtd_blktrans_dev又调用了 然后我们的alloc_disk就出来了 设置容量出来了 add_disk出来了 在nand_scan_ident这个函数之后有个 这个函数 这个函数里面 又有个这个,构造struct mtd_info *mtd结构体 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |