vivi的mtd部分基本都是仿照linux下mtd的驱动,我也是一边看vivi的mtd部分一边看linux的mtd部分,linux里面跟复杂,也更能说明设计的初衷。由于linux里面除了底层的驱动,还包括了linux驱动模块的写法问题,这些以后可能会在我的linux设备驱动那里总结,这里就主要说vivi。
struct mtd_info;表示MTD原始设备的结构
vivi中就是有一个简单的全局指针变量 struct mtd_info *mymtd
在mtd初始化后,这个指针将得到一个struct mtd_info,以后对flash的操作都是通过mymtd指针来的。
相关的函数:mtd_init()
我理解的vivi是基于这样的一个简化,就是nor和nand你只能两选其一,不能同时选,因为他只有一个mtd_info,linux内核中有一个mtd_table这个是mtd_info结构的集合,可以同时好几个mtd存在,这样才能保证nor和nand的同时存在。
struct mtd_info结构体有个priv指针,这个指针在norflash时候指向strut map_info,在nandflash时候指向struct nand_chip。下面我就在这两种情况在说说。
相关函数:norflash涉及 cfi_init()和amd_init()
nandflash涉及 smc_init()
norflash:
两种情况,cfi和amd(non-cfi)
如果是cfi
那么struct map_info结构体中的fldrv_priv指针指向struct cfi_private,struct cfi_private结构体中cfiq指向一个struct cfi_ident结构,它主要保存时从cfi结构读出来的芯片信息,一个mtd_info结构是假设你使用同一型号的norflash(cfi),struct cfi_private结构体中chips指向flchip结构数组。
struct cfi_ident;描述Flash芯片的信息
struct flchip;描述每个Flash芯片的专有信息(比如说起始地址)
相关函数:do_map_probe-》get_mtd_chip_driver-》cfi_probe-》mtd_do_chip_probe-》genprobe_ident_chips&check_cmd_set
如果是amd
那么struct map_info结构体中的fldrv_priv指针指向struct amd_flash_private,struct amd_flash_private结构体中的chips指向flchip结构数组,作用同cfi。
相关函数:do_map_probe-》get_mtd_chip_driver-》amd_flash_probe-》probe_new_chip
nand flash
struct nand_chip作用和norflash中map_info差不多
相关函数:smc_insert-》smc_scan
阅读(1568) | 评论(0) | 转发(0) |