u-boot移植日記
u-boot移植日記 很好的文章
•
u-boot移植日記 很好的文章(轉載) 06.10.27 from darkhero 相關文章(2) 來源 以文找文上一篇 下一篇
Tag:嵌入式應用 這篇文章不錯,快看看收藏了該文章的所有2人,我也要收藏
幾經艱辛,終於基本完成了u-boot在s3c44b0的移植工作,在些記錄一下在移植過程中所碰到的困難和解決方法(一
些心得),作為日後參考之用,也希望能夠幫到其它有需要的人^_^。
1.來由:
在我搞完ucos後(本來我是想學uclinux的,不過在對系統一無所知的情況下,還是先學一下ucos比較實際^_^,從中也
可以對系統有個清晰的概念),我意識到要搞系統的話一個功能強大的bootloader是必不可少的,而我的板上自帶的
是armboot(其實我個人覺得應用在ARM上的話armboot已經足夠了,畢竟u-boot也是從armboot中發展過來的,純屬
個人意見),如果我的板上自帶光碟有已經移植好的armboot原始程式碼供我參考的話,我想我也不會花這麼多時間去搞
u-boot,可恨的是我的光碟上只有armboot.bin這個二進位檔案,而沒有原始檔案,沒辦法,我下定主意自己搞一個,考
慮了一番後我選擇了u-boot,畢竟參考資料相對比較多,再我學完u-boot後再回頭看armboot,簡直是一個爐裡出的
餅,這是後話。
2.準備:
說是容易,做起來卻挺難。因為編譯u-boot要在linux環境下,而不能在我們平時所熟悉的ads下那麼直觀。首
先要建立好交叉編譯環境,這個交叉編譯環境可以自己來做,不過完全沒必要,而且難度也挺大,一般是下載人家
編譯好的工具。我剛開始在這裡就鬱悶了很久,現在會了以後覺得原來就是這麼簡單,在些我把方法說清楚,希望
不會再有人為這個問題鬱悶了^_^:
file:///E|/sxn/u-boot移植日記 很好的文章.htm(第 1/12 頁)2008-1-3 13:22:16
u-boot移植日記 很好的文章
1) 在網上下載一個u-boot原始程式碼,我用的是1.1.2版本的,最新的應該是1.1.4的吧,其實差不多,那就像我那樣下載
一個1.1.2版本的吧。把原始檔案解壓,這個應該不用說了吧,學過linux的人應該會,不會的話我想你繼續做下去也困
難,那就先裝個linux用下吧(我用的是RedHat的,哦對了,編譯器是需要gcc編譯器的,所以安裝方式一定要選擇
工作站哦^_^)。好了,解壓後你發現在u-boot.1.1.2目錄下有Makefile這個檔吧?讓我們看看它裡面的內容,最簡
單的方法就是vi Makefile了。我們要看的是它選擇的是哪一個交叉編譯器。可以看到這一項:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是說這裡所用的交叉編譯器是arm-linux-gcc了,(u-boot默認是用這個的,也有用arm-elf-gcc的,網上
有個工具包arm-elf-tools-20030314.sh,我試過用它來編譯,沒有問題,順便提一下,arm-elf-gcc是用來編譯uClinux內
核的工具來的)那你就下載一個arm-linux-的交叉編譯器吧,我是在網上下載cross-2.95.3.tar.bz2這個檔,然後解壓
得到2.95.3版本的交叉編譯工具的,具體設置如下(參考網上資料):
2)在宿主機上建立arm-linux-gcc交叉編譯環境
在RedHat Linux系統下以root使用者登錄,
將cross-2.95.3.tar.bz2檔複製到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個命令會在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯器,
然後在PATH變數中添加一項:/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文件中添加一項:
export PATH=/usr/local/arm/2.95.3/bin:$PATH
測試:
把終端關閉,重新打開後執行如下命令:
# arm-linux-gcc –v
好了,建立好交叉編譯環境後可以試著編譯u-boot了
這裡提幾個注意點:
1.不可用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種檔(就個可能新手會犯,一般熟悉linux命令的人
應該都不會這樣做吧,在此還是要提一下)
2.可能下載的檔有一些中間檔會阻礙編譯的運行,所以在編譯前最好來個徹底清除,在u-boot.1.1.2目錄下運行
命令:make distclean (其實這個命令在Makefile檔下就有)我當時為這個問題鬱悶了很久,希望你們不會像我這
樣^_^);
3,有些人為了方便想在cygwin下編譯,但是經常在網上看到在這個虛擬平臺下編譯有很多的問題,要配置的東西也
多,而且好像我用過那個vi沒有linux環境下的好用,所以最好還是不要用這個軟體了吧,如果你真的離不開windows
的話可以像我這樣裝個虛擬機器,在虛擬機器下再裝linux的系統,具體參考這個網站):http://fedora.linuxsir.org/doc/
vmware/
3)好了,現在開始測試你的交叉編譯器搞好沒有。在u-boot.1.1.2目錄下執行如下命令:
1) Make distclean (再次強調)
2) Make B2_config(隨便再個現成的試試^_^)
3) Make (沒錯的話應該會生成u-boot.bin檔,發生錯誤的話也不怕,只要細心看一下哪裡錯就行了,gcc碰到錯
誤後會退出編譯,所以可以一個個錯誤來改,一般的問題都是沒找到編譯器(可能你沒裝或者裝的不對,例如人家
用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環境變數設好了沒有,前面有講,如果不關編譯器的
事的話那就再看看,一般是檔的尾碼不對,有些檔尾碼是大寫的,例如start.S但是如果你的是start.s小寫的話那
當然找不到(解決方法很,把它改成大寫就行了)。細心看吧,不用怕,它都有注明路徑,很容易可以找到的))
如果以上步驟都無誤的話那麼恭喜你,你的交叉編譯環境可以用來編譯你的u-boot原始程式碼了,可以開始以下階段。
u-boot移植日記2(新手必讀)
3.移植:
說時遲那時快,現在開始移植工作(以下是我一步步重新做一遍,力求說得詳細點,感謝我吧^_^)
我以B2板子的程式做為範本來做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (這是我取的板子名字,可以換上你的,但是後面的也要跟著來換哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (自己取個板子名)
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改myboards3c44b0裡面的Makefile, 把B2改成myboards3c44b0,編譯時如果報的其它類似找不到B2的錯誤也是把相
應的B2改成myboards3c44b0來處理。
1)其中的myboards3c44b0.c文件是板的初始化代碼,看一下就知道,根據你的板上自帶的44binit.s來修改吧。
memsetup.S檔主要是記憶體的初始化設置,其實也是44binit.s裡面的一部分。
2)其實board這裡要修改的不多,先跳過flash部分吧,我們來看一下cpu設置部分吧。
u-boot-1.1.2裡面已經加入了對s3c44b0的支持,讓我們來看一下cpu/s3c44b0裡面的部分吧。
看到start.S這個檔了嗎?要修改的其實並不多,按照你的板設置一下中斷跳轉向量就行了,或者上網查一下吧,
應該很容易看明的。其中cpu.c這個檔簡直不用修改,再來看一下serial.c這個檔吧,改一下串列傳輸速率的設置就行,
就是你用多少M的CPU頻率的話對應的串列傳輸速率參數設置問題,其實B2已經做得不錯的了,很多副程式都不用自己寫
的了^_^,在我的板上是這樣設置的,參考一下吧:
#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的這些66改成60,原因,我的實驗板上用的頻率是60(44B0最
高頻率為64M)。然後其它分頻係數,寄存器初始化設置,可以參考一下44blib.c,在這裡我給出我的設置出來吧,
可以參考一下。
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;
UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;
我在這方面算術不好,所以都是參考人家的。
3)好,再加上個標頭檔:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
這個頭檔其實要改的地方還挺多的,我等下再說怎樣修改。先回到u-boot.1.1.2目錄,
4)在Makefile裡面加上這部分,不會的話就模仿B2來寫吧^_^
在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來的,萬萬不能用空格代替,
因為它是靠這個來識別命令的!
5)好,現在可以在u-boot-1.1.2目錄下執行如下命令:
Make distclean(還是用這個吧,比較徹底)
Make myboards3c44b0_config
Make
看看有沒有錯,有錯的話按著提示來改,如果沒錯的話應該就能生成u-boot.bin這個檔,現在還不能用哦,因為這
幾是B2的一個仿製品而已(注:在我的機上到這一步可沒有報錯哦,你一步步按著來做的話應該也不會有什麼錯誤
u-boot移植日記3(新手必讀)
6)好,現在繼續修改u-boot-1.1.2/include/configs/myboards3c44b0.h這個檔。
#define CONFIG_INIT_CRITICAL 1 這個在cpu/s3c44b0/start.S裡面用到,如果你的u-boot程式不是在sdram中調
試而是固化到flash中運行的話,這個必不可少。
找到 #define CONFIG_B2 1 把B2改成myboards3c44b0吧(不然就不會編譯你的板了)
找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 你的44b0x應該沒有75M吧 我的是改成60的
找到Size of malloc() pool這部分設置,改成這樣吧,反正我是照著人家來做的,你自己研究下吧^_^。
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
#define CFG_ENV_SIZE (64*1024) /* 1024 bytes may be used for env vars*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH 1 這個必不可少,如果你想把你的參數保存到flash的話(有些板是保存到
EEPRAM中去的,但是s3c44b0的話還是保存到flash吧)
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 這個就是你的參數保存在flash裡的起始位址了
#define CFG_ENV_OFFSET 0x40000 這個我後來看它來源程式發現如果你上一步沒有設置它的起始位址的話就會用
它來作默認地址的了
#define CONFIG_AUTO_COMPLETE
其它地方沒有深究哦,有些好像不要也行,你就試試吧。
找到Hardware drivers部分,這應該是網路晶片設置吧,參考一下這個吧(要看晶片的):
#define CONFIG_DRIVER_RTL8019 這個就要看你的板上用的是什麼網卡了(這個是臺灣出的,有10M)
#define RTL8019_BASE 0x06000000 這個是網卡相就寄存器的起始位址
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 應該是重試的次數吧
#define CONFIG_BAUDRATE 115200 設置串列傳輸速率
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_DATE | \
CFG_CMD_ELF | \
CFG_CMD_NET | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
CFG_CMD_FAT | \
CFG_CMD_JFFS2)
把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,雖然不改也是可以的,具體沒考究。
以下是板上env參數設置,看一下吧,其實我覺得瞭解一下就行的了,只是一些初始設置值,以後可以用命令
setenv saveenv來修改的。
#define CONFIG_BOOTDELAY 3 這個就是運行bootcmd之前的等待時間
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引導uClinux的時候傳遞的參數,不會
就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 網卡的物理位址MAC
#define CONFIG_NETMASK 255.255.255.0 遮罩位址,設置過ip的人都應該知道吧
#define CONFIG_IPADDR 192.168.0.30 這是你板上網卡8019的ip位址
#define CONFIG_SERVERIP 192.168.0.10 這是你宿主機的ip地址,以後用tftp下載的時候用到,一定要跟你的
宿主機一致才行。
#define CONFIG_BOOTFILE "u-boot.bin" 這個就是你要下載檔案的默認名字
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 這是bootdelay後運行的命令
Miscellaneous configurable options部分,參考一下吧:
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "s3c44b0=>" 這是進入命令模式下的提示符,改個帥一點的吧
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 100 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR 0x0c008000 默認的下載地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供選擇的串列傳輸速率
Physical Memory Map部分,比較重要,修改你的sdram和flash的位址和容量。
#define CONFIG_NR_DRAM_BANKS 1 我們只佔用了一個Bank用來映射sdram
#define PHYS_SDRAM_1 0x0c000000 sdram的起始位址
#define PHYS_SDRAM_1_SIZE 0x00800000 sdram的容量(8M)
#define PHYS_FLASH_1 0x00000000 flash的起始位址
#define PHYS_FLASH_SIZE flash的容量(2M)
#define CFG_FLASH_BASE PHYS_FLASH_1 定義多個名字而已,其它地方會用到
FLASH organization部分,看注釋應該知道了吧,參考一下:
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) */
#define CFG_FLASH_WRITE_TOUT 4000 /* Timeout for Flash Write (in ms) */
按著來一步步的做應該不難,這裡提一下vi程式的用法,其實在google一搜就找到了,不過為了方便大家,還是說一
聲吧,
在命令模式下:
按/ xxx再回車即可搜索到你所需要的內容(xxx),再按n搜索下一個,按shift+n搜索上一個
按:xxx即可跟到你想要的行
按:set nu顯示行號
其它查書都可以找到就不說了。
做到這個時候,你可以再編譯一下,看有沒有錯,這一步我就沒有幫你們做了,不過我覺得應該不會有問題吧,下
載到ram中運行,看看效果。
u-boot移植日記4(新手必讀)
7)終於到了flash的設置部分了,這完全是我個人悟出來的,網上資料好像講得不是先清楚。
首先介紹一下flash的識別吧,每塊flash都有一個id,前部分用來說明生產廠家,後部分用來說明它的容量,類型,
位數等。它們的定義是在u-boot-1.1.2/include/flash.h中,就以我的ssts9vf1601為例:
file:///E|/sxn/u-boot移植日記 很好的文章.htm(第 10/12 頁)2008-1-3 13:22:16
u-boot移植日記 很好的文章
#define SST_MANUFACT 0x00BF00BF 這是生產廠家id
#define SST_ID_xF1601 0x234B234B 這是它的型號,容量,位元數等id
#define FLASH_SST160A 0x0046 這個我還說不清楚,有個要注意的問題是像sst160是不能用奇位址的,我做的
過程中是把SST160A改成SST1601的,懶得幫它創一個
好了,相信你已經找到你的板上所用的flash對應的id號了吧?現在就來談談怎麼改。
先進入u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它裡面已經幫SST160A設置好了,我的做法是把SST公司的160A都改成1601,是不是很簡單,當然你也可以幫1601
再寫一分,但是我是個懶人,所以我就樣做了^_^
到這裡還有個問題沒提到的,就是如果你重新用setenv saveenv 設置了參數,但是復位後會發現怎麼沒有保存到的
(不信你試試看)。其實我是故意留到這裡講的,應該它不會報錯,可以說是比較隱秘的問題,所以我故意放到這
裡來說,以引起你的重視。
解決方法:vi u-boot-1.1.2/board/myboard/common/flash.c
找到這個函數:write_buff
裡面有這句話:#ifdef CONFIG_B2
要把B2改了,因為我們的板不叫B2,那叫什麼呢?原來是在這裡定義的:u-boot-1.1.2/include/configs/
myboards3c44b0.h
裡面有這句話:#define CONFIG_HFRK 你不喜歡HFRK這個名字也行,可以改成別的名字,只不過相應地前面的B2
也要改成這個名字而已。
4.後記:
本來是想剛做好的時候寫的,但是後來發現有些功能實現不了,所以就停住了筆,等我搞好了以後,又急著去學
習uClinux的移植,真的很忙,現在終於抽空把它寫完。雖然有些地方還沒說清楚(畢竟我對它的瞭解還不是很深,
但我相信在我以後移植系統的過程中會逐步加深對它的瞭解),我還是希望它能成為最詳盡的u-boot移植新手指
導,對u-boot移植的初學者起到實質性的作用,這樣就不枉我花了這麼多的心思來寫這個文檔。
reference: http://wenku.baidu.com/view/837cd47f1711cc7931b71675
•
u-boot移植日記 很好的文章(轉載) 06.10.27 from darkhero 相關文章(2) 來源 以文找文上一篇 下一篇
Tag:嵌入式應用 這篇文章不錯,快看看收藏了該文章的所有2人,我也要收藏
幾經艱辛,終於基本完成了u-boot在s3c44b0的移植工作,在些記錄一下在移植過程中所碰到的困難和解決方法(一
些心得),作為日後參考之用,也希望能夠幫到其它有需要的人^_^。
1.來由:
在我搞完ucos後(本來我是想學uclinux的,不過在對系統一無所知的情況下,還是先學一下ucos比較實際^_^,從中也
可以對系統有個清晰的概念),我意識到要搞系統的話一個功能強大的bootloader是必不可少的,而我的板上自帶的
是armboot(其實我個人覺得應用在ARM上的話armboot已經足夠了,畢竟u-boot也是從armboot中發展過來的,純屬
個人意見),如果我的板上自帶光碟有已經移植好的armboot原始程式碼供我參考的話,我想我也不會花這麼多時間去搞
u-boot,可恨的是我的光碟上只有armboot.bin這個二進位檔案,而沒有原始檔案,沒辦法,我下定主意自己搞一個,考
慮了一番後我選擇了u-boot,畢竟參考資料相對比較多,再我學完u-boot後再回頭看armboot,簡直是一個爐裡出的
餅,這是後話。
2.準備:
說是容易,做起來卻挺難。因為編譯u-boot要在linux環境下,而不能在我們平時所熟悉的ads下那麼直觀。首
先要建立好交叉編譯環境,這個交叉編譯環境可以自己來做,不過完全沒必要,而且難度也挺大,一般是下載人家
編譯好的工具。我剛開始在這裡就鬱悶了很久,現在會了以後覺得原來就是這麼簡單,在些我把方法說清楚,希望
不會再有人為這個問題鬱悶了^_^:
file:///E|/sxn/u-boot移植日記 很好的文章.htm(第 1/12 頁)2008-1-3 13:22:16
u-boot移植日記 很好的文章
1) 在網上下載一個u-boot原始程式碼,我用的是1.1.2版本的,最新的應該是1.1.4的吧,其實差不多,那就像我那樣下載
一個1.1.2版本的吧。把原始檔案解壓,這個應該不用說了吧,學過linux的人應該會,不會的話我想你繼續做下去也困
難,那就先裝個linux用下吧(我用的是RedHat的,哦對了,編譯器是需要gcc編譯器的,所以安裝方式一定要選擇
工作站哦^_^)。好了,解壓後你發現在u-boot.1.1.2目錄下有Makefile這個檔吧?讓我們看看它裡面的內容,最簡
單的方法就是vi Makefile了。我們要看的是它選擇的是哪一個交叉編譯器。可以看到這一項:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是說這裡所用的交叉編譯器是arm-linux-gcc了,(u-boot默認是用這個的,也有用arm-elf-gcc的,網上
有個工具包arm-elf-tools-20030314.sh,我試過用它來編譯,沒有問題,順便提一下,arm-elf-gcc是用來編譯uClinux內
核的工具來的)那你就下載一個arm-linux-的交叉編譯器吧,我是在網上下載cross-2.95.3.tar.bz2這個檔,然後解壓
得到2.95.3版本的交叉編譯工具的,具體設置如下(參考網上資料):
2)在宿主機上建立arm-linux-gcc交叉編譯環境
在RedHat Linux系統下以root使用者登錄,
將cross-2.95.3.tar.bz2檔複製到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個命令會在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯器,
然後在PATH變數中添加一項:/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文件中添加一項:
export PATH=/usr/local/arm/2.95.3/bin:$PATH
測試:
把終端關閉,重新打開後執行如下命令:
# arm-linux-gcc –v
好了,建立好交叉編譯環境後可以試著編譯u-boot了
這裡提幾個注意點:
1.不可用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種檔(就個可能新手會犯,一般熟悉linux命令的人
應該都不會這樣做吧,在此還是要提一下)
2.可能下載的檔有一些中間檔會阻礙編譯的運行,所以在編譯前最好來個徹底清除,在u-boot.1.1.2目錄下運行
命令:make distclean (其實這個命令在Makefile檔下就有)我當時為這個問題鬱悶了很久,希望你們不會像我這
樣^_^);
3,有些人為了方便想在cygwin下編譯,但是經常在網上看到在這個虛擬平臺下編譯有很多的問題,要配置的東西也
多,而且好像我用過那個vi沒有linux環境下的好用,所以最好還是不要用這個軟體了吧,如果你真的離不開windows
的話可以像我這樣裝個虛擬機器,在虛擬機器下再裝linux的系統,具體參考這個網站):http://fedora.linuxsir.org/doc/
vmware/
3)好了,現在開始測試你的交叉編譯器搞好沒有。在u-boot.1.1.2目錄下執行如下命令:
1) Make distclean (再次強調)
2) Make B2_config(隨便再個現成的試試^_^)
3) Make (沒錯的話應該會生成u-boot.bin檔,發生錯誤的話也不怕,只要細心看一下哪裡錯就行了,gcc碰到錯
誤後會退出編譯,所以可以一個個錯誤來改,一般的問題都是沒找到編譯器(可能你沒裝或者裝的不對,例如人家
用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環境變數設好了沒有,前面有講,如果不關編譯器的
事的話那就再看看,一般是檔的尾碼不對,有些檔尾碼是大寫的,例如start.S但是如果你的是start.s小寫的話那
當然找不到(解決方法很,把它改成大寫就行了)。細心看吧,不用怕,它都有注明路徑,很容易可以找到的))
如果以上步驟都無誤的話那麼恭喜你,你的交叉編譯環境可以用來編譯你的u-boot原始程式碼了,可以開始以下階段。
u-boot移植日記2(新手必讀)
3.移植:
說時遲那時快,現在開始移植工作(以下是我一步步重新做一遍,力求說得詳細點,感謝我吧^_^)
我以B2板子的程式做為範本來做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (這是我取的板子名字,可以換上你的,但是後面的也要跟著來換哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (自己取個板子名)
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改myboards3c44b0裡面的Makefile, 把B2改成myboards3c44b0,編譯時如果報的其它類似找不到B2的錯誤也是把相
應的B2改成myboards3c44b0來處理。
1)其中的myboards3c44b0.c文件是板的初始化代碼,看一下就知道,根據你的板上自帶的44binit.s來修改吧。
memsetup.S檔主要是記憶體的初始化設置,其實也是44binit.s裡面的一部分。
2)其實board這裡要修改的不多,先跳過flash部分吧,我們來看一下cpu設置部分吧。
u-boot-1.1.2裡面已經加入了對s3c44b0的支持,讓我們來看一下cpu/s3c44b0裡面的部分吧。
看到start.S這個檔了嗎?要修改的其實並不多,按照你的板設置一下中斷跳轉向量就行了,或者上網查一下吧,
應該很容易看明的。其中cpu.c這個檔簡直不用修改,再來看一下serial.c這個檔吧,改一下串列傳輸速率的設置就行,
就是你用多少M的CPU頻率的話對應的串列傳輸速率參數設置問題,其實B2已經做得不錯的了,很多副程式都不用自己寫
的了^_^,在我的板上是這樣設置的,參考一下吧:
#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的這些66改成60,原因,我的實驗板上用的頻率是60(44B0最
高頻率為64M)。然後其它分頻係數,寄存器初始化設置,可以參考一下44blib.c,在這裡我給出我的設置出來吧,
可以參考一下。
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;
UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;
我在這方面算術不好,所以都是參考人家的。
3)好,再加上個標頭檔:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
這個頭檔其實要改的地方還挺多的,我等下再說怎樣修改。先回到u-boot.1.1.2目錄,
4)在Makefile裡面加上這部分,不會的話就模仿B2來寫吧^_^
在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來的,萬萬不能用空格代替,
因為它是靠這個來識別命令的!
5)好,現在可以在u-boot-1.1.2目錄下執行如下命令:
Make distclean(還是用這個吧,比較徹底)
Make myboards3c44b0_config
Make
看看有沒有錯,有錯的話按著提示來改,如果沒錯的話應該就能生成u-boot.bin這個檔,現在還不能用哦,因為這
幾是B2的一個仿製品而已(注:在我的機上到這一步可沒有報錯哦,你一步步按著來做的話應該也不會有什麼錯誤
u-boot移植日記3(新手必讀)
6)好,現在繼續修改u-boot-1.1.2/include/configs/myboards3c44b0.h這個檔。
#define CONFIG_INIT_CRITICAL 1 這個在cpu/s3c44b0/start.S裡面用到,如果你的u-boot程式不是在sdram中調
試而是固化到flash中運行的話,這個必不可少。
找到 #define CONFIG_B2 1 把B2改成myboards3c44b0吧(不然就不會編譯你的板了)
找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 你的44b0x應該沒有75M吧 我的是改成60的
找到Size of malloc() pool這部分設置,改成這樣吧,反正我是照著人家來做的,你自己研究下吧^_^。
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
#define CFG_ENV_SIZE (64*1024) /* 1024 bytes may be used for env vars*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH 1 這個必不可少,如果你想把你的參數保存到flash的話(有些板是保存到
EEPRAM中去的,但是s3c44b0的話還是保存到flash吧)
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 這個就是你的參數保存在flash裡的起始位址了
#define CFG_ENV_OFFSET 0x40000 這個我後來看它來源程式發現如果你上一步沒有設置它的起始位址的話就會用
它來作默認地址的了
#define CONFIG_AUTO_COMPLETE
其它地方沒有深究哦,有些好像不要也行,你就試試吧。
找到Hardware drivers部分,這應該是網路晶片設置吧,參考一下這個吧(要看晶片的):
#define CONFIG_DRIVER_RTL8019 這個就要看你的板上用的是什麼網卡了(這個是臺灣出的,有10M)
#define RTL8019_BASE 0x06000000 這個是網卡相就寄存器的起始位址
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 應該是重試的次數吧
#define CONFIG_BAUDRATE 115200 設置串列傳輸速率
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_DATE | \
CFG_CMD_ELF | \
CFG_CMD_NET | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
CFG_CMD_FAT | \
CFG_CMD_JFFS2)
把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,雖然不改也是可以的,具體沒考究。
以下是板上env參數設置,看一下吧,其實我覺得瞭解一下就行的了,只是一些初始設置值,以後可以用命令
setenv saveenv來修改的。
#define CONFIG_BOOTDELAY 3 這個就是運行bootcmd之前的等待時間
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引導uClinux的時候傳遞的參數,不會
就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 網卡的物理位址MAC
#define CONFIG_NETMASK 255.255.255.0 遮罩位址,設置過ip的人都應該知道吧
#define CONFIG_IPADDR 192.168.0.30 這是你板上網卡8019的ip位址
#define CONFIG_SERVERIP 192.168.0.10 這是你宿主機的ip地址,以後用tftp下載的時候用到,一定要跟你的
宿主機一致才行。
#define CONFIG_BOOTFILE "u-boot.bin" 這個就是你要下載檔案的默認名字
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 這是bootdelay後運行的命令
Miscellaneous configurable options部分,參考一下吧:
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "s3c44b0=>" 這是進入命令模式下的提示符,改個帥一點的吧
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 100 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR 0x0c008000 默認的下載地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供選擇的串列傳輸速率
Physical Memory Map部分,比較重要,修改你的sdram和flash的位址和容量。
#define CONFIG_NR_DRAM_BANKS 1 我們只佔用了一個Bank用來映射sdram
#define PHYS_SDRAM_1 0x0c000000 sdram的起始位址
#define PHYS_SDRAM_1_SIZE 0x00800000 sdram的容量(8M)
#define PHYS_FLASH_1 0x00000000 flash的起始位址
#define PHYS_FLASH_SIZE flash的容量(2M)
#define CFG_FLASH_BASE PHYS_FLASH_1 定義多個名字而已,其它地方會用到
FLASH organization部分,看注釋應該知道了吧,參考一下:
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) */
#define CFG_FLASH_WRITE_TOUT 4000 /* Timeout for Flash Write (in ms) */
按著來一步步的做應該不難,這裡提一下vi程式的用法,其實在google一搜就找到了,不過為了方便大家,還是說一
聲吧,
在命令模式下:
按/ xxx再回車即可搜索到你所需要的內容(xxx),再按n搜索下一個,按shift+n搜索上一個
按:xxx即可跟到你想要的行
按:set nu顯示行號
其它查書都可以找到就不說了。
做到這個時候,你可以再編譯一下,看有沒有錯,這一步我就沒有幫你們做了,不過我覺得應該不會有問題吧,下
載到ram中運行,看看效果。
u-boot移植日記4(新手必讀)
7)終於到了flash的設置部分了,這完全是我個人悟出來的,網上資料好像講得不是先清楚。
首先介紹一下flash的識別吧,每塊flash都有一個id,前部分用來說明生產廠家,後部分用來說明它的容量,類型,
位數等。它們的定義是在u-boot-1.1.2/include/flash.h中,就以我的ssts9vf1601為例:
file:///E|/sxn/u-boot移植日記 很好的文章.htm(第 10/12 頁)2008-1-3 13:22:16
u-boot移植日記 很好的文章
#define SST_MANUFACT 0x00BF00BF 這是生產廠家id
#define SST_ID_xF1601 0x234B234B 這是它的型號,容量,位元數等id
#define FLASH_SST160A 0x0046 這個我還說不清楚,有個要注意的問題是像sst160是不能用奇位址的,我做的
過程中是把SST160A改成SST1601的,懶得幫它創一個
好了,相信你已經找到你的板上所用的flash對應的id號了吧?現在就來談談怎麼改。
先進入u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它裡面已經幫SST160A設置好了,我的做法是把SST公司的160A都改成1601,是不是很簡單,當然你也可以幫1601
再寫一分,但是我是個懶人,所以我就樣做了^_^
到這裡還有個問題沒提到的,就是如果你重新用setenv saveenv 設置了參數,但是復位後會發現怎麼沒有保存到的
(不信你試試看)。其實我是故意留到這裡講的,應該它不會報錯,可以說是比較隱秘的問題,所以我故意放到這
裡來說,以引起你的重視。
解決方法:vi u-boot-1.1.2/board/myboard/common/flash.c
找到這個函數:write_buff
裡面有這句話:#ifdef CONFIG_B2
要把B2改了,因為我們的板不叫B2,那叫什麼呢?原來是在這裡定義的:u-boot-1.1.2/include/configs/
myboards3c44b0.h
裡面有這句話:#define CONFIG_HFRK 你不喜歡HFRK這個名字也行,可以改成別的名字,只不過相應地前面的B2
也要改成這個名字而已。
4.後記:
本來是想剛做好的時候寫的,但是後來發現有些功能實現不了,所以就停住了筆,等我搞好了以後,又急著去學
習uClinux的移植,真的很忙,現在終於抽空把它寫完。雖然有些地方還沒說清楚(畢竟我對它的瞭解還不是很深,
但我相信在我以後移植系統的過程中會逐步加深對它的瞭解),我還是希望它能成為最詳盡的u-boot移植新手指
導,對u-boot移植的初學者起到實質性的作用,這樣就不枉我花了這麼多的心思來寫這個文檔。
reference: http://wenku.baidu.com/view/837cd47f1711cc7931b71675