Linux-2.6.32.2在mini2440移植时常见问题

来源:互联网 发布:找网络工作 编辑:程序博客网 时间:2024/04/29 23:46

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           //延时

1uboot中设置命令行启动参数: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-0x400x30007fc0)。结果可以成功引导。

[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

3ftl_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.2mini2440上的移植。

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是指的bitsconsole=ttySAC[,options] 同上面。看你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4ttyS2.6ttySAC,但实际情况是官方文档中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。

init: 指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinitpreinit 的内容一般是创建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 rwroot=/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=[<server-ip>:]<root-dir>[,<nfs-options>]

如果指令列上没有给定 nfsroot 参数,则将使用‘/tftpboot/%s’预设值。其它选项如下:

<server-ip> :指定网络文件系统服务端的互联网地址(IP address)。如果没有给定此栏位,则使用由 nfsaddrs 变量(见下面)所决定的值。此参数的用途之一是允许使用不同机器作为反向地址解析协议(RARP)及网络文件系统服务端。通常你可以不管它(设为空白)。


 

 

 

原创粉丝点击