尊天命,尽人事
分类:
2011-09-02 15:24:37
原文地址:zz U-BOOT 1.1.3移植心得 作者:soararing
1.0 文档说明
本文记录了一个星期以来移植U-BOOT 1.1.3的全过程。尽管很多挫折,不过最后还是搞定,当U-BOOT 成功的自动启动内核后,太高兴了。为了以后不走弯路,写下如下的文档。
1.1 移植平台及环境
开发板:YL2410
内核版本:2.6.14
U-BOOT: 1.1.3(采用Luofuchong大侠所提供的补丁)
参考文档:
1)CalmArrow 《 U-BOOT BOOTM 引导的补充说明》
http://blog.chinaunix.net/u/21948/showart_389116.html
2)Luofuchong 大侠 《U-BOOT下使用bootm引导内核方法》
http://www.cnitblog.com/luofuchong/archive/2007/01/12/21834.html
3)Farway 《s3c2410的u-boot及linux2.6.10后的内核移植(包括nand,及skyeye模拟)》
4)creator 《UBOOT1.3.1到S3C2440移植心得》
http://blog.chinaunix.net/u1/49088/showart.php?id=1074139
感谢以上大侠留下的Blog
2.0 移植过程
STEP 1:
编译U-BOOT源码,可以PASS。
STEP2:
搭建TFTP环境,bootm内核,发现内核启动到
TCP bic registered
NET: Registered protocol family 1
end_request: I/O error, dev mtdblock2, sector 0
Buffer I/O error on device mtdblock2, logical block 0
end_request: I/O error, dev mtdblock2, sector 0
Buffer I/O error on device mtdblock2, logical block 0
end_request: I/O error, dev mtdblock2, sector 8
Buffer I/O error on device mtdblock2, logical block 1
end_request: I/O error, dev mtdblock2, sector 16
Buffer I/O error on device mtdblock2, logical block 2
end_request: I/O error, dev mtdblock2, sector 16
Buffer I/O error on device mtdblock2, logical block 2
end_request: I/O error, dev mtdblock2, sector 24
Buffer I/O error on device mtdblock2, logical block 3
end_request: I/O error, dev mtdblock2, sector 24
Buffer I/O error on device mtdblock2, logical block 3
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
停止,以为是启动参数设置的问题,但我用优龙自带的boot可以正常启动内核
在网络上查找了很多文章,怎么改都不行。后来仔细比对正常启动是的打印信息发现区别如下:
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics (U-BOOT启动信息)
S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics (优龙启动信息)
发现U-BOOT启动时,频率为202.800Mhz,而内核启动为200MHZ,做如下更改:
在MPLLCON这个寄存器的配置上。(board/s3c2410/s3c2410.c)
在VIVI:MPLLCON = 0x0005c040;计算出来的Mpll = 200Mhz
Uboot114:MPLLCON = 0x000a1031;计算出来的Mpll = 202Mhz
让人奇怪的是这种频率的不匹配为什么直到文件系统加载时才体现出来,其余的启动(包括我加的驱动启动都是成功的)
更改后根文件系统能够成功加载了,兴奋ing
这里可以参照Luofuchong大侠的文章写的很详细,现在拷贝下来:
1、首先,用u-boot/tools/mkimage这个工具为你的内核加上u-boot引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008040
2、下载内核
U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)
U-Boot code: 33F80000 -> 33F9BAC0 BSS: -> 33F9FBAC
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
sbc2410=>tftp 0x30008000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)
3.运行
sbc2410=>bootm 0x30008000
## Booting image at 30008000 ...
Image Name: linux-2.6.14
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1261056 Bytes = 1.2 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
内核启动信息省。。。。
三、固化
如果你想把镜像文件写入flash,每次开机后让u-boot帮你复制到sdram中,再使用bootm命令引导的话,可以按照这样操作:
sbc2410=>tftp 0x30008000 zImage.img
TFTP from server 192.168.1.115; our IP address is 192.168.1.128
Filename 'zImage.img'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263324 (1346dc hex)
sbc2410=>nand erase 0x30000 0x1d0000
NAND erase: device 0 offset 196608, size 1900544 ... OK
sbc2410=>nand write 0x30008000 0x30000 0x1d0000
NAND write: device 0 offset 196608, size 1900544 ... 1900544 bytes written: OK
sbc2410=>setenv bootcmd nand read 0x30008000 0x30000 0x1d0000\;bootm 0x30008000
sbc2410=>saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
在这个过程中需要注意的事情如下:
Bootcmd参数的设置最后是在配置文件中设置好,直接编译到uboot中否则会出现一些莫名其妙的错误,NAND 的读写分区地址需要根据内核中NAND分区的信息来确定,对NAND写之前需要先进行删除。
3.0 补充说明
1)屏幕打印信息对分析问题很重要,一定要注意仔细比较和分析
2)TFTP 的环境搭建见《TFTP使用说明书》