您的位置:首页 > 其它

u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(3)

2013-05-18 12:56 423 查看


u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(3)

转载别人的过程,加入自己的见解,谢谢分享:http://blog.163.com/liuqiang_mail@126/blog/static/1099688752011762710316/

根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动

【1】增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分

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

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

/* turn off the watchdog */

由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,修改后代码如下:

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

/* turn off the watchdog */

... ...

# 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 //其他开发板的时钟部分

/* FCLK:HCLK:PCLK = 1:2:4 */

/* default FCLK is 202.8 MHz ! */

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

ldr r0, =MPLLCON //设置系统主频为202.8MHz(可以先不添加,对我们的移植没有影响)

ldr r1, =0xa1031 //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分[b](可以先不添加,对我们的移植没有影响)


str r1, [r0](可以先不添加,对我们的移植没有影响)[/b]

[b]# endif[/b]

#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */

首先,上面INTSUBMSK寄存器有15位可用与2410是不同的,在之前的文章中已经做出说明了,这里不在说了,说一下时钟部分:看一下这两个寄存器



下面的说明也许需要注意一下,手册中说在设置MPLLCON和UPLLCON时要先设置UPLLCON,之后再设置MPLLCON,上面作者是没有按照这个要求来做的,没有去验证是否对系统有影响,在我的移植过程中我是按照手册中的要求,按顺序设置的,然后怎么通过设置MPLLCON和UPLLCON获得我们想要的系统主频时钟和USB时钟呢,手册上面给了我们一个计算方法,当然我们一般直接按照手册中给出的表获得我们想要的配置



看看这个配置表吧,我们用这个配置表来配置:



我们把主频时钟配置为405MHz,那么按照上面的说明,MDIV=127,PDIV=2,SDIV=1,所以MPLLCON =0x7F021,同理,把USB时钟配置为48MHz,按照上面的说明,MDIV=56,PDIV=2,SDIV=2,所以,UPLLCON=0x38022,[b]设置分频系数FCLK:HCLK:PCLK
= 1:4:8,下面
[/b]

【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 /* Fout = 203MHz, Fin = 12MHz for Audio */

#define M_MDIV 0xC3

#define M_PDIV 0x4

#define M_SDIV 0x1

#elif FCLK_SPEED==1 /* Fout = 202.8MHz */

#define M_MDIV 0xA1

#define M_PDIV 0x3

#define M_SDIV 0x1

#elif FCLK_SPEED==2 /* Fout = 405MHz */

#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 /* Fout = 48MHz */

#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倍,这个地方也是我有疑问的地方,虽然是2倍的关系不错,我这里在移植过程中还是加入了UPLL分支的计算方法,在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

程序先获得m,p,s,然后根据这三个变量求出响应的值,这个就是修改此函数的缘由。

由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改:

/* return HCLK frequency */

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页有这样一段话:



我们到底应该返回FCLK的几分之一在这里就有秒数,其中必须根据HDIVN 的值与CAMDIVN的值来判断。

【3】加入LED进度指示,增加控制台显示信息

作用是显示代码进度,对 Debug 有帮助。这里先看一下led的硬件连接





(1)代码在跳转到第二阶段代码start_armboot 函数前会亮起一个LED 灯,打开cpu/arm920t/start.S,定位到240行附近,修改如下:

clbss_l: str r2, [r0] /* clear loop... */

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

1.首先通过GPBUP关闭GPB口上拉



所以设置GPBUP=0x7FF

2.配置GPB5,6,7,8为输出



作者使用设置GPBCON=0x154FD,其中GPB1234全部reserved,GPB0同样设为输出,查看原理图可以知道,GPB0连接蜂鸣器,使蜂鸣器可以鸣叫

3.是第一个灯亮,就不解释了,懒得解释了

(2)在完成board_init函数初始化时的点亮第二个LED,修改如下:

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

/* set up the I/O ports */

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;


/* arch number of SMDK2410-Board */

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

/* adress of boot parameters */

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

/************************************************************************

* Coloured LED functionality

************************************************************************

* May be supplied by boards if desired

*/

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 (singleboy@163.com)\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

/* Pointer is writable since we allocated a register for it */

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

/* compiler optimization barrier needed for GCC >= 3.4 */

__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

/* main_loop() can return to retry autoboot, if so just run it again. */

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行附近):

/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */

/* (see S3C2410 manual chapter 7) */

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


} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;

这个结构是用来封装时钟寄存器的,我们要在其中增加一项CAMDIVN寄存器是2410所没有的,而2440在配置时钟的时候又必须用到,看名字我们就知道是用来配置CAMERA时钟的,也就是配置摄像头的时钟的。

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

#if defined(CONFIG_S3C2410)

/* NAND FLASH (see S3C2410 manual chapter 6) */

typedef struct {

S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCMD;

S3C24X0_REG32 NFADDR;

S3C24X0_REG32 NFDATA;

S3C24X0_REG32 NFSTAT;

S3C24X0_REG32 NFECC;

} /*__attribute__((__packed__))*/ S3C2410_NAND;

#endif

#if defined (CONFIG_S3C2440)

/* NAND FLASH (see S3C2440 manual chapter 6) */

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;

} /*__attribute__((__packed__))*/ S3C2410_NAND;

#endif


定位到343行附近,加入下面代码:

#endif /* __BIG_ENDIAN */

//S3C24X0_USB_DEV_FIFOS fifo[5];

//S3C24X0_USB_DEV_DMAS dma[5];

S3C24X0_REG32 res17[8];

S3C24X0_USB_DEV_FIFOS fifo[5];

S3C24X0_REG32 res18[11];

S3C24X0_USB_DEV_DMAS ep1;

S3C24X0_USB_DEV_DMAS ep2;

S3C24X0_REG8 res19[16];

S3C24X0_USB_DEV_DMAS ep3;

S3C24X0_USB_DEV_DMAS ep4;

} /*__attribute__((__packed__))*/ S3C24X0_USB_DEVICE;

定位到486行附近,加入下面代码:

S3C24X0_REG32 GSTATUS3;

S3C24X0_REG32 GSTATUS4;

#if defined (CONFIG_S3C2440)

S3C24X0_REG32 res9[3];

S3C24X0_REG32 MSLCON;

S3C24X0_REG32 GPJCON;

S3C24X0_REG32 GPJDAT;

S3C24X0_REG32 GPJUP;

#endif

#endif

} /*__attribute__((__packed__))*/ S3C24X0_GPIO;

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

S3C24X0_REG32 SDIDSTA;

S3C24X0_REG32 SDIFSTA;

#if defined(CONFIG_S3C2410)

#if 0

#ifdef __BIG_ENDIAN

S3C24X0_REG8 res[3];

S3C24X0_REG8 SDIDAT;

#else

S3C24X0_REG8 SDIDAT;

S3C24X0_REG8 res[3];

#endif

#endif

S3C24X0_REG32 SDIDAT;

S3C24X0_REG32 SDIIMSK;

#elif defined(CONFIG_S3C2440)

S3C24X0_REG32 SDIIMSK;

S3C24X0_REG32 SDIDAT;

#endif

} /*__attribute__((__packed__))*/ S3C2410_SDI;

(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

/* set I2CSDA and I2CSCL (GPE15, GPE14) to GPIO */

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

#endif

... ...

/* restore pin functions */

#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 /* This is an ARM920T Core */

//#define CONFIG_S3C2410 1 /* in a SAMSUNG S3C2410 SoC */

//#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */

#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */

#define CONFIG_MINI2440 1 /* on a SAMSUNG MINI2440 Board */

#define CONFIG_MINI2440_LED 1 /* mini2440 led on/off */


/* input clock of PLL */

#define CONFIG_SYS_CLK_FREQ 12000000/* the SMDK2410 has 12MHz input clock */

【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重新编译,运行测试

[root@localhost u-boot-2009.08]# make clean

Generating include/autoconf.mk

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

编译完成之后,利用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

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支持。
待续。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: