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

立你斯 發表在 痞客邦 留言(0) 人氣()