Linux-2.6.32.2在mini2440移植时常见问题
首先感谢网友的贡献。
本机环境参数
baudrate=115200
ethaddr=08:08:11:18:12:27 //目标板网卡地址(软地址)
ipaddr=192.168.1.226 //目标板IP
gatewayip=192.168.1.1
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
lcdtype=w
ethact=dm9000
serverip=192.168.1.72 //服务器IP
bootdelay=3 //延时
1、uboot中设置命令行启动参数:undefined instruction错误
<1>、NFS启动
setenv bootargs noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/nfs rw nfsroot=192.168.1.72:/nfsroot ip=192.168.1.226:192.168.1.72:192.168.1.1:255.255.255.0::eth0:off
setenv bootcmd "nfs 0x31000000 192.168.1.72:/nfsroot/rootfs/uImage;bootm 0x31000000"
<2>、TFTP启动
setenv bootargs noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock3 rw rootfstype=yaffs ip=192.168.1.226:192.168.1.72:192.168.1.1:255.255.255.0::eth0:off
setenv bootcmd=tftp 0x31000000 uImage;bootm 0x31000000 或者使用
bootcmd "nand read 0x30008000 0x80000 0x300000;bootm 0x30008000"
切记不要将0x30008000作为下载地址。因为内核期望的入口地址为0x30008000,所以将加载地址向前减去0x40个字节,变成0x30007fc0(0x30008000-0x40=0x30007fc0)。结果可以成功引导。
[u-boot@SMDK2440A]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 ...
Image Name: Linux-2.6.32.2
Created: 2012-11-30 12:03:32 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2111192 Bytes = 2 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK
Starting kernel ...
undefined instruction
pc : [<30008008>] lr : [<33fa6a9c>]
sp : 33f3ddfc ip : 00000000 fp : 30000100
r10: 000007cf r9 : 33f12688 r8 : 33f3ffe0
r7 : 30008000 r6 : 33fc3d18 r5 : 00000000 r4 : 33f3ffc4
r3 : 00000000 r2 : 30000100 r1 : 000007cf r0 : 300001dc
Flags: nzCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...
resetting ...
<3>、修改启动参数时,可以在linux-2.6.32.2顶层目录下的.config文件查找
#define CONFIG_BOOTARGS "noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/mtdblock3 rw rootfstype=yaffs ip=10.1.0.129:10.1.0.128:10.1.0.1:255.255.255.0::eth0:off"
2、交叉工具链版本太或者Linux版本低
在Fedora14下,使用arm-linux-gcc-4.3.2无法通过yaffs2的编译,纠结了好久,后来采用arm-linux-gcc-4.4.3。而把arm-linux-gcc-4.4.3放置Redhat rnterprise 5.1中也容易出问题。这是在Fedora14下用arm-linux-gcc-4.3.2出现的错误。
#make zImage
LD fs/sysfs/built-in.o
CC fs/yaffs2/yaffs_ecc.o
CC fs/yaffs2/yaffs_vfs.o
In function 'yaffs_link':
fs/yaffs2/yaffs_vfs.c:309: error: implicit declaration of function 'set_nlink'
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_setattr':
fs/yaffs2/yaffs_vfs.c:526: error: implicit declaration of function 'setattr_copy'
fs/yaffs2/yaffs_vfs.c:529: error: implicit declaration of function 'truncate_setsize'
fs/yaffs2/yaffs_vfs.c: At top level:
fs/yaffs2/yaffs_vfs.c:875: warning: initialization from incompatible pointer type
fs/yaffs2/yaffs_vfs.c:906: warning: initialization from incompatible pointer type
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_evict_inode':
fs/yaffs2/yaffs_vfs.c:1066: error: implicit declaration of function 'end_writeback'
fs/yaffs2/yaffs_vfs.c: At top level:
fs/yaffs2/yaffs_vfs.c:1957: error: unknown field 'evict_inode' specified in initializer
fs/yaffs2/yaffs_vfs.c:1957: warning: initialization from incompatible pointer type
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_mount':
fs/yaffs2/yaffs_vfs.c:2310: error: implicit declaration of function 'mount_bdev'
fs/yaffs2/yaffs_vfs.c:2311: warning: return makes pointer from integer without a cast
fs/yaffs2/yaffs_vfs.c: At top level:
fs/yaffs2/yaffs_vfs.c:2317: error: unknown field 'mount' specified in initializer
fs/yaffs2/yaffs_vfs.c:2317: warning: initialization makes integer from pointer without a cast
fs/yaffs2/yaffs_vfs.c: In function 'yaffs2_mount':
fs/yaffs2/yaffs_vfs.c:2332: warning: return makes pointer from integer without a cast
fs/yaffs2/yaffs_vfs.c: At top level:
fs/yaffs2/yaffs_vfs.c:2338: error: unknown field 'mount' specified in initializer
fs/yaffs2/yaffs_vfs.c:2338: warning: initialization makes integer from pointer without a cast
make[2]: *** [fs/yaffs2/yaffs_vfs.o] Error 1
make[1]: *** [fs/yaffs2] Error 2
make: *** [fs] Error 2
3、ftl_cs: FTL header not found错误。可以采取如下措施:
Make clean下,重新编译,切记~~~
重新配置内核,取消下面三个选项(黄色部分)。
在Make menuconfig时:
Device Drivers ->
Memory Technology Devices (MTD) ->
不要选择下面这三个选项
<>FTL (Flash Translation Layer) support
<> NFTL (NAND Flash Translation Layer) support
<>INFTL (Inverse NAND Flash Translation Layer) support
然后保存配置并重新编译即可
4、编译Busybox错误。
执行make命令,报错,错误信息:437 “mixed implicit and normal rules”,在makefile中:
<1>、将437行代码config %config: scripts_basic outputmakefile FORCE改:
%config: scripts_basic outputmakefile FORCE
<2>、将1288行代码:/ %/: prepare scripts FORCE(错)改为:
%/: prepare scripts FORCE(对)
即可编译通过!具体的行数请参照实际的make报错信息!
参考文献:
友善官网移植文件Linux-2.6.32.2在mini2440上的移植。
http://blog.csdn.net/chengwei05192008/archive/2010/12/29/6105386.aspx
补充:
bootargs参数解析:
initrd, noinitrd: 当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
console: console=tty 使用虚拟串口终端设备 。console=ttyS[,options] 使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶位(从来没有看过使用过),n是指的bits。console=ttySAC[,options] 同上面。看你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4用ttyS,2.6用ttySAC,但实际情况是官方文档中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。
init: 指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit 的内容一般是创建console,null 设备节点,运行init 程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。如果内核找不到linurc文件,将会依次搜索 /sbin/init , /etc/init ,/bin/init,/bin/sh。
mem: 指定内存大小,不是必须的。
root: 用来指定rootfs的位置, 常见的情况有:
root=/dev/ram rw
root=/dev/ram0 rw
请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x
上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
root=/dev/nfs,并非真的设备,而是一个告诉内核经由网络取得根文件系统的旗标。 在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot,这个参数告诉内核以哪一台机器,哪个目录以及哪个网络文件系统选项作为根文件系统使用。参数的格式如下:
nfsroot=[
如果指令列上没有给定 nfsroot 参数,则将使用‘/tftpboot/%s’预设值。其它选项如下: