您的位置:首页 > 其它

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

2012-08-16 22:07 423 查看

一 概述

项目概述:
移植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,系统挂掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐