U-boot移植 (v2012.04.1 S3C2440平台) (一) 平台相关文件修改

一 概述

项目概述:

移植u-boot v2012.4.1到micro2440开发板(S3C2440平台)

项目github地址:https://github.com/novawl/u-boot-v2012.4.1


预期目标:

1)  实现Nand flash Nor flash 烧写;

2)  实现Nand flash 启动U-boot;

3)  USB驱动移植,实现USB下载镜像;

4)  网络驱动支持;

5)  设置环境变量,实现Nor flash 和 Nand flash引导Linux kernel.


二 移植过程

1  准备工作

1)  安装ARM交叉编译工具:arm-linux-gcc 4.3.2

2)  下载u-boot代码:git clonegit://git.denx.de/u-boot.git

2  配置micro2440编译选项,创建micro2440平台相关文件

1)  和之前的版本不同,平台编译选项不再是在顶层Makefile里添加,而是修改u-boot/boards.cfg文件。查看boards.cfg文件可以看到每一个平台由以下选项组成:

Target        ARCH   CPU            Board name     Vendor           SoC       Options
mx31ads     arm     arm1136      -                    freescale        mx31
mx31pdk     arm     arm1136      -                    freescale        mx31     mx31pdk:NAND_U_BOOT
tt01              arm     arm1136      -                    hale                mx31
smdk2410    arm     arm920t      -                    samsung        s3c24x0
micro2440    arm     arm920t     -                    samsung        s3c24x0

我们只需要按照smdk2410的配置,添加micro2440的配置即可。

2)  在u-boot/board/samsung目录创建micro2440目录,复制smdk2410下的全部文件到此目录。复制u-boot/include/configs/smdk2410.h到u-boot/include/configs/micro2440.h。

3)  修改arch/arm/config.mk,设置CROSS_COMPILE ?= arm-linux- (此处依据交叉工具链具体位置设定)

4)  执行make micro2440_config && make all,此时会在u-boot目录下生成u-boot.bin等文件,不过这是针对smdk2410平台的,想生成micro2440平台的,还需要对board/samsung/micro2440下的文件和include/configs/micro2440.h进行修改。

3  u-boot 调试

在对u-boot进行移植的前期,由于系统经常会在启动阶段挂掉,此时串口还未初始化,没有信息输出,调试起来非常不方便。此时我们最好使用调试工具进行调试,我采用的是OpenJTAG。关于OpenJTAG,openocd, arm-linux-gdb的使用方法,可以参考相关手册。这里只说调试期间需要注意的几个问题:

1)  在micro2440.h中添加 #define CONFIG_SKIP_LOWLEVEL_INIT:  由于openocd会加载u-boot镜像到开发板中运行,之前会对SDRAM进行初始化,所以u-boot在内存里执行时,不再需要执行lowlevel_init.S中的代码来对储存器进行初始化了。

2)  修改micro2440.h中CONFIG_SYS_TEXT_BASE:#define CONFIG_SYS_TEXT_BASE   0x33D80000

arm-linux-gdb会根据TEXT_BASE的值将u-boot镜像加载到SDRAM中对应地方。对于该版本的u-boot,在初始化过程中,会把u-boot代码拷贝到SDRAM末端,所以我们在定义TEXT_BASE值时,不能定义得太靠后,否则代码会overlap。(之前我把CONFIG_SYS_TEXT_BASE定义为0x33F80000就出现过这种情况)。

3)  注意arm-linux-gdb的版本:由于我的交叉编译工具为4.3.2版本的,刚开始用老版本的arm-linux-gdb工具调试时,指令总是跑飞,根本执行不到内存中的u-boot代码。后来下载最新的gdb代码,重新编译最新的arm-linux-gdb才解决此问题。

4  修改micro2440平台相关文件

1)  修改u-boot/include/configs/micro2440.h:

#define CONFIG_S3C2410 改为 #define CONFIG_S3C2440

#define CONFIG_SMDK2410 改为 #define CONFIG_MICRO2440。

2)  修改u-boot/board/samsung/micro2440/lowlevel_init.S。该文件的作用是配置储存控制器,依据开发板对应的储存映射来修改相关寄存器。具体代码可以在我的github中查看。

3)  修改u-boot/boards/samsung/micro2440/micro2440.c: 该文件是与开发析配置相关的,对于micro2440来说,主要需要修改的是board_early_init_f函数,该函数主是要设置系统时钟频率和GPIO。由于S3C2410和S3C2440时钟设置方法不一样,我们需要对该函数针对S3C2440进行修改:

#define M_MDIV0x5C

#define M_PDIV0x1
#define M_SDIV0x1

#define U_M_MDIV0x38
#define U_M_PDIV0x2
#define U_M_SDIV0x2

/*
* Miscellaneous platform dependent initialisations
*/

int board_early_init_f(void)
{
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power();
struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();

writel(0x5, &clk_power->clkdivn);
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFFFF, &clk_power->locktime);

/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);

/* some delay between MPLL and UPLL */
pll_delay(4000);

...
}

这里需要注意的是对分频比clk_power->clkdivn的设置:因为这个值在arch/arm/cpu/arm920t/start.S里有过一次设置(那里设置的是3),默认情况下,这里可以不用设置的。但我针对S3C2440修改了分频设置,CLKDIV要设置成5,所以这里必须要设置下。(一开始我就由于CLKDIV没有设置正确,造成系统挂掉。)

4)  此时再执行make micro2440_config && make all,将生成的u-boot.bin烧入micro2440开发Nor flash中,应该就能看到串口有信息输出了,不过因为还没有配置Nor flash,会看到flash error,系统挂掉。

你可能感兴趣的:(嵌入式系统)