天天看點

u-boot-2009.08在mini2440上的移植

u-boot-2009.08在mini2440上的移植

建立mini2440工程環境[日期:2011-05-14] 來源:Linux社群 作者:singleboy

移植環境

1,主機環境:VMare下CentOS 5.5 ,1G記憶體。

2,內建開發環境:Elipse IDE

3,編譯編譯環境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。

4,開發闆:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

6,參考文章:

下載下傳并解壓源檔案

1,下載下傳u-boot-2009.08,可以從官方網站下載下傳u-boot-2009.08

2,#tar -jxvf u-boot-2009.08.tar.bz2 //解壓源碼

移植步驟

1.1,了解u-boot目錄結構和啟動流程,請參考U-Boot啟動過程分析

【1】目錄結構

【2】啟動流程

1.2,建立mini2440開發闆檔案并編譯測試

在項目根目錄u-boot-2009.08上單擊右鍵->浏覽檔案夾

【1】定位到board/samsung,将目錄smdk2410複制并粘貼到目前目錄下,将其重命名為mini2440。

【2】打開mini2440目錄,将smdk2410.c重命名為mini2440.c,

【3】用gedit打開目前目錄下的Makefile(在Makefile上單擊右鍵->使用“文本編輯器”打開),定位到28行,修改後代碼如下所示(修改部分用灰色背景顔色标出):

include $(TOPDIR)/config.mk

LIB = $(obj)lib$(BOARD).a

COBJS := mini2440.o flash.o

SOBJS := lowlevel_init.o

然後儲存。

【4】在根目錄下定位到include/configs,将smdk2410.h複制并粘貼到目前目錄下,将其重命名成mini2440.h。

【5】用gedit打開根目錄下的Makefile檔案,然後搜尋smdk2410,定位到2997行,找到下列語句

smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

然後将其複制并粘貼到其下面,并修改成如下語句

mini2440_config : unconfig

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

然後儲存。

*說明:

arm :CPU的架構(ARCH)

arm920t:CPU的類型

mini2440 :對應在board目錄下建立新的開發闆項目的目錄

samsung:新開發闆項目目錄的上級目錄,如直接在board下建立新的開發闆項目的目錄,則這裡就為NULL

s3c24x0:CPU型号

*注意:編譯選項格式的第二行要用Tab鍵開始,否則編譯會出錯。

【6】編譯測試

打開終端,進入到u-boot-2009.08根目錄下執行

[[email protected] u-boot-2009.08]# make distclean

[[email protected] u-boot-2009.08]# make mini2440_config

Configuring for mini2440 board...

[[email protected] u-boot-2009.08]# make

... .... .... ....

board.c:127: error: inline function 'coloured_LED_init' cannot be declared weak

board.c:129: error: inline function 'red_LED_on' cannot be declared weak

board.c:131: error: inline function 'red_LED_off' cannot be declared weak

board.c:133: error: inline function 'green_LED_on' cannot be declared weak

board.c:135: error: inline function 'green_LED_off' cannot be declared weak

board.c:137: error: inline function 'yellow_LED_on' cannot be declared weak

board.c:139: error: inline function 'yellow_LED_off' cannot be declared weak

board.c:141: error: inline function 'blue_LED_on' cannot be declared weak

board.c:143: error: inline function 'blue_LED_off' cannot be declared weak

make[1]: *** [board.o] 錯誤 1

make[1]: Leaving directory `/root/workspace/u-boot-2009.08/lib_arm'

make: *** [lib_arm/libarm.a] 錯誤 2

[[email protected] u-boot-2009.08]#

出現錯誤,内嵌函數不能被聲明為weak屬性,打開lib_arm/board.c,定位到127行開始,将其注釋掉,修改後結果如下:

void inline __coloured_LED_init (void) {}

//void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));

void inline __red_LED_on (void) {}

//void inline red_LED_on (void) __attribute__((weak, alias("__red_LED_on")));

void inline __red_LED_off(void) {}

//void inline red_LED_off(void) __attribute__((weak, alias("__red_LED_off")));

void inline __green_LED_on(void) {}

//void inline green_LED_on(void) __attribute__((weak, alias("__green_LED_on")));

void inline __green_LED_off(void) {}

//void inline green_LED_off(void)__attribute__((weak, alias("__green_LED_off")));

void inline __yellow_LED_on(void) {}

//void inline yellow_LED_on(void)__attribute__((weak, alias("__yellow_LED_on")));

void inline __yellow_LED_off(void) {}

//void inline yellow_LED_off(void)__attribute__((weak, alias("__yellow_LED_off")));

void inline __blue_LED_on(void) {}

//void inline blue_LED_on(void)__attribute__((weak, alias("__blue_LED_on")));

void inline __blue_LED_off(void) {}

//void inline blue_LED_off(void)__attribute__((weak, alias("__blue_LED_off")));

[[email protected] u-boot-2009.08]# make clean

[[email protected] u-boot-2009.08]# make

... ...

cpu/arm920t/start.o: In function `start_code':

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:117: undefined reference to `coloured_LED_init'

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:118: undefined reference to `red_LED_on'

make: *** [u-boot] 錯誤 1

出現錯誤coloured_LED_init'未定義。打開cpu/arm920t/start.S,搜尋“coloured_LED_init”定位到117行,找到如下代碼:

bl coloured_LED_init

bl red_LED_on

将其注釋掉

//這兩行是AT91RM9200DK開發闆的LED初始化,注釋掉

//bl coloured_LED_init

//bl red_LED_on

然後執行清除、編譯指令

[[email protected] u-boot-2009.08]# make clean

[[email protected] u-boot-2009.08]# make

... ...

arm-linux-objcopy -O srec u-boot u-boot.srec

arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

[[email protected] u-boot-2009.08]#

編譯通過。

【7】加入調試選項,啟用DEBUG宏,有兩種辦法辦法

<1>參考文章Makefile,如何傳遞宏定義DEBUG和Debug版和Release版的程式

在編譯時,直接在make 後面傳入參數 -d ,表示Debug模式,輸出有關檔案和檢測時間的詳細資訊,如

make -d

可以輸出源程式中定義的DEBUG宏定義的調試資訊

<2>用gedit打開根目錄下的config.mk檔案,然後搜尋“DDEBUG”,找到如下語句

DBGFLAGS= -g # -DDEBUG

将注釋掉的DDEBUG選項打開,修改後下面語句

DBGFLAGS= -g -DDEBUG

但是此種辦法需要在調試完成時需要在将其注釋掉。

1.3,根據啟動流程修改或添加基本的u-boot源碼,使其能夠在記憶體中啟動

【1】增加對S3C2440一些寄存器的支援,添加中斷禁止部分和時鐘設定部分

用gedit打開cpu/arm920t/start.S,定位到134行附近,如下代碼

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

由于2410和2440的寄存器及位址大部分是一緻的,是以這裡就直接在2410的基礎上再加上對2440的支援即可,修改後代碼如下:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

... ...

# if defined(CONFIG_S3C2410)

ldr r1, =0x3ff

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

# if defined(CONFIG_S3C2440)//添加s3c2440的中斷禁止部分

ldr r1, =0x7fff //根據2440晶片手冊,INTSUBMSK寄存器有15位可用

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

# if defined(CONFIG_S3C2440) //添加s3c2440的時鐘部分

#define MPLLCON 0x4C000004 //系統主頻配置寄存器基位址

#define UPLLCON 0x4C000008 //USB時鐘頻率配置寄存器基位址

ldr r0, =CLKDIVN //設定分頻系數FCLK:HCLK:PCLK = 1:4:8

mov r1, #5

str r1, [r0]

ldr r0, =MPLLCON //設定系統主頻為405MHz

ldr r1, =0x7F021 //這個值參考晶片手冊“PLL VALUE SELECTION TABLE”部分

str r1, [r0]

ldr r0, =UPLLCON //設定USB時鐘頻率為48MHz

ldr r1, =0x38022 //這個值參考晶片手冊“PLL VALUE SELECTION TABLE”部分

str r1, [r0]

# else //其他開發闆的時鐘部分

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

ldr r0, =MPLLCON //設定系統主頻為202.8MHz

ldr r1, =0xa1031 //這個值參考晶片手冊“PLL VALUE SELECTION TABLE”部分

str r1, [r0]

#endif

【2】S3C2440的時鐘部分除了在start.S中添加外,還要分别在board/samsung/mini2440/mini2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代碼。

(1)用gedit打開board/samsung/mini2440/mini2440.c,定位到33行,修改或添加如下内容:

//設定主頻和USB時鐘頻率參數與start.S中的一緻

#define FCLK_SPEED 2 //設定預設等于2

#if FCLK_SPEED==0

#define M_MDIV 0xC3

#define M_PDIV 0x4

#define M_SDIV 0x1

#elif FCLK_SPEED==1

#define M_MDIV 0xA1

#define M_PDIV 0x3

#define M_SDIV 0x1

#elif FCLK_SPEED==2

#define M_MDIV 0x7F //這三個值根據S3C2440晶片手冊“PLL VALUE SELECTION TABLE”部分進行設定

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

#define USB_CLOCK 2 //設定預設等于2

#if USB_CLOCK==0

#define U_M_MDIV 0xA1

#define U_M_PDIV 0x3

#define U_M_SDIV 0x1

#elif USB_CLOCK==1

#define U_M_MDIV 0x48

#define U_M_PDIV 0x3

#define U_M_SDIV 0x2

#elif USB_CLOCK==2

#define U_M_MDIV 0x38 //這三個值根據S3C2440晶片手冊“PLL VALUE SELECTION TABLE”部分進行設定

#define U_M_PDIV 0x2

#define U_M_SDIV 0x2

#endif

(2)用gedit打開cpu/arm920t/s3c24x0/speed.c,定位到69行加入如下代碼

m = ((r & 0xFF000) >> 12) + 8;

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

s = r & 0x3;

//根據設定的分頻系數FCLK:HCLK:PCLK = 1:4:8修改擷取時鐘頻率的函數

#if defined(CONFIG_S3C2440)

if(pllreg == MPLL)//參考S3C2440晶片手冊上的公式:PLL=(2 * m * Fin)/(p * 2s)

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

//else if (pllreg == UPLL) //warning: control reaches end of non-void function

#endif

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

為什麼要再傳回時加一個判斷呢?因為在2440中MPLL的時鐘為UPLL時鐘的2倍,在s3c2440的資料手冊裡的227頁這樣寫到MPLL和UPLL的計算方法

MPLL Control Register

Mpll = (2 * m * Fin) / (p * 2s)

m = (MDIV + 8), p = (PDIV + 2), s = SDIV

UPLL Control Register

Upll = (m * Fin) / (p * 2s)

m = (MDIV + 8), p = (PDIV + 2), s = SDIV

這個就是修改此函數的緣由。

由于S3C2410和S3C2440的設定方法也不一樣,是以get_HCLK函數也需要修改:

ulong get_HCLK(void)

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

#if defined(CONFIG_S3C2440)

if (clk_power->CLKDIVN & 0x6)

{

if ((clk_power->CLKDIVN & 0x6)==2) return(get_FCLK()/2);

if ((clk_power->CLKDIVN & 0x6)==6) return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);

if ((clk_power->CLKDIVN & 0x6)==4) return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);

return(get_FCLK());

}

else return(get_FCLK());

#else

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

#endif

}

這裡用到了将在include/s3c24x0.h檔案裡所添加的CAMDIVN 項,因為這一項的值決定了我們的時鐘配置。

這樣修改的原因是在s3c2440的資料手冊的231頁有這樣一段話:

CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER

Register Address R/W Description Reset Value

CLKDIVN 0x4C000014 R/W Clock divider control register 0x00000000

CLKDIVN Bit Description

DIVN_UPLL [3] UCLK select register(UCLK must be 48MHz for USB)

0:UCLK = UPLL clock

1:UCLK = UPLL clock / 2

Set to 0, when UPLL clock is set as 48Mhz

Set to 1. when UPLL clock is set as 96Mhz.

HDIVN [2:1] 00 : HCLK = FCLK/1.

01 : HCLK = FCLK/2.

10 : HCLK = FCLK/4 when CAMDIVN[9] = 0.

HCLK= FCLK/8 when CAMDIVN[9] = 1.

11 : HCLK = FCLK/3 when CAMDIVN[8] = 0.

HCLK = FCLK/6 when CAMDIVN[8] = 1.

PDIVN [0] 0: PCLK has the clock same as the HCLK/1.

1: PCLK has the clock same as the HCLK/2.

我們到底應該傳回FCLK的幾分之一在這裡就有秒數,其中必須根據HDIVN 的值與CAMDIVN的值來判斷。

【3】加入LED進度訓示,增加控制台顯示資訊

作用是顯示代碼進度,對 Debug 有幫助。

(1)代碼在跳轉到第二階段代碼start_armboot 函數前會亮起一個LED 燈,打開cpu/arm920t/start.S,定位到240行附近,修改如下:

clbss_l: str r2, [r0]

add r0, r0, #4

cmp r0, r1

ble clbss_l

#if defined(CONFIG_MINI2440_LED)

//根據mini2440原理圖可知LED分别由S3C2440的PB5、6、7、8口來控制,

//以下是PB端口寄存器基位址(查2440的DataSheet得知)

#define GPBCON 0x56000010

#define GPBDAT 0x56000014

#define GPBUP 0x56000018

//以下對寄存器的操作參照S3C2440的DataSheet進行操作

ldr r0, =GPBUP

ldr r1, =0x7FF //即:二進制11111111111,關閉PB口上拉

str r1, [r0]

ldr r0, =GPBCON //配置PB5、6、7、8為輸出口,對應PBCON寄存器的第10-17位

ldr r1, =0x154FD //即:二進制010101010011111101

str r1, [r0]

ldr r0, =GPBDAT

ldr r1, =0x1C0 //即:二進制111000000,PB5設為低電平,6、7、8為高電平

str r1, [r0]

#endif

//此段代碼使u-boot啟動後,開發闆上的LED1被點亮,而LED2、LED3、LED4不亮

ldr pc, _start_armboot

_start_armboot: .word start_armboot

#define STACK_BASE 0x33f00000

#define STACK_SIZE 0x10000

.align 2

DW_STACK_START: .word STACK_BASE+STACK_SIZE-4

(2)在完成board_init函數初始化時的點亮第二個LED,修改如下:

打開board/samsung/mini2440/mini2440.c,定位到100行附近,修改如下:

gpio->GPACON = 0x007FFFFF;

#if defined(CONFIG_MINI2440)

gpio->GPBCON = 0x00295551;

#else

gpio->GPBCON = 0x00044556;

#endif

gpio->GPBUP = 0x000007FF;

gpio->GPCCON = 0xAAAAAAAA;

gpio->GPCUP = 0xFFFFFFFF;

gpio->GPDCON = 0xAAAAAAAA;

gpio->GPDUP = 0xFFFFFFFF;

gpio->GPECON = 0xAAAAAAAA;

gpio->GPEUP = 0x0000FFFF;

gpio->GPFCON = 0x000055AA;

gpio->GPFUP = 0x000000FF;

gpio->GPGCON = 0xFF95FFBA;

gpio->GPGUP = 0x0000FFFF;

gpio->GPHCON = 0x0016FAAA;

gpio->GPHUP = 0x000007FF;

gpio->EXTINT0=0x22222222;

gpio->EXTINT1=0x22222222;

gpio->EXTINT2=0x22222222;

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

gd->bd->bi_boot_params = 0x30000100;

icache_enable();

dcache_enable();

#if defined(CONFIG_MINI2440_LED)

gpio->GPBDAT = 0x00000181;//GPB0=buzzer

#endif

int dram_init (void)

{

gd->bd->bi_dram[0].start = PHYS_SDRAM_1;

gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

return 0;

}

(3)在初始化console後點亮一個LED3,進入指令行之前點亮LED4

打開/lib_arm/board.c,定位到52行,修改如下:

#include <nand.h>

#include <onenand_uboot.h>

#include <mmc.h>

#include <s3c2410.h> //modify

#ifdef CONFIG_DRIVER_SMC91111

定位到121行,注釋掉下面代碼:

#if 0

void inline __coloured_LED_init (void) {}

//void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));

void inline __red_LED_on (void) {}

//void inline red_LED_on (void) __attribute__((weak, alias("__red_LED_on")));

void inline __red_LED_off(void) {}

//void inline red_LED_off(void) __attribute__((weak, alias("__red_LED_off")));

void inline __green_LED_on(void) {}

//void inline green_LED_on(void) __attribute__((weak, alias("__green_LED_on")));

void inline __green_LED_off(void) {}

//void inline green_LED_off(void)__attribute__((weak, alias("__green_LED_off")));

void inline __yellow_LED_on(void) {}

//void inline yellow_LED_on(void)__attribute__((weak, alias("__yellow_LED_on")));

void inline __yellow_LED_off(void) {}

//void inline yellow_LED_off(void)__attribute__((weak, alias("__yellow_LED_off")));

void inline __blue_LED_on(void) {}

//void inline blue_LED_on(void)__attribute__((weak, alias("__blue_LED_on")));

void inline __blue_LED_off(void) {}

//void inline blue_LED_off(void)__attribute__((weak, alias("__blue_LED_off")));

#endif

定位到171行附近:修改如下:

static int display_banner (void)

{

#if defined(CONFIG_MINI2440_LED)

S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

gpio->GPBDAT = 0x101; //

#endif

printf ("\n\n%s\n\n", version_string);

printf (" modified by singleboy ([email protected])\n"); //display on serial console

printf (" Love Linux forever!!\n\n");

debug ("U-Boot code: %08lX -> %08lX BSS: -> %08lX\n",

_armboot_start, _bss_start, _bss_end);

#ifdef CONFIG_MODEM_SUPPORT

debug ("Modem Support enabled\n");

#endif

#ifdef CONFIG_USE_IRQ

debug ("IRQ Stack: %08lx\n", IRQ_STACK_START);

debug ("FIQ Stack: %08lx\n", FIQ_STACK_START);

#endif

return (0);

}

定位到314行附近:修改如下:

#if defined(CONFIG_VFD) || defined(CONFIG_LCD)

unsigned long addr;

#endif

#if defined(CONFIG_MINI2440_LED)

S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

#endif

gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));

__asm__ __volatile__("": : :"memory");

定位到479行附近,修改如下:

#if defined(CONFIG_RESET_PHY_R)

debug ("Reset Ethernet PHY\n");

reset_phy();

#endif

#endif

#if defined(CONFIG_MINI2440_LED)

gpio->GPBDAT = 0x0; //

#endif

for (;;) {

main_loop ();

}

【4】如果這時進行編譯,是不能通過的,對于S3C2440,很多代碼是借用S3C2410 的,是以要在所有條件編譯中有CONFIG_S3C2410 的地方添CONFIG_S3C2440,這樣這些代碼才會編譯進來。一個簡單的方法就是在代碼中搜尋出所有的CONFIG_S3C2410,并根據實際情況修改。但要注意不是所有的2410的寄存器都和2440相容,還必須根據兩個晶片的不同來分布做出修改,比如PLL的操作代碼和NAND Flash Controller的操作代碼。現分别修改如下:

(1)打開include/common.h,定位到496行,修改結果如下:

#ifdef CONFIG_4xx

ulong get_OPB_freq (void);

ulong get_PCI_freq (void);

#endif

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || \

defined(CONFIG_LH7A40X) || defined(CONFIG_S3C6400)

ulong get_FCLK (void);

ulong get_HCLK (void);

(2)打開include/s3c24x0.h檔案,分别定位到85、95、99、110、148、404行,将“#ifdef CONFIG_S3C2410”改為

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) //#ifdef CONFIG_S3C2410

然後在下面結構中加入2440 的NAND FLASH 的資料結構成員CAMDIVN定義(第128行附近):

typedef struct {

S3C24X0_REG32 LOCKTIME;

S3C24X0_REG32 MPLLCON;

S3C24X0_REG32 UPLLCON;

S3C24X0_REG32 CLKCON;

S3C24X0_REG32 CLKSLOW;

S3C24X0_REG32 CLKDIVN;

#if defined (CONFIG_S3C2440)

S3C24X0_REG32 CAMDIVN;

#endif

} S3C24X0_CLOCK_POWER;

這個結構是用來封裝時鐘寄存器的,我們要在其中增加一項CAMDIVN寄存器是2410所沒有的,而2440在配置時鐘的時候又必須用到,看名字我們就知道是用來配置CAMERA時鐘的,也就是配置攝像頭的時鐘的。

加入Nand flash寄存器定義(第160行附近):

#if defined(CONFIG_S3C2410)

typedef struct {

S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCMD;

S3C24X0_REG32 NFADDR;

S3C24X0_REG32 NFDATA;

S3C24X0_REG32 NFSTAT;

S3C24X0_REG32 NFECC;

} S3C2410_NAND;

#endif

#if defined (CONFIG_S3C2440)

typedef struct {

S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCONT;

S3C24X0_REG32 NFCMD;

S3C24X0_REG32 NFADDR;

S3C24X0_REG32 NFDATA;

S3C24X0_REG32 NFMECCD0;

S3C24X0_REG32 NFMECCD1;

S3C24X0_REG32 NFSECCD;

S3C24X0_REG32 NFSTAT;

S3C24X0_REG32 NFESTAT0;

S3C24X0_REG32 NFESTAT1;

S3C24X0_REG32 NFMECC0;

S3C24X0_REG32 NFMECC1;

S3C24X0_REG32 NFSECC;

S3C24X0_REG32 NFSBLK;

S3C24X0_REG32 NFEBLK;

} S3C2410_NAND;

#endif

(3)打開cpu/arm920t/s3c24x0/interrupts.c檔案,定位到第36行作如下修改:

#if defined(CONFIG_S3C2400)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

#include <s3c2410.h>

#endif

(4)打開cpu/arm920t/s3c24x0/timer.c檔案分别定位到33行和37行,修改如下:

#include <common.h>

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_TRAB)

#if defined(CONFIG_S3C2400)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#include <s3c2410.h>

#endif

在180行添加:

#if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)

tbclk = timer_load_val * 100;

#elif defined(CONFIG_SBC2410X) || \

defined(CONFIG_SMDK2410) || \

defined(CONFIG_MINI2440) || \

defined(CONFIG_VCMA9)

tbclk = CONFIG_SYS_HZ;

#else

# error "tbclk not configured"

#endif

(5)打開cpu/arm920t/s3c24x0/speed.c,分别定位到33行和37行,修改如下:

#include <common.h>

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_TRAB)

#if defined(CONFIG_S3C2400)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#include <s3c2410.h>

#endif

(6)打開/cpu/arm920t/s3c24x0/usb.c檔案,定位到第27、31行:

#if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT)

# if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#if defined(CONFIG_S3C2400)

# include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

# include <s3c2410.h>

#endif

(7)打開drivers/serial/serial_s3c24x0.c,定位到24行,修改如下:

#include <common.h>

#if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#include <s3c2410.h>

#endif

(8)打開drivers/rtc/s3c24x0_rtc.c檔案,定位到第35行:

#if defined(CONFIG_S3C2400)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#include <s3c2410.h>

#endif

(9)打開/drivers/i2c/s3c24x0_i2c.c檔案,定位到32行:

#include <common.h>

#if defined(CONFIG_S3C2400)

#include <s3c2400.h>

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

#include <s3c2410.h>

#endif

#include <i2c.h>

再分别定位到第63、82、139、147、171行:

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) //#ifdef CONFIG_S3C2410

return (gpio->GPEDAT & 0x8000) >> 15;

#endif

... ...

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) //#ifdef CONFIG_S3C2410

gpio->GPEDAT = (gpio->GPEDAT & ~0x4000) | (x&1) << 14;

#endif

... ...

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) //#ifdef CONFIG_S3C2410

gpio->GPECON = (gpio->GPECON & ~0xF0000000) | 0x10000000;

#endif

... ...

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) //#ifdef CONFIG_S3C2410

gpio->GPECON = old_gpecon;

#endif

【5】在mini2440.h頭檔案中加入宏定義

用gedit打開include/configs/mini2440.h頭檔案,在其中添加CONFIG_S3C2440宏,修改後代碼如下所示

#define CONFIG_ARM920T 1

//#define CONFIG_S3C2410 1

//#define CONFIG_SMDK2410 1

#define CONFIG_S3C2440 1

#define CONFIG_MINI2440 1

#define CONFIG_MINI2440_LED 1

#define CONFIG_SYS_CLK_FREQ 12000000

【6】為了能夠讓u-boot.bin下載下傳到記憶體中運作,需要注釋掉CPU和DRAM初始化部分

用gedit打開cpu/arm920t/start.S,定位到如下代碼

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

将其注釋掉,屏蔽u-boot對CPU、RAM的初始化

//#ifndef CONFIG_SKIP_LOWLEVEL_INIT

//bl cpu_init_crit

//#endif

1.3重新編譯,運作測試

[[email protected] u-boot-2009.08]# make clean

Generating include/autoconf.mk

[[email protected] u-boot-2009.08]# make

... ...

In file included from speed.c:38:

/root/u-boot-test/u-boot-2009.08/include/s3c2410.h:96: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token

make[1]: *** [speed.o] 錯誤 1

make[1]: Leaving directory `/root/u-boot-test/u-boot-2009.08/cpu/arm920t/s3c24x0'

make: *** [cpu/arm920t/s3c24x0/libs3c24x0.a] 錯誤 2

錯誤發生在/include/s3c2410.h:96行S3C2410_NAND結構定義,将其誤寫成S3C2440_NAND了,進行更正後重新編譯。

編譯完成之後,利用mini2440自帶的supervivi将根目錄u-boot-2009.08下的u-boot.bin檔案下載下傳到DRAM中運作測試。确認開發闆與主機之間的網線和序列槽線已經正确連接配接,給開發闆上電,在suppervivi啟動完成後,在與開發闆相連的終端中執行如下指令:

##### FriendlyARM BIOS 2.0 for 2440 #####

[x] format NAND FLASH for Linux

[v] Download vivi

[k] Download linux kernel

[y] Download root_yaffs image

[a] Absolute User Application

[n] Download Nboot for WinCE

[l] Download WinCE boot-logo

[w] Download WinCE NK.bin

[d] Download & Run

[z] Download zImage into RAM

[g] Boot linux from RAM

[f] Format the nand flash

[b] Boot the system

[s] Set the boot parameters

[u] Backup NAND Flash to HOST through USB(upload)

[r] Restore NAND Flash from HOST through USB

[q] Goto shell of vivi

Enter your selection: d

Clear the free memory

USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:31000000h,TOTAL:99806]

RECEIVED FILE SIZE: 99806 (97KB/S, 1S)

Downloaded file at 0x30000000, size = 99796 bytes

U-Boot 2009.08 ( 5鏈?04 2011 - 17:04:11)

DRAM: 64 MB

Flash: 512 kB

*** Warning - bad CRC, using default environment

In: serial

Out: serial

Err: serial

SMDK2410 #

到此可以看到u-boot的版本和編譯時間-Boot 2009.08 ( 4鏈?22 2011 - 17:04:11),以及還未修改的提示符SMDK2410 #。同時還可以看到開發闆上的第一個LED燈是亮的,其它三個是滅的。有關Warning ...相關的告警資訊,将在下一節解決。

接下來将進入u-boot的第二階段,為u-boot-2009.08增加norflash支援。

轉載自:http://www.linuxidc.com/Linux/2011-05/35982.htm