笔者使用的是GT2440开发板,ARM型号为S3C2440。在移植之前要安装必要的软件,我在这里就不详细介绍了,相信网上有很多关于这方面的资料。以下是我移植u-boot之前准备安装的软件:
1.VMware 6.5虚拟机;
2.RedHat Linux9.0操作系统;
3. Windows下安装NotePad++;
4.Linux下安装VMware Tools用于两操作系统间共享文件;
5.Linux下安装arm-linux-gcc3.4.1。
在Linux系统中打开终端,进入编译器目录,用tar xjvf命令解压arm-linux-gcc3.4.1到C盘(tar xjvf arm-linux-gcc-3.4.1.tar.bz2 –C/);解压完成后修改交叉编译器环境变量,在终端中使用“vim /etc/profile”命令打开配置文件;移动光标至“export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC”下面,点击“i”进入插入界面,添加“export PATH=/usr/local/arm/3.4.1/bin:$PATH”后按“ESC”键退出插入界面,输入“:wq”回车后返回终端,“/usr/local/arm/3.4.1/bin”为编译器路径;在终端中使用“source /etc/profile”命令使设置生效;查看交叉编译工具的版本,在终端中使用“arm-linux-gcc -v”命令,到此为止,gcc3.4.1交叉编译环境安装完毕!
一、移植前检查
1.检查arm-linux-gcc3.4.1是否安装成功:
在Linux下超级终端中输入“arm-linux-gcc –v”后击回车,出现如下信息时说明arm-linux-gcc3.4.1安装成功。
否则,确保arm-linux-gcc3.4.1解压到Linux文件系统后在超级终端中输入“vim /etc/bash.bashrc”回车后,点击“i”进入编辑模式,加入程序路径如下:
1.
笔者把u-boot-1.1.6.tar.bz2解压到了Linux下的/usr目录下并更名为GT2440,由于笔者使用的开发板上的ARM是S3C2440,与u-boot-1.1.6中的smdk2410相似,这样更改的内容不会太多。先编译一下smdk2410是否通过:
a.在超级终端中输入命令“cd /usr/GT2440”进入该目录下;
b.输入命令“make smdk2410_config”,若出现“Configuring for smdk2410 board…”信息说明smdk2410配置正确;
c.输入命令“make”开始编译,若编译成功,会生成两个文件如下:
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
现在可以开始u-boot-1.1.6的移植工作了。
二、 uboot移植步骤
1.
在smdk2410_config :
后面加上
GT2440_config :
@$(MKCONFIG) $(@:_config=) arm arm920t GT2440 NULL s3c24x0
注意:在“@$(MKCONFIG) $(@:_config=) arm arm920t GT2440 NULL s3c24x0”之前要加一个“Tab”键,否则编译时会出错。
各项的意思如下:
然后指定交叉编译器:在第128行,
2.
3.
4.
5.
出现“Configuring for GT2440 board..”字样的话标志配置成功。此时再执行“make”也应该能编译通过的。
注意:待编译的文件夹不能是Linux和Windows的共享文件夹且必须制定权限。
6.
B5_BWSCON 改为(DW8)
7.
#define S3C2440_MPLL_400MHZ
#define S3C2440_UPLL_48MHZ
#define S3C2440_CLKDIV
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
__asm__(
gd->bd->bi_boot_params = 0x30000100;
dcache_enable();
return 0;
}
8.
在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量
修改get_PLLCLK函数:
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
}
修改get_HCLK, get_PCLK:
#define S3C2440_CLKDIVN_PDIVN
#define S3C2440_CLKDIVN_HDIVN_MASK
#define S3C2440_CLKDIVN_HDIVN_1
#define S3C2440_CLKDIVN_HDIVN_2
#define S3C2440_CLKDIVN_HDIVN_4_8
#define S3C2440_CLKDIVN_HDIVN_3_6
#define S3C2440_CLKDIVN_UCLK
#define S3C2440_CAMDIVN_CAMCLK_MASK
#define S3C2440_CAMDIVN_CAMCLK_SEL
#define S3C2440_CAMDIVN_HCLK3_HALF
#define S3C2440_CAMDIVN_HCLK4_HALF
#define S3C2440_CAMDIVN_DVSEN
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
}
ulong get_PCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:S3C24X0_REG32
但是显示的“Flash:512 kB”并不是实际的Nor Flash大小,这是因为源码包里并没有与GT2440开发板Nor Flash同型号的宏定义,需要在源码中加入型号的宏文件并修改存储器容量的计算方法,在这里就不多说了;也并没有显示Nand Flash的大小,这是因为现在还不支持Nand Flash的读写,接下来具体以操作说明。
1.
a.首先在配置文件include/configs/GT2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND (大概在82行);
b.在include/configs/GT2440.h的最后面增加3个宏:
#define CFG_NAND_BASE
#define CFG_MAX_NAND_DEVICE
#define NAND_MAX_CHIPS
c.在cpu/arm920t/s3c24x0下新建nand_flash.c
d.在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)
typedef struct {
S3C24X0_REG32 NFCONT;
d.在include/s3c2410.h中仿照S3C2410_GetBase_NAND函数(96行)
定义2440的函数:
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
}
e.在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的,代码略。
f.修改cpu/arm920t/s3c24x0/Makefile:
COBJS
编译后生成uboot镜像,但这里注意,现在还不支持NAND FLASH启动,只能烧到NOR FLASH中。要支持NAND FLASH启动,要修改cpu/arm920t/start.S,还要编写nand启动函数。
三、
编译成功后会生成uboot.bin文件,将该文件下载到GT2440开发板的Nor Flash中,连接开发板串口和PC机串口,打开PC机Windows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择Nor Flash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。