内核移植时遇到的一些问题

1 uboot传递给内核的参数问题,go是不能传递参数的,要想传递参数需要对代码进行一些修改,在其它的文档里已经总结了如何修改。我们利用bootm命令来启动内核。
/board/tc2410/tc2410.c
/* arch number of SMDK2410-Board */
	gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

	/* adress of boot parameters */
	gd->bd->bi_boot_params = 0x30000100;
而MACH_TYPE_SMDK2410在include/asm-arm/mach_type.h中定义了
#define MACH_TYPE_SMDK2410             193
因此我们可知bi_arch_number = 193
bi_boot_params= 0x30000100
这两个参数是传递到内核里去的,如果与内核里面的不相等,则linux不能启动。linux关于这两个参数的定义在arch/arm/tools/mach_types文件中定义了。
# machine_is_xxx	CONFIG_xxxx		MACH_TYPE_xxx		number
smdk2410		ARCH_SMDK2410		SMDK2410		193

可以看出类型都是SMDK2410,且为193。参数相等,可以启动。

2 tftp下载内核

 使用tftp下载过来是下在内存里面,断电以后就不存在了。因此如果要实现自启动,必须将它烧写到nandflash中去,可以使用Uboot的nand_erase,nand_write命令来实现。每次开机后让u-boot帮你复制到sdram中,再使用bootm命令引导的话,可以按照这样操作:
tc2410=>tftp 0x30008000 uImage2.6.18.6
TFTP from server 192.168.1.100; our IP address is 192.168.1.10
Filename 'uImage2.6.18.6'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)
tc2410=>nand erase 0x30000 0x200000 根据内核的分区信息填写
NAND erase: device 0 offset 196608, size 1900544 ... OK
tc2410=>nand write 0x30008000 0x30000 0x200000
NAND write: device 0 offset 196608, size 1900544 ... 1900544 bytes written: OK
bootm 0x30008000

如果想uboot中实现自启动内核,则可以使用下面的命令。
我默认的下载地址是0x30008000,因此采用这条自启动命令
tc2410=>setenv bootcmd nand read 0x30008000 0x30000 0x200000\;bootm 0x30008000
将0x30000到0x200000之间的内容读到内存中0x30008000的地址去,到这里发现一个问题,我的内核代码并没有完全占用0x30000到0x200000的所有空间,所以前面的nanderase可以不用擦写这么多多余的空间了。尤其是在大空间范围内时,没必要将所有的空间都擦除了。
tc2410=>saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done

tc2410=>reset
..........启动信息。可以自启动了。。。。。。。

3 下载文件系统,下面的信息只作示例,因为root_china.cramfs太大,我给我的filesystem只分了4M的大小,而这个文件有20多M.不过原理都是一样的
tc2410 # tftp 0x31000000   root_china.cramfs                                      
TFTP from server 192.168.1.100; our IP address is 192.168.1.10                  
Filename 'root_china.cramfs'.                                                   
Load address: 0x31000000  
##########################
tc2410=>nand erase 0x200000 0x600000 这里也一样,没必要将这个范围内的所有块都擦除,不过我也擦除了,才4M而已,没什么关系。
tc2410=>nand write  0x31000000 0x200000 0x600000

4 烧进去以后再启动,出错
unable to open an initial console
根据网上的资料说明,在2.6的内核挂载文件系统时,必须在/dev目录下添加console,null设备。
具体操作:切换到root权限,以及转到dev目录
mknod -m 660 null c 1 3
mknod -m 660 console 5 1具体什么意思我也不懂。
先少进板子里看看吧。以后有机会了再自己制作文件系统。
mkcramfs的用法
 Mkcramfs [-h][--eedition][-l file][-n name] Dirname,outputfile
./mkcramfs root root.img
在dev目录下添加了console,null后,再启动。一切OK。移植结束!


5 一些资料
引导cramfs的linux_cmd_line
param set linux_cmd_line "noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock2 rootfstype=cramfs mem=64M"
引导nfs的linux_cmd_line
param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.111:/nfs/FriendlyARM/QQ2440/root_nfs  ip=192.168.1.70:192.168.1.111:192.168.1.111:255.255.255.0:QQ2440V3.arm9.net:eth0:off"

引导yaffs的linux_cmd_line
param set linux_cmd_line "noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock2 rootfstype=yaffs mem=64M"

下载文件系统,如何设置bootargs 
Uboot>setenv bootargs root=/dev/mtdblock3 rw initrd=0x21100000,6000000 ramdisk_size=15360


不管是从哪起动,uboot是用来引导linux的,如果uboot的bootargs设置了的话,uboot在引导Linux时会用bootargs替换掉linux的command string。

Uboot的一些命令
bdinfo 输出板上的一些信息。
1. nand得到所有命令列表
2. help: help usb, 列出USB功能的使用说明
3. ping:注:只能开发板PING别的机器
4. setenv: 设置互环境变量:
5. setenv serverip 192.168.0.1
6. setenv ipaddr 192.168.0.56
7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’
8. saveenv: 保存环境变量
9. 在设置好环境变量以后, 保存变量值
10. tftp: tftp 32000000 vmlinux, 把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
11. kgo: 起动没有压缩的linux内核,kgo 32000000
12. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
13. protect: 对FLASH进行写保护或取消写保护, protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护
14. erase: 删除FLASH的扇区, erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
15. cp: 在内存中复制内容, cp 32000000 0 40000(把内存中0x32000000开始的0x40000字节复制到0x0处)
16. mw: 对RAM中的内容写操作, mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
17. md: 修改RAM中的内容, md 32000000(内存的起始地址)
18. usb:
l usb start: 起动usb 功能
l usb info: 列出设备
l usb scan: 扫描usb storage(u 盘)设备
19. fatls:列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件
20. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000 aa.txt
21. 把USB中的aa.txt 读到物理内存0x32000000处!
22. flinfo: 列出flash的信息
23. loadb: 准备用 KERMIT协议接收来自kermit或超级终端传送的文件。
24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值