uboot版本:uboot2010.03
硬件平台:NUAA2440开发板
主机编译环境:linux --- enterprise5
交叉编译器:arm-linux-gcc 4.1.2 支持EABI
一、基础移植,增加对S3C2440平台的支持
修改主目录下的Makefile文件,找到
smdk2410_config : unconfig
@$(MKCONFIG)$ (@:_config=)arm arm920t smdk2410 samsung s3c24x0
仿照smdk2410的配置编写自己开发板的配置:
nuaa2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t nuaa2440 why s3c24x0
(注意:第二行前面是TAB键,而不是空格!!)
修改第160行,指定交叉编译器:
CROSS_COMPILE = arm-linux-
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
NUAA2440: 开发板的型号(BOARD),对应于board/NUAA2440目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
在board目录下,新建自己的开发板目录NUAA2440,把samsung目录下的smdk2410目录下的所有文件拷到NUAA2440目录下,把smdk2410.c改为NUAA2440.c。修改该目录下的Makefile,(第28行)把smdk2410.o改为NUAA2440.o。用的命令cp-a board/Samsung/smdk2410/* board/nuaa2440,
删除board目录下其他开发板文件,mv nuaa2440 ../,rm –rf *,mv ../nuaa2440 ./。
开发板的SDRAM接的是BANK6,BANK6的起始地址为0x30000000。
修改lowlevel_init.S文件,修改REFRESH的刷新周期
/* REFRESH parameter */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trc 0x3 /* 7clk */
#define Tchr 0x2 /* 3clk */
#if defined(CONFIG_S3C2440)
#define Trp 0x2 /* 4clk */
#define REFCNT 1012
#else
#define Trp 0x0 /* 2clk */
#define REFCNT 0x0459
#endif
在include/configs目录下创建开发板的配置头文件,把smdk2410.h改名为nuaa2440.h,再把所有的文件全部删除,只留nuaa2440.h,为开发板添加新的软硬件配置文件cp smdk2410.h nuaa2440.h。mv nuaa2440.h ../,rm –rf *,
Mv ../nuaa2440.h ./。
修改nuaa2440.h,取消S3C2410的定义,加入S3C2440定义:
//#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
//#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
增加对S3C2440处理器的支持,首先要修改2440的时钟设置
对于2440开发板,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8
修改nuaa2440.c文件,注释掉前面配置时钟寄存器的内容
#if 0
#define FCLK_SPEED 1
#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
#endif
#define USB_CLOCK 1
#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
#endif
#endif
下面开始加入2440的时钟配置:
#if defined(CONFIG_S3C2440)
/* Fout = 405MHz */
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
#endif
#if defined(CONFIG_S3C2440)
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#endif
#define U_M_SDIV 0x2
指定MACH_TYPE,在board_init函数中,查看bi_arch_number:
/* arch number of S3C2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
MACH_TYPE在include/asm-arm/mach-types.h中定义,其中MACH_TYPE_S3C2440是362,这个要和内核中的mach-types一致
修改cpu/arm920t/s3c24X0/speed.c:
在get_PLLCLK函数中加入:
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
/*why add begin*/
#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));
else if (pllreg == UPLL)
#endif
/*why add end*/
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
include 目录是uboot使用的头文件该目录下的asm目录有于cpu体系结构相关的头文件,在include/asm-arm/arch-s3c24x0目录下的s3c24x0.h中定义了/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
/* (see S3C2410 manual chapter 7) */
struct s3c24x0_clock_power {
u32 LOCKTIME;
u32 MPLLCON;
u32 UPLLCON;
u32 CLKCON;
u32 CLKSLOW;
u32 CLKDIVN;
};
修改get_HCLK函数:
/* return HCLK frequency */
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
// return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
/*why add begin*/
#if defined(CONFIG_S3C2440)
if (readl(&clk_power->CLKDIVN) & 0x6)
{
if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else
return(get_FCLK());
#else
return((readl(&clk_power->CLKDIVN) & 0x2) ? get_FCLK()/2 : get_FCLK());
#endif
/*why add end*/
}
修改include/asm-arm/arch-s3c24x0/s3c24x0_cpu.h:
仿照前两项,在后面加入:
/*why add begin*/
#elif defined CONFIG_S3C2440
#include <asm/arch/s3c2410.h>
/*why add end*/
修改s3c24x0.h的寄存器定义头文件include/asm-arm/arch-s3c24x0/s3c24x0.h:将该文件中所有的“#ifdef CONFIG_S3C2410”替换成
“#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)”
在struct s3c24x0_clock_power结构体中加入2440的CAMDIVN寄存器定义:
u32 CLKSLOW;
u32 CLKDIVN;
#if defined (CONFIG_S3C2440)
u32 CAMDIVN;
#endif
修改cpu/arm920t/s3c24x0/timer.c,在get_tbclk函数中加入:
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
defined(CONFIG_S3C2440) || \
defined(CONFIG_VCMA9)
修改cpu/arm920t/start.S:
# if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#else
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
# endif
/*why add begin*/
#define CLK_CTL_BASE 0x4C000000
#define MDIV_405 0x7f << 12
#define PSDIV_405 0x21
#define MDIV_200 0xa1 << 12
#define PSDIV_200 0x31
/*why add end*/
/*why add begin*/
#if defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
#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
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r1, #0x04]
#else
/*why add end*/
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
/*why add begin*/
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
/*why add end*/
到此,uboot在S3C2440平台的基础移植工作已完成,接下来就要编译u-boot,然后在开发板上运行一下,验证是否可以正常启动。
make nuaa2440_config
编译命令:#make all,生成u-boot.bin镜像文件,用JTAG工具将其烧入Nor Flash中,运行效果如下: