交叉编译mtd-utils工具(linux下flash工具)
uclinux下Nand+Flash的JFFS2文件系统的移植

uclinux下Nand Flash的JFFS2文件系统的移植uclinux下Nand Flash的JFFS2文件系统的移植(写在前面)现在(2005-12-5),linux对mtd设备支持的好得多,远没有我当时(大概2.5年前吧)做得那么复杂了,这里仍然要发原文,是因为想给初学者提供一个参考思路,介绍一下我对linux的学习了解的整个过程,希望对大家有借鉴意义。
但是,建议还是使用最新的mtd补丁,新版本的mtd包括了对2k page 的nand flash的支持,要使用大于128MB的Nand flash,就用这个吧。
文件系统方面,建议在Nor flash上,使用jffs2(jffs3也有,但是,我没用过,没有发言权)。
在Nand flash上强烈建议使用yaffs,这比jffs2快很多,而且支持direct模式,在其他系统,比如:uCOS-II、winCE等都可以使用。
我已经做到了在uCOS-II下和Linux下通过yaffs文件系统实现共享。
但是,要想使用2k page的nand flash,只有使用yaffs2了。
现在,yaffs2开源的代码有点问题,不能直接和mtd设备配合使用,稍作修改可以实现,有兴趣,我可以专门再写一片yaffs2的移植心得。
uclinux下Nand Flash的JFFS2文件系统的移植(1)继续上一篇《uClinux下移植Ne2000兼容的网卡驱动程序》中介绍的平台和操作系统,开始写JFF2的感想。
虽然JFFS2的移植弄出来有一段时间了,但是,前一段时间忙着期末考试,无心写心得。
昨天总算考完了,我就继续罗嗦那段时期的经历吧,希望把我遇到的问题和解决的方法和大家共享。
错误之处也请不吝指出。
我使用的uClinux的硬件平台还是44B0那个板子具体的情况参见《uClinux下移植Ne2000兼容的网卡驱动程序》中的介绍。
Flash我用的是三星公司的K9F2808——16MByte的Nand Flash。
mtd-utils 工具的使用

一.下载源码包。
二.编译1.修改MakefileCROSS=mipsel-linux-2.make3.将编译生成的可执行文件COP Y到开发板上三.命令的使用使用命令前用cat /proc/mtd 查看一下mtdchar字符设备;或者用ls -l /dev/mtd*#cat /proc/mtddev: si z e erasesi z e namemtd0: 00c00000 00020000 "ROOTFS"mtd1: 00200000 00020000 "BOOTLOADER"mtd2: 00200000 00020000 "KE RNE L"mtd3: 03200000 00020000 "NAND ROOTFS partition"mtd4: 04b00000 00020000 "NAND DATAFS partition"为了更详细了解分区信息用mtd_debug命令#mtd_debug info /dev/mtdX (不能使用mtdblockX, mtdblockX 只是提供用來mount 而已)mtd.type = MTD_NORFLASHmtd.flags =mtd.size = 12582912 (12M)mtd.erasesi z e = 131072 (128K)mtd.oobblock = 1mtd.oobsize = 0mtd.ecctype = (unknown E CC type - new MTD API maybe?)regions = 0命令:flash_erase作用:擦出指定范围内flash的内容,如果不指定,默认擦出起始位置的第一块,使相应flash变为全1 用法:flash_erase MTD-device [start] [cnt (# erase blocks)] [lock]MTD-device:待擦出的分区,如/dev/mtd0start:起始位置设置,这里必须设置为0x20000(128K)的整数倍cnt: 从start开始计算,要擦出的块数lock: 写保护eg: ./flash_erase /dev/mtd0 0x40000 5 //擦出mtd0分区上从0x40000开始的5块数据,128K/块作用:擦出整个分区的数据,同时也会作坏块检测用法:flash_eraseall [OPTION] MTD_DE V ICE-q, --quiet 不显示打印信息-j, --j f fs2 一j f fs2 格式化分区eg: ./flash_eraseall -j /dev/mtd0命令:flashcp作用:copy数据到 flash 中用法:usage: flashcp [ -v | --verbose ] <filename> <device>flashcp -h | --helpfilename:待写入的数据device: 写入的分区,如/dev/mtd0eg: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 i f=/tmp/fs.img of=/dev/mtd0差不多命令:nand write作用:向nand flash中写数据用法:nandwrite [OP TION] MTD_DE VICE INPUTFILE-a, --autoplace Use auto oob layout-j, --jffs2 force j f fs2 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 w ithout 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 di s play progress messages--help display this help and exit--version output version information and exiteg: ./nandwrite -p /dev/mtd0 /tmp/rootfs.j f fs2作用:dump出nand flash一些信息,如:block size,erasesize,oobblock 大小,oob data ,page data等;同时也会作坏块检测用法:nanddump [OP TIONS] 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 addresseg:./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 w rite <device> <offset> <len> <source-filename>mtd_debug erase <devi c e> <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 中的数据是否一致;也可以使用di f f命令来比较另外针对nand flash,mtd_debug这个工具来测试mtd驱动也不是很好,用nand write和nanddump这两个工具或许更好点。
Hi3516dv300搭建开发环境——编译osdrv(7)-mtd-utils2.0.2的。。。

Hi3516dv300搭建开发环境——编译osdrv(7)-mtd-utils2.0.2的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%注意1:如果你要安装automake1.15.1,建议你的安装顺序为:M4 -> autoconf -> automake(⼀定要安照这个顺序,不然会出现很多错误,建议从下⾯的3)开始看),这关于这⼏个包以及相关下载地址会在下⾯有⽂字或图⽚解释.有⼀个问题:我指定安装⽬录的时候⽐如安装m4和autoconf的时候为什么在/usr/local/建⽴名为m4⽂件夹,当m4安装到这个⽂件后为什么安装运⾏./configure --prefix=/usr/local/autoconf就⼀直提⽰要你安装m4,但是你都将他们安装在/usr/local/这同⼀⽬录下就不会出现该问题,我想是不是因为安装在不同⽬录系统是不是识别不了才出现这个问题,注意2:下⾯的⼀、⼆、三、四的安装顺序是我按照说明⽂档的安装顺序,亲测这个顺序是有问题的,在其中我插⼊了遇到的⼀些问题,以及对问题的解决%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1、本⽂的autoconf的安装过程可以参考:https:///xlwang1995/p/10604104.html 注意:只参考它的autoconf安装即可,不要按照它的顺序2、本⽂automake1.15.1的安装与autoconf的安装类似3、本⽂安装顺序参考⾃:https:///ubuntucc/article/details/9264165⼀、mtd-utils2.0.2依赖以下⼏个库,以ubuntu为例,安装⽅式请参考下⾯命令:sudo apt-get install zlib1g-dev liblzo2-dev uuid-dev pkg-config⼆、由于mtd-utils2.0.2通过pkg-config⼯具检查各个库是否正常安装,因此请参考如下⽅式设置pkg-config⼯具搜索路径:export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/x86_64-linux-gnu/pkgconfig"注:这⼀步可参考链接:https:///weixin_41041772/article/details/102767759理解:输⼊指令:pkg-config --variable pc_path pkg-config出现问题:pkg-config命令未发现,可以安装这个包,安装这个包后重新输⼊该指令,发现这个路径/usr/lib/x86_64-linux-gnu/pkgconfig有了,故可进⾏下⼀步三、mtd-utils2.0.2依赖于automake1.15.1版本,请参考如下⽅式安装automake1.15.1版本:1、删除原有automake版本sudo apt-get autoremove automake2、下载1.15.1版本1)Windows系统中使⽤浏览器访问automake⼯程url并下载对应源码包:https:///archive/html/info-gnu/2017-06/msg00007.html2)linux系统中可以使⽤下⾯命令下载:wget ftp:///gnu/automake/automake-1.15.1.tar.gz3、编译安装automake1.15.1tar zxvf automake-1.15.1.tar.gzcd automake-1.15.1/./configure注:安装到这⼀步出错了,原因是autoconf版本太低了,输⼊指令下载autoconf2.65,(我下载的为2.68),1)输⼊下载的指令为:wget ftp:///gnu/autoconf/autoconf-2.68.tar.gz2)解压到指定⽬录(我解压到root⽬录下),-C为指定路径命令3)出现提⽰需要下载另⼀个包m4,同样⽤wget⽅法4)这次解压⽤绝对路径,(绝对路径是不是为在prefix前⾯加两个减号)指定解压位置:指定安装路径:最后安装编译:4.1)执⾏到这⼀步出现三个错误:4.2)第⼀个错误为:c:83:3:error:#error please port gnulib freadahead.c to your platf orm!Look at the..........解决办法:在在该⽬录下的终端(就是从终端进⼊m4-1.4.14⽬录也⾏)输⼊指令:sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.cecho "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h注意:这指令⾥⾯的IO中的I为⼤写的i, lib/stdio-impl.h这⾥⾯的l位⼩写字母l此步参考链接为:第⼆个为:error:get undeclared here (not in a function);did you mean......出现这个问题,参考链接:https:///weixin_34168880/article/details/91842744按照这个⽅法处理后,竟然⼜出现了两个错误4.3)第三个为:/m4-1.4.14/src/path.c:118: undefined reference to `S_ISDIR'的错误参考链接:https:///ubuntucc/article/details/9264165⾮常感谢这个链接的博主,通过这个⽂章我知道我掉坑⾥去了,知道了正确的安装顺序为:M4 -> autoconf -> automake (很重要!!!!)你要是按照osdrv/tools/jffs2_tool/readme_cn.txt⾥⾯的安装步骤你就会以⼀个相反的安装顺序安装并会出现我上⾯所有的问题,⼀个软件还没安装完问题就出现了,⼜解决这个问题解决问题中⼜出现问题到最后⼀个软件也没安装上。
ARM、linux常用服务器+交叉编译工具链

1.tftp服务器在安装linux时通常可供选择是否安装tftp服务器启动后可通过在控制终端输入netstat -a|grep tftp查看是否已经安装若已安装则为如下打印信息:[root@localhost /]# netstat -a|grep tftpudp 0 0 *:tftp *:*若没有安装则可使用rpm –ivh tftp-server-0.42-3.1.i386.rpm进行安装然后建立主要工作目录mkdir /tftpboot接下来配置tftp服务器vim /etc/init.d/tftp# default: off# description: The tftp server serves files using the trivial file transfer \# protocol. The tftp protocol is often used to boot diskless \# workstations, download configuration files to network-aware printers, \# and to start the installation process for some operating systems.service tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4}注意修改server_args = -s /tftpboot为你tftp工作目录。
接下来便是重启tftp 服务器了/etc/init.d/xinetd restart打印出如下信息[root@localhost /]# /etc/init.d/xinetd restartStopping xinetd: [ OK ]Starting xinetd: [ OK ]表示重启成功接下来便可查看是否已经安装成功[root@localhost /]# netstat -a|grep tftpudp 0 0 *:tftp *:*2.nfs服务器首先查看nfs服务器是否被安装(这里为red-had5)rpm –q nfs-utils若打印出如下信息则表示已经被安装[root@localhost ~]# rpm -q nfs-utilsnfs-utils-1.0.9-24.el5若没有安装nfs服务器则先下载相应的nfs服务器包百度一个即可然后rpm –ivh nfs- utils-1.0.9-24.el5.i386.rpm这里使用的nfs版本为utils-1.0.9-24.el5故不同版本安装不同,然后进入nfs配置vi /etc/exports/nfsroot/rootfs 211.67.216.* (rw,sync,no_root_squash)211.67.216.* 配置网段为自己IP地址同一网段然后启动NFS服务器/etc/init.d/nfs start 启动nfs服务器如下所示:[ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ]然后即可挂载nfs服务器上的共享目录了mount –t nfs xx.xx.xx.xx:/xx /mntxx.xx.xx.xx为nfs服务器ip地址/xx 为需要挂载的目录接下来ls /mnt 即可查看是否挂载成功3.samba服务器在安装linux时选中安装samba服务器然后这里就只需配置即可vim /etc/samba/smb.conf约248行复制6行248 [homes]249 comment = Home Directories250 browseable = no251 writable = yes252 ; valid users = %S253 ; valid users = MYDOMAIN\%S然后粘贴修改如下254 [root]255 comment = Root Directories256 browseable = yes257 writable = yes258 path = /259 ; valid users = smb260 ; valid users = MYDOMAIN\%S这里valid users = smb如果smb用户存在则不需添加否则需要添加useradd smb然后设置smb账户登录密码smbpasswd –a smb重启smb服务器/etc/init.d/smb restart设置好linux ip后在windows命令行运行\\xx.xx.xx.xx 输入账户密码即可访问linux目录了xx.xx.xx.xx为虚拟机linux IP地址通过chmod修改权限即可实现linux和windows文件共享了。
交叉编译工具链的制作

交叉编译⼯具链的制作交叉编译⼯具链的制作前⾔及准备本笔记制作的交叉编译⼯具已通过简单验证,对初次有需求需要搭建交叉⼯具链有⼀定的指导意义,制作⼯具链⽐较耗时,需做好花费⼀整天时间的准备。
资料学习链接linux⼯具、软件安装的基本步骤:下载,配置,编译,安装crosstool-ng下载或使⽤指令新建 arm-linux-tool ⽂件夹⽤于制作⼯具链mkdir arm-linux-toolcd arm-linux-toolwget /download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2tar -xvjf crosstool-ng-1.23.0.tar.bz2新建mkdir crosstool-build crosstool-install src⼀、安装crosstool-ng1.编译依赖sudo apt-get install gperf flex bison texinfo gawk libtool automake libncurses5-dev g++ help2mangperf是完美哈希函数⽣成器;bison和flex是⽤来⽣成语法和词法分析器;texinfo和man类似,⽤来读取帮助⽂档;automake是帮助⽣成Makefile的⼯具;libtool帮助在编译过程中处理库的依赖关系,⾃动搜索路径;gawk是linux下⽤于⽂本处理和模式匹配的⼯具;2.配置、安装cd crosstool-ng-1.23.0./configure --prefix /home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/配置过程中出现的缺少安装项通过安装解决配置正常⽣成 makefile 后,进⾏编译安装makemake install验证安装是否成功在 crosstool-install/bin ⽬录下执⾏ ./ct-ng -v为了后⾯使⽤⽅便,配置临时环境变量export PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/bin/⼆、配置交叉编译⼯具链对于常见的架构,⽐如arm,mips,powerpc等等,都有了很多的,已经帮我验证过,可以正常编译的⽰例配置了,所以我们接下来,主要就是:搞懂⾃⼰借⽤哪个配置,然后调⽤默认配置,然后再确认⼀下配置,根据⾃⼰的情况去改⼀改,就差不多,就配置好了。
Linux交叉编译简介

Linux交叉编译简介Linux 交叉编译简介主机,⽬标,交叉编译器主机与⽬标编译器是将源代码转换为可执⾏代码的程序。
像所有程序⼀样,编译器运⾏在特定类型的计算机上,输出的新程序也运⾏在特定类型的计算机上。
运⾏编译器的计算机称为主机,运⾏新程序的计算机称为⽬标。
当主机和⽬标是同⼀类型的机器时,编译器是本机编译器。
当宿主和⽬标不同时,编译器是交叉编译器。
为什么要交叉编译?某些设备构建程序的PC,⽤户可以获得适当的⽬标硬件(或模拟器),启动 Linux Release版,在该环境中进⾏本地编译。
这是⼀种有效的⽅法(在处理 Mac Mini时甚⾄可能是⼀个好主意),但对于 linksys 路由器,或 iPod,有⼀些突出的缺点:速度- ⽬标平台通常⽐主机慢⼀个数量级或更多。
⼤多数专⽤嵌⼊式硬件是为低成本和低功耗⽽设计的,⽽不是⾼性能。
由于在⾼性能桌⾯硬件上运⾏,现代模拟器(如 qemu)实际上⽐模拟的许多现实世界的硬件要快。
性能- 编译⾮常耗费资源。
⽬标平台通常没有台式机GB 内存和数百 GB 磁盘空间;甚⾄可能没有资源来构建“hello world”,更不⽤说⼤⽽复杂的包了。
可⽤性-未运⾏过的硬件平台上运⾏ Linux,需要交叉编译器。
即使在 Arm 或 Mips 等历史悠久的平台上,给定⽬标找到最新的全功能预构建本机环境很困难。
如果平台通常不⽤作开发⼯作站,可能没有现成的最新预构建Release版,如果有,则可能已经过时。
如果必须先为⽬标构建Release版,才能在⽬标上进⾏构建,⽆论如何都将返回交叉编译。
灵活性- 功能齐全的 Linux Release版,由数百个软件包组成,但交叉编译环境可以从⼤多数⽅⾯依赖于主机的现有Release版。
交叉编译的重点是构建要部署的⽬标包,不是花时间获取在⽬标系统上运⾏的仅构建先决条件。
⽅便-⽤户界⾯不友好,debug构建中断不⽅便。
从 CD 安装到没有 CD-ROM 驱动器的机器上,在测试环境和开发环境之间来回重新启动。
如何下载交叉编译工具

如何下载交叉编译工具
1.5 安装VMware Tools
VMwareTools可以方便windows系统和linux系统之间拷贝文件,可以直接通过鼠标拖拽的方式将需要传递的文件从Windows系统拷贝到Linux系统。
点击之后会出现如下对话框
通过命令行进入上图文件所在的目录/media/te st/VMare Tools/
将VMwareTools压缩包拷贝到/home/test/目录下
解压压缩包,并进入解压后目录
执行安装脚本进行安装,安装完成后重启系统即可完成安装
1.6 下载交叉编译工具
1.6.1 下载Linux kernel编译工具
下载标注的安装包
安装petalinux需要的依赖
将安装包拷贝到/opt目录下,直接运行安装
配置环境变量,将交叉编译工具链导出,打开文件/etc/bash.bashrc在最后添加一行
执行source命令使配置生效或重启系统
执行如下命令,可以看到交叉编译工具命令已经生效
此编译工具用于编译Linux kernel
1.6.2 下载u-boot编译工具
下载标注的安装包
将安装包拷贝到/opt目录下,并解压
配置环境变量,将交叉编译工具链导出,打开文件/etc/bash.bashrc在最后添加一行
执行source命令使配置生效或重启系统
执行如下命令,可以看到交叉编译工具命令已经生效
此编译工具用于编译u-boot。
Linux系统的在线升级

Linux系统的在线升级目前嵌入式Linux系统的升级,即升级uboot,kernel,rootfs等的传统的方式,都是用烧写工具去烧写,相对来说,显得很繁琐和效率比较低,而利用mtd工具的方式去升级系统,相对比较方便。
1.系统升级前的准备工作1.1linux中已实现了U盘挂载,以方便拷贝要升级的文件linux系统中已经有了USB驱动,并且已经实现了USB的自动挂载。
有了U盘挂载,每次升级系统文件,包括uboot、kernel、rootfs 等文件就可以放在U盘。
1.2linux中nor flash和nand flash己能正常工作要用mtd工具升级系统之前,肯定是对应的nand flash以及nor flash都是已经正常工作了,即除了系统正常运行外,通过:cat /proc/mtd ,可以看到对应的nor flash和nand flash所对应的分区信息了。
如下图所示。
图1-1 Nand flash 分区1.3 准备好mtd工具使用交叉工具链编译zlib-1.2.3和mtd,可以得到mtd工具flash_erase、flash_eraseall、nandwrite、nanddump,这四个工具的作用如下表:表1 MTD工具简介MTD工具名称功能Flash_erase 擦除flash(nand或nor)的某个部分Flash_eraseall 擦除flash的某个分区nandwrite 用于将某个文件/数据,写入到某个分区nanddump 用于查看当前某个mtd分区的数据2.利用MTD工具实现Linux系统的升级利用MTD工具升级系统,方法是:先用nand_eraseall擦除对应的mtd分区中的内容,再将对应的数据用nandwrite写入对应的mtd 中对应的位置中。
Nand flash的MTD分区情况可以查看文件arch/arm/plat-s3c24xx /common-smdk.c,代码如下:static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name = "bootloader u-boot-2010.03",.size = SZ_1M,.offset = 0,},[1] = {.name = "kernel linux-2.6.35",.offset = SZ_1M,.size = SZ_4M,},[2] = { .name= "rootfs busybox-1.17.3",.offset = SZ_1M * 5, .size = SZ_1M * 40,}, [3] = { .name = "usrfs",.offset= SZ_1M * 45,.size = SZ_1M * 19,},};图2-1 Linux 系统中的Nand MTD 分区2.1 升级u-boot1. 擦除u-boot 所在分区的数据/tmp/usb/util/flash_eraseall /dev/mtd02. 写入升级的u-boot 数据u-bootKernel根文件系统(cramfs)用户文件系统(yaffs2)0 1000005000002d000004000000/dev/mtd0 /dev/mtd1 /dev/mtd2 /dev/mtd3/tmp/usb/util/nandwrite -p -s 0x4000 /dev/mtd0 /tmp/usb/u-boot.bin 其中,-p参数表示,如果要写入的数据不是页大小的整数倍,会自己加填充数据;0x4000是nand flash的一个块的大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、下载源码包并解压wget ftp:///pub/mtd‐utils/mtd‐utils‐1.5.1.tar.bz2wget /zlib‐1.2.8.tar.gzwget /opensource/lzo/download/lzo‐2.03.tar.gzwget https:///pub/linux/utils/util‐linux/v2.21/util‐linux‐2.21.1.tar.gztar zxvf zlib‐1.2.8.tar.gztar zxvf lzo‐2.03.tar.gztar jxvf mtd‐utils‐1.5.1.tar.bz2tar zxvf util‐linux‐2.21.1.tar.gz二、编译安装zlib1)cd zlib‐1.2.8CC=arm‐none‐linux‐gnueabi‐gcc ./configure ‐‐prefix= /usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi ‐‐shared(注意:这里的/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi是交叉编译工具默认目录。
)2)makemake installcd ..3)安装完成后会在/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi /目录下生成三个目录:include、lib、share。
安装完后检查一下目录/usr/local/arm‐2007q1/zlib/假如 include 中没有 zlib.h 之类的头文件,lib 中没有 libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的 *.h 都需要拷过去,在拷库的时候用 cp ‐Ca libz.* /…./lib 就行,要用上 ‐Ca 选项。
三、编译安装lzo1)cd lzo‐2.03/CC=arm‐none‐linux‐gnueabi‐gcc ./configure ‐‐host=arm‐none‐linux‐gnueabi ‐‐prefix=/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi2)makemake installcd ..3)同上四、编译安装uuid1)cd util‐linux‐2.21.1/./configure ‐‐prefix=/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi ‐‐host=arm‐none‐linux‐gnueabi ‐‐disable‐mount ‐‐disable‐makeinstall‐setuid ‐‐disable‐makeinstall‐chown ‐‐disable‐use‐tty‐group ‐‐disable‐chsh‐only‐listed ‐‐disable‐schedutils ‐‐disable‐wall ‐‐disable‐kill ‐‐disable‐pivot_root ‐‐disable‐switch_root ‐‐disable‐cramfs ‐‐disable‐agetty ‐‐disable‐unshare ‐‐disable‐fallocate ‐‐disable‐mountpoint ‐‐disable‐uuidd ‐‐disable‐partx ‐‐disable‐fsck ‐‐disable‐losetup ‐‐disable‐mount ‐‐disable‐libmount ‐‐disable‐tls ‐‐without‐ncurses2)makemake installcd ..3)同上五、交叉编译mtd‐utils1)cd mtd‐utils‐1.5.1/2)make CROSS=arm‐none‐linux‐gnueabi‐ WITHOUT_XATTR=1查看下mtd‐utils‐1.0.0目录下是否生成了咱们所需要大工具(flashcp,nandwrite......等)。
有工具生成了,OK,交叉编译成功。
4)将生成大工具拷贝到文件系统开发板的根文件系统,放在/bin 或/sbin 都行。
再编译内核就OK拉。
五、补充如果交叉编译器为 4.3.x以上 ,编译不通过,请参考http://www.mail‐/ptxdist@pengutronix.de/msg01067.html/patch/12689/打补丁六、mtd‐utils工具命令的使用1)使用命令前用cat /proc/mtd 查看一下mtdchar字符设备;或者用ls ‐l /dev/mtd*#cat /proc/mtddev: size erasesize namemtd0: 00c00000 00020000 "ROOTFS"mtd1: 00200000 00020000 "BOOTLOADER"mtd2: 00200000 00020000 "KERNEL"mtd3: 03200000 00020000 "NAND ROOTFS partition"mtd4: 04b00000 00020000 "NAND DATAFS partition"为了更详细了解分区信息用mtd_debug命令#mtd_debug info /dev/mtdX (不能使用mtdblockX, mtdblockX 只是提供用來 mount 而已) mtd.type = MTD_NORFLASHmtd.flags =mtd.size = 12582912 (12M)mtd.erasesize = 131072 (128K)mtd.oobblock = 1mtd.oobsize = 0mtd.ecctype = (unknown ECC type ‐ new MTD API maybe?)regions = 02)命令:flash_erase作用:擦出指定范围内flash的内容,如果不指定,默认擦出起始位置的第一块,使相应flash 变为全1用法:flash_erase MTD‐device [start] [cnt (# erase blocks)] [lock]MTD-device:待擦出的分区,如/dev/mtd0start:起始位置设置,这里必须设置为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 | ‐‐helpfilename:待写入的数据device: 写入的分区,如/dev/mtd0eg: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 exiteg: ./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 addresseg:./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这两个工具或许更好点。