移植u-boot1.1.6到mini2440文檔

  u-boot移植:

移植是一個複雜的過程,其中的東西太多,最初應該以掌握思路、方法爲主,能夠編譯通過,實現簡單功能,在實踐中慢慢積累經驗,熟悉過程。

在PC上編譯好U-Boot,生成Bin文件,將開發板與PC通過串口和USB口相連,把生成的Bin文件通過USB口下載到開發板上RAM裏,從RAM裏直接運行,查看串口是否按要求輸出信息。熟悉u-boot移植的流程和基本設置,對於設計flash,網卡,usb等的移植在後面結合內核移植深入研究

    移植內容:LED,串口,時鐘以及基本硬件初始化等內容

移植過程:

一.建立交叉編譯環境

拷貝並解壓arm-linux-gcc-3.4.1.tgz,

#tar xvzf arm-linux-gcc-3.4.1.tgz –C / 

建立工作目錄 

#mkdir /home/u-boot1.1.6

運行命令,改變路徑

#gedit /root/.bashrc

編輯/root/.bashrc文件最後一行

export PATH=$PATH:/usr/local/arm/3.4.1/bin

重啓linux,然後測試編譯環境是否建立

#arm-linux-gcc –v

二.在u-boot中建立自己的開發板類型,並測試編譯

1.在U-Boot源碼Board中找一款與目標開發板配置相近的文件夾,進入board目錄,把smdk2410複製一份並命名爲mini2440,進入mini2440目錄,將裏面的smdk2410.c改成mini2440.c,同時Makefile中也要作相應的更改。

2. 進入include/configs目錄,將smdk2410.h複製一份並命名爲mini2440.h。

3. 打開U-Boot根目錄下的Makefile文件,搜索smdk2410,定位到smdk2410_config : unconfig處,對照該格式在下面加兩行:

mini2440_config :      unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0

各項的意思如下:

arm: CPU的架構(ARCH)

arm920t: CPU的類型(CPU),其對應於cpu/arm920t子目錄。

mini2440: 開發板的型號(BOARD),對應於board/mini2440目錄。

Null: 開發者/或經銷商(vender),直接在board目錄下此處爲NULL

s3c24x0: 片上系統(SOC)。

4.進入mini2440目錄修改Makefie文件

COBJS := smdk2410.o flash.o爲

COBJS := mini2440.o flash.o

5.測試編譯

[root@localhost u-boot-1.1.6]# make mini2440_config

Configuring for mini2440 board...

[root@localhost u-boot-1.1.6]# make

測試通過完成第一步工作

三.修改u-boot文件,匹配mini2440

3.1 修改/cpu/arm920t/start.S

(1)啓動代碼的正式開始處,加上led驅動,使其能夠顯示u-boot進程

#define GPBCON                  0x56000010

#define GPBDAT                   0x56000014

#define GPBUP                     0x56000018

 

ldr                           r0, =GPBUP

ldr                           r1, =0x7FF

str                          r1, [r0]

 

ldr                           r0, =GPBCON

ldr                           r1, =0x154FF

str                          r1, [r0]

 

ldr                           r0, =GPBDAT

ldr                           r1, =0x000                  /*使其全部點亮四個led燈*/

str                          r1, [r0]

在以上向行代碼分別定義了操作PB口的寄存器地址,關閉PB口上拉,設置PB5、6、7、8口爲輸出口(對應mini2440開發板上的4個LED),設PB5、PB6、7、8設爲爲低電平,對應LED亮。

(2) 關閉u-boot的RAM初始化功能

一般的Bootloader都有以下兩個功能:上電首先初始化RAM;然後將自身複製到RAM中運行,提高運行速度。以上兩點我們可以從start.S文件中start_code往下的兩個宏看到:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

我們直接通過現在Bootloader將U-Boot.bin文件下載到內存中運行,RAM初始化的動作已經由Supervivi做了,這裏我們不需要再次進行初始化,而且如果進行初始化也會導致試驗失敗,因此一定要將LOWLEVEL_INIT功能關掉,你可以在這裏把bl cpu_init_crit註釋掉,也可以在include/configs/mini2440.h中增加一個宏定義:

#define CONFIG_SKIP_LOWLEVEL_INIT                     1

(3)修改寄存器地址

#if defined(CONFIG_S3C2400)

#define pWTCON        0x15300000

#define INTMSK        0x14400008    /* Interupt-Controller base addresses */

#define CLKDIVN    0x14800014    /* clock divisor register */

#else

#define pWTCON        0x53000000

#define INTMSK        0x4A000008    /* Interupt-Controller base addresses */

#define INTSUBMSK    0x4A00001C

#define CLKDIVN    0x4C000014     /* clock divisor register */

#endif

(4)修改中斷部分

#if defined(CONFIG_S3C2410)

    ldr r1,=0x7ff /*根據2410芯片手冊,INTSUBMSK有11位可用, vivi也是0x7ff,U-Boot一直沒改過來。*/  

ldr r0,=INTSUBMS

str r1,[r0]

#endif

#if defined(CONFIG_S3C2440)

    ldr r1,=0x7fff /*根據2440芯片手冊,INTSUBMSK有15位可用*/

    ldr r0,=INTSUBMSK

    str r1,[r0]

#endif

(5)修改時鐘

#define MPLLCON                              0x4C000004

#define UPLLCON                               0x4C000008

 

ldr r0, =UPLLCON

ldr r1, =0x38022

str r1, [r0]

 

ldr r0, =MPLLCON

ldr r1, =0x7F021

str r1, [r0]

 

ldr r0, =CLKDIVN

mov r1, #5

str r1, [r0]

第一段代碼定義了相關寄存器,CLKDIVN前面已有定義;第二段設置了USB時鐘頻率48MHz;第三段設置了系統的主頻405MHz;第四段設置了分頻係數,將主頻降頻分配給系統總線,等其它慢速設備使用

打開board//mini2440/mini2440.c,修改M_MDIV、

M_PDIV、M_SDIV等幾個值,在這裏主要就是修改宏定義,改成與前面在彙編文件中寄存器設置的參數一致即可,

#define M_MDIV       0x7f                        

#define M_PDIV  0x2

#define M_SDIV  0x1

//ldr r0, =MPLLCON

//ldr r1, =0x7F021(由此處設計上面數值)

(6)修改串口

修改cpu/arm920t/s3c24x0/speed.c中的頻率計算函數。2440中FCLK的計算與2410有一定的區別,是原2410計算值的2倍,另外已知前面設置的分頻參數是FCLK:HCLK:PCLK=1:4:8,直接把HCKL設爲FCLK的1/4,代碼修改如下:

ulong get_FCLK(void)

{

               ......

               p = ((r & 0x003F0) >> 4) + 2;

               s = r & 0x3;

 

              

    if (pllreg == MPLL)

               r = clk_power->MPLLCON;

               return((CONFIG_SYS_CLK_FREQ * m*2) / (p << s));

    else if (pllreg == UPLL)

               r = clk_power->UPLLCON;

               return((CONFIG_SYS_CLK_FREQ * m) / (p << s));

    else

               hang();   

}

 

ulong get_HCLK(void)

{

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

 

    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/4 : get_FCLK());

}

(7)在文件中添加“CONFIG_S3C2440”,使得原來s3c2410的代碼可以編譯進來。

U-Boot裏有些驅動根據處理的型號的不同,配置的方法、參數各不相同,那麼就是通過這個CONFIG_XXXXX來定義區分的。由於S3C2410和S3C2440的寄存器地址和參數設置基本是相同的,所以只需在定義CONFIG_S3C2410的地方加上CONFIG_S3C2440即可,CONFIG_MINI2440同理;如果處理器差異較大,那麼在具體地置你就要根據該處的功能需要編寫相應的驅動代碼。

 

 

在u-boot根目錄下運用命令尋找帶有”CONFIG_S3C2410”的文件然後在後面加上||defined(CONFIG_S3C2440)

[root@localhost u-boot-1.1.6]# grep 'CONFIG_S3C2410' * -R

然後依次進行修改

特別注意:

/cpu/arm920t/s3c24x0/interrupts.c文件的181行,加上紅字部分

#elif defined(CONFIG_SBC2410X) || \

      defined(CONFIG_SMDK2410) || \

      defined(CONFIG_VCMA9)||defined(CONFIG_mini2440)

四:修改完畢後,進行編譯

[root@localhost u-boot-1.1.6]# make

編譯生成uboot.bin,現在運行

Uboot的基本流程已經基本熟悉,後面可以根據需要進行flash,網卡等相關移植。  

                                                                                           by 麥田

                                                                                         2009.6.25         

本文主要參考以下兩位博友文章,表示感謝

http://www.stars625.com/portinguboottomini2440step1.html  

http://blog.chinaunix.net/u1/34474/showart_487416.html            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章