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