您的位置:首页 > 其它

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

2013-03-19 21:02 295 查看
一·增加對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

此時第一步就算完成了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: