http://singleboy.blog.163.com/blog/static/5490019420115149220159/
A ,下載源代碼:
zlib和lzo是編譯mtd-utils所需庫文件,需提前交叉編譯完成,以供mtd-utils編譯時調用
zlib:
http://www.zlib.net/zlib-1.2.5.tar.gz
http://www.dnaphp.com/downloads/server/linux/30-zlib-1-2-5-tar
lzo:
http://www.oberhumer.com/opensource/lzo/download/,這裡下載是lzo-2.05.tar.gz
E2fsprogs:
http://e2fsprogs.sourceforge.net/,這裡下載的是e2fsprogs-1.41.14.tar.gz
mtd-utils:
ftp://ftp.infradead.org/p /mtd-utils/
下載後
[root@localhost linux-test]# cd mtdtools
[root@localhost mtdtools]# ls e2fsprogs-1.41.14.tar.gz mtd-utils-1.4.4.tar.bz2 lzo-2.05.tar.gz zlib-1.2.5.tar.gz
可以在打開的頁面中下載最新版本,分別對其進行解壓
[root@localhost mtdtools]# tar -zxf zlib-1.2.5.tar.gz
[root@localhost mtdtools]# tar -zxf lzo-2.05.tar.gz
[root@localhost mtdtools]# tar -jxf mtd-utils-1.4.4.tar.bz2 -C ./
B,編譯安裝zlib
[root@localhost linux-test]# cd zlib-1.2.5
[root@localhost zlib-1.2.5]#CC=arm-linux-gcc ./configure --enable-static --disable-shared --prefix=/usr/local/arm/4.4.3/arm-none- linux-gnueabi
[root@localhost zlib-1.2.5]# make
[root@localhost zlib-1.2.5]# make install
檢查: zconf.h和libz.a都安裝到了工具鏈目錄.
其中-prefix指定zlib的安裝路徑,需要指定到交叉編譯器所在路徑,而且是與命令執行的bin文件夾同一級別的目錄下而非軟連接的bin目錄!
C,編譯安裝lzo
[root@localhost zlib-1.2.5]# cd ../lzo-2.05
[root@localhost lzo-2.05]#CC=arm-linux-gcc ./configure --host=arm-linux --enable-static - -disable-shared --prefix=/usr/local/arm/4.4.3/arm-none-linux-gnueabi
[root@localhost lzo-2.05]# make
[root@localhost lzo-2.05]# make install
檢查:liblzo2.a已經拷貝到工具鏈的lib目錄.
解決錯誤現象:error: lzo/lzo1x.h: No sh file or director
D,編譯安裝e2fsprogs
配置e2fsprogs
[root@localhost e2fsprogs-1.41.14]#CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/arm/4.4.3/arm-none-linux -gnueabi
編譯
[root@localhost e2fsprogs-1.41.14]# make
安裝,因為我們只需要uuid庫,所以不需要完全安裝,查看Makefile文件,所以只執行make install-libs
[root@localhost e2fsprogs-1.41.14]# make install-libs
檢查,可以在工具鏈目錄看到, uuid/uuid.h文件已經安裝. libuuid.a已經安裝.
解決錯誤現象:uuid/uuid.h: No sh file or directory
E,編譯安裝mtd-uitls
進入到mtd-uitls目錄所在的目錄,在make時需要指定交叉編譯工具
[root@localhost lzo-2.05]# cd ../mtd-utils-1.4.4
[root@localhost mtd-utils-1.4.4]# mkdir mtd_install
[root@localhost mtd-utils-1.4.4]# export CROSS=arm-linux-
[root@localhost mtd-utils-1.4.4]# export WITHOUT_XATTR=1
[root@localhost mtd-utils-1.4.4]# export DESTDIR=./mtd_install
需要指定WITHOUT_XATTR=1 是由於在編譯mkfs.jffs2使其不調用acl.h而是用zlib的庫,否則出現
sys/acl.h:mkfs.jffs2.c:69:21: error: sys/acl.h: No sh file or directory
直接編譯:
make
make install
檢查1:mtdtools/mtd-utils-1.4.4/arm-linux(即所指定的CROSS)目錄已經拷貝了所有mtd-utils的工具.
檢查2:file flash_erase
flash_erase: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
上面信息有兩點要注意,第一是使用靜態/動態庫,第二是沒有striped/not triped。
這裡strip是用來去除編譯出來的命令中的debug信息的。
如果file出的信息是dynamically linked 和stripped,那麼要在目標板上執行此程序,需要將編譯器的lib目錄下所有庫文件複製到目標板的lib目錄下,如果不想使用庫文件,就要編譯成靜態鏈接方式:
查看mtd-utils-1.4.4的common.mk 文件,發現有CFLAGS ?= -O2 -g 編譯選項。
所以再加上一個選項:
export CFLAGS="-static -O2 -g"
重新運行make 和make install 後發現
file flash_erase
flash_erase: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
遺留問題1
顯然採用-static方式編譯後,仍然是動態鏈接方式,這個問題目前也是懸而未決。
目前也只能採用複制庫的方式。
http://blog.csdn.net/yinkaizhong/article/details/3604794
工具使用
命令:flash_erase
作用:擦出指定范围内flash的内容,如果不指定,默认擦出起始位置的第一块,使相应flash变为全1
用法:
flash_erase MTD-device [start] [cnt (# erase blocks)] [lock]
MTD-device:待擦出的分区,如/dev/mtd0
start:起始位置设置,这里必须设置为0x20000(128K)的整数倍
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 ] <filename> <device>
flashcp -h | --help
filename:待写入的数据
device: 写入的分区,如/dev/mtd0
eg:
filename制作:mkfs.jffs2 -e 0x20000 -d cq8401 -o cq8401.img -n //这里的-e 0x20000 必须更你芯片的erasesize 相等
./flashcp cq8401.img /dev/mtd0 // copy cq8401.img文件系统到 /dev/mtd0分区中
当然这个命令的功能跟 dd if=/tmp/fs.img of=/dev/mtd0差不多
命令:nandwrite
作用:向nand flash中写数据
用法:
nandwrite [OPTION] MTD_DEVICE INPUTFILE
-a, --autoplace Use auto oob layout
-j, --jffs2 force jffs2 oob layout (legacy support)
-y, --yaffs force yaffs oob layout (legacy support)
-f, --forcelegacy force legacy support on autoplacement enabled mtd device
-n, --noecc write without ecc
-o, --oob image contains oob data
-s addr, --start=addr set start address (default is 0)
-p, --pad pad to page size
-b, --blockalign=1|2|4 set multiple of eraseblocks to align to
-q, --quiet don't display progress messages
--help display this help and exit
--version output version information and exit
eg: ./nandwrite -p /dev/mtd0 /tmp/rootfs.jffs2
命令:nanddump
作用:dump出nand flash一些信息,如:block size,erasesize,oobblock 大小,oob data ,page data等;同时也会作坏块检测
用法:
nanddump [OPTIONS] MTD-device
--help display this help and exit
--version output version information and exit
-f file --file=file dump to file
-i --ignoreerrors ignore errors
-l length --length=length length
-o --omitoob omit oob data
-b --omitbad omit bad blocks from the dump
-p --prettyprint print nice (hexdump)
-s addr --startaddress=addr start address
eg:./nanddump -p -f nandinfo.txt /dev/mtd0 //dump出nand flash /dev/mtd0数据并保存到 nandinfo.txt
命令:mtd_debug
作用: 对mtd 调试作用
用法:
usage: mtd_debug info <device>
mtd_debug read <device> <offset> <len> <dest-filename>
mtd_debug write <device> <offset> <len> <source-filename>
mtd_debug erase <device> <offset> <len>
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分区,写入 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命令来比较
另外针对nand flash,mtd_debug这个工具来测试mtd驱动也不是很好,用nandwrite和nanddump这两个工具或许更好点。然后可以用cmp这个命令来比较一下nanddump出来的数据和nandwrite写入的数据是否一致。
命令:ftl_format
解释:In order to use one of conventional file systems (Ext2, ext3, XFS, JFS, FAT) over an MTD device, you need a software layer which emulates a block device over the MTD device. These layers are often called Flash Translation Layers (FTLs).
例一:如何测试nor flash 驱动
step1:
#./mtd_debug info /dev/mtd0 // 输出/dev/mtd0上的一些信息,这里必须用mtdx
step2:
#./mtd_debug erase /dev/mtd0 0x0 0x40000 // 擦出/dev/mtd0 分区上 从0x0开始的 , 128K*2 大小的数据
step3:
#./mtd_debug write /dev/mtdblock0 ox0 0x360810 cq8401.img //向mtdblock0分区,写入 3.6M 大小的文件系统cq8401.img,这里最好用mtdblockx
step4:
#./mtd_debug read /dev/mtdblock0 ox0 0x360810 read.img //从mtdblock0中读出 3.6M 数据保存到read.img,当然这里的长度应该相等
step5:
# cmp -l cq8401.img read.img // 验证write to flash 和 read from flash 中的数据是否一致;也可以使用diff命令来比较
例二:如何测试nand flash 驱动
其实nand flash 驱动同样可以用例一的方法测试,但既然有nandwrite,nanddump命令,为何不用呢!
step1:
#./flash_eraseall -j /dev/mtd1 //用jffs2格式化该分区
step2:
#./nanddump -p /dev/mtd1 //dump出nand flash /dev/mtd1数据,可以看到现在的数据全是ff
step3:
#./nandwrite -p /dev/mtd1 cq8401.img // 将cq8401.img文件系统写入mtd0分区
step4:
#./nanddump -p /dev/mtd1 //dump出nand flash /dev/mtd1数据,可以看到现在的数据不再是全ff
例三:如何用mtd-util 工具向nand flash写入文件系统jffs2.img,并修改启动参数,使文件系统从nand flash 启动;假设已分好区,mtd0为文件系统分区
方式一:
step1:
NFS起文件系统
#./flash_eraseall -j /dev/mtd0 //用jffs2格式化该分区
#./nandwrite -j -f -p -q /dev/mtd0 jffs2.img // 将jffs2.img文件系统写入mtd0分区
step2:
然后再看看我们新写入的JFFS2文件系统能不能mount上.
#mount -t jffs2 /dev/mtdblock0 /mnt
#ls /mnt
setp3:
重启开发板,在U-BOOT里 设置启动参数
#setenv bootargs 'mem=64M console=ttyS0,115200n8 ip=192.168.4.201:::::eth0:off root=/dev/mtdblock0 rootfstype=jffs2 rw'
#reset
方式二:
NAND 起内核,NAND起文件系统
1. 网起文件系统
nerase 0 55 && nprog 0 192.168.4.200 n-boot.bin.hg && nprog 128 192.168.4.200 zImage-6pci && reset
2.进入网起的文件系统
cat /proc/mtd
3. 制作JIFFS的文件系统
mkfs.jffs2 -e 0x20000 -d root-vw -o dvr20000.img -n
4.
cp dvr20000.img /dev/mtdblock1
5.修改NAND BOOT启动参数 include/cq8401_board.h
修改NAND BOOT
setenv bootargs 'mem=64M console=ttyS0,115200n8 ip=192.168.4.201:::::eth0:off root=/dev/mtdblock1 rootfstype=jffs2 rw'
6. 从新烧写
nerase 0 55 && nprog 0 192.168.4.200 n-boot.bin.local && nprog 128 192.168.4.200 zImage-6pci && reset
例四:
如何将一个 .tar.gz文件系统 写到 nor 或者 nand flash中
target$ mkdir /mnt/flash
target$ mount -t jffs2 /dev/mtdblock0 /mnt/flash (mtdblockx只是用来挂载的)
target$ cd /mnt/flash
target$ tar zxvf rootfs.tar.gz