- 論壇徽章:
- 0
|
from http://www.cnitblog.com/luofuchong/archive/2007/01/10/21726.aspx
1)
在網(wǎng)上下載一個(gè)
u-boot
源代碼,我用的是
1.1.2
版本的,最新的應(yīng)該是
1.1.4的吧,其實(shí)差不多,那就像我那樣下載一個(gè)
1.1.2
版本的吧。把源文件解壓,這個(gè)應(yīng)該不用說了吧,學(xué)過
linux
的人應(yīng)該會(huì),不會(huì)的話我想你繼續(xù)做下去也困難,那就先裝個(gè)linux
用下吧(我用的是
RedHat
的,哦對了,編譯程序是需要
gcc
編譯器的,所以安裝方式一定要選擇工作站哦
^_^
)。好了,解壓后你發(fā)現(xiàn)在
u-boot.1.1.2
目錄下有
Makefile
這個(gè)文件吧?讓我們看看它里面的內(nèi)容,最簡單的方法就是
vi Makefile
了。我們要看的是它選擇的是哪一個(gè)交叉編譯器?梢钥吹竭@一項(xiàng):
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是說這里所用的交叉編譯器是
arm-linux-gcc
了,(
u-boot
默認(rèn)是用這個(gè)的,也有用
arm-elf-gcc
的,網(wǎng)上有個(gè)工具包arm-elf-tools-20030314.sh,
我試過用它來編譯,沒有問題,順便提一下,arm-elf-gcc
是用來編譯
uClinux
內(nè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
測試:
把終端關(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)行,所以在編譯前最好來個(gè)徹底清除,在
u-boot.1.1.2
目錄下運(yùn)行命令:
make distclean (其實(shí)這個(gè)命令在Makefile
文件下就有)我當(dāng)時(shí)為這個(gè)問題郁悶了很久,希望你們不會(huì)像我這樣
^_^
)
;
3
,有些人為了方便想在
cygwin
下編譯,但是經(jīng)常在網(wǎng)上看到在這個(gè)虛擬平臺(tái)下編譯有很多的問題,要配置的東西也多,而且好像我用過那個(gè)
vi
沒有
linux
環(huán)境下的好用,所以最好還是不要用這個(gè)軟件了吧,如果你真的離不開
windows
的話可以像我這樣裝個(gè)虛擬機(jī),在虛擬機(jī)下再裝
linux
的系統(tǒng),具體參考這個(gè)網(wǎng)站):
http://fedora.linuxsir.org/doc/vmware/
3
)好了,現(xiàn)在開始測試你的交叉編譯器搞好沒有。在u-boot.1.1.2目錄下執(zhí)行如下命令:
1)
Make distclean (
再次強(qiáng)調(diào))
2)
Make B2_config(
隨便再個(gè)現(xiàn)成的試試^_^)
3)
Make (
沒錯(cuò)的話應(yīng)該會(huì)生成u-boot.bin文件,發(fā)生錯(cuò)誤的話也不怕,只要細(xì)心看一下哪里錯(cuò)就行了,gcc碰到錯(cuò)誤后會(huì)退出編譯,所以可以一個(gè)個(gè)錯(cuò)誤來改,一般的問題都是沒找到編譯器(可能你沒裝或者裝的不對,例如人家用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環(huán)境變量設(shè)好了沒有,前面有講,如果不關(guān)編譯器的事的話那就再看看,一般是文件的后綴不對,有些文件后綴是大寫的,例如start.S但是如果你的是start.s小寫的話那當(dāng)然找不到(解決方法很,把它改成大寫就行了)。細(xì)心看吧,不用怕,它都有注明路徑,很容易可以找到的))
如果以上步驟都無誤的話那么恭喜你,你的交叉編譯環(huán)境可以用來編譯你的u-boot源代碼了,可以開始以下階段。
3.
移植
:
說時(shí)遲那時(shí)快,現(xiàn)在開始移植工作(以下是我一步步重新做一遍,力求說得詳細(xì)點(diǎn),感謝我吧^_^)
我以B2板子的程序做為模板來做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (
這是我取的板子名字,可以換上你的,但是后面的也要跟著來換哦^_^)
#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
來處理。
1
)其中的
myboards3c44b0.c
文件是板的初始化代碼,看一下就知道,根據(jù)你的板上自帶的
44binit.s
來修改吧。
memsetup.S
文件主要是存儲(chǔ)器的初始化設(shè)置,其實(shí)也是44binit.s
里面的一部分。
2
)其實(shí)
board
這里要修改的不多,先跳過
flash
部分吧,我們來看一下
cpu
設(shè)置部分吧。
u-boot-1.1.2
里面已經(jīng)加入了對
s3c44b0
的支持,讓我們來看一下
cpu/s3c44b0
里面的部分吧。
看到
start.S
這個(gè)文件了嗎?要修改的其實(shí)并不多,按照你的板設(shè)置一下中斷跳轉(zhuǎn)矢量就行了,或者上網(wǎng)查一下吧,應(yīng)該很容易看明的。其中
cpu.c
這個(gè)文件簡直不用修改,再來看一下
serial.c這個(gè)文件吧,改一下波特率的設(shè)置就行,就是你用多少
M
的
CPU
頻率的話對應(yīng)的波特率參數(shù)設(shè)置問題,其實(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è)置出來吧,可以參考一下。
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í)要改的地方還挺多的,我等下再說怎樣修改。先回到
u-boot.1.1.2
目錄,
4
)在
Makefile
里面加上這部分,不會(huì)的話就模仿
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
來的,萬萬不能用空格代替,因?yàn)樗强窟@個(gè)來識(shí)別命令的!
5
)好,現(xiàn)在可以在
u-boot-1.1.2
目錄下執(zhí)行如下命令:
Make distclean
(還是用這個(gè)吧,比較徹底)
Make myboards3c44b0_config
Make
看看有沒有錯(cuò),有錯(cuò)的話按著提示來改,如果沒錯(cuò)的話應(yīng)該就能生成
u-boot.bin
這個(gè)文件,現(xiàn)在還不能用哦,因?yàn)檫@幾是
B2
的一個(gè)仿制品而已(注:在我的機(jī)上到這一步可沒有報(bào)錯(cuò)哦,你一步步按著來做的話應(yīng)該也不會(huì)有什么錯(cuò)誤吧
^_^
)。
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)該沒有
75M吧
我的是改成
60
的
找到
Size of malloc() pool
這部分設(shè)置,改成這樣吧,反正我是照著人家來做的,你自己研究下吧
^_^
。
#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 這個(gè)必不可少,如果你想把你的參數(shù)保存到flash
的話(有些板是保存到
EEPRAM
中去的,但是
s3c44b0
的話還是保存到
flash
吧)
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 這個(gè)就是你的參數(shù)保存在
flash里的起始地址了
#define CFG_ENV_OFFSET0x40000
這個(gè)我后來看它源程序發(fā)現(xiàn)如果你上一步?jīng)]有設(shè)置它的起始地址的話就會(huì)用它來作默認(rèn)地址的了
#define CONFIG_AUTO_COMPLETE
其它地方?jīng)]有深究哦,有些好像不要也行,你就試試吧。
找到
Hardware drivers
部分,這應(yīng)該是網(wǎng)絡(luò)芯片設(shè)置吧,參考一下這個(gè)吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019 這個(gè)就要看你的板上用的是什么網(wǎng)卡了(這個(gè)是臺(tái)灣出的,有
10M
)
#define RTL8019_BASE 0x06000000
這個(gè)是網(wǎng)卡相就寄存器的起始地址
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 應(yīng)該是重試的次數(shù)吧
#define CONFIG_BAUDRATE 115200 設(shè)置波特率
#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
參數(shù)設(shè)置,看一下吧,其實(shí)我覺得了解一下就行的了,只是一些初始設(shè)置值,以后可以用命令
setenv saveenv
來修改的。
#define CONFIG_BOOTDELAY 3 這個(gè)就是運(yùn)行
bootcmd
之前的等待時(shí)間
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引導(dǎo)
uClinux
的時(shí)候傳遞的參數(shù),不會(huì)就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 網(wǎng)卡的物理地址
MAC
#define CONFIG_NETMASK 255.255.255.0 掩碼地址,設(shè)置過
ip
的人都應(yīng)該知道吧
#define CONFIG_IPADDR 192.168.0.30 這是你板上網(wǎng)卡
8019
的
ip
地址
#define CONFIG_SERVERIP 192.168.0.10 這是你宿主機(jī)的
ip
地址,以后用
tftp
下載的時(shí)候用到,一定要跟你的宿主機(jī)一致才行。
#define CONFIG_BOOTFILE "u-boot.bin" 這個(gè)就是你要下載文件的默認(rèn)名字
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 這是
bootdelay
后運(yùn)行的命令
Miscellaneous configurable options
部分,參考一下吧:
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "s3c44b0=>" 這是進(jìn)入命令模式下的提示符,改個(gè)帥一點(diǎn)的吧
#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 默認(rèn)的下載地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供選擇的波特率
Physical Memory Map
部分,比較重要,修改你的
sdram
和
flash
的地址和容量。
#define CONFIG_NR_DRAM_BANKS1 我們只占用了一個(gè)
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 定義多個(gè)名字而已,其它地方會(huì)用到
FLASH organization
部分,看注釋應(yīng)該知道了吧,參考一下:
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) */
#define CFG_FLASH_WRITE_TOUT 4000 /* Timeout for Flash Write (in ms) */
按著來一步步的做應(yīng)該不難,這里提一下
vi
程序的用法,其實(shí)在
google
一搜就找到了,不過為了方便大家,還是說一聲吧,
在命令模式下:
按
/ xxx
再回車即可搜索到你所需要的內(nèi)容(
xxx
),再按
n
搜索下一個(gè),按
shift+n
搜索上一個(gè)
按
:
xxx
即可跟到你想要的行
按
:
set nu
顯示行號(hào)
其它查書都可以找到就不說了。
做到這個(gè)時(shí)候,你可以再編譯一下,看有沒有錯(cuò),這一步我就沒有幫你們做了,不過我覺得應(yīng)該不會(huì)有問題吧,下載到
ram
中運(yùn)行,看看效果。
7
)終于到了
flash
的設(shè)置部分了,這完全是我個(gè)人悟出來的,網(wǎng)上資料好像講得不是先清楚。
首先介紹一下
flash
的識(shí)別吧,每塊
flash
都有一個(gè)
id
,前部分用來說明生產(chǎn)廠家,后部分用來說明它的容量,類型,位數(shù)等。它們的定義是在
u-boot-1.1.2/include/flash.h中,就以我的
ssts9vf1601
為例:
#define SST_MANUFACT 0x00BF00BF 這是生產(chǎn)廠家
id
#define SST_ID_xF1601 0x234B234B 這是它的型號(hào),容量,位數(shù)等
id
#define FLASH_SST160A 0x0046 這個(gè)我還說不清楚,有個(gè)要注意的問題是像
sst160
是不能用奇地址的,我做的過程中是把
SST160A
改成
SST1601
的,懶得幫它創(chuàng)一個(gè)
好了,相信你已經(jīng)找到你的板上所用的
flash
對應(yīng)的
id
號(hào)了吧?現(xiàn)在就來談?wù)勗趺锤摹?br />
先進(jìn)入
u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它里面已經(jīng)幫
SST160A
設(shè)置好了,我的做法是把
SST
公司的
160A
都改成
1601
,是不是很簡單,當(dāng)然你也可以幫
1601
再寫一分,但是我是個(gè)懶人,所以我就樣做了
^_^
到這里還有個(gè)問題沒提到的,就是如果你重新用
setenv saveenv
設(shè)置了參數(shù),但是復(fù)位后會(huì)發(fā)現(xiàn)怎么沒有保存到的(不信你試試看)。其實(shí)我是故意留到這里講的,應(yīng)該它不會(huì)報(bào)錯(cuò),可以說是比較隱秘的問題,所以我故意放到這里來說,以引起你的重視。
解決方法:
vi u-boot-1.1.2/board/myboard/common/flash.c
找到這個(gè)函數(shù):
write_buff
里面有這句話:
#ifdef CONFIG_B2
要把
B2
改了,因?yàn)槲覀兊陌宀唤?br />
B2
,那叫什么呢?原來是在這里定義的:u-boot-1.1.2/include/configs/myboards3c44b0.h
里面有這句話:
#define CONFIG_HFRK 你不喜歡
HFRK
這個(gè)名字也行,可以改成別的名字,只不過相應(yīng)地前面的
B2
也要改成這個(gè)名字而已。
4.
后記:
本來是想剛做好的時(shí)候?qū)懙模呛髞戆l(fā)現(xiàn)有些功能實(shí)現(xiàn)不了,所以就停住了筆,等我搞好了以后,又急著去學(xué)習(xí)
uClinux
的移植,真的很忙,現(xiàn)在終于抽空把它寫完。雖然有些地方還沒說清楚(畢竟我對它的了解還不是很深,但我相信在我以后移植系統(tǒng)的過程中會(huì)逐步加深對它的了解),我還是希望它能成為最詳盡的
u-boot
移植新手指導(dǎo),對
u-boot
移植的初學(xué)者起到實(shí)質(zhì)性的作用,這樣就不枉我花了這么多的心思來寫這個(gè)文檔。
參考資料:
http://blog.21ic.com/more.asp?name=sockit&id=8509
我所認(rèn)為的最有奉獻(xiàn)精神,寫得最詳細(xì)的記錄,在此表示我深深的敬意!
(2) 開始
由于沒有接觸過u-boot,因此第一步要做的就是google一些資料.
u-boot官方網(wǎng)站:http://sourceforge.net/projects/u-boot(比較慢)
http://u-boot.sourceforge.net/這個(gè)快一些.
DENX U-Boot及Linux使用手冊:
http://coosign.blogchina.com/coosign/1318487.html
, 這是一遍翻譯的文檔.主要介紹了u-boot編譯及使用的命令.但沒有涉及新板子的移植流程.
根據(jù)上面手冊中的說明,下載了最新的u-boot代碼,命令:
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
到board目錄查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
結(jié)果是:
./dave/B2/B2.c
B2網(wǎng)站是:
http://www.dave-tech.it
,初初看了B2開發(fā)板的介紹,但不詳細(xì).包括使用的網(wǎng)絡(luò)芯片等都沒有介紹.
google "u-boot 移植"后查到一篇文章:
"收集了一些關(guān)于U-BOOT的文章"
http://www.bloghome.cn/index.php?op=ViewArticle&articleId=2111&blogId=390
里面搜集了不少關(guān)于u-boot移植的問題.
里
面介紹了"U-Boot 在44B0X
開發(fā)板上的移植以及代碼分析"的內(nèi)容,仔細(xì)看了看.發(fā)現(xiàn)其移植的版本比較低,但對了解u-boot結(jié)構(gòu)是滿不錯(cuò)的,因?yàn)檫@個(gè)版本不支持44B0X,因此完
全是支持新CPU的移植.了解到make XX_config是在Makefile中定義的.
另外"MPC8xx的U-Boot移植體會(huì)(ZT) "這一篇對u-boot介紹滿詳細(xì)的.但對移植工作只做了理論性和經(jīng)驗(yàn)性介紹,沒有具體的操作步驟.
"基于Atmel at91rm9200的armlinux的bootloader啟動(dòng)代碼分析 "
http://www.linuxfans.org/nuke/modules.php?name=News&file=print&sid=2765
里面介紹了u-boot移植到at91rm9200上的情況,可以參考一下.
另外就是仔細(xì)閱讀u-boot下的README文件.
(3) 編譯一把
看了相關(guān)的資料,心動(dòng)不如行動(dòng).先編譯一把看看情況.既然只有B2開發(fā)板是S3C44B0X CPU的,因此先編譯一下B2開發(fā)板看看. 具體:
#cd u-boot
#make B2_config
#make
結(jié)果順利,成功編譯.
(4) 開始動(dòng)手移植
我以B2板子的程序做為模板來做.
#cd board
#cp -r dave wx (自己取個(gè)公司名wx)
#cd wx
#mv B2 wx20 (自己取個(gè)板子名wx20)
#cd wx20
# mv B2.c wx20.c
修改Makefile及wx20.c, 主要是B2改成wx20.
增加配置文件:
#cd include/configs
#cp B2.h wx20.h
修改Makefile配置文件,增加wx20_config.
1432 wx20_config : unconfig
1433 @./mkconfig $(@:_config=) arm s3c44b0 wx20 wx
[注:前面的數(shù)字是文件行號(hào),以下一樣].
將board/wx目錄下和wx20.h文件中的B2改成wx20或WX20.
這里其實(shí)是最重要的步驟,就是根據(jù)硬件的情況來修改相關(guān)的參數(shù).由于對硬件板子的情況不是太了解,因此此時(shí)最需要的就是耐心地看看硬件資料.主要修改的地方有:
include/configs/wx20.h ---- 配置文件,大部分參數(shù)是這里配置的.
board/wx/wx20/lowlevel_init.S -- 內(nèi)存參數(shù)配置
cpu/s3c44b0/serial.c -- 串口配置
cpu/s3c44b0/start.S -- 程序入口
如果此時(shí)配置全部正確了,那么我們就簡單的很了.(如果你用我的patch的話,就是如此了!)那么我也就不會(huì)仔細(xì)再去研究u-boot其他部分了. 困難就是你學(xué)習(xí)的最好機(jī)會(huì)!
(5) 開始編譯
經(jīng)過簡單的參數(shù)修改,編譯成功.然后下載u-boot.bin(二進(jìn)制格式). 此時(shí)你可以用nm看一下u-boot(elf格式)的內(nèi)容,會(huì)有所收獲的.
然后用armsys的bootloader將u-boot.bin調(diào)入到內(nèi)存0xc100000運(yùn)行.結(jié)果可想而知,串口沒有任何顯示,而且死機(jī).bootloader也必須斷電重起.
(6) u-boot流程
原
因是比較明顯的,就是參數(shù)和硬件沒有符合.因此接下來做的事情就是仔細(xì)閱讀S3C44B0
CPU的硬件資料,包括內(nèi)存配置,串口配置這些.我覺得要讓串口出信息,最主要的就是CPU的初始化,內(nèi)存配置和串口配置.另外就是了解u-boot程序
運(yùn)行流程,這個(gè)對了解需要設(shè)置的參數(shù)是非常有幫助的.我這里大致說一下u-boot運(yùn)行流程.
入口: cpu/s3c44b0/start.S
主要是CPU初始化( cpu_init_crit ), 調(diào)內(nèi)存配置函數(shù)( lowlevel_init ), 然后判斷u-boot是否從flash運(yùn)行,如果是就把u-boot代碼拷貝到TEXT_BASE定義的地方.然后轉(zhuǎn)到start_armboot.
start_armboot: lib_arm/board.c
進(jìn)行各種初始化設(shè)置,主要有:
cpu_init CPU相關(guān)的設(shè)置, 具體在./cpu/s3c44b0/cpu.c中.
board_init 板子相關(guān)的設(shè)置, 具體在board/wx/wx20/wx20.c 中
interrupt_init中斷設(shè)置,我們沒有用,具體在./cpu/s3c44b0/interrupts.c中
env_init 初始化環(huán)境變量, 具體要看用什么介質(zhì)來存儲(chǔ)環(huán)境變量,如果用flash來存貯, 程序在common/env_flash.c中.
init_baudrate 設(shè)置baud參數(shù)
serial_init 串口初始化, 具體在cpu/s3c44b0/serial.c.
console_init_f 控制臺(tái)設(shè)置, 具體在./common/console.c
display_banner 顯示標(biāo)題.
dram_init 可用內(nèi)存配置, 具體在./board/wx/wx20/wx20.c.
flash_init flash初始化,具體./drivers/cfi_flash.c.
接下來就是環(huán)境變量初始化, 網(wǎng)絡(luò)初始化,最后到main_loop,可以運(yùn)行各種命令.
(7) 主要參數(shù)修改
經(jīng)過一段時(shí)間調(diào)試,終于串口出東西了,這段時(shí)間犯了一個(gè)小錯(cuò)誤,走了一段冤枉路.其實(shí)配置參數(shù)可能早已正確,但串口老是亂碼,原因是自己的u-boot.bin傳下來時(shí)目錄搞錯(cuò)了,結(jié)果老是運(yùn)行錯(cuò)誤的u-boot.bin.這段時(shí)間里主要改的參數(shù)有:
include/configs/wx20.h:
#define CONFIG_S3C44B0_CLOCK_SPEED 64
CPU主頻,armsys板的是64M
#define PHYS_SDRAM_1 0x0c000000 /* SDRAM Bank #1 */
B2板子里的定義是錯(cuò)誤的.還有RAM大小,flash大小需要修改,跟B2板不同.
#define CONFIG_DRIVER_RTL8019
#define RTL8019_BASE 0x08000000
配置rtl8019AS網(wǎng)絡(luò)芯片.
#define CFG_LOAD_ADDR 0x0c008000 /* default load address */
uclinux運(yùn)行入口地址
lowlevel_init.S:
MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于對armsys硬件不是太了解,沒有辦法,只得看armsys bootloader程序,但每個(gè)版本又有差別.因此是用AXD調(diào)試看bootlaoder啟動(dòng)后0x1c80000中的值定的.
cpu/s3c44b0/serial.c:
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
divisor = 34;
串口設(shè)置,這個(gè)也是根據(jù)bootloader里的公式計(jì)算出來的.這里只定義了115200得值,其他沒有去設(shè)置.
cpu/s3c44b0/start.S:
ldr r1, =PLLCON
#if CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
ldr r0, =((M_DIV 0C11A73C BSS: -> 0C11ECF4
RAM Configuration:
Bank #0: 0c000000 8 MB
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
MAC: 26:26:26:26:26:26
Hit any key to stop autoboot: 0
=>
(10) 希望環(huán)境變量存貯到flash
B2板缺省的定義是把環(huán)境變量存貯到EEPROM上,雖然armsys上也有,但我也搞不清楚它的硬件配置,因此希望把環(huán)境變量存貯到flash上.
增加配置: include/configs/wx20.h (從evb4510.h中學(xué)來。
79 #define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
80 CFG_CMD_DATE | \
81 CFG_CMD_ELF | \
82 CFG_CMD_NET | \
83 CFG_CMD_ENV|CFG_CMD_FLASH )
173 #define CFG_ENV_IS_IN_FLASH
174 #undef CFG_ENV_IS_NOWHERE
175
176 #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x20000) /* environment start address */
177 #define CFG_ENV_SECT_SIZE 0x10000 /* Total Size of Environment Sector */
編譯運(yùn)行, 并操作setenv, saveenv, printenv. 看起來正常.
=> setenv ipaddr 192.168.1.100
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
ð printenv
但重新啟動(dòng)機(jī)器后,參數(shù)沒有起作用,還是缺省的.仔細(xì)看了環(huán)境變量的程序,發(fā)現(xiàn)是由于ENV_IS_EMBEDDED定義造成的,而此變量定義是在./tools/envcrc.c中:
# if (CFG_ENV_ADDR >= CFG_MONITOR_BASE) && \
((CFG_ENV_ADDR + CFG_ENV_SIZE) 0C117DA0 BSS: -> 0C11C0F0
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000
env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram
ip=192.168.1.100:::::eth0:off ether=25,0,0,0,eth0
ethaddr=00:50:c2:1e:af:fb
envptr->crc=1470de2 1470de2
buffer->crc=1470de2
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
env_ptr=20000
gd->env_addr=20004 gd->env_valid=1
env_relocate[211] offset = 0x0
env_relocate[229] malloced ENV at 00000000
In:
Out:
Err:
死機(jī)!!!
然后改回arm-elf編譯:
U-Boot 1.1.3 (Jul 3 2005 - 07:04:48)
U-Boot code: 0C100000 -> 0C119B98 BSS: -> 0C11DCD8
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000
env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram
ip=192.168.1.100:::::eth0:off ether=25,0,0,0,eth0
ethaddr=00:50:c2:1e:af:fb
envptr->crc=1470de2 1470de2
buffer->crc=1470de2
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
env_ptr=20000
gd->env_addr=20004 gd->env_valid=1
env_relocate[211] offset = 0x0
env_relocate[229] malloced ENV at 0c0dfc08
In: serial
Out: serial
Err: serial
rtl8019 MAC: 2a:2a:2a:2a:2a:2a
Hit any key to stop autoboot: 0
=>
正
常!因此最好是用arm-elf編譯.
我在看網(wǎng)上查資料時(shí)記得有人說過"用arm-linux編譯時(shí),malloc返回0,而改成arm-elf編譯時(shí)就好了".有個(gè)印象,具體帖子不記得在哪
里了.所以后來我就一直使用arm-elf編譯,沒有再去試arm-linux編譯.
(12) 網(wǎng)卡調(diào)試
剩下來的事情就是調(diào)網(wǎng)絡(luò)了.根據(jù)上面配置rtl8019as后,網(wǎng)絡(luò)仍然不同,然后參考uclinux驅(qū)動(dòng)中的寄存器定義修改,網(wǎng)絡(luò)就可以了.具體修改是:
drivers/rtl8019.h
36 #define ETH_ADDR_SFT (8)
37 #define EI_SHIFT(x) ((x) tftpboot
eth_init...00:50:c2:1e:af:fb
TFTP from server 192.168.1.25; our IP address is 192.168.1.100
Filename 'image.bin'.
Load address: 0xc008000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###############################
死機(jī)!
原因是我們現(xiàn)在的u-boot入口地址是C100000,而uclinux內(nèi)核大約2M,因此load過來就沖突了.因此我們把u-boot的入口地址改成C300000,具體修改在board/wx/wx20/config.mk:
TEXT_BASE = 0x0C300000
重新編譯運(yùn)行就可以了.
(14) 設(shè)置自動(dòng)運(yùn)行uclinux
剛才我們是用命令load uclinux并執(zhí)行的.自動(dòng)運(yùn)行需要設(shè)置bootcmd環(huán)境變量:
=> setenv bootcmd "tftpboot; go 0xc008000" ==》設(shè)置錯(cuò)誤
## Starting application at 0x0C008000 ...
=> setenv bootcmd "tftpboot\; go 0xc008000" ==》需要有個(gè)\
=> saveenv
重新開機(jī)運(yùn)行u-boot:
Hit any key to stop autoboot: 0
Unknown command '"tftpboot' - try 'help'
## Starting application at 0x0C008000 ...
結(jié)果還是不能自動(dòng)下載uclinux和運(yùn)行.經(jīng)過調(diào)試才發(fā)現(xiàn)在設(shè)置bootcmd時(shí)多加了引號(hào)造成的!正確的設(shè)法是:
=> setenv bootcmd tftpboot \; go 0xc008000 ==》正確的設(shè)置
此時(shí)可以成功自動(dòng)下載uclinux和運(yùn)行了.
(15) flash運(yùn)行
刻錄到flash后,運(yùn)行uclinux出現(xiàn)問題,運(yùn)行到:uclinux 開中斷后就死機(jī),提示:
Linux version 2.4.24-uc0 (root@samfei) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux
XIP and shared lib patches from
http://www.snapgear.com/))
#46 Áù 7ÔÂ 2 15:52:55 CST 2005
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc
前
面一直用armsys的bootloader,將u-boot下載到0xc300000運(yùn)行,然后再load
linux到0xc0080000運(yùn)行,正常.而將u-boot刻錄到flash后運(yùn)行不正常,經(jīng)過調(diào)試uclinux,到init/main.c中
sti()函數(shù)后出現(xiàn)死機(jī).因此懷疑中斷向量設(shè)置問題.
將cpu/s3c44b0/start.S中代碼修改成;
40 .globl _start
41 _start: b reset
42 /*
43 add pc, pc, #0x0c000000
44 add pc, pc, #0x0c000000
45 add pc, pc, #0x0c000000
46 add pc, pc, #0x0c000000
47 add pc, pc, #0x0c000000
48 add pc, pc, #0x0c000000
49 add pc, pc, #0x0c000000
50 */
51 LDR PC, Undefined_Addr
52 LDR PC, SWI_Addr
53 LDR PC, Prefetch_Addr
54 LDR PC, Abort_Addr
55 LDR PC,RESERVE_Addr
56 LDR PC, IRQ_Addr
57 /* subs pc,lr,#4*/
58 LDR PC, IRQ_Addr
59 /* subs pc,lr,#4*/
114 Undefined_Addr:
115 .word 0x0c000004
116 SWI_Addr:
117 .word 0x0c000008
118 Prefetch_Addr:
119 .word 0x0c00000C
120 Abort_Addr:
121 .word 0x0c000010
122 RESERVE_Addr:
123 .word 0x0c000014
124 IRQ_Addr:
125 .word 0x0c000018
126 FIQ_Addr:
127 .word 0x0c00001C
128
129 /*
130 * the actual reset code
131 */
132
133 reset:
后編譯,刻錄,然后運(yùn)行.正常了!!!
(16) 補(bǔ)丁制作和測試
[root@samfei u-boot]# make distclean
[root@samfei 44b0]# mv u-boot u-boot.wx
[root@samfei 44b0]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
Logging in to
![]()
server:anonymous@cvs.sourceforge.net:2401/cvsroot/u-boot
CVS password:
[root@samfei 44b0]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
cvs checkout: Updating u-boot
U u-boot/CHANGELOG
U u-boot/COPYING
U u-boot/CREDITS
U u-boot/MAINTAINERS
。。。。。。
[root@samfei 44b0]# diff -Naur u-boot u-boot.wx > uboot-wx-20050703.patch
[root@samfei 44b0]# vi uboot-wx-20050703.patch
去掉沒有用的文件.做補(bǔ)丁的好處就是自己可以很清楚的知道哪些文件修改了!做完了,別忘了測試一下.
[root@samfei 44b0]# cd u-boot
[root@samfei u-boot]# patch -p1
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u1/45211/showart_403849.html |
|