移植u-boot到s3c2410開發(fā)板
說(shuō) 明:這是u-boot移植文檔,移植到實(shí)驗(yàn)室的遠(yuǎn)峰s3c2410開發(fā)板(YF2410, 無(wú)NOR flash)。當(dāng)時(shí)本來(lái)計(jì)劃細(xì)化后分幾部分貼在博客上,后來(lái)也沒(méi)做這項(xiàng)工作。正好前幾天轉(zhuǎn)了一篇在skyeye上運(yùn)行u-boot的文章,順便貼出自己這 篇:)
1, 基本思路
==========
(1)思路
看參考資料(1),(2)對(duì)u-boot有了基本了解, 但沒(méi)有把握。嘗試進(jìn)行修改后,感覺(jué)不理解。于是嘗試u-boot在ram中運(yùn)行,當(dāng)時(shí)覺(jué)得使用ICE很沒(méi)有把握,畢竟沒(méi)怎么用過(guò),上網(wǎng)查資料,在"ADS 調(diào)試經(jīng)驗(yàn)"文章中看到了方法,嘗試幾次后才成功。后來(lái)閱讀讀u-boot和vivi相關(guān)代碼,結(jié)合s3c2410文檔和"ARM SOC體系結(jié)構(gòu)"學(xué)習(xí)匯編語(yǔ)言,這樣對(duì)bootloader第一階段有了直接的了解,感覺(jué)心里有底了,這時(shí)"boot from nand flash"等文檔已經(jīng)找到,感覺(jué)如果第一階段成功,第二階段會(huì)更有把握"。最初的第一階段移植沒(méi)有遇到什么困難。
在第二階段一直中參考了vcam9開發(fā)板和"boot from nand flash",只是在"CFG_NO_FLASH"和"ENV"遇到些問(wèn)題,認(rèn)真分析后隨即解決。
這時(shí)反過(guò)來(lái)再修改第一階段代碼,在"move r10, lr"等語(yǔ)句的修改后,u-boot啟動(dòng)失敗,第二天決定分析匯編語(yǔ)言,根據(jù)記憶查"skyeye"那本書,找到ojbectdump這個(gè)工具,反匯編后,問(wèn)題解決。
總的來(lái)說(shuō),最大的問(wèn)題就是基本工具的使用包括ICE,Makefile,binutils等。另外,高質(zhì)量的文檔不多。
(2)版本:arm-linux.gcc 3.3.2, u-boot 1.2.0。
(3) 與其它文檔的不同點(diǎn)
(3)-1,更注意將來(lái)的可移植性,u-boot第一階段從NAND flash到RAM的搬移代碼移植性更好,并且沒(méi)有加入mem_clear代碼。
(3)-2,更注意代碼是否清楚,nand_legacy_rw的cmd參數(shù)直接使用宏定義,而不是數(shù)字;
(3)-3,把內(nèi)容解釋清楚,不僅僅是操作文檔,
(4) 編譯器:3.3.2,使用3.4.1會(huì)出錯(cuò)。
2, 基礎(chǔ)
=======
(1)基礎(chǔ)知識(shí):
bootloader: 移植前要了解bootloader基本原理,看"嵌入式系統(tǒng)bootloader技術(shù)內(nèi)幕.pdf"
arm匯編:邊移植邊學(xué)習(xí),參考s3c2410手冊(cè)和ARM SOC體系結(jié)構(gòu)學(xué)習(xí),需要了解APCS(ARM過(guò)程調(diào)用標(biāo)準(zhǔn))
(2)u-boot使用說(shuō)明:僅介紹引導(dǎo)內(nèi)核所需命令:
(2)-1打補(bǔ)?。?/p>
假設(shè)你已經(jīng)進(jìn)入要解壓縮u-boot的目錄,例如"/usr/src/s3c2410/"。且補(bǔ)丁文件"u-boot-1.2.0_patch_20070911_1317"位于該目錄。用管理員權(quán)限,因?yàn)榫幾gu-boot也需要管理員權(quán)限。
tar jxvf u-boot-1.2.0.tar.bz2
cd u-boot-1.2.0
patch -p1 < ../u-boot-1.2.0_patch_20070911_1317
(2)-2編譯u-boot
(2)-3燒寫flash
(2)-4下載Linux內(nèi)核。
A,用mkimage生成u-boot引導(dǎo)所需映像:
[root@localhost tools]# ./mkimage -A arm -O Linux -T kernel -C none -a
0x30008000 -e 0x30008000 -n Linux2.6.14 -d zImage_2054 zImage_2054_mk
Image Name: Linux2.6.14
Created: Wed Sep 5 20:47:53 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.91 kB = 0.93 MB
Load Address: 0x30008000
Entry Point: 0x30008000
見"s3c2410/bootloader/u-boot/BootLinux",tftpboot是使用go啟動(dòng)失敗的例子;tftpboot_successful是使用bootm成功的例子。zImage_2054也在同一個(gè)目錄。
B, 下載Linux內(nèi)核,這里只說(shuō)明windows下使用tftp的方法。Linux方法見"ARM_Yuanfenglog-20070313.txt"。
windows下是使用tftpd32提供tftp服務(wù),不需要設(shè)置,安裝后即可使用。
tftpboot 31000000 zImage_2054_mk
TFTP from server 172.23.19.132; our IP address is 172.23.19.60
Filename 'zImage_2054_mk'.
Load address: 0x31000000
Loading: *^H#################################################################
#################################################################
#############################################################
done
Bytes transferred = 976868 (ee7e4 hex)
設(shè)置環(huán)境變量:
setenv gatewayip 172.23.19.254
保存環(huán)境變量:
saveenv
注:根據(jù)代碼和文檔,當(dāng)環(huán)境變量"autostart=yes"時(shí),tftpboot會(huì)自動(dòng)引導(dǎo)下載的內(nèi)核。這個(gè)沒(méi)有試驗(yàn),待做。
C, 驗(yàn)證內(nèi)核是否正確:
YF2410 # bootm 31000000
## Booting image at 31000000 ...
Image Name: Linux2.6.14
Created: 2007-09-05 20:47:53 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.9 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing
Linux................................................................ done,
booting the kernel.
Linux version 2.6.14 (root@localhost.localdomain) (gcc version 3.4.1) #1 Wed
Aug 22 20:56:33 GMT 2007
......
D, 內(nèi)核啟動(dòng)正確,燒寫到flash中,并且設(shè)置啟動(dòng)參數(shù):
tftpboot 31000000 zImage_2054_mk
TFTP from server 172.23.19.132; our IP address is 172.23.19.60
Filename 'zImage_2054_mk'.
Load address: 0x31000000
Loading: *^H#####################################T############################
##########################################T #######################
#############################################################
done
Bytes transferred = 976868 (ee7e4 hex)
YF2410 # nand erase 40000 f0000
NAND erase: device 0 offset 262144, size 983040 ...
OK
YF2410 # nand write 31000000 40000 f0000
NAND write: device 0 offset 262144, size 983040 ...
983040 bytes written: OK
YF2410 # setenv bootcmd nand read 31000000 40000 f0000;bootm 31000000
YF2410 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
注意,這里的偏移設(shè)置要和Linux內(nèi)核中設(shè)置的NAND flash分區(qū)一致。這里對(duì)應(yīng)kernel分區(qū)。
(2)-5,重啟開發(fā)板:
U-Boot 1.2.0 (Sep 5 2007 - 10:08:14)
DRAM: 64 MB
NAND: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 2 ^H^H^H 1 ^H^H^H 0
NAND read: device 0 offset 262144, size 983040 ...
983040 bytes read: OK
## Booting image at 31000000 ...
Image Name: Linux2.6.14
Created: 2007-09-05 20:47:53 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.9 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing
Linux................................................................ done,
booting the kernel.
......
3, u-boot移植過(guò)程:
=================
本 次移植使用u-boot1.2.0,還不會(huì)用git,如果進(jìn)一步做移植還是使用最新版比較好。整個(gè)的u-boot移植完成了兩部分:(1)u-boot第 一階段移植,完成從flash到sdram的復(fù)制;(2)u-boot第二階段移植,完成nand legacy操作函數(shù),saveenv函數(shù);
(1)u-boot在ram中運(yùn)行
--------------------
目的:驗(yàn)證u-boot能否正常啟動(dòng),為下一步工作打基礎(chǔ);
編譯方法:
make distclean #徹底刪除make產(chǎn)生的文件中間文件,如果開發(fā)過(guò)程中修改了目錄,需要
#distclean,否則依賴關(guān)系是舊的,無(wú)法編譯。一般下使用"make
# clean"刪除中間文件即可。
make smdk2410_config #配置u-boot為smdk2410配置文件,待做結(jié)合此看懂
#"mkconfig"文件
make ARCH=arm #編譯u-boot,執(zhí)行體系結(jié)構(gòu)是ARM
u- boot在ram中運(yùn)行成功,日志見"s3c2410/bootloader/u-boot/in_ram",具體過(guò)程見"AXD_u- boot_ram_log",起始地址是從include/configs/smdf2410.h文件CFG_LOAD_ADDR宏看到的 (0x33000000)。
第一次做loadbinary(lb)時(shí),System Output Monitor的Debog Log選項(xiàng)卡會(huì)顯示W(wǎng)arning,>說(shuō)映象有錯(cuò),沒(méi)管它,繼續(xù)進(jìn)行,可以啟動(dòng)u-boot。后來(lái)這個(gè)Warning也不出出現(xiàn)了。這樣>對(duì) flash的移植就有了基礎(chǔ)。繼續(xù)加油!
AXD運(yùn)行bin文件的方法參考了"ARM ADS中的AXD 調(diào)試經(jīng)驗(yàn)集錦",axf文件與bin文件的區(qū)別>見"ARM映象文件及執(zhí)行機(jī)理001"。
運(yùn)行: AXD操作日志和u-boot啟動(dòng)日志以及u-boot.bin見"s3c2410/bootloader/u-boot/in_ram"
注:如果鏈接出錯(cuò),可能是編譯器的問(wèn)題,用3.4.1不行,3.3.2就可以,很奇怪。這和注>釋里面提到的需要用3.4以上編譯起矛盾(待做,查那個(gè)文檔的名字),下面是當(dāng)時(shí)錯(cuò)誤的記錄:
cd /usr/src/s3c2420-linux/bootloader/u-boot-1.2.0 && arm-linux-ld -Bstatic -T
/usr/src/s3c2420-linux/bootloader/u-boot-1.2.0/board/YF2410/u-boot.lds -Ttext
0x33F80000 $UNDEF_SYM cpu/arm920t/start.o
--start-group lib_generic/libgeneric.a
board/YF2410/libYF2410.a cpu/arm920t/libarm920t.a
cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a
fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a
rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a
drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a
post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1 -lgcc
-Map u-boot.map -o u-boot