uboot移植初步成功啦
移植的uboot版本為1.4版,用的編譯工具鏈為arm-elf-。不能用arm-linux編譯,原因是用的c庫(kù)不同。簡(jiǎn)單的說(shuō)就是arm-linux是為有MMU硬件單元的處理器配置的,如ARM9器件,而arm-elf-則是用于無(wú)MMU的cpu的,如ARM7。(也試了一下,用arm-linux-編譯得到的uboot.bin加載到SDRAM中運(yùn)行后無(wú)顯示)。arm-elf-gcc版本為2.93版本的(有點(diǎn)低,還需要修改cpus3c44b0config.mk,后面提到)。在uboot1.4版本中符合s3c44b0內(nèi)核的板子為daveB2板,移植就是基于該板子的,當(dāng)然實(shí)際板子有很多硬件情況與它不同,需要修改。
本文引用地址:http://www.ex-cimer.com/article/201611/323262.htm現(xiàn)在就分別講講所要修改的文件和具體修改吧:"uboot"表示uboot的根目錄
ubootMakefile:在uboot中,默認(rèn)的編譯器為arm-linux-,所以首先要修改的就是把編譯器改為arm-elf-:
ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif
只需要把a(bǔ)rm-linux-改為arm-elf-就行
同時(shí),要增加自己的板子在Makefile中的配置:
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
該句增加了B2板子在Makefile中的配置,其中向編譯器傳遞了四個(gè)參數(shù):cpu體系 cpu類型 板子 公司
可仿造該板子增加自己板子的設(shè)置,其中板子和公司可自取,為了文件,都取為44b0,增加配置如下:
44b0_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 44b0 44b0
ubootoard:該文件夾放置了所有uboot支持的板子。故要在此文件夾中增加自己的板子。移植嘛,就是在原有的基礎(chǔ)上修改成符合自己的就行了。于是可以把dave復(fù)制成44b0放在該文件夾下。同時(shí),把44b0所有插著B2標(biāo)志的文件夾或文件都復(fù)制成44b0(這里我們就不刪除daveB2吧)。然后我們修改操作就是針對(duì)44b0的,那才是我們需要的。
ubootoard44b044b044b0.c:該文件就兩個(gè)函數(shù):board_init(),dram_init()。其中dram_init()無(wú)需修改,不過(guò)卻給了我們個(gè)信號(hào):關(guān)于SDRAM的映射起始地址和SDRAM的大小。而board_init()似乎也是不需要怎么改的。主要是配置一下IO。口但B2板子沒(méi)有初始化Port c。因?yàn)槲业陌遄由嫌腥齻€(gè)LED在Port c,所以還是初始化一下吧。也許后面要用到的話還得到這里來(lái)改
ubootincludeconfigs:我們的配置文件也還是要借用B2的,(哎,誰(shuí)叫咱是兄弟呢)和前面一樣,把所有標(biāo)著B2的文件夾和文件都復(fù)制成44b0(不要?jiǎng)h除了B2)?,F(xiàn)在就修改一下44b0.h吧
ubootincludeconfigs44b0.h:這個(gè)文件就是配置板子的各個(gè)參數(shù)。配置項(xiàng)還是比較多的,主要是根據(jù)板子的實(shí)際硬件情況來(lái)修改相應(yīng)的數(shù)值或定義。主要修改的如下:
#define CONFIG_B2-------->#define CONFIG_44b0
#define CONFIG_S3C44B0_CLOCK_SPEED 75
定義板子的系統(tǒng)時(shí)鐘,我的板子配置成40M比較麻煩,后見(jiàn)分曉~~~
#undef CONFIG_USE_IRQ
不定義USE_IRQ堆棧。如果要在SDRAM中用到IRQ堆棧的話,這里就應(yīng)該定義了
#define CONFIG_BOOTDELAY 5------>#define CONFIG_BOOTDELAY 6
定義UBOOT引導(dǎo)系統(tǒng)的選擇延時(shí):如果定義自動(dòng)加載系統(tǒng)的話,超過(guò)了這個(gè)定義 的計(jì)數(shù)之后,UBOOT將自己加載系統(tǒng)。我把計(jì)數(shù)數(shù)改為6了,在SDRAM中調(diào)試的時(shí)候,看著顯示的倒計(jì)時(shí)數(shù)為5開始時(shí),就知道移植成功了
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
這個(gè)都是根據(jù)B2板子來(lái)設(shè)定的,而我的板子則不是它們,而是下面的:
#define CFG_MEMTEST_START 0x0C040000 起始值還是應(yīng)該計(jì)算計(jì)算滴
#define CFG_MEMTEST_END 0x0C100000 /這個(gè)最大什為TEXT_BASE
#define CFG_LOAD_ADDR 0x0c700000 /* default load address */
默認(rèn)的加載系統(tǒng)的地址,還是改了吧,這個(gè)地址太大了,不合適啊,
#define CFG_LOAD_ADDR 0x0c008000
#define PHYS_SDRAM_1 0xc0000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x01000000 /* 16 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define PHYS_FLASH_SIZE 0x00400000 /* 4 MB */
關(guān)于SDRAM和flash的起始地址和大小的宏定義。當(dāng)然,也是不符合實(shí)際情況的
#define PHYS_SDRAM_1 0x0c000000 映射起始地址 0x0c000000
#define PHYS_SDRAM_1_SIZE 0x00800000 大?。?M
#define PHYS_FLASH_1 0x00000000 映射起始地址 0x00000000
#define PHYS_FLASH_SIZE 0x00200000 大小:2M
#define CFG_MAX_FLASH_SECT 256 /* max number of sectors on one chip */
flash最大可選sectors 也是要改的
#define CFG_MAX_FLASH_SECT 32
還有就是這個(gè)B2板子沒(méi)有網(wǎng)卡,還應(yīng)該加一個(gè)網(wǎng)卡的配置:
#define CONFIG_DRIVER_TRL8019
#define RTL8019_BASE 0x08000000
當(dāng)然,還有很多其他的配置。目前為止還不知道哪些是需要的,哪些是不需要的,哪些是要 改的,哪些是不要改的,都還要在應(yīng)用中才能發(fā)現(xiàn)哦
ubootcpus3c44b0lowlevel_init.S:關(guān)于s3c44b0存儲(chǔ)器的配置。主要參考s3c44b0手冊(cè)和SDRAM和FLASH手冊(cè),具體的已在前面的日志中說(shuō)明了,在此不再羅嗦。
ubootcpus3c44b0serial.c:關(guān)于串口的——這個(gè)很重要哦,設(shè)置不好的話就看不到顯示了。主要是關(guān)于串口初始化的,serial_init()調(diào)用serial_setbrg()來(lái)設(shè)置相關(guān)寄存器。這里要修改的就是依據(jù)相應(yīng)的串口波特率來(lái)設(shè)置divisor。這里就能看到CONFIG_S3C44B0_CLOCK_SPEED的身影了。如果在44b0.h文件里沒(méi)有定義這個(gè)宏或是這個(gè)宏的值定義不是75或66的話,那在編譯的時(shí)候就會(huì)報(bào)錯(cuò):#error CONFIG_S3C44B0_CLOCK_SPEED undefined。
ubootcpus3c44b0start.S:終于要說(shuō)到這個(gè)文件了。其實(shí)當(dāng)初覺(jué)的神秘,現(xiàn)在看來(lái)真是有點(diǎn)太把它當(dāng)回事了。細(xì)看一下,和一個(gè)普通的startup.S沒(méi)多大區(qū)別。主要難點(diǎn)還是幾段代碼和原理吧。關(guān)于start.S參考前面寫的日志吧。這里主要講修改的話就太簡(jiǎn)單了。要修改的寄存器初始化參數(shù)就是LOCKTIME和PLLCON。設(shè)為符合板子的值就可以了,LOCKTIME=2000,PLLCON=0x48032,設(shè)置主頻Mclk=40Mhz就行了
這里是程序代碼的修改。還有一個(gè)就是前面提到的在編譯的時(shí)候碰到的問(wèn)題:由于arm-elf-gcc版本太低了,導(dǎo)致在引用編譯符號(hào)的時(shí)候參數(shù)錯(cuò)誤:ubootcpus3c44b0config.mk中有如下行:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
提示也錯(cuò)的參數(shù)為:abi=apcs;只要做如下改動(dòng)即可消除編譯器的不適:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
至此,關(guān)于uboot1.4移植所要做的修改就完了。但問(wèn)題還遠(yuǎn)遠(yuǎn)沒(méi)有完吧:uboot應(yīng)該放在哪個(gè)目錄?make的時(shí)候經(jīng)常碰到莫名的問(wèn)題~~
還是那句話,路漫漫其修遠(yuǎn)~~~~
評(píng)論