Chinaunix首页 | 论坛 | 博客
  • 博客访问: 227804
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-07 15:10:47

1 flash如何分区?

见内核配置与编译

系统启动后,在dev目录下,/dev/mtd0,1,2等代表char型设备,mtd0代表flash的第一分区,依次类推;/dev/mtdblock0,1,2代表block型设备,mtdblock0代表flash第一分区,依次类推。

在下述的一些操作flash的命令中,必须区别使用者两种设备。

 

2 linux系统对flash进行操作

       经过搜索,找到linux MTD的支持网站,以及一个The Linux MTD, JFFS HOWTOhttp://easwy.com/blog/archives/the-linux-mtd-jffs-howto/.

infradead网站上可以找到mtd-utils的工具包,这个工具包如何下载和安装及使用网上都有,我也保存了下了。但是编译这个包还是好麻烦,需要zlib等等。然后我发现如何我只需要对flash进行erasewriteread等操作,只需要把mtd-utils包里面的几个文件单独拿出来就可以了。

 

3 mtd-utils包找出几个需要使用的文件

在网站上下载最新的mtd-utils包:mtd-utils-1.3.1.tar.bz2

找出需要的文件:

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

 

4 使用mtd-utils

4.1 查看flash分区信息

# cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00060000 00010000 "u-boot"

mtd1: 00120000 00010000 "kernel"

mtd2: 00080000 00010000 "jffs2"

 

4.2 flash_erase

命令: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/

 

4.3 flash_eraseall

命令:flash_eraseall

作用:擦出整个分区的数据,同时也会作坏块检测

用法:

flash_eraseall [OPTION] MTD_DEVICE

 

-q, --quiet    不显示打印信息

-j, --jffs2    jffs2 格式化分区

 

eg: ./flash_eraseall -j /dev/mtd0

 

4.4 flashcp

命令: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差不多

 

4.5 mtd_debug

作用: 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开始的  128K2 大小的数据

#./mtd_debug write /dev/mtdblock0 ox0 0x360810 cq8401.img //mtdblock0分区,写入 3.6M 大小的文件系统cq8401.img,这里最好用mtdblockx

#./mtd_debug read  /dev/mtdblock0 ox0 0x360810 read.img  //mtdblock0中读出 3.6M 数据保存到read.img

# cmp -l cq8401.img read.img  // 验证write to flash read from flash 中的数据是否一致;也可以使用diff命令来比较

阅读(6474) | 评论(0) | 转发(0) |
0

上一篇:Linux 任务调度

下一篇:linux下使用msntp

给主人留下些什么吧!~~