u-boot-2010.06移植(一)
上一篇 / 下一篇 2011-06-05 02:43:46 / 个人分类:嵌入式Linux
u-boot-2010.06移植(一)
硬件环境:
Intel Dual-Core E5200;2G DDR2-800;ASUS P5QL/EPU;Seagate SATAII-500G
S3C2440AL;H57V2562GTR*2;EN29LV160AB;K9F2G08U0B;CS8900A-CQ
J-Link V6.0
软件环境:
Windows7 Ultimate
VMware Workstation 6.0
Redhat Enterprise Linux Server Release 5.1
gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
一、 准备
1.1下载u-boot-2010.06
http://ftp.denx.de/pub/u-boot/u-boot-2010.06.tar.bz2
1.2解压u-boot-2010.06
tar jvxf u-boot-2010.06
1.3清除编译产生的中间件
make distclean
二、 开始移植
2.1、选择基础移植平台
因为u-boot中没有直接对S3C2440所支持的开发板,所以我们选择S3C2410的开发板SMDK2410作为蓝本进行移植。
2.2、创建自已的目标平台
在board/Samsung/下建立自已的目标平台目录,将smdk2410目录下的内容全部复制到我们自已的平台目录下,并将新目录下的smdk2410.c更名为smdk2440.c,另外还需要将我们刚得到的smdk2440.c加入到编译链接项中。
mkdir board/samsung/smdk2440
cp board/samsung/smdk2410/* board/samsung/smdk2440/ -arf
mv board/samsung/smdk2440/smdk2410.c board/samsung/smdk2440/smdk2440.c
vim board/samsung/smdk2440/Makefile
将第28行内容更改为
COBJS := smdk2440.o flash.o
2.3、创建smdk2440配置头文件
配置文件位于include/configs/目录,
cp include/configs/smdk2410.h include/configs/smdk2440.h
vim include/configs/smdk2440.h
将该文件第117行改为(这不是必需的,改不改无关紧要)
#define CONFIG_SYS_PROMPT "SMDK2440 # "
大家一看都知道这就是u-boot的命令行提示符
2.4、修改顶层Makefile文件(u-boot里有N多Makefile,所谓顶层,就是u-boot根目录下的Makefile,别搞错了)
vim Makefile
修改159内容,设置交叉变译器为
CROSS_COMPILE ?= arm-linux-
找到以下两行,大概在3051行
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
复制并更改为以下内容
smdk2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0
至此,我们的基本平台移植已完成,大家可以make make了
2.5、针对S3C2440特性修改
2.5.1、修改时钟
首先,为了在程序中我们采用分支方式处理2440与2410代码兼容,我们需要定义一个宏,来作为我们的条件判断依据,当然你也可以直接修改代码使最终程序只支持2440。
vim include/configs/smdk2440.h
在第40行上添加
#define CONFIG_SMDK2440 1 /**/
在u-boot中,所有处理都是查询模式,所以我们需要屏蔽掉处理器的所有中断源,找到以下代码段,在后面添加红色部份
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
#if defined(CONFIG_SMDK2440)
ldr r1, =0x7FFF
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
紧接着,我们就来配置时钟部份,就在我们上面修改中断的代码后面,添加如下代码,
#if defined(CONFIG_SMDK2440)
#define LOCKTIME 0x4C000000
#define MPLLCON 0x4C000004
#define UPLLCON 0x4C000008
#define CAMDIVN 0x4C000018
ldr r0, =LOCKTIME
mov r1, #0x0FFFFFF
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
ldr r0, =CAMDIVN
mov r1, #0
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x7F021
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022
str r1, [r0]
#else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* end of CONFIG_SMDK2440 */
#endif /* CONFIG_S3C24X0 */
以上仅仅是Start.S中的时钟初始化,除此之外,我们还需要对smdk2440.c进行修改
vim board/samsung/smdk2440/smdk2440.c
找到33行处,将这部份代码按以下内容修改
#if defined(CONFIG_SMDK2440)
#define FCLK_SPEED 2
#define USB_CLOCK 2
#else
#define FCLK_SPEED 1
#define USB_CLOCK 1
#endif
#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
#define M_PDIV 0x02
#define M_SDIV 0x01
#endif
/*此处删除了原USB_CLOCK定义*/
#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
#define U_M_MDIV 0x38
#define U_M_PDIV 0x02
#define U_M_SDIV 0x02
#endif
接下来,我们需要修改speed.c,这里主要是修改获取时钟频率的函数
vim arch/arm/cpu/arm920t/s3c24x0/speed.c
找到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_SMDK2440)
if(pllreg == MPLL)
{
return((CONFIG_SYS_CLK_FREQ * m * 2)/(p << s));
}
#endif
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
}
找到get_HCLK(void)函数,按以下内容进行修改
ulong get_HCLK(void)
{
struct s3c24x0_cl
TAG:
