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