uboot移植参考说明:
http://blog.chinaaet.com/detail/17764.html
1 U-Boot简介
选择U-Boot的理由:
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
2 U-Boot主要目录结构
board 目标板相关文件,主要包含SDRAM、FLASH驱动;
common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)
doc U-Boot的说明文档;
examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;
include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;
net 与网络功能相关的文件目录,如bootp,nfs,tftp;
post 上电自检文件目录。尚有待于进一步完善;
rtc RTC驱动程序;
tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;
3 U-Boot支持的主要功能
U-Boot可支持的主要功能列表
系统引导 支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统
支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;
基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最为强劲;
支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;
CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好;
设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;
上电自检功能 SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;
特殊功能 XIP内核引导;
好了废话就少说了,直接进入主题
1.下载最新版本的u-boot:
ftp://ftp.denx.de/pub/u-boot/
u-boot 手册:http://www.denx.de/wiki/DULG/Manual
2.安装编译工具cross-3.3.2.tar.bz2
#tar –xjvf cross-3.3.2.tar.bz2
将解压缩的文件夹3.3.2 copy到/usr/local/arm/下
3.修改文件脚本文件
#cd /etc
#vim bashrc
在文件最后添加以下语句
PATH=/usr/local/arm/3.3.2/bin:”${PATH}”
保存退出
退出当前用户重新登陆即可
查看是否修改成功
#echo $PATH
或
修改uboot的Makefile文件,详细修改参考第5小结
4.在linux下面解压缩uboot
#tar –xjvf u-boot-1.1.4.tar.bz2
5.修改Makefile文件
#cd u-boot-1.1.4
#vi Makefile
ifeq ($(ARCH),arm)
CROSS_COMPILE := /usr/local/arm/3.3.2/bin/arm-linux-
endif
如果你修改了此处就不需要执行第三节的设置了。
5.首先随便找一个SOC芯片编译一下
看看是否能通过。如果这里你都编译不过,你就别继续往下看了,还是检查你的交叉编译器或是源码吧。。。。。。
uboot移植参考说明:
6. 打开board文件夹新建一个处理器文件名
7. 其实board这里要修改的不多,先跳过flash部分吧,我们来看一下cpu设置部分吧。u-boot-1.1.4里面已经加入了对s3c24x0的支持,让我们来看一下cpu/arm920t/s3c24x0里面的部分吧。
8.添加头文件
9.回到u-boot-1.1.4主目录修改Makefile文件
smdk2410_config :
hyt24x0_config■:■unconfig
■@./mkconfig $(@:_config=) arm arm920t hyt24x0 NULL s3c24x0
注意:■为一个TAB,不可以是空格,也不是紫方块;否则make时会出错
arm:
arm920t:
hyt24x0:
NULL:
s3c24x0:
uboot移植参考说明:
这里介绍一下有关编译器的问题,如果你使用的交叉编译器版本不是3.4.1,你可以跳过此节。注意使用3.3.2版本的也需要看一下,后面有一个小地方需要修改一下。
如果你使用的是3.4.1在编译u-boot的时候大多数人会遇到以下这样的错误,这个时候你别紧张,这里给你提供了一个好的解决办法:
rm-linux-ld:ERROR:usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld:failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS)
arm-linux-ld: ERROR: /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld: failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS)
make: *** [u-boot] Error 1
解决的办法:
找到/u-boot-1.1.4/cpu/arm920t/config.mk文件
该文件内容如下所示:
PLATFORM_RELFLAGS += -fno-strict-aliasing
PLATFORM_CPPFLAGS += -march=armv4
# =========================================================================
#
# Supply options according to compiler version
#
# =========================================================================
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
修改该文件:
PLATFORM_RELFLAGS += -fno-strict-aliasing
#
PLATFORM_CPPFLAGS += -march=armv4
# =========================================================================
#
# Supply options according to compiler version
#
# =========================================================================
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)#,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
请注意紫色部分的修改!
问题是编译链接器3.4.1用的是hardware FP,而u-boot 使用的是 software FP 也可以使用2.95或者3.3.2版本可解决这个问题。
如果使用3.3.2编译器编译出错的话
编译错误:error: invalid option `abi=apcs-gnu'
出错原因:
指示编译器不支持选项 -mabi=apcs-gnu
出错的文件是/cpu/arm920t/下的config.mk
函数cc-option用于检查编译器是否支持给定的选项
在PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)中
apcs:指的是 ARM 过程调用标准
apcs-32和apcs-gnu是APCS 标准中的两个版本。
在上边脚本中cc-option首先检查是否支持apcs-32标准,如果不支持的话就使用apcs-gnu标准,而3.3.2 arm-linux-gcc也不支持apcs-gnu标准,所以出错。而PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
脚本中如果给定的两个标准都不支持的话就不指定了。
如果你用的是3.3.2版本你可以按照我的修改
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)#,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
11.修改cpu/arm920t/start.S文件
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) ||
#if defined(CONFIG_S3C2400)
# define pWTCON
# define INTMSK
# define CLKDIVN
#else
# define pWTCON
# define INTMSK
# define INTSUBMSK
# define CLKDIVN
#endif
……
修改中断禁止部分:
# if defined(CONFIG_S3C2410)
# endif
#if defined(CONFIG_S3C2440)
# endif
……
修改时钟:
#if defined(CONFIG_S3C2440)
#else
#endif
#endif
……
从FLASH启动改成从NAND FLASH启动
#if defined(CONFIG_S3C2440)
#endif
#if defined(CONFIG_S3C2410)
#endif
禁止从FLASH启动
#ifdef
#define CONFIG_SKIP_RELOCATE_UBOOT
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:
copy_loop:
#endif
#endif
为了测试方便,在uboot启动第一个阶段后,用LED闪烁做指示
这里说明一下led_test是一段汇编程序(也可以是你写的C程序),根据板子具体的情况自己去写这段程序。
从NAND FLASH到SDRAM
#if defined(CONFIG_S3C2440)
copy_nand_to_sdram:
ok_nand_read:
go_next:
notmatch:
1:
done_nand_read:
#endif
#if defined(CONFIG_S3C2410)
copy_nand_to_sdram:
ok_nand_read:
go_next:
notmatch:
1:
done_nand_read:
#endif
DW_STACK_START:
12.在board/hyt24x0/文件夹下新建一个.c文件<read_nand.c>
文件内容如下:
#include <common.h>
#include <s3c2410.h>
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#if defined(CONFIG_S3C2440)
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
//#define GPDAT __REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)
#define NAND_CHIP_ENABLE
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB
#define NAND_DETECT_RB
#define BUSY 4
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
void nand_reset(void)
{
}
int nand_read_ll(unsigned char *buf,unsigned long start_addr,int size)
{
}
#endif //CONFIG_S3C2440
#if defined(CONFIG_S3C2410)
#define NFCONF
#define NFCMD
#define NFADDR
#define NFDATA
#define NFSTAT
#define BUSY 1
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
inline void wait_idle(void) {
}
void nand_reset(void)
{
}
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
}
#endif //CONFIG_S3C2410
添加完后保存并退出。同时修改在目录下面的Makefile文件
OBJS
SOBJS