UBOOT-2010-03在S3C2440上的移植<二>------------硬件初始化

三、修改时钟频率和中断的配置

Notes:下面绿色色部分代码既是需要修改的代码

             接上文

UBOOT-2010-03在S3C2440上的移植<一>------------项目搭建

3.1)修改eilian240开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的 stage1部分)  

3.1.1) 添加CPU频率初始化设置:

    大概在star.S文件的第146行代码后面添加如下内容

/***定义时钟配置寄存器****change by eilianlau*************************/
#define CLK_CTL_BASE    0x4C000000
#define MDIV_405    0x7f << 12
#define PSDIV_405    0x21
#define MDIV_200    0xa1 << 12
#define PSDIV_200    0x31

/***************这些寄存器的定义S3C2440数据手册上是说的再清楚不过了如果不知道怎么配置请看下面贴图

3.1.2)添加中断禁止部分: 因为2410和2440的中断配置不同

# if defined(CONFIG_S3C2410)
    ldr    r1, =0x3ff
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
#endif                          //
/***添加中断禁止部分****changeby eilianlau*************************/

# if defined(CONFIG_S3C2440)

 ldr r1, =0x7fff

 ldr r0, =INTSUBMSK

 str r1, [r0]

# endif

3.1.3) 修改时钟设置(2440的主频为405MHz)

          原来的时钟设置函数是

/* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]

          修改上述代码如下

/***修改时钟设置(2440的主频为405MHz)****change by eilianlau***FCLK:HCLK:PCLK=1:4:8******/
/*********************************/
#if defined(CONFIG_S3C2440)
    /* FCLK:HCLK:PCLK = 1:4:8 */
    ldr    r0, =CLKDIVN
    mov    r1, #5
    str    r1, [r0]
    
    mrc    p15, 0, r1, c1, c0, 0    
    orr    r1, r1, #0xc0000000        
    mcr    p15, 0, r1, c1, c0, 0    
    /****上面这三句是非常的重要的对于S3C2440,CLKDIVN的第[2:1]位为HDIVN,如果HDIVN非0,CPU总线模   式应该从“fast bus mode”转换为“asynchronous bus mode”,可以通过上面的3句程序实现。否则
CPU的工作频率将自动变成HCLK,不再是FCLK。这对SDRAM的初始化至关重要。****/
    mov    r1, #CLK_CTL_BASE    
    mov    r2, #MDIV_405    
    add    r2, r2, #PSDIV_405    
    str    r2, [r1, #0x04]        /* MPLLCON*/
/************************************/
#else
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
/*************************************/    
    mrc    p15, 0, r1, c1, c0, 0    
    orr    r1, r1, #0xc0000000    
    mcr    p15, 0, r1, c1, c0, 0    
    
    mov    r1, #CLK_CTL_BASE    
    mov    r2, #MDIV_200    
    add    r2, r2, #PSDIV_200    
    str    r2, [r1, #0x04]
#endif
/**************没什么可说的还是S3C2440数据手册********************/
#endif    /* CONFIG_S3C24X0 */

3.2)修改cpu/arm920t/s3c24x0/ speed.c

       我直接添代码吧<不知道要说什么。。>

3.2.1)修改static ulong get_PLLCLK(int pllreg)

static ulong get_PLLCLK(int pllreg)
{
    struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power();
    ulong r, m, p, s;

    if (pllreg == MPLL)
        r = readl(&clk_power->MPLLCON);
    else if (pllreg == UPLL)
        r = readl(&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);
}

3.2.2)修改ulong get_FCLK(void)

/* return HCLK frequency */
ulong get_HCLK(void)
{
    struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power();
#if defined(CONFIG_S3C2440)
    return(get_FCLK()/4);
#endif

    return (readl(&clk_power->CLKDIVN) & 2) ?get_FCLK() / 2 : get_FCLK();
}

3.3)修改board/Samsung/eilian240/ eilian240.c 

3.3.1)修改FCLK代码中带详细解释

/**#define FCLK_SPEED 1 *默认是加载FCLK_SPEED==1但2440的FCLK输出时钟为405Mhz该设置请参考2440数据手册255页那个表*/
#define FCLK_SPEED 2
/**change by eilianlau********/
#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

/**change by eilianlau********/
#elif FCLK_SPEED==2       /* Fout = 405MHz */
#define M_MDIV    0x7f
#define M_PDIV    0x2
#define M_SDIV    0x1
#endif

/**change by eilianlau********/

3.3.2)修改USB的时钟

/**#define USB_CLOCK 1*道理同上*/
#define USB_CLOCK 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

/**change by eilianlau********/
#elif USB_CLOCK==2
#define U_M_MDIV    0x38
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2
#endif

3.3.3)修改引导Linux内核的机器码<机器码必须和Linux内核中的机器码相同 这个是自己可以定义> cpu/arm920t/s3c24x0/ speed.c

    /* arch number of eilian240-Board */
    /* 这个机器码用于和Linux内核配对*/
    gd->bd->bi_arch_number =MACH_TYPE_EILIAN240;

    /* adress of boot parameters */
    gd->bd->bi_boot_params = 0x30000100;

    icache_enable();

3.4)定义3.3.3的机器码MACH_TYPE_EILIAN240

3.4.1)修改u-boot-2010.03/include/asm-arm/mach-types.h    <机器码都定义在这个文件中呢。。>

      在第2702行添加下面的宏定义就O了

#defineMACH_TYPE_EILIAN240           8000

3.5)在include/configs/eilian240.h头文件中添加之前用到的CONFIG_S3C2440宏
       第40行添加代码如下:
#define CONFIG_S3C2440 1   /* on aeilian240 Board  */ 

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

3.6)另外为了更好理解S3C2440的时钟体系 上传几个图来理解希望对大家有所帮助<移植S3C3440芯片手册是必须要要参看的>

S3C2440时钟体系<一>


S3C2440时钟体系<二>

 

S3C2440时钟启动<一>

S3C2440时钟启动<二>

 

S3C2440时钟时钟相关寄存器LOCKTIME


S3C2440时钟时钟相关寄存器MPLLCON


S3C2440时钟时钟相关寄存器CLKDIVN


至此硬件初始化的工作就完成了。。可以测试编译下看有没有错误<编译通过 No problem> 如发现有错误请指出 十分感谢。。。

Notes:该文档下载地址连接点击下载此文档

Notes:下文接

UBOOT-2010-03在S3C2440上的移植<三>------------自动识别启动模式Nand Or Nor





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值