logo资料库

mtd源代码分析.pdf

第1页 / 共116页
第2页 / 共116页
第3页 / 共116页
第4页 / 共116页
第5页 / 共116页
第6页 / 共116页
第7页 / 共116页
第8页 / 共116页
资料共116页,剩余部分请下载后查看
本地磁盘
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 Linux MTD 源代码分析 by Jim Zeus Version 0.1 2002/4/29 Copyright © 2002 Jim Zeus. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,Version 1.1 or any later version published by the Free Software Foundation;with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 1/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 If you got any Problem, Suggestion, Advice or Question , Please mail to: jimzeus@sina.com.cn Any correction will be appreciated. 目录 专有名词: Linux MTD介绍: 设备层和原始设备层的函数调用关系(红色部分需要我们实现): NOR型Flash芯片驱动与MTD原始设备 NAND和NOR的比较 源码分析 头文件分析 mtd.h MTD_CHAR_MAJOR MTD_BLOCK_MAJOR MAX_MTD_DEVICES mtd_info mtd_info.type的取值 mtd_info.flags的取值 mtd_info.ecctype的取值 erase_info erase_info.state的取值 mtd_notifier get_mtd_device put_mtd_device partitions.h mtd_partition MTDPART_OFS_APPEND MTDPART_SIZ_FULL map.h map_info mtd_chip_driver gen_probe.h chip_probe file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 2/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 cfi.h cfi_private cfi_private.cfi_mode的取值 cfi_ident cfi_ident.P_ID的取值 flashchip.h flchip /drivers/mtd/子目录 mtdcore.c mtd_table mtd_notifiers add_mtd_device del_mtd_device register_mtd_user unregister_mtd_user __get_mtd_device mtdpart.c mtd_partitions mtd_part PART(x) add_mtd_partitions del_mtd_partitions part_read part_write part_readv part_writev part_erase part_lock part_unlock part_sync part_suspend part_resume mtdblock.c notifier mtdblk_dev mtdblks erase_callback erase_write write_cached_data do_cached_write do_cached_read file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 3/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 mtdblock_open mtdblock_release handle_mtdblock_request leaving mtdblock_thread mtdblock_ioctl mtd_fops init_mtdblock cleanup_mtdblock mtdchar.c notifier mtd_lseek mtd_open mtd_close MAX_KMALLOC_SIZE mtd_read mtd_write mtd_erase_callback mtd_ioctl mtd_fops init_mtdchar cleanup_mtdchar /drivers/mtd/chips子目录 chipreg.c chip_drvs_list register_mtd_chip_driver unregister_mtd_chip_driver get_mtd_chip_driver do_map_probe cfi_probe.c cfi_chipdrv cfi_probe_init cfi_probe_exit cfi_probe cfi_chip_probe cfi_probe_chip qry_present cfi_chip_setup jedec_probe.c amd_flash_info jedec_table file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 4/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 jedec_chipdrv jedec_probe_init jedec_probe_exit jedec_probe jedec_probe_chip jedec_probe_chip cfi_jedec_setup gen_probe.c mtd_do_chip_probe genprobe_ident_chips genprobe_new_chip check_cmd_set cfi_cmdset_unkown cfi_cmdset_0002.c cfi_amdstd_chipdrv cfi_cmdset_0002 cfi_amdstd_setup cfi_amdstd_erase_onesize do_erase_oneblock cfi_amdstd_read do_read_onechip cfi_amdstd_write do_write_oneword cfi_amdstd_sync cfi_amdstd_suspend cfi_amdstd_resume cfi_amdstd_destroy cfi_amdstd_erase_varsize cfi_amdstd_init cfi_amdstd_exit cfi_cmdset_0001.c /drivers/mtd/maps子目录 your-flash.c WINDOW_ADDR WINDOW_SIZE BUSWIDTH mymtd your_read8 your_read16 your_read32 your_copy_from file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 5/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 your_write8 your_write16 your_write32 your_copy_to your_set_vpp your_partition NUM_PARTITIONS your_map init_yourflash cleanup_yourflash 专有名词: 1. MTD:Memory Technology Device,内存技术设备, 2. JEDEC:Joint Electron Device Engineering Council,电子电器设备联合会 3. CFI:Common Flash Interface,通用Flash接口,Intel发起的一个Flash的接口标准 4. OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的块有 16个字节的extra data,用于纠错或元数据。 5. ECC: error correction,某些硬件不仅允许对flash的访问,也有ecc功能,所有flash器件都受位 交换现象的困扰。在某些情况下,一个比特位会发生反转或被报告反转了,如果此位真的反转了, 就要采用ECC算法。 6. erasesize: 一个erase命令可以擦除的最小块的尺寸 7. buswidth:MTD设备的接口总线宽度 8. interleave:交错数,几块芯片平行连接成一块芯片,使buswidth变大 9. devicetype:芯片类型,x8、x16或者x32 10. NAND:一种Flash技术,参看NAND和NOR的比较 11. NOR:一种Flash技术,参看NAND和NOR的比较 file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 6/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 Linux MTD介绍: MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系 统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个 抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层(从设备节 点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱 动层。 根文件系统 文件系统 字符设备节点 MTD字符设备 MTD块设备 MTD原始设备 FLASH硬件驱动 块设备节点 一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动 遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序则位于/drivers/ mtd/nand子目录下 二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个 特定的Flash的数据,例如分区。 用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。 file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 7/116 页)2007-5-11 15:22:32
OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的 mtd_table(mtdcore.c)则是所有MTD原始设备的列表,mtd_part(mtd_part.c)是用于表示MTD原始设 备分区的结构,其中包含了mtd_info,因为每一个分区都是被看成一个MTD原始设备加在mtd_table中 的,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part->master中获得。 在drivers/mtd/maps/子目录下存放的是特定的flash的数据,每一个文件都描述了一块板子上的flash。 其中调用add_mtd_device()、del_mtd_device()建立/删除mtd_info结构并将其加入/删除mtd_table(或者调 用add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/删除mtd_part结构并将mtd_part.mtd_info加 入/删除mtd_table 中)。 三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备 (设备号90)。MTD字符设备的定义在mtdchar.c中实现,通过注册一系列file operation函数(lseek、 open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构mtdblk_dev,并声明了 一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个mtd_info一一对应。 四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点 (主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。 五、根文件系统:在Bootloader中将JFFS(或JFFS2)的文件系统映像jffs.image(或jffs2.img)烧到flash 的某一个分区中,在/arch/arm/mach-your/arch.c文件的your_fixup函数中将该分区作为根文件系统挂载。 六、文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint 上。 设备层和原始设备层的函数调用关系(红色部分需要我们实现): 一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进mtd_table,mtd_table中的每个 MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为0、2、4、 6…(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0、1、2、3… mtd_notifier mtd_notifier 字符设备 mtd_fops 块设备 mtd_fops (mtdchar.c) (mtdblock.c) mtdblks 设备层 register_mtd_user() get_mtd_device() unregister_mtd_user() put_mtd_device() erase_info file:///C|/Documents%20and%20Settings/bob/Local%20Settings/Temp/wzf966/Your-MTD.htm(第 8/116 页)2007-5-11 15:22:32
分享到:
收藏