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