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处。
内核移植时遇到的一些问题
最新推荐文章于 2021-05-16 09:41:53 发布