??
字號(hào):
轉(zhuǎn)載一篇44b0上的u-boot移植文章
最近接了一個(gè)帶本科生嵌入式系統(tǒng)實(shí)驗(yàn)的SRTP的項(xiàng)目,要求1、uClinux的移植;2、鍵盤驅(qū)動(dòng)的編寫;3、文件系統(tǒng)。拿到了一塊很老的S3C44B0的板子,配套的東西很爛,給的armboot是bin格式的。所以決定自己移植u-boot,還能學(xué)到點(diǎn)東西。回過(guò)頭來(lái)搜了一下網(wǎng)上的一些經(jīng)驗(yàn),發(fā)現(xiàn)了這個(gè)帖子,看的我后心脹的不得了!--原因是,他上邊遇到的問(wèn)題,我也都遇到了,也曾困擾了我很久。如果早發(fā)現(xiàn),我也就不會(huì)那么辛苦了。下面就把這片文章貼出來(lái),我也懶得寫,也算是我做的東西的一個(gè)記錄吧(借他人之文邀功?哈哈)
--------------------------------------------------------------------------------
轉(zhuǎn)載自:http://www.hzlitai.com.cn/bbs/dispbbs.asp?boardID=9&ID=5142&page=1
幾經(jīng)艱辛,終于基本完成了u-boot在s3c44b0的移植工作,在些記錄一下在移植過(guò)程中所碰到的困難和解決方法(一些心得),作為日后參考之用,也希望能夠幫到其它有需要的人^_^。
1.來(lái)由:
在我搞完ucos后(本來(lái)我是想學(xué)uclinux的,不過(guò)在對(duì)系統(tǒng)一無(wú)所知的情況下,還是先學(xué)一下ucos比較實(shí)際^_^,從中也可以對(duì)系統(tǒng)有個(gè)清晰的概念),我意識(shí)到要搞系統(tǒng)的話一個(gè)功能強(qiáng)大的bootloader是必不可少的,而我的板上自帶的是armboot(其實(shí)我個(gè)人覺(jué)得應(yīng)用在ARM上的話armboot已經(jīng)足夠了,畢竟u-boot也是從armboot中發(fā)展過(guò)來(lái)的,純屬個(gè)人意見),如果我的板上自帶光盤有已經(jīng)移植好的armboot源代碼供我參考的話,我想我也不會(huì)花這么多時(shí)間去搞u-boot,可恨的是我的光盤上只有armboot.bin這個(gè)二進(jìn)制文件,而沒(méi)有源文件,沒(méi)辦法,我下定主意自己搞一個(gè),考慮了一番后我選擇了u-boot,畢竟參考資料相對(duì)比較多,再我學(xué)完u-boot后再回頭看armboot,簡(jiǎn)直是一個(gè)爐里出的餅,這是后話。
2.準(zhǔn)備:
說(shuō)是容易,做起來(lái)卻挺難。因?yàn)榫幾gu-boot要在linux環(huán)境下,而不能在我們平時(shí)所熟悉的ads下那么直觀。首先要建立好交叉編譯環(huán)境,這個(gè)交叉編譯環(huán)境可以自己來(lái)做,不過(guò)完全沒(méi)必要,而且難度也挺大,一般是下載人家編譯好的工具。我剛開始在這里就郁悶了很久,現(xiàn)在會(huì)了以后覺(jué)得原來(lái)就是這么簡(jiǎn)單,在些我把方法說(shuō)清楚,希望不會(huì)再有人為這個(gè)問(wèn)題郁悶了^_^:
1) 在網(wǎng)上下載一個(gè)u-boot源代碼,我用的是1.1.2版本的,最新的應(yīng)該是1.1.4的吧,其實(shí)差不多,那就像我那樣下載一個(gè)1.1.2版本的吧。把源文件解壓,這個(gè)應(yīng)該不用說(shuō)了吧,學(xué)過(guò)linux的人應(yīng)該會(huì),不會(huì)的話我想你繼續(xù)做下去也困難,那就先裝個(gè)linux用下吧(我用的是RedHat的,哦對(duì)了,編譯程序是需要gcc編譯器的,所以安裝方式一定要選擇工作站哦^_^)。好了,解壓后你發(fā)現(xiàn)在u-boot.1.1.2目錄下有Makefile這個(gè)文件吧?讓我們看看它里面的內(nèi)容,最簡(jiǎn)單的方法就是vi Makefile了。我們要看的是它選擇的是哪一個(gè)交叉編譯器。可以看到這一項(xiàng):
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是說(shuō)這里所用的交叉編譯器是arm-linux-gcc了,(u-boot默認(rèn)是用這個(gè)的,也有用arm-elf-gcc的,網(wǎng)上有個(gè)工具包arm-elf-tools-20030314.sh,我試過(guò)用它來(lái)編譯,沒(méi)有問(wèn)題,順便提一下,arm-elf-gcc是用來(lái)編譯uClinux內(nèi)核的工具來(lái)的)那你就下載一個(gè)arm-linux-的交叉編譯器吧,我是在網(wǎng)上下載cross-2.95.3.tar.bz2這個(gè)文件,然后解壓得到2.95.3版本的交叉編譯工具的,具體設(shè)置如下(參考網(wǎng)上資料):
2)在宿主機(jī)上建立arm-linux-gcc交叉編譯環(huán)境
在RedHat Linux系統(tǒng)下以root用戶登錄,
將cross-2.95.3.tar.bz2文件復(fù)制到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個(gè)命令會(huì)在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯程序,
然后在PATH變量中添加一項(xiàng):/usr/local/arm/2.95.3/bin.
[root@localhost root]# export ATH=/usr/local/arm/2.95.3/bin:$PATH
或
把PATH=/usr/local/arm/2.95.3/bin:$PATH添加到/ETC/bash_profile文件中
或者
在/etc/bashrc文件中添加一項(xiàng):
export PATH=/usr/local/arm/2.95.3/bin:$PATH
測(cè)試:
把終端關(guān)閉,重新打開后執(zhí)行如下命令:
# arm-linux-gcc –v
好了,建立好交叉編譯環(huán)境后可以試著編譯u-boot了
這里提幾個(gè)注意點(diǎn):
1.不可用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種文件(就個(gè)可能新手會(huì)犯,一般熟悉linux命令的人應(yīng)該都不會(huì)這樣做吧,在此還是要提一下)
2.可能下載的文件有一些中間文件會(huì)阻礙編譯的運(yùn)行,所以在編譯前最好來(lái)個(gè)徹底清除,在u-boot.1.1.2目錄下運(yùn)行命令:make distclean (其實(shí)這個(gè)命令在Makefile文件下就有)我當(dāng)時(shí)為這個(gè)問(wèn)題郁悶了很久,希望你們不會(huì)像我這樣^_^);
3,有些人為了方便想在cygwin下編譯,但是經(jīng)常在網(wǎng)上看到在這個(gè)虛擬平臺(tái)下編譯有很多的問(wèn)題,要配置的東西也多,而且好像我用過(guò)那個(gè)vi沒(méi)有l(wèi)inux環(huán)境下的好用,所以最好還是不要用這個(gè)軟件了吧,如果你真的離不開windows的話可以像我這樣裝個(gè)虛擬機(jī),在虛擬機(jī)下再裝linux的系統(tǒng),具體參考這個(gè)網(wǎng)站):http://fedora.linuxsir.org/doc/vmware/
3)好了,現(xiàn)在開始測(cè)試你的交叉編譯器搞好沒(méi)有。在u-boot.1.1.2目錄下執(zhí)行如下命令:
1) Make distclean (再次強(qiáng)調(diào))
2) Make B2_config(隨便再個(gè)現(xiàn)成的試試^_^)
3) Make (沒(méi)錯(cuò)的話應(yīng)該會(huì)生成u-boot.bin文件,發(fā)生錯(cuò)誤的話也不怕,只要細(xì)心看一下哪里錯(cuò)就行了,gcc碰到錯(cuò)誤后會(huì)退出編譯,所以可以一個(gè)個(gè)錯(cuò)誤來(lái)改,一般的問(wèn)題都是沒(méi)找到編譯器(可能你沒(méi)裝或者裝的不對(duì),例如人家用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環(huán)境變量設(shè)好了沒(méi)有,前面有講,如果不關(guān)編譯器的事的話那就再看看,一般是文件的后綴不對(duì),有些文件后綴是大寫的,例如start.S但是如果你的是start.s小寫的話那當(dāng)然找不到(解決方法很,把它改成大寫就行了)。細(xì)心看吧,不用怕,它都有注明路徑,很容易可以找到的))
如果以上步驟都無(wú)誤的話那么恭喜你,你的交叉編譯環(huán)境可以用來(lái)編譯你的u-boot源代碼了,可以開始以下階段。
u-boot移植日記2(新手必讀)
3.移植:
說(shuō)時(shí)遲那時(shí)快,現(xiàn)在開始移植工作(以下是我一步步重新做一遍,力求說(shuō)得詳細(xì)點(diǎn),感謝我吧^_^)
我以B2板子的程序做為模板來(lái)做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (這是我取的板子名字,可以換上你的,但是后面的也要跟著來(lái)?yè)Q哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (自己取個(gè)板子名)
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改myboards3c44b0里面的Makefile, 把B2改成myboards3c44b0,編譯時(shí)如果報(bào)的其它類似找不到B2的錯(cuò)誤也是把相應(yīng)的B2改成myboards3c44b0來(lái)處理。
1)其中的myboards3c44b0.c文件是板的初始化代碼,看一下就知道,根據(jù)你的板上自帶的44binit.s來(lái)修改吧。memsetup.S文件主要是存儲(chǔ)器的初始化設(shè)置,其實(shí)也是44binit.s里面的一部分。
2)其實(shí)board這里要修改的不多,先跳過(guò)flash部分吧,我們來(lái)看一下cpu設(shè)置部分吧。
u-boot-1.1.2里面已經(jīng)加入了對(duì)s3c44b0的支持,讓我們來(lái)看一下cpu/s3c44b0里面的部分吧。
看到start.S這個(gè)文件了嗎?要修改的其實(shí)并不多,按照你的板設(shè)置一下中斷跳轉(zhuǎn)矢量就行了,或者上網(wǎng)查一下吧,應(yīng)該很容易看明的。其中cpu.c這個(gè)文件簡(jiǎn)直不用修改,再來(lái)看一下serial.c這個(gè)文件吧,改一下波特率的設(shè)置就行,就是你用多少M(fèi)的CPU頻率的話對(duì)應(yīng)的波特率參數(shù)設(shè)置問(wèn)題,其實(shí)B2已經(jīng)做得不錯(cuò)的了,很多子程序都不用自己寫的了^_^,在我的板上是這樣設(shè)置的,參考一下吧:
#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的這些66改成60,原因,我的實(shí)驗(yàn)板上用的頻率是60(44B0最高頻率為64M)。然后其它分頻系數(shù),寄存器初始化設(shè)置,可以參考一下44blib.c,在這里我給出我的設(shè)置出來(lái)吧,可以參考一下。
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;
UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;
我在這方面算術(shù)不好,所以都是參考人家的。
3)好,再加上個(gè)頭文件:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
這個(gè)頭文件其實(shí)要改的地方還挺多的,我等下再說(shuō)怎樣修改。先回到u-boot.1.1.2目錄,
4)在Makefile里面加上這部分,不會(huì)的話就模仿B2來(lái)寫吧^_^
在B2的這部分文件
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上這部分:
myboards3c44b0_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
切記在@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard前面的是Tab來(lái)的,萬(wàn)萬(wàn)不能用空格代替,因?yàn)樗强窟@個(gè)來(lái)識(shí)別命令的!
5)好,現(xiàn)在可以在u-boot-1.1.2目錄下執(zhí)行如下命令:
Make distclean(還是用這個(gè)吧,比較徹底)
Make myboards3c44b0_config
Make
看看有沒(méi)有錯(cuò),有錯(cuò)的話按著提示來(lái)改,如果沒(méi)錯(cuò)的話應(yīng)該就能生成u-boot.bin這個(gè)文件,現(xiàn)在還不能用哦,因?yàn)檫@幾是B2的一個(gè)仿制品而已(注:在我的機(jī)上到這一步可沒(méi)有報(bào)錯(cuò)哦,你一步步按著來(lái)做的話應(yīng)該也不會(huì)有什么錯(cuò)誤吧^_^)
u-boot移植日記3(新手必讀)
6)好,現(xiàn)在繼續(xù)修改u-boot-1.1.2/include/configs/myboards3c44b0.h這個(gè)文件。
#define CONFIG_INIT_CRITICAL 1 這個(gè)在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中調(diào)試而是固化到flash中運(yùn)行的話,這個(gè)必不可少。
找到 #define CONFIG_B2 1 把B2改成myboards3c44b0吧(不然就不會(huì)編譯你的板了)
找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 你的44b0x應(yīng)該沒(méi)有75M吧 我的是改成60的
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -