移植u-boot到s3c2410開發(fā)板
說 明:這是u-boot移植文檔,移植到實驗室的遠峰s3c2410開發(fā)板(YF2410, 無NOR flash)。當時本來計劃細化后分幾部分貼在博客上,后來也沒做這項工作。正好前幾天轉(zhuǎn)了一篇在skyeye上運行u-boot的文章,順便貼出自己這 篇:)
1, 基本思路
==========
(1)思路
看參考資料(1),(2)對u-boot有了基本了解, 但沒有把握。嘗試進行修改后,感覺不理解。于是嘗試u-boot在ram中運行,當時覺得使用ICE很沒有把握,畢竟沒怎么用過,上網(wǎng)查資料,在"ADS 調(diào)試經(jīng)驗"文章中看到了方法,嘗試幾次后才成功。后來閱讀讀u-boot和vivi相關(guān)代碼,結(jié)合s3c2410文檔和"ARM SOC體系結(jié)構(gòu)"學(xué)習(xí)匯編語言,這樣對bootloader第一階段有了直接的了解,感覺心里有底了,這時"boot from nand flash"等文檔已經(jīng)找到,感覺如果第一階段成功,第二階段會更有把握"。最初的第一階段移植沒有遇到什么困難。
在第二階段一直中參考了vcam9開發(fā)板和"boot from nand flash",只是在"CFG_NO_FLASH"和"ENV"遇到些問題,認真分析后隨即解決。
這時反過來再修改第一階段代碼,在"move r10, lr"等語句的修改后,u-boot啟動失敗,第二天決定分析匯編語言,根據(jù)記憶查"skyeye"那本書,找到ojbectdump這個工具,反匯編后,問題解決。
總的來說,最大的問題就是基本工具的使用包括ICE,Makefile,binutils等。另外,高質(zhì)量的文檔不多。
(2)版本:arm-linux.gcc 3.3.2, u-boot 1.2.0。
(3) 與其它文檔的不同點
(3)-1,更注意將來的可移植性,u-boot第一階段從NAND flash到RAM的搬移代碼移植性更好,并且沒有加入mem_clear代碼。
(3)-2,更注意代碼是否清楚,nand_legacy_rw的cmd參數(shù)直接使用宏定義,而不是數(shù)字;
(3)-3,把內(nèi)容解釋清楚,不僅僅是操作文檔,
(4) 編譯器:3.3.2,使用3.4.1會出錯。
2, 基礎(chǔ)
=======
(1)基礎(chǔ)知識:
bootloader: 移植前要了解bootloader基本原理,看"嵌入式系統(tǒng)bootloader技術(shù)內(nèi)幕.pdf"
arm匯編:邊移植邊學(xué)習(xí),參考s3c2410手冊和ARM SOC體系結(jié)構(gòu)學(xué)習(xí),需要了解APCS(ARM過程調(diào)用標準)
(2)u-boot使用說明:僅介紹引導(dǎo)內(nèi)核所需命令:
(2)-1打補?。?/p>
假設(shè)你已經(jīng)進入要解壓縮u-boot的目錄,例如"/usr/src/s3c2410/"。且補丁文件"u-boot-1.2.0_patch_20070911_1317"位于該目錄。用管理員權(quán)限,因為編譯u-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啟動失敗的例子;tftpboot_successful是使用bootm成功的例子。zImage_2054也在同一個目錄。
B, 下載Linux內(nèi)核,這里只說明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ù)代碼和文檔,當環(huán)境變量"autostart=yes"時,tftpboot會自動引導(dǎo)下載的內(nèi)核。這個沒有試驗,待做。
C, 驗證內(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)核啟動正確,燒寫到flash中,并且設(shè)置啟動參數(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ū)一致。這里對應(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移植過程:
=================
本 次移植使用u-boot1.2.0,還不會用git,如果進一步做移植還是使用最新版比較好。整個的u-boot移植完成了兩部分:(1)u-boot第 一階段移植,完成從flash到sdram的復(fù)制;(2)u-boot第二階段移植,完成nand legacy操作函數(shù),saveenv函數(shù);
(1)u-boot在ram中運行
--------------------
目的:驗證u-boot能否正常啟動,為下一步工作打基礎(chǔ);
編譯方法:
make distclean #徹底刪除make產(chǎn)生的文件中間文件,如果開發(fā)過程中修改了目錄,需要
#distclean,否則依賴關(guān)系是舊的,無法編譯。一般下使用"make
# clean"刪除中間文件即可。
make smdk2410_config #配置u-boot為smdk2410配置文件,待做結(jié)合此看懂
#"mkconfig"文件
make ARCH=arm #編譯u-boot,執(zhí)行體系結(jié)構(gòu)是ARM
u- boot在ram中運行成功,日志見"s3c2410/bootloader/u-boot/in_ram",具體過程見"AXD_u- boot_ram_log",起始地址是從include/configs/smdf2410.h文件CFG_LOAD_ADDR宏看到的 (0x33000000)。
第一次做loadbinary(lb)時,System Output Monitor的Debog Log選項卡會顯示W(wǎng)arning,>說映象有錯,沒管它,繼續(xù)進行,可以啟動u-boot。后來這個Warning也不出出現(xiàn)了。這樣>對 flash的移植就有了基礎(chǔ)。繼續(xù)加油!
AXD運行bin文件的方法參考了"ARM ADS中的AXD 調(diào)試經(jīng)驗集錦",axf文件與bin文件的區(qū)別>見"ARM映象文件及執(zhí)行機理001"。
運行: AXD操作日志和u-boot啟動日志以及u-boot.bin見"s3c2410/bootloader/u-boot/in_ram"
注:如果鏈接出錯,可能是編譯器的問題,用3.4.1不行,3.3.2就可以,很奇怪。這和注>釋里面提到的需要用3.4以上編譯起矛盾(待做,查那個文檔的名字),下面是當時錯誤的記錄:
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