2.到u-boot官方网张下载u-boot-1.1.6.tar.bz2
3.解压下载好的u-boot-1.1.6.tar.bz2 tar xjvf u-boot-1.1.6.tar.bz2
4.进入解压好的u-boot-1.1目录文件裁剪:
(2)删除 cpu/下除 arm920t 以外的所有其它 cpu 目录
(3)删除根目录下 除lib_arm 和 lib_generic以外的所有lib_XXX 的库文件目录
(4)删除 include/目录下 asm-XXX 的文件目录,只留下 asm-arm
(5)删除 include/configs 目录下除 smdk2410.h 以外的所有其它配置头文件
5.将 board/smdk2410 目录复制为 hang2440 目录,进入hang2440目录把smdk2410.c改为hang2440.c,修改当前目录下第Makefile中第28行改为:COBJS
:= hang2440.o flash.o。
进入include/configs 目录 将smdk2410.h改为 hang2440.h。修改顶层目录中的Makefile文件中第1881行,添加:
hang2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t hang2440 NULL s3c24x0
各项的意思如下:
arm: CPU 的架构(ARCH)
arm920t: CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。
hang2440: 开发板的型号(BOARD),对应于 board/dong2440 目录。
NULL: 开发者/或经销商(vender)。(此处没加 vender,为 NULL。)
修改第128行第交叉编译器:CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-
退出Makefile,编译测试:
#make mrproper //(或#make distclean 修改顶层 Makefile 等相关文件必须执行此步骤)
#make hang2440_config
#make all
编译中如果不出错,就会才当前目录生成u-boot.bin文件。
6.修改文件增加对S3C2440的支持。
进入 board/hang2440 目录修改 lowlevel_init.S 文件 54 行如下:
#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW8)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
第126行:#define REFCNT 0x4f4
7.时钟设置。
由于u-boot只支持2410不支持2440。它们的时钟设置不一样。所以要重新设置时钟。
首先屏蔽2410的时钟 修改 cpu/arm920t/目录下 start.S 文件 148 行如下:
#if 0
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
#if 0 的意思就是不进行编译。
修改时钟的方法是重新写一个时钟初始化函数。修改cpu/arm920t/start.S 文件时在屏蔽原来的时钟后将 stack_setup 子程序搬到 relocate 子程序之前,并在 stack_setup 子程序后加一条跳转指令调用到 clock_init 子函数,进行时钟初始化:
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
bl clock_init
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq clear_bss /*stack_setup*/
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
#if 1
bl CopyCode2Ram
#else
add r2, r0, r2 /* r2 <- source end address */
在 board/hang2440 目录下新建一个名为 boot_init.c 的文件,编写 colck_init 函数,同时加上一些声明和延时子函数,还有后面要用到的nand 相关操作函数:http://download.csdn.net/detail/u012851076/6971119
然后修改 board/hang2440/hang2440.c 文件中的 board_init 函数,修改如下:
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00055555;
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 = 0xFF94FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPGDAT = gpio->GPGDAT &(~(1<<4))|(1<<4);
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
/*support both of S3C2410 and S3C2440*/
if((gpio->GSTATUS1==0x32410000)||(gpio->GSTATUS1==0x32410002))
{
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
}
else
{
/* arch number of SMDK2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
}
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
然后修改 board/hang2440/目录下的 Makefile 文件 28 行,修改如下: COBJS := hang2440.o flash.o boot_init.o
并在 board/hang2440/u-boot.lds 文件中 35 行添加如下内容:
.text :
{
cpu/arm920t/start.o (.text)
board/hang2440/boot_init.o (.text)
*(.text)
}
在后面设置串口波特率时需要获得系统时钟, 就是在 U-Boot 的第二阶段,lib_arm/board.c中 start_armboot 函数调用 serial_init 函数初始化串口时,会调用 get_PCLK 函数 。它在
cpu/arm920t/s3c24x0/speed.c 中定义,与它相关的还有 get_HCLK、get_PLLCLK 等函数。前 面 的 board_init 函 数 在 识 别 出 S3C2410 或 S3C2440 后 , 设 置 了 机 器 类 型
ID:gd、 bd、 bi_arch_number,后面的函数可以通过它来分辨是 S3C2410 还是 S3C2440。首先要在程序的开头增加如下一行,这样才可以使用 gd 变量。
首先要在程序的开头增加如下一行,这样才可以使用 gd 变量。在 cpu/arm920t/s3c24x0/speed.c 中修改:在程序开头 40 行增加一行:DECLARE_GLOBAL_DATA_PTR;这样才可以使用 gd 变量
修改 get_PPLCLK 函数:
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /*s3c2400*/
修改 get_HCLK、get_PCLK:
/* for s3c2440 */
#define S3C2440_CLKDIVN_PDIVN (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)
#define S3C2440_CLKDIVN_UCLK (1<<3)
#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)
#define S3C2440_CAMDIVN_DVSEN (1<<12)
/* 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;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
{
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;
}
}
修改 PCLK
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
else
{
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 CLKDIVN;
至此,对 s3c2440 的支持(时钟配置部分)就算做好了,为了方便调试,可以利用开发板自带的 u-boot 文件烧写到内存中运行,此时还要修改一些配置:
修改 cpu/arm920t/start.S 文件的 162 行如下:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
@bl cpu_init_crit
#endif
修改 board/dong2440/config.mk 文件如下:
TEXT_BASE = 0x33000000
#TEXT_BASE = 0x33F80000
进入u-boot-1.1.6 目录
在超级用户模式下执行
[root@acer 1]# make mrproper
[root@acer 1]# make hang2440_config
Configuring for hang2440 board...
make
进入开发板的nor flsah模式 q 进入命令行模式
EmbedSky> tftp 0x33000000 u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
MAC: 0a:1b:2c:3d:4e:5f
TFTP from server 192.168.1.101; our IP address is 192.168.1.6
Filename 's.bin'.
Load address: 0x33000000
Loading: T #######
done
Bytes transferred = 94500 (17124 hex)
EmbedSky> go 0x33000000
## Starting application at 0x33000000 ...
U-Boot 1.1.6 (Feb 27 2014 - 21:18:05)
DRAM: 64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
说明时钟移植成功