http://home.eeworld.com.cn/my/space.php?uid=135723&do=blog&id=25347
u-boot 下载 U-boot 镜像 ,下载 1.1.6 版本的,这是比较早的版本,选择它主要是为了学习用。
u-boot中已经有对2410的支持了,我的板子是TQ2440 ,只需要在smdk2410的基础上改就可以了。
这是u-boot的大致目录,先精简一下,删除不需要的文件:
1> 删除根目录下的除了了lib_arm , lib_generic 外的其他lib_XXX类型的目录。
2> 删除/board/ 目录下的除了smdk2410以外的其他目录。
3> 删除/cpu/ 目录下的除了arm920t以外的其他目录
4> 删除cpu /arm920t/目录下除了s3c24x0以外的其他目录,是目录,文件不要删。
5> 删除/include/目录下除了asm-arm目录以外的其他asm-XXX目录。
6> 删除/include/configs 目录下除了smdk2410.h 以外的其他头文件。建立TQ2440 的目录
1>复制board/smdk2410为 board/TQ2440 ,复制board/smdk2410/smdk2410.c 为 board/TQ2440/TQ2440.c
2>复制include/s3c2410.h 为/include /s3c2440.h
3>复制include/configs/smdk2410.h 为 include /configs/TQ2440.h修改顶层Makefile:
搜索smdk2410_config :在其下方添加:、
TQ2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t TQ2440 NULL s3c24x0
交叉编译器 已经默认配置为arm-linux- 了,不需要改。修改/board/TQ2440/Makefile :
COBJS := smdk2410.o flash.o
改为:
COBJS := TQ2440.o flash.o修改头文件包含关系
/board/TQ2440/TQ2440.c
顶部#include < s3c2410.h> ==> #include < s3c2440.h>
/cpu/arm920t/s3c24x0/下的几个文件都需要改,只要是有CONFIG_S3C2410) 宏定义的地方,都加上 || defined(CONFIG_S3C2440)
#include < common.h>
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined(CONFIG_S3C2440)
#if defined(CONFIG_S3C2400)
#include < s3c2400.h>
#elif defined(CONFIG_S3C2410)
#include < s3c2410.h>
#elif defined(CONFIG_S3C2440)
#include < s3c2440.h>
#endif
有这样的头部都像这样改,有些文件中间还有部分有这个宏,也得改为2440.h 得,不然包含不进去。
- 修改/include /configs /TQ2440.h
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2410 SoC */
#define CONFIG_TQ2440 1 /* on a SAMSUNG SMDK2410 Board */
修改/include /s3c24x0.h
同样将有CONFIG_S3C2410 宏得地方加上 2440 得宏/include/ s3c2440.h
#ifndef __S3C2440_H__
#define __S3C2440_H__
- /cpu/arm920t/s3c24x0/interrupts.c
这里面有个比较隐蔽得地方,需要加上TQ2440得宏
#if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)
tbclk = timer_load_val * 100;
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
defined(CONFIG_TQ2440) || \
defined(CONFIG_VCMA9)
tbclk = CFG_HZ;
#else
# error "tbclk not configured"
#endif
否则就会看见 tbclk not configured 得错误。
- 修改适配板级得SDRAM配置
SDRAM是在/board/TQ2440/lowlevel_init.S中完成得.
#define B1_BWSCON (DW16) //(DW32) (IDE)
#define B2_BWSCON (DW16) //(IDE)
#define B3_BWSCON (DW16 + WAIT + UBLB) //CS8900
#define B4_BWSCON (DW16) //DM9000
#define B5_BWSCON (DW8) //(DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
...
修改REFCNT 得值为0x4f4 因为是100MHZ
#include REFCNT 0x4f4
- 修改/board/TQ2440/Makefile
因为改了名字,所以需要编译得名字也改了
COBJS := TQ2440.o flash.o
- 修改/board/TQ2440/TQ2440.c
因为2440和2410得时钟不一样,所以需要修改board_init中的时钟设置。
//添加时钟配置的宏:
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x02<<4)|(0x01)) //HJ 400MHZ
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02)) //HJ 100MHZ
#define S3C2440_CLKDIV 0x05
/* 修改后的 board_init 函数 */
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
/* set up the I/O ports */
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00044555;
gpio->GPBUP = 0x000007FF;
gpio->GPCCON = 0xAAAAAAAA;
gpio->GPCUP = 0x0000FFFF;
gpio->GPDCON = 0xAAAAAAAA;
gpio->GPDUP = 0x0000FFFF;
gpio->GPECON = 0xAAAAAAAA;
gpio->GPEUP = 0x0000FFFF;
gpio->GPFCON = 0x000055AA;
gpio->GPFUP = 0x000000FF;
gpio->GPGCON = 0xFF95FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
clk_power->CLKDIVN = S3C2440_CLKDIV;
/* change to asynchronous bus mode */
__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 MPLL */
clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
/* some delay between MPLL and UPLL */
delay (4000);
/* configure UPLL */
clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
/* some delay between MPLL and UPLL */
delay (8000);
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
- 修改相关时钟函数
因为2440和2410 MPLL和UPLL计算的公式不一样,所以获取当前分频的函数有些不同,他们都在/cpu/arm920t/s3c24x0/speed.c 中定义。
首先更改get_PLLCLK 函数:
return((CONFIG_SYS_CLK_FREQ * m *2) / (p << s));
再更改 get_HCLK 和get__PCLK
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;
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_CAMDIVN_HCLK3_HALF:
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;
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
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_CAMDIVN_HCLK3_HALF:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;
}
return( get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN) ? 2:1) );
}
到此配置了最基本的uboot ,如果没错的话,应该可以编译烧写到TQ2440并在串口有输出。