本文章中的很多内容参考友善之臂的说明文档《mini2440之U-boot移植详细手册-20100419》,使用的U-boot的版本是u-boot-2010.03
说明:此次移植的目的不是为了制作一个功能强大的U-boot,只是做一个最简单的U_boot。该U-boot能够实现通过串口和电脑通信,可以将环境变量保存在NOR Flash中,通过TFTP服务器将使用NFS根文件系统的内核镜像从电脑拷贝到内存中执行。而且这个U-boot只支持从NOR中启动。
在移植U-Boot之前建议对U-Boot中的源码组织结构有较深的理解,可参考我的另一篇博文Bootloader介绍和Uboot源码结构
移植U-Boot的原则是,先选取与目标板相似的板子,将其的源码内容进行一份拷贝,然后从整个U-Boot的启动流程更改相应的代码。
一、移植初处理
拷贝文件
因为smdk2410与mini2440最相近,所以我们选择smdk2410作为修改对象。
拷贝/board/samsung/smdk2410到/board/samsung/mini2440
拷贝/include/configs/smdk2410.h到/include/configs/mini2440.h
修改顶层makefile
仿照smdk2410添加如下代码:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
初步修改/board/samsung/mini2440目录中的文件
在makefile中修改下列代码:
COBJS := smdk2410.o flash.o
修改成:
COBJS := mini2440.o flash.o
将文件smdk2410.c重新命名为mini2440.c
现在可以尝试着编译:
make mini2440_config
make all
二、具体代码移植
现在的思路是,跟随着U-Boot代码的启动流程进行修改和开发板相关的内容。
第一阶段(汇编语言)
.globl _start
_start: b start_code
首先运行的是标号为start_code处的代码
下面的代码是针对需要改的部分。
@ bl coloured_LED_init
@ bl red_LED_on
因为没有必要实现LED的操作,所以直接注释掉。
s3c2440的频率设定方式与其它的有些区别,需要一些额外的寄存器如下:
#ifdef CONFIG_S3C2440
# define CLK_CTL_BASE 0x4C00000
# define MDIV_405 0x7f << 12
# define PSDIV_405 0x21
# define MDIV_200 0xa1 << 12
# define PSDIV_200 0x31
#endif
需要屏蔽的子中断个数也不一样,所以要进行不同的设定:
#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
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CONFIG_S3C2440 */
下面修改lowlevel_init.S,这个文件位于/board/samsung/mini2440目录下,显然和硬件关系密切。
这个文件主要是对开发板的内存地址空间硬件的挂载有关,开发板上的NOR FLASH、NAND FLASH、SDRAM、DM9000都是挂载在内存地址空间上的,所以和它们相关的内容需要在这个文件中设置。
注意:该文件不要用smdk2410中的lowlevel_init.c,应该以sbc2410x文件夹中的lowlevel_init.c为修改代码来源。否则,网络功能无法使用。
#define Trp 0x0 /* 2clk */
#define REFCNT 1113
将上述代码修改成下列代码: