u-boot-1.1.6在GT2440开发板上的移植
来源:互联网 发布:电影种子搜索软件 编辑:程序博客网 时间:2024/05/16 19:35
笔者使用的是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”进入插入界面,添加“exportPATH=/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”进入编辑模式,加入程序路径如下:
上图中,/usr/local/arm/3.4.1/bin是笔者解压的文件路径。
1. 检查要移植的u-boot-1.1.6源码是否正确
笔者把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 srecu-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binaryu-boot u-boot.bin
现在可以开始u-boot-1.1.6的移植工作了。
二、 uboot移植步骤
1. 修改Makefile:
在smdk2410_config: unconfig
@$(MKCONFIG)$(@:_config=) arm arm920t smdk2410 NULL s3c24x0(大约在1879行)
后面加上
GT2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920tGT2440 NULL s3c24x0
注意:在“@$(MKCONFIG)$(@:_config=) arm arm920t GT2440 NULL s3c24x0”之前要加一个“Tab”键,否则编译时会出错。
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。
GT2440: 开发板的型号(BOARD),对应于board/GT2440目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
然后指定交叉编译器:在第128行,
ifeq($(ARCH),arm)
CROSS_COMPILE= arm-linux-。
2. 在board目录下,新建自己的开发板目录GT2440,把smdk2410目录下的所有文件拷到GT2440,把smdk2410.c改为GT2440.c。 将board目录下所有文件夹全部删除,只留GT2440;
3. 修改board下GT2440目录下面的Makefile文件
COBJS := GT2440.o flash.o
4. 在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为GT2440.h,再把所有的文件全部删除,只留GT2440.h;
5. 返回当前目录为GT2440,然后执行make GT2440_config ,测试能否编译成功:
出现“Configuringfor GT2440 board..”字样的话标志配置成功。此时再执行“make”也应该能编译通过的。
注意:待编译的文件夹不能是Linux和Windows的共享文件夹且必须制定权限。
6. 修改SDRAM配置,在board/GT2440/lowlevel_init.S中,检查
#defineB6_BWSCON (DW32) 位宽为32
把B1_BWSCON 改为(DW16)
B5_BWSCON 改为(DW8)
将 #define REFCNT 1113 改为 #define REFCNT 0x4f4。
7. 对S3C2440的支持,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8,修改board/GT2440/GT2440.c中的board_init函数。
#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
#define S3C2440_CLKDIV 0x05
int board_init (void)
{
S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
gpio->GPACON= 0x007FFFFF;
gpio->GPBCON= 0x00044555;
gpio->GPBUP= 0x000007FF;
gpio->GPCCON= 0xAAAAAAAA;
gpio->GPCUP= 0x0000FFFF;
gpio->GPDCON= 0xAAAAAAAA;
gpio->GPDUP= 0x0000FFFF;
gpio->GPECON= 0xAAAAAAAA;
gpio->GPEUP= 0x0000FFFF;
gpio->GPFCON= 0x000055AA;
gpio->GPFUP= 0x000000FF;
gpio->GPGCON= 0xFF95FFBA;
gpio->GPGUP= 0x0000FFFF;
gpio->GPHCON= 0x002AFAAA;
gpio->GPHUP= 0x000007FF;
clk_power->CLKDIVN= S3C2440_CLKDIV;
__asm__( "mrc p15,0, r1, c1, c0, 0\n"
"orr r1,r1, #0xc0000000\n"
"mcr p15,0, r1, c1, c0, 0\n"
:::"r1"
);
clk_power->LOCKTIME= 0xFFFFFF;
clk_power->MPLLCON= S3C2440_MPLL_400MHZ;
delay(4000);
clk_power->UPLLCON= S3C2440_UPLL_48MHZ;
delay(8000);
gd->bd->bi_arch_number= MACH_TYPE_S3C2440;
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
8. 在cpu/arm920t/s3c24X0/speed.c中修改:
在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量
修改get_PLLCLK函数:
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();
ulongr, m, p, s;
if(pllreg == MPLL)
r= clk_power->MPLLCON;
elseif (pllreg == UPLL)
r= clk_power->UPLLCON;
else
hang();
m= ((r & 0xFF000) >> 12) + 8;
p= ((r & 0x003F0)>> 4) + 2;
s= r & 0x3;
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p<< s));
}
修改get_HCLK,get_PCLK:
#define S3C2440_CLKDIVN_PDIVN (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)
#define S3C2440_CLKDIVN_UCLK (1<<3)
#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)
#define S3C2440_CAMDIVN_DVSEN (1<<12)
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsignedlong clkdiv;
unsignedlong camdiv;
inthdiv = 1;
clkdiv= clk_power->CLKDIVN;
camdiv= clk_power->CAMDIVN;
switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK){
caseS3C2440_CLKDIVN_HDIVN_1:
hdiv= 1;
break;
caseS3C2440_CLKDIVN_HDIVN_2:
hdiv= 2;
break;
caseS3C2440_CLKDIVN_HDIVN_4_8:
hdiv= (camdiv & S3C2440_CAMDIVN_HCLK4_HALF)? 8 : 4;
break;
caseS3C2440_CLKDIVN_HDIVN_3_6:
hdiv= (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;
break;
}
returnget_FCLK() / hdiv;
}
ulong get_PCLK(void)
{
S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsignedlong clkdiv;
unsignedlong camdiv;
int hdiv = 1;
clkdiv= clk_power->CLKDIVN;
camdiv= clk_power->CAMDIVN;
switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK){
caseS3C2440_CLKDIVN_HDIVN_1:
hdiv= 1;
break;
caseS3C2440_CLKDIVN_HDIVN_2:
hdiv= 2;
break;
caseS3C2440_CLKDIVN_HDIVN_4_8:
hdiv= (camdiv & S3C2440_CAMDIVN_HCLK4_HALF)? 8 : 4;
break;
caseS3C2440_CLKDIVN_HDIVN_3_6:
hdiv= (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;
break;
}
returnget_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)?2:1);
}
在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:S3C24X0_REG32 CAMDIVN; ,然后重新make all编译。编译成功后会生成uboot.bin文件,将该文件下载到GT2440开发板的Nor Flash中,连接开发板串口和PC机串口,打开PC机Windows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择NorFlash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。
但是显示的“Flash:512 kB”并不是实际的Nor Flash大小,这是因为源码包里并没有与GT2440开发板Nor Flash同型号的宏定义,需要在源码中加入型号的宏文件并修改存储器容量的计算方法,在这里就不多说了;也并没有显示Nand Flash的大小,这是因为现在还不支持Nand Flash的读写,接下来具体以操作说明。
1. 支持NAND Flash
a.首先在配置文件include/configs/GT2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND (大概在82行);
b.在include/configs/GT2440.h的最后面增加3个宏:
#define CFG_NAND_BASE 0 //无实际意义:基地址,在board_nand_init中重新定义
#define CFG_MAX_NAND_DEVICE 1 //NANDFlash设备数目为1
#define NAND_MAX_CHIPS 1 //每个NAND设备由1个NADN芯片组成
c.在cpu/arm920t/s3c24x0下新建nand_flash.c
d.在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
}S3C2440_NAND;
d.在include/s3c2410.h中仿照S3C2410_GetBase_NAND函数(96行)
定义2440的函数:
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return(S3C2440_NAND * const)S3C2410_NAND_BASE;
}
e.在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的,代码略。
f.修改cpu/arm920t/s3c24x0/Makefile:
COBJS = 加上一项nand_flash.o
编译后生成uboot镜像,但这里注意,现在还不支持NAND FLASH启动,只能烧到NOR FLASH中。要支持NAND FLASH启动,要修改cpu/arm920t/start.S,还要编写nand启动函数。
三、 u-boot调试
编译成功后会生成uboot.bin文件,将该文件下载到GT2440开发板的Nor Flash中,连接开发板串口和PC机串口,打开PC机Windows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择NorFlash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。
- u-boot-1.1.6在GT2440开发板(S3C2440)上的移植
- u-boot-1.1.6在GT2440开发板上的移植
- u-boot-1.1.6在FS2410开发板上的移植
- u-boot-1.1.6在FS2410开发板上的移植
- u-boot-2010在s3c2440开发板上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-boot在SBC2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- u-boot 在s3c2443上的移植
- U-Boot在S3C2410上的移植
- u-boot 在s3c6400上的移植
- u-boot在2440上的移植
- U-Boot在S3C2410上的移植
- u-boot在s3c44b0 上的移植
- xib 自定义Cell(一)
- 网页设计大赛大神养成之路第一天
- 加强redis安全
- C语言编程规范2: 排版
- [LeetCode]Combination Sum II
- u-boot-1.1.6在GT2440开发板上的移植
- java__泛型的类型参数推测
- C语言编程规范3: 可读性
- firstProject
- Android SDK的目录结构及作用
- 一 、Java 学习笔记:enum 的初体验(易忘记点)
- Webkit之插件扩展
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- 1.0.2、Docker Machine