上一个笔记已经可以正常编译Uboot了,这里先修改Uboot让其能在SDRAM中运行起来。
1.修改/include/configs/smdk6410.h
#define CONFIG_S3C6410 1 /* in a SAMSUNG S3C6400 SoC */
#define CONFIG_SMDK6410 1 /* on a SAMSUNG SMDK6400 Board */
#define CONFIG_SYS_PROMPT "SMDK6410 # " /* Monitor Command Prompt */
#define CONFIG_NR_DRAM_BANKS 2 //2个128M的chip
#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x08000000 /* 128 MB in Bank #1 */
#define PHYS_SDRAM_2 (CONFIG_SYS_SDRAM_BASE+PHYS_SDRAM_1_SIZE)/* SDRAM Bank #1 */
#define PHYS_SDRAM_2_SIZE 0x08000000 /* 128 MB in Bank #1 */
#define CONFIG_IDENT_STRING " for SMDK6410"
#define CONFIG_SYS_NAND_PAGE_SIZE 4096 //2048
#define CONFIG_SYS_NAND_BLOCK_SIZE (512 * 1024) //128
#define CONFIG_SYS_NAND_PAGE_COUNT 128 //64。
2.修改/board/samsung/smdk6410/lowlevel_init.S
修改LED显示
/* LED on only #8 */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x00111111
str r1, [r0, #GPMCON_OFFSET]
ldr r1, =0x00000555
str r1, [r0, #GPMPUD_OFFSET]
ldr r1, =0x0027
str r1, [r0, #GPMDAT_OFFSET]
修改这段This was unconditional in original Samsung sources.......屏蔽掉宏定义
//#ifndef CONFIG_S3C6410
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0xC0
orr r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]
wait_for_async:
ldr r1, [r0, #OTHERS_OFFSET]
and r1, r1, #0xf00
cmp r1, #0x0
bne wait_for_async
//#endif
所有的6400的字符修改为6410
修改MMU正确显示SDRAM大小
/* 128MB for SDRAM 0xC0000000 -> 0x50000000 */
.set __base, 0x500
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base, 3, 0, 1, 1
.set __base, __base + 1
.endr
/* access is not allowed. */
.rept 0x1000 - 0xD00
.word 0x00000000
.endr
3.修改arch\arm\cpu\arm1176\s3c64xx下的Makefile所有的smdk6400修改smdk6410
4.下载uboot到SDRAM中运行
先使用IROM_Fusing_Tool.exe把OK6410_SDboot.nb0烧录到SD卡中,此处需要安装DNW的驱动,如果是WIN7的系统,需要使用附件中的驱动文件,并且禁用数字签名。dmw usb驱动下载地址
设置开发板从SD卡启动。打开DNW,设置下载地址为0x57e00000,启动开发板后通过DNW把编译好的u-boot.bin下载到SDRAM中,下载后DNW窗口显示:
U-Boot 2012.10 (Sep 05 2015 - 11:54:55) for SMDK6410
CPU: S3C6400@533MHz
Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)
Board: SMDK6400
DRAM: 128 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
该处需要修正的问题:CPU和Board显示不正常,另外程序检测到Flash:***failed***,实际上ok6410,没有flash
5.调试更正
打开uboot打开DEBUG以便显示调试调试信息。
flash在ok6410中没有使用,屏蔽flash的检测。arch\arm\lib\board.c,删除puts(failed);后面的hang();
6.程序启动后移植在打印raise: Signal # 8 caught
主要修复timer.c,在timer.c中需要初始化全局变量gd而不是初始化一个本地变量。
出现该信息表示做除法运算时,除数为0,进最终定位发现uboot延时程序里面调用了do_div (res, (timer_load_val / (100 * CONFIG_SYS_HZ)))函数,打印输出timer_load_val的值发现timer_load_val=0。
进一步查看源代码发现,uboot第二阶段启动代码的加载地址是0x57e00000,调用relocate_code函数后,代码挪到了SDRAM存储器比较靠后的位置:0x57fa4000(mini6410开发板挪到了这个位置)。由于timer_load_val定义为未初始化的静态全局变量,因此timer_load_val存在于uboot的bss段所在空间,而timer_load_val是由timer_init函数在代码挪动前初始化的,代码挪动时并没有将bss段内容挪到新的位置,而是简单的全部初始化为0,导致该问题的发生。
解决办法就是打开arch\arm\cpu\arm1176\s3c64xx\timer.c文件,在timer_load_val的定义后面增加:__attribute__((section(".data")))。修改后代码如下:
static ulong timer_load_val __attribute__((section(".data")));