Q2440 ARM开发板Uboot移植
移植环境
主 机:VMWare--Fedora 10 Kernel:2.6.34
开发板:TQ2440--256MB Nand
编译器:arm-linux-gcc-4.3.3.tgz
u-boot:u-boot-1.1.6
代码查看工具:Source Insight
移植步骤
本次移植的功能特点包括:
Nand Flash读写
Nor/Nand 自动选择启动
DM9000网卡支持
Yaffs2文件系统支持
Uboot启动菜单
1. 清除已编译的文件,配置编译选项
make distclean
修改u-boot/cpu/arm920t/config.mk文件:
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 /
-msoft-float
注释掉 / -msoft-float这一段,不使用软浮点编译。
PLATFORM_CPPFLAGS += -march=armv4修改成
PLATFORM_CPPFLAGS += -march=armv4t
来避免编译时产生target CPU does not support interworking的错误。
2. 建立自己的开发板项目并测试编译。
tar xjfv u-boot-1.1.6.tar.bz2 –C /opt/bootloader
cd /opt/bootloader/u-boot-1.1.6/board
cp –fr smdk2410/ tender/
cd tender
mv smdk2410.c tender.c
cd /opt/bootloader/u-boot-1.1.6/include/configs
cp –f smdk2410.h tender.h
U-boot对我们使用的TQ2440开发板和S3C2440芯片并不支持,但是我们可以以具有相似性的SMDK2410为参考,通过以上几个步骤,建立自己开发板的项目。取名为tender 。现在继续。
vim /opt/bootloader/u-boot-1.1.6/Makefile
对自己的开发板进行配置
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
tender_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
SX1_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm925t sx1
保存退出。
vim /opt/bootloader/u-boot-1.1.6/board/tender/Makefile
将我们的开发板的编译项进行修改。
LIB = $(obj)lib$(BOARD).a
COBJS := tender.o flash.o
SOBJS := lowlevel_init.o
接着:
vim /opt/bootloader/u-boot-1.1.6/include/configs/tender.h
进入配置头文件,添加与我们使用的开发板相关的宏定义。
#define CONFIG_TENDER 1
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */
/* #define CONFIG_SMDK2410 1 on a SAMSUNG SMDK2410 Board */
查看board目录下的u-boot.lds文件可以知道,我们整个工程的入口位于cpu/arm920t/start.c。接下去所有跳转指令都是位于u-boot的根目录下进行的操作。
cd cpu/arm920t/start.c
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#elif defined(CONFIG_TENDER)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
S3C2440用户手册中的中断和看门狗寄存器与S3C2410地址相似。进行以上的修改。紧接着进行reset设置,包括关闭看门狗、禁止中断、禁止子中断、配置时钟分频比,同时将总线模式修改为异步模式,原因在于我们使用的分频比为1:4:8,根据用户手册说明,HDIV=1的时候,总线工作模式应该为异步。在相应的位置加入如下代码。
#if defined(CONFIG_TENDER)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
/* FCLK:HCLK:PCLK = 1:4:8 */
/* default FCLK is 400 MHz ! */
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
#endif /* CONFIG_TENDER */
mrc p15,0,r0,c1,c0,0 //根据2440的Datasheet,设置异步总线模式
orr r0,r0,#0xc0000000 /*R1_nF:OR:R1_iA*/
mcr p15,0,r0,c1,c0,0
完成上述任务之后,将会跳到cpu_init_crit函数,
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
在这个函数里面,在完成mmu的关闭的同时,还完成了13个寄存器的初始化,这些寄存器的任务是进行内存管理。
bl lowlevel_init
它位于board/tender/lowlevel_init.S文件中,我们的SDRAM是挂载在Bank6上的,修改同文件下的SDRAM配置,使之和开发板的硬件配置一致。检查在board/smdk2440/lowlevel_init.S:
一并将之后需要涉及的Nor Flash、网卡和串口进入位宽修改。
#define B1_BWSCON (DW16)
#define B4_BWSCON (DW16) //接网卡,位宽为16
#define B5_BWSCON (DW8)
#define B6_BWSCON (DW32) //接内存,位宽为32
根据HCLK设置SDRAM 的刷新参数,主要是REFCNT寄存器,开发板HCLK为100M,查看SDRAM的datasheet进行计算,
将 #define REFCNT 0x1113 改为 #define REFCNT 0x4f4
#if 0
i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link/n");
return 0;
}
}
#endif