Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39740
  • 博文数量: 25
  • 博客积分: 605
  • 博客等级: 中士
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 21:57
文章分类

全部博文(25)

文章存档

2012年(22)

2011年(3)

我的朋友

分类: LINUX

2012-05-01 11:00:24

uboot版本 2010.03

开发板 杨创2440

主机:windows7 + VM ubuntu10.4

编译器:ARM-Linux GCC 4.3.2 

 

其实写这个东西主要是做个备份,怕自己以后忘了,所以有些内容直接用了其他人写的东西。如有不足之处敬请指出。

 

参考文档:

http://blog.chinaunix.net/u3/101649/showart_2105215.html

这里一些原理讲的很好,一定要看

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

这里有完整的源码,可以参考。

 

 

以下会有一些上述2个blog的内容,不再另行指出。

 

uboot下载

可以用git下载 也可以在网页上直接下载。

 

在board/samsung/下建立smdk2440目录 并将smdk2410中文件copy过来,并改名。

编辑makefile文件

smdk2440目录下的:

COBJS    := smdk2440.o flash.o

根目录下的

#gedit Makefile

CROSS_COMPILE ?= arm-linux-        //指定交叉编译器为arm-linux-gcc

 

smdk2410_config    :    unconfig   //2410编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

 

smdk2440_config    :    unconfig     //2440编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t my2440 samsung s3c24x0

 

*说明:arm    :CPU的架构(ARCH)

       arm920t:CPU的类型

       smdk2440 :对应在board目录下建立新的开发板项目的目录

       samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL

       s3c24x0:CPU型号

*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错

 

在include/config下 copy smdk2410.h 为smdk2440.h

 

#make smdk2440_config //如果出现Configuring for smdk2440 board...则表示设置正确

#make //编译后在根目录下会出现u-boot.bin文件,则u-boot移植的第一步就算完成了

 

修改start.s

#gedit cpu/arm920t/start.S

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


根据原理图 加上板子led的代码

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

#define GPBCON 0x56000050//gpio配置
#define GPBDAT 0x56000054//data
#define GPBUP  0x56000058   //上拉

    //以下对寄存器的操作参照S3C2440的DataSheet进行操作
    ldr r0, =GPBCON
    ldr r1, =0x55aa    //配置为输出口
    str r1, [r0]

    ldr r0, =GPBUP  
    ldr r1, =0xff  //关掉上拉
    str r1, [r0]

    ldr r0, =GPBDAT
    ldr r1, =0x00    //我的板子是低电平 led点亮
    str r1, [r0]

#endif

 

在include/configs/my2440.h头文件中添加CONFIG_S3C2440宏

注意include/asm-arm/arch-s3c24x0/s3c24x0.h 这个文件 可能需要加一些东西。可参考上面blog的代码

#gedit include/configs/smdk2440.h

#define CONFIG_ARM920T        1    /* This is an ARM920T Core     */
#define CONFIG_S3C2410        1    /* in a SAMSUNG S3C2410 SoC    */
#define CONFIG_SMDK2440       1    /* on a SAMSUNG SMDK2410 Board */
#define CONFIG_S3C2440        1    /* in a SAMSUNG S3C2440 SoC    */

并把代码中定义CONFIG_SMDK2410的地方也加上CONFIG_SMDK2440

 

 

先下到ram中测试

/*#ifndef CONFIG_SKIP_LOWLEVEL_INIT //在start.S文件中屏蔽u-boot对CPU、RAM的初始化
   bl cpu_init_crit
#endif*/

#make smdk2440_config

#make

下载运行后可以看到开发板上的LED灯亮了。

 

在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。
由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在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  //下面2410和2440的寄存器地址是一致的
# 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/my2440/my2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:

#gedit board/samsung/smdk2440/smdk2440.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的命令行,这说明这一部分移植完成。

阅读(302) | 评论(0) | 转发(0) |
0

上一篇:u-boot 网卡

下一篇:内核移植

给主人留下些什么吧!~~