2010年(49)
分类: 嵌入式
2010-09-07 15:10:47
见内核配置与编译
系统启动后,在dev目录下,/dev/mtd0,1,2等代表char型设备,mtd0代表flash的第一分区,依次类推;/dev/mtdblock0,1,2代表block型设备,mtdblock0代表flash第一分区,依次类推。
在下述的一些操作flash的命令中,必须区别使用者两种设备。
经过搜索,找到linux MTD的支持网站,以及一个The Linux MTD, JFFS HOWTO(http://easwy.com/blog/archives/the-linux-mtd-jffs-howto/).
在infradead网站上可以找到mtd-utils的工具包,这个工具包如何下载和安装及使用网上都有,我也保存了下了。但是编译这个包还是好麻烦,需要zlib等等。然后我发现如何我只需要对flash进行erase、write、read等操作,只需要把mtd-utils包里面的几个文件单独拿出来就可以了。
在网站上下载最新的mtd-utils包:mtd-utils-
找出需要的文件:
flash_erase.c 擦除flash扇区
flashcp.c 向flash写
flash_eraseall.c 擦除某个flash分区,还可以格式化为jffs2文件系统
mtd_debug.c 可以擦除、读、写flash,查看flash info,
将这些单独编译后就可以使用了;下面是makefile:
CC = ppc_8xx-gcc
target:
$(CC) -o flash_erase flash_erase.c
$(CC) -o flashcp flashcp.c
$(CC) -o flash_eraseall flash_eraseall.c crc32.c
$(CC) -o mtd_debug mtd_debug.c
.PHONY:clean
clean:
rm -f flash_erase flashcp mtd_debug flash_eraseall
# cat /proc/mtd
dev: size erasesize name
mtd0: 00060000 00010000 "u-boot"
mtd1: 00120000 00010000 "kernel"
mtd2: 00080000 00010000 "jffs2"
命令:flash_erase
作用:擦出指定范围内flash的内容,如果不指定,默认擦出起始位置的第一块,使相应flash变为全1
用法:
flash_erase MTD-device [start]
[cnt (# erase blocks)] [lock]
MTD-device:待擦出的分区,如/dev/mtd0
start:起始位置设置,这里必须设置为0x20000(128K)的整数倍(这里说的128k应该是单个扇区的大小,因为我的flash单扇区大小为64k,所以起始位置必须为0x10000)
cnt: 从start开始计算,要擦出的块数
lock: 写保护
eg: ./flash_erase /dev/mtd0
0x40000 5 //擦出mtd0分区上从0x40000开始的5块数据 ,128K/块
命令:flash_eraseall
作用:擦出整个分区的数据,同时也会作坏块检测
用法:
flash_eraseall [OPTION]
MTD_DEVICE
-q, --quiet 不显示打印信息
-j, --jffs2 一jffs2 格式化分区
eg: ./flash_eraseall -j /dev/mtd0
命令:flashcp
作用:copy 数据到 flash 中
用法:
usage: flashcp [ -v | --verbose ]
flashcp -h | --help
filename:待写入的数据
device: 写入的分区,如/dev/mtd0
./flashcp cq8401.img
/dev/mtd0 // copy cq8401.img文件系统到 /dev/mtd0分区中
当然这个命令的功能跟 dd if=/tmp/fs.img of=/dev/mtd0差不多
作用: 对mtd 调试作用
用法:
usage: mtd_debug info
mtd_debug read
mtd_debug write
mtd_debug erase
eg:
#./mtd_debug info /dev/mtd0
// 输出/dev/mtd0上的一些信息,这里必须用mtdx
#./mtd_debug erase /dev/mtd0 0x0 0x40000 // 擦出/dev/mtd0 分区上 从0x0开始的 , 128K*2 大小的数据
#./mtd_debug write /dev/mtdblock0
ox0 0x360810 cq8401.img //向mtdblock0分区,写入
#./mtd_debug read
/dev/mtdblock0 ox0 0x360810 read.img //从mtdblock0中读出
# cmp -l cq8401.img
read.img // 验证write to flash 和 read from flash 中的数据是否一致;也可以使用diff命令来比较