歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 移植U-Boot-2009.08到mini2440(二)板級設置

移植U-Boot-2009.08到mini2440(二)板級設置

日期:2017/3/1 10:44:42   编辑:Linux編程

一、環境

目標板:mini2440

u-boot版本:u-boot-2009.08

交叉編譯器:arm-linux-gcc-4.3.2

操作系統:Linux(Ubuntu-11.10)

相關閱讀: 植U-Boot-2009.08到mini2440 基礎配置篇 http://www.linuxidc.com/Linux/2011-12/50388.htm

二、目的

修改cpu/arm920t/start.s包括時鐘部分、中斷部分、看門狗

修改cpu/arm920t/

增加mini2440的板子定義

三、步驟

1、 注釋LED跳轉

cpu/arm920t/start.s第117行,這部分的LED初始化代碼是為AT91RM9200DK開發板寫的。這裡我們注釋掉跳轉語句

blcoloured_LED_init

blred_LED_on

@bl coloured_LED_init

@bl red_LED_on

2、 添加板子宏定義

在include/configs/mini2440.h 文件中去掉s3c2410的宏定義,修改為:

#define CONFIG_S3C2440 1 /*in a SAMSUNG S3C2440 SoC */

3、 CPU頻率定義

S3c2440比s3c2410的頻率要高,為405MHZ。所以我們必須要修改CPU頻率設置的代碼。

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

/* turn off the watchdog */

# ifdefined(CONFIG_S3C2400)

# define pWTCON 0x15300000

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

# define CLKDIVN 0x14800014 /* clockdivisor register */

#else

# define pWTCON 0x53000000

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

# define INTSUBMSK 0x4A00001C

# define CLKDIVN 0x4C000014 /* clockdivisor register */

# endif

修改為

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

/* turn off the watchdog */

# ifdefined(CONFIG_S3C2400)

# define pWTCON 0x15300000

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

# define CLKDIVN 0x14800014 /* clockdivisor register */

#else

# define pWTCON 0x53000000

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

# define INTSUBMSK 0x4A00001C

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

# endif

#define CLK_CTL_BASE 0x4c000000

#define MDIV_405 0x7f << 12

#define PSDIV_405 0x21

#define MDIV_200 0xa1 << 12

#define PSDIV_200 0x31

由於S3C2410和S3C2440的MPLL、UPLL計算公式不一樣,所以get_PLLCLK函數也需要修改

get_PLLCLK函數在cpu\arm920t\s3c24x0\speed.c

static ulongget_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;

#ifdefined(CONFIG_S3C2440)

if(pllreg == MPLL)

{

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

}

#endif

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

}

由於S3C2410和S3C2440的設置方法也不一樣,所以get_HCLK函數也需要修改

get_HCLK函數在cpu\arm920t\s3c24x0\speed.c

ulong get_HCLK(void)

{

S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();

#ifdefined(CONFIG_S3C2440)

return(get_FCLK()/4);

#endif

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

}

Copyright © Linux教程網 All Rights Reserved