u-boot-2010-06在mini2440上的移植(二)

二.基本功能实现

2.1  mini2440开发板u-bootstage1阶段的硬件设备初始化

由于在u-boot启动代码处有两行是AT91RM9200DKLED初始代码,但我们mini2440上的LED资源与该开发板的不一致,所以我们要删除或屏蔽该处代码,再加上mini2440LED驱动代码(注:添加my2440 LED功能只是用于表示u-boot运行的状态,给调试带来方便,可将该段代码放到任何你想调试的地方),代码如下:

#gedit cpu/arm920t/start.S

 

/*bl coloured_LED_init  //这两行是AT91RM9200DK开发板的LED初始化,注释掉

    bl red_LED_on*/

#if defined(CONFIG_S3C2440)  //区别与其他开发板

//根据mini2440原理图可知LED分别由S3C2440PB5678口来控制,以下是PB端口寄存器基地址(2440DataSheet得知)

#define GPBCON 0x56000010

#define GPBDAT 0x56000014

#define GPBUP  0x56000018     

//以下对寄存器的操作参照S3C2440DataSheet进行操作

    ldr r0, =GPBUP

    ldr r1, =0x7FF    //即:二进制11111111111,关闭PB口上拉

    str r1, [r0]

    ldr r0, =GPBCON  //配置PB5678为输出口,对应PBCON寄存器的第10-17

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

    str r1, [r0]

 

    ldr r0, =GPBDAT

    ldr r1, =0x1C0    //即:二进制111000000PB5设为低电平,678为高电平

    str r1, [r0]

#endif

 

//此段代码使u-boot启动后,点亮开发板上的LED1LED2LED3LED4不亮

include/configs/mini2440.h头文件中添加CONFIG_S3C2440

#gedit include/configs/mini2440.h

#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    */

现在编译u-boot,在根目录下会生成一个u-boot.bin文件。然后我们利用mini2440原有的superviviu-boot.bin下载到RAM中运行测试(注意:我们使用supervivi进行下载时已经对CPURAM进行了初始化,所以我们在u-boot中要屏蔽掉对CPURAM的初始化),如下:

/*#ifndef CONFIG_SKIP_LOWLEVEL_INIT //start.S文件中屏蔽u-bootCPURAM的初始

   bl cpu_init_crit                        //

#endif*/

#make my2440_config

#make

2.2 u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分

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

#gedit cpu/arm920t/start.S

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

    /* turn off the watchdog */

 

# if defined(CONFIG_S3C2400)

# define pWTCON     0x15300000

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

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

#else     //下面24102440的寄存器地址是一致的

# define pWTCON     0x53000000

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

# define INTSUBMSK  0x4A00001C

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

# endif

    ldr  r0, =pWTCON

    mov  r1, #0x0

    str  r1, [r0]

    /*

     * mask all IRQs by setting all bits in the INTMR - default

     */

    mov  r1, #0xffffffff

    ldr  r0, =INTMSK

    str  r1, [r0]

# 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 //其他开发板的时钟部分,这里就不用管了,我们现在是做2440

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

    /* default FCLK is 120 MHz ! */ 

    ldr  r0, =CLKDIVN

    mov  r1, #3

    str  r1, [r0]

# endif

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

S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/mini2440/mini2440.carch/arm/cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:

#gedit board/samsung/mini2440/mini2440.c //设置主频和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

 

#gedit cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时

//频率的函数

static ulong get_PLLCLK(int pllreg)

{

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

    ulong r, m, p, s;

 

    if (pllreg == MPLL)

    r = clk_power->MPLLCON;

    else if (pllreg == UPLL)

    r = clk_power->UPLLCON;

    else

    hang();

 

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

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

    s = r & 0x3;

 

#if defined(CONFIG_S3C2440)

    if(pllreg == MPLL)

    {   //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)

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

    }

#endif

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

}

/* return HCLK frequency */

ulong get_HCLK(void)

{

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

#if defined(CONFIG_S3C2440)

    return(get_FCLK()/4);

#endif

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

}

 

修改完毕后我们再重新编译u-boot,然后再下载到RAM中运行测试。结果终端有输出信息并且出现类似Shell的命令行,这说明这一部分移植完成。示意图如下:

 u-boot-2010-06在mini2440上的移植(二)_第1张图片

你可能感兴趣的:(u-boot-2010-06在mini2440上的移植(二))