在u-boot2012.04 的版本中,没有S3C2440的相关代码。因此需要单板的移植、
主机环境:ubuntu12.04 32bit
交叉编译器:rm-none-linux-gnueabi- 4.3.2
u-boot版本:2012.04
开源地址:http://git.oschina.net/gxx9203/u-boot2012.04_jz2440
第一部分: 构建smdk2440单板
1 底层文件
cd board/samsung
cp smdk2410 smdk2440 -rf
cd smdk2440/
mv smdk2410.c smdk2440.c
vim Makefile
28 COBJS := smdk2410.o
==》28 COBJS := smdk2440.o
cd ../../..
1.2 配置文件
cd cd include/configs/
cp smdk2410.h smdk2440.h
修改#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */ 为
#define CONFIG_S3C2440 /* specifically a SAMSUNG S3C2440 SoC */
修改
#define CONFIG_SMDK2410 /* on a SAMSUNG SMDK2410 Board */
为
#define CONFIG_SMDK2440 /* on a SAMSUNG SMDK2440 Board */
修改 #define CONFIG_SYS_PROMPT "SMDK2410 # "
为
= #define CONFIG_SYS_PROMPT "SMDK2440 # "
1.3 smdk2440_config
vim boards.cfg
添加
75 smdk2440 arm arm920t - samsung
1.4 make smdk2440_config
1.5 make
在make 后会出现文件,先注释掉 //#define CONFIG_CMD_NAND ( include/configs/smdk2440.h) 来解决编译的问题,
此阶段的目的,是构建一个单板,能够实现正常的编译过程,为了适合2440单板,还需要对对刚刚移植的信息,进行修改。
第二部分:修改时钟配置和内存配置
对于2440 来说。原文件存在着一下的问题:
①时钟设置不对
② 由于时钟不对,导致内存设置出现问题。
---------------------------------------------------------------
① Smdk2440.c \board\samsung\smdk2440)中 int board_early_init_f(void) 对MPLL的设置
在 start.s 文件关闭中断后,添加如下的代码
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =0x4c000014
// mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]
/* 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
同时在cpu_init_crit后,添加如下的代码
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
bl nand_init_ll //见git地址
mov r0, #0
//ldr r1, =_start
ldr r1, _TEXT_BASE
ldr r2, _bss_start_ofs
bl copy_code_to_sdram
bl clear_bss
ldr pc, =call_board_init_f
/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:
ldr r0,=0x00000000
bl board_init_f
/*board_init_f 的返回值放在 r0 中*/
ldr r1, _TEXT_BASE
/*设置栈*/
ldr sp,base_sp
/*第二阶段的代码*/
bl board_init_r
此处进行了sdram 的初始化,将nand flash中的数据拷贝到sdram中。
同时对sdram的设置也需要改变、
在替换lowlevel_init.S \board\samsung\smdk2440)
SMRDATA:
.long 0x22011110 //BWSCON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000740 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x00018005 //BANKCON7
.long 0x008C04F4 // REFRESH
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
make 之后。烧写,u-boot会出现乱码现象。此时波特率配置存在问题
init_sequence
serial_init, /* serial communications setup */
get_current(void)
default_serial_console();
s3c24xx_serial0_device;
.....
DECLARE_S3C_SERIAL_FUNCTIONS(0);
serial_setbrg_dev(port); \
serial_setbrg_dev
_serial_setbrg
reg = get_PCLK() / (16 * gd->baudrate) - 1;
return (readl(&clk_power->clkdivn) & 1) ? get_HCLK() / 2 : get_HCLK();
#ifdef CONFIG_S3C2440 Speed.c (\arch\arm\cpu\arm920t\s3c24x0\speed.c)
需要配置 CONFIG_S3C2440 (include/configs/smdk2440.h)
现在移植的u-boot已经能够正常的从 启动。
第三部分:支持nand 启动
修改u-boot支持nand flash 启动
原来的代码在连接是加了-pie 选项。是的u-boot里边多了"rel" .dynsym
使得代码非常大。不利于nand 启动。 (重定位的代码应当小于4K)
修改Makefile 去掉-pie
搜索grep "\-pie" * -nR
arch/arm/config.mk:88:LDFLAGS_u-boot += -pie
修改u-boot中的nand 支持nand 启动
添加文件 init.c (boadr/samsung/smdk2440) 修改Makefile
修改 #define CONFIG_SYS_TEXT_BASE 0x33f80000 Smdk2440.h (include\configs)
修改start.s
修改_main 去掉重定位
修改连接脚本 把starts.S init.c lowlevel.S 放在最前边
顶层目录的u-boot.lds 自动生成的
find -name "u-boot.lds" 搜索
./arch/arm/cpu/u-boot.lds
编译后,通过查看u-boot.lds 和u-boot.dis 看是否符合预期
33f80048 <_bss_end_ofs>:
33f80048: 00098d84 andeq r8, r9, r4, lsl #27