u-boot-2009.08移植笔记二,平台TQ2440

一·增加對S3C2440的支持
由於U-BOOT沒有對2440的支持,可以在2410的基礎上修改
添加宏定義如下:
    vi include/configs/CM2440.h 第37行
#define CONFIG_S3C2440          1       /* in a SAMSUNG S3C2440 SoC     */
#define CONFIG_CM2440           1       /* on a SAMSUNG CCM2440 Board  */
並屏蔽掉原來的
1.修改SDRAM配置
    vi board/samsung/CM2440/lowlevel_init.S
    修改lowlevel_init.S第54行
#define B1_BWSCON               (DW16)//DW32
#define B2_BWSCON               (DW16)
#define B3_BWSCON               (DW16 + WAIT + UBLB)
#define B4_BWSCON               (DW16)//DM9000
#define B5_BWSCON               (DW8)//DW16
#define B6_BWSCON               (DW32)//SDRAM
#define B7_BWSCON               (DW32)
    修改SDRAM刷新率,第126行
#define REFCNT                  0x4f4  /* period=7.8125us,HCLK=100Mhz,(2048+1-7.8125*100)=0x4F4 */

2.修改start.S
stage1的入口點在start.S,現在修改裡寄存器的配置
      vi cpu/arm920t/start.S 第143行左右
#elif defined(CONFIG_S3C2440)
# define pWTCON         0x53000000
# define INTMOD         0X4A000004
# define INTMSK         0x4A000008      /* Interupt-Controller base addresses */
# define INTSUBMSK      0x4A00001C
# define CLKDIVN        0x4C000014      /* clock divisor register */

# if defined(CONFIG_S3C2410)
        ldr     r1, =0x3ff
        ldr     r0, =INTSUBMSK
        str     r1, [r0]
/******************WXZ********************/
#elif defined(CONFIG_S3C2440)
        ldr     r1, =0x7fff
        ldr     r0, =INTSUBMSK
        str     r1, [r0]
/******************WXZ*******************/
# endif
3.時鐘修改
2440的時鐘和2410的時鐘設置有區別,將FCLK:HCLK:PCLK=1:4:8
start.S第171行添加

/******************WXZ******************/
# if defined(CONFIG_S3C2440)
#define MPLLCON         0x4c000004
#define UPLLCON         0x4c000008
#define LOCKTIME    0x4c000000
   
    ldr     r0,=LOCKTIME
        ldr     r1,=0xffffff
        str     r1,[r0]

        /* FCLK:HCLK:PCLK = 1:4:8 */
        ldr r0, =CLKDIVN
        ldr r1, =0x5
        str r1, [r0]

        ldr r0, =MPLLCON
        ldr r1, =0x5c021/*mpll=400MHZ*/
        str r1, [r0]

        ldr r0, =UPLLCON
        ldr r1, =0x38022
        str r1, [r0]
# else
/********************WXZ****************/
        /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 120 MHz ! */
        ldr     r0, =CLKDIVN
時鐘還要在board/samsung/CM2440/CM2440.c和cpu/arm920t/s3c24x0/speed.c
中修改部分代碼,在第二階段初始化會用到
    修改board/samsung/CM2440/CM2440.c中board_init()時鐘部分
第67行加入如下宏定義:
/******************************WXZ****************************/
/* S3C2440: Mpll = (2*m * Fin) / (p * 2^s), UPLL = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
/* Fin = 12.0000MHz */
#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x02<<4)|(0x01))
//MPLL= 400MHz
#define S3C2440_UPLL_48MHZ      ((0x38<<12)|(0x02<<4)|(0x02))
//UPLL= 96MHz
#define S3C2440_CLKDIV  0x05 /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL/2= 48MHz*/
/*******************************WXZ*****************************/
以上代码针对 s3c2440定义了MPLL、UPLL寄存器的值。开发板输入时钟
为 12Mhz(这在 include/configs/CM2440.h 中的宏 CONFIG_SYS_CLK_FREQ 中定义)
註釋掉原來時鐘設置,在board_init()加入

/*********************************WXZ*******************************/
        clk_power->CLKDIVN = S3C2440_CLKDIV; //1:4:8
        /* change to asynchronous bus mod */
        __asm__(
        "mrc    p15, 0, r1, c1, c0, 0\n"
        "orr    r1, r1, #0xc0000000\n"
        "mcr p15, 0, r1, c1, c0, 0\n"
        :::"r1"
        );
        /* to reduce PLL lock time, adjust the LOCKTIME register */
        clk_power->LOCKTIME = 0xFFFFFF;

       /* configure UPLL */
        clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
       /* some delay between MPLL and UPLL */

        delay (4000);

         /* configure MPLL */
        clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
        //fin=12.000MHz
        /* some delay between MPLL and UPLL */
        delay (8000);
        /* arch number of SMDK2440-Board */
        gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
//關於MPLL,UPLL設置先後順序,按照手冊來說應該是UPLL設置以後至少7個機器周期后才設置MPLL
/*******************************WXZ********************************/
    vi cpu/arm920t/s3c24x0/speed.c 根据设置的分频系数FCLK:HCLKCLK = 1:4:8
修改获取时钟频率的函数
在開頭處包含頭文件第39行
#elif defined(CONFIG_S3C2440)
#include <s3c2440.h>
並在40行左右增加gt變量
DECLARE_GLOBAL_DATA_PTR;
下面分別修改get_PLLCLK();get_HCLK();get_PCLK();
是因為2410和2440分頻計算不一樣
get_PLLCLK();第72行改為
/******************************WXZ**********************/
    return((CONFIG_SYS_CLK_FREQ * m*2)/ (p << s));
同樣修改 get_HCLK();get_PCLK();
/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
        unsigned long clkdiv;
        unsigned long camdiv;
        int hdiv = 1;
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;
        /* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
        hdiv = 1;
        break;
        case S3C2440_CLKDIVN_HDIVN_2:
        hdiv = 2;
        break;
 case S3C2440_CLKDIVN_HDIVN_4_8:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
        break;
        case S3C2440_CLKDIVN_HDIVN_3_6:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
        break;
}
        return get_FCLK() / hdiv;

}

/* return PCLK frequency */
ulong get_PCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
        unsigned long clkdiv;
        unsigned long camdiv;
        int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
        clkdiv = clk_power->CLKDIVN;
 camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
        hdiv = 1;
        break;
        case S3C2440_CLKDIVN_HDIVN_2:
        hdiv = 2;
        break;
        case S3C2440_CLKDIVN_HDIVN_4_8:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
        break;
        case S3C2440_CLKDIVN_HDIVN_3_6:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
        break;
}

        return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);

}
     在 include/s3c24x0.h 中 重 新 定 义 S3C24X0_CLOCK_POWER 结 构 体 , 在
include/s3c24x0.h 中,S3C24X0_CLOCK_POWER 结构体中增加:129 行
    S3C24X0_REG32 CAMDIVN; /* for s3c2440*/

現在    make CM2440_config
       make all
可能會出現的一些錯誤,跟蹤會發現是smdk2410宏未定義出錯,此時改為CM2440即可,在start.s中屏蔽@bl cpu_init_crit,原因是CPUSDRAM已經初始化,在board/samsung/CM2440/config.mk 中修改_TXET_BASE=0x33000000加載到TXET_BASE這個地址運行

U-Boot 2009.08-rc3 ( 5 26 2011 - 19:03:54)

DRAM:  64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment

SMDK2410 #
以上並為對CAMDIVN進行操作,原因是複位時,初始值為0
此時第一步就算完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值