一、项目概述
近期项目需要在一个老板子上(P2020处理器)支持对norflash的操作和升级内核,内核版本为Linux p2020rdb 3.8.13
二、交叉编译工具
交叉编译工具为:/opt/fls-networking/......./powerpc-fsl_networking-linux-gnuspe-gcc
zlib和lzo编译完后存放路径为: /opt/fsl-networking/......../zlib
这个可以根据自己实际应用场景修改,主要是编译zlib和lzo时需要指定--prefix=....
三、编译依赖包
3.1 zlib
(1) 获取:zlib Home Site, 我下载版本为1.2.11
(2)./configure --prefix=/opt/fsl-networking/......./zlib/ --shared
(注意:这里的/opt/fsl-networking/......./zlib/ 是zlib库要安装大目录你可以设成自己想要大目录。要记住这个目录哦,不然你会找不到zlib库的)
(3) 修改生成的Makefile文件的以下几项:
CC=/opt/fls-networking/......./powerpc-fsl_networking-linux-gnuspe-gcc
AR=/opt/fls-networking/......./powerpc-fsl_networking-linux-gnuspe-ar
RANLIB=/opt/fls-networking/......./powerpc-fsl_networking-linux-gnuspe-ranlib
(注意:交叉编译工具链路径要换成你的交叉编译工具路径。)
(4)
make
make install
3.2 LZO编译安装
(1) 下载 http://www.oberhumer.com/opensource/lzo/#download, 我下载版本为lzo-2.10.tar.gz
(2) 编译
CC=/opt/fls-networking/......./powerpc-fsl_networking-linux-gnuspe-gcc ./configure --host=powerpc-linux --prefix=/opt/fsl-networking/......./zlib/
make
make install
(这里的--prefix采用了和zlib一样的路径,都放在一起了)
3.3 e2fsprogs编译
该工具包主要是为了解决编译mtd-utils时,产生-luuid错误问题的,如果没有这个,则会产生如下错误:
(1)可以下载版本e2fsprogs-1.45.4.tar.gz:
http://distfiles.macports.org/e2fsprogs/
(2)sudo ./configure --host=powerpc-linux CC=/opt/fsl-networking/....../powerpc-fsl_networking-linux-gnuspe-gcc --prefix=/opt/fsl-networking/...../mtdutils
这里如果不使用sudo,比如会提示configure error: C compile cannot create executables,这基本是当前用户的PATH路径问题,自己修改一下PATH变量即可。
如果上述configure没有错误,则继续
cd lib/uuid
make
sudo make install (因为我mtdutils目录创建在opt目录下了)
四、编译mtd-utils
(1) 获取:ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-2.1.2.tar.bz2
(2) tar jxvf mtd-utils-2.1.2.tar.bz2
(3) 进去之后发现是没有Makefile文件的,需要根据./configure产生Makefile文件,下面描述中我都省略了交叉编译工具路径和库路径
(4)设置必要的环境变量,可以参见configure脚本里面说明
export ZLIB_CFLAGS=-I/opt/fsl-networking/...../zlib/include
export ZLIB_LIBS=-L/opt/fsl-networking/....../zlib/lib
export LZO_CFLAGS=-I/opt/fsl-networking/....../zlib/include
export LZO_LIBS=-L/opt/fsl-networking/......./zlib/lib
export UUID_CFLAGS=-I/opt/fsl-networking/...../mtdutils/include/uuid
export UUID_LIBS=-L/opt/fsl-networking/....../mtdutils/lib/pkgconfig
export CFLAGS="-O2 -g $ZLIB_CFLAGS $LZO_CFLAGS $UUID_CFLAGS"
export LDFLAGS="$ZLIB_LIBS $LZO_LIBS $UUID_LIBS -luuid -lz"
./configure --host=powerpc-linux CC=/opt/fsl-networking/..../powerpc-fsl_networking-linux-gnuspe-gcc --without-zstd
这里后面添加一个--without-zstd 主要是不添加的话,./confiure会报错,提示SZTD library找不断,如下图:
接下来输入:make WITHOUT_XATTR=1
会报缺少-llud错误,这个是产生一些mkfs工具需要的,我目前还没有研究为什么,估计是需要添加-llud库之类的。如果提示缺少LZO 库,configure时也可以添加--without-lzo
但是此时已经不影响norflash的一些工具生成了,比如flashcp flash_erase, mtd_debug 等见下图:
五、flash工具
命令: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差不多
命令: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/块
为了更详细了解分区信息用mtd_debug命令
mtd_debug info /dev/mtdX #(不能使用mtdblockX, mtdblockX 只是提供用來 mount 而已) mtd.type = MTD_NORFLASH mtd.flags = mtd.size = 12582912 (12M) mtd.erasesize = 131072 (128K) mtd.oobblock = 1 mtd.oobsize = 0 mtd.ecctype = (unknown ECC type - new MTD API maybe?) regions = 0