您的位置:首页 > 其它

嵌入式系统移植常见问题与解决方案备忘

2009-12-28 11:56 441 查看
//=========================================================//
编译U-BOOT
在主目录下:
make clean
make mini2440_config
make
//==========================================================//
tftp 192.168.0.67(服务器IP)
get zImage.img (测试)

在串口(目标板上)
printenv (查看环境变量)
setenv (修改环境变量)
saveenv (保存环境变量)
tftp 300080000 zImage.img (下载内核印象到内存地址30008000开始的段)

//===========================================================//
linux2.6.29.4移植中,需要对NAND分区部分代码进行修改。友善的源码中,对于这个分区的代码是在
arch/arm/plat-s3c24xx/common-frendly-arm.c中,一般的源码不是在这个位置,这点要注意。
一般的源码是在arch/arm/plat-s3c24xx/common-smdk.c中

在内核中arch/arm/mach-s3c2440/mach- smdk2440.c下面的 MACHINE_START函数,里面有设置MATCH_TYPE,
这个东西要与U-BOOT中的设置一致。不然引导内核时,参数传递会出错。
另外,UBOOT能应到的内核是交了一个40K封装头的zImage.img文件,这个文件要用mkimage工具生成。
我们一开始编译出来的内核,是zImage文件(在 arch/arm/boot/中),可以用VIVI引导。但是用了mkimage工具后,生成的
zImage.img才能被UBOOT引导,而且这个时候还无法挂载文件系统。

因为板子上的根文件系统为yaffs2 这时候内核还没有这个文件系统的支持,需要我们加上去
拷贝友善的送的2.6.29下的fs/yaffs2目录 到我们的fs目录下
然后修改观察一下友善的送的2.6.29下的“fs/jffs2/Kconfig” 上面加上 source “fs/yaffs2/Kconfig”
在Makefile中的 obj-$(CONFIG_FAT_FS) += fat/ 上面加上 obj-$(CONFIG_YAFFS_FS) += yaffs2/

然后在配置的 File systems->Miscellaneous filesystems 中选上 “YAFFS2 file system support” “Autoselect yaffs2 format” “Cache short names in RAM”

http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380143fd3d1027fa3c215cc7903160627b4fb70790d548d98297a40e91a1ab1a12b71370026b498cc8241ddb990232489243f701e864419d913b2df037881769f04b2f35eadadf043ccfd8389c85523dd54716d8180cd114243&p=8565d60086cc4bea0be297121b&user=baidu&fast=y
这个网页说道了很多移植内核可能遇到的问题。

//=============================================================//

移植U-BOOT-2009.03
遇到的问题
1:下载到板上,一点反应都没有
后来发现是在start.s中设置时钟前多写了3句话,

2:下载到板上,提示不能识别nand,
原因是在driver/mtd/nand/nand.c文件中,IO_BASE这个东西要在前面定义为全局变量,并且在hwcontl函数中赋值。这个函数很重要,对NAND的所有操作都要经过它,所以要格外小心,不能错。

3:能识别NAND了,但是启动后,串口不断输出读写的BYTE,似乎是死循环。
原因,在board.c中,对NAND初始化完成后的函数,接着是一个从NAND中获取环境变量到内存的函数,这个函数中有debugen函数,打印获取的字节。因为前面调试的时候屏蔽了#if 0 define debugen printf 因此,会不断打印东西。

4:boot the kernel 没反应
原因,在board/samsung/mini2440/mini2440.c中,mach_type被定义为S3C2440 ,应该改为MINI2440,其实这个MINI2440在另外一个文件被定义为1999.

5:可以boot the kernel,但是LCD有现实,串口没反应,或者是在boot the kernel 没反应
原因:环境变量设置没对,应该设置环境变量中的控制台为console=ttySAC0,115200n81

6:ichi128M NAND
为了支持128MNAND,需要额外注意NAND的那些参数红定义,已经 CONFIG_CMD_NAND_IS_IN_NAND 这几个宏的使用和屏蔽关系。详见攻略。

7:参数传递不成功,不能启动内核。
原因:Linux内核的启动参数可以由内核默认设定,也可以通过u-boot传递。相对来说,u-boot传递的灵活性更强,只须设置bootargs环境变量即可;而内核的默认设置改变,则需要重新编译内核。
#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
这几个红定义需要添加在include/configs/mini2440.h中详见http://blog.chinaunix.net/u2/73911/showart_1088249.html

8:不能挂在文件系统
原因:要先使用VIVI的功能,下载文件系统到NAND,然后修改控制台参数为root=/dev/mtdblock2 init=/linuxrc。

9:修改环境变量后,使用printenv打印出来的环境变量没有改变。
原因:环境变量是从NAND中读出来的,之前NAND的那个区域已经有环境变量了,所以要重新下载U_BOOT,在下载之前,要使用F命令,格式化一下。

9:使用TFTP下载内核到内存30008000,然后使用nand write命令,写到nand ,启动失败,分析可能是nand write有问题。

10: 不能使用nand write写文件系统到nand.

//==============================================================//

一些系统启动容易出现的问题:(这部分摘自http://hi.baidu.com/3444542/blog/item/508b595c52a77648faf2c028.html

1.Bad Magic Number
## Booting image at 33000000 ...
Bad Magic Number
OMAP5912 OSK # (tftp下载好kernel的uImage后就停止在这,不能启动kernel)

问题原因:启动参数设置错误,0x30000000处不可以执行。
有的开发板sdram不是在0x33000000,所以不能把kernel uImage下载到0x33000000中运行。如我之前的bootcmd参数为:setenv bootcmd tftpboot 33000000 uImage/; bootm 33000000。但板子Omap5912的sdram地址在0x100000000,将参数改为setenv bootcmd tftpboot 10000000 uImage/; bootm 10000000后便可以启动kernel了。

2.启动停止在"Starting kernel ..."
TFTP from server 192.168.167.170; our IP address is 192.168.167.15
Filename 'uImage'
Load address: 0x10000000
Loading: #################################################################
#################################################################
done
Bytes transferred = 2025908 (1ee9b4 hex)
## Booting image at 10000000 ...
Image Name: Linux-2.6.18-mh8_pro500-versatil
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2025844 Bytes = 1.9 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ... (卡在这里)

问题原因:多半是kernel没编译成功。
确认configure参数是否配置正确,是否选择了正确的目标编译平台,如smdk2410等。

3.不能启动kernel
Starting kernel ...
Uncompressing Linux.........................................................
.................... done, booting the kernel.

问题原因:可能是Bootargs参数设置错误,确认bootargs设置是否正确。

4.不能挂载nfs
eth0: link up
IP-Config: Complete:
device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
host=192.168.167.15, domain=, nis-domain=(none),
bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.167.170
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.167.170 not responding, timed out
Root-NFS: Server returned error -5 while mounting /work/nfs/rootfs_bluetooth_omap
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

问题原因:这种情况通常是nfs配置问题。
确认uboot的bootargs参数里和nfs相关的ip地址信息设置是否正确,以及Host机/etc/exports配置无误,重起nfs服务,重新尝试连接。另外还需要注意bootargs内console和mem两个参数的设置。kernel2.6后console最好设置为ttySAC0,mem也要根据开发板实际情况设置正确。

5.文件系统不能启动问题
eth0: link up
IP-Config: Complete:
device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
host=192.168.167.15, domain=, nis-domain=(none),
bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Looking up port of RPC 100005/1 on 192.168.167.170
VFS: Mounted root (nfs filesystem).
Freeing init memory: 128K
/sbin/initKernel panic - not syncing: Attempted to kill init!

问题原因:制作的文件系统缺少运行busybox所需的libcrypt.so库,新版本会有缺库提示,老版本(1.60)没有。
注:运行一个busybox文件系统至少需要如下几个库:
ld-linux.so.x
libc.so.6
libcrypt.so.x
较新版本的busybox可能还需要
libm.so.6
libgcc_s.so.x (x为版本号)
6.文件系统不能启动问题2
eth0: link up
IP-Config: Complete:
device=eth0, addr=192.168.167.15, mask=255.255.255.0, gw=192.168.167.254,
host=192.168.167.15, domain=, nis-domain=(none),
bootserver=192.168.167.170, rootserver=192.168.167.170, rootpath=
Looking up port of RPC 100003/2 on 192.168.167.170
Looking up port of RPC 100005/1 on 192.168.167.170
VFS: Mounted root (nfs filesystem).
Freeing init memory: 128K
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

问题原因:对比一个可用的文件系统后发现,缺少了ld-linux.so.x库,文件系统里只有ld-linux.so.x的连接文件,少拷了库文件。

8.不能获得帐户UID信息
Could not get password database information for UID of current process: User "???" unknown or no memory to allocate password entry
Unknown username "root" in message bus configuration file
Could not get password database information for UID of current process: User "???" unknown or no memory to allocate password entry
Failed to start message bus: Could not get UID and GID for username "root"

问题原因:
情况一:系统帐户验证出现问题.怀疑是调用getuid、getguid时并没有返回正确值,可能是缺少帐户验证相关库,实际排查后发现,缺少libnss_files库。拷贝交叉编译器的libnss_files库到文件系统后,启动文件系统成功。
情况二:系统没有root帐号。可以由whoami命令看出。
手动创建帐号。
#vi /etc/passwd
root:x:0:0:root:/root:/bin/sh
kyo:x:500:500:kyo:/home/kyo:/bin/bash
添加组
#vi group
root:x:0:root

9.
Freeing init memory: 128K
init started: BusyBox v1.6.1 (2007-08-27 14:33:15 CST) multi-call binary
starting pid 834, tty '': '/etc/init.d/rcS'
Cannot run '/etc/init.d/rcS': No such file or directory
Please press Enter to activate this console.
发现没有/etc/init.d/rcS文件系统一样能正常启动。看来rcS只是用来设置一些随机启动的参数,对文件能否正常运行关系不大。 注:这个不是错误,是偶然发现! :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: