U-Boot 1.1.6 基于S3C44B0的移植
作者:zenf E-Mail:
[email protected]
版权所有:作者保留文档中的任何原创文字和原创图片的版权,任何转载或者商业用途必须获得作者的许可和授权。(2007 年 10 月)
说明1:本文档基于hfrk 的ARM7 S3C44B0 开发板配置平台。
说明2:U-Boot 1.1.6 的移植,基于ARM7 S3C44B0的hfrk U-Boot 1.1.1能够正常工作的包裹提取适当文件合并至U-Boot 1.1.6中,并适当修改Makefile实现。
目 录
1.1 U-Boot 添加新Board步骤 1
1.2 添加board 类型且适当修改目录内文件 2
1.3 修改cpu/s3c44b0目录文件 以及10M以太网芯片驱动 2
1.4 修改主Makefile文件 (解决-MQ问题) 3
1.5 编译和运行 5
1.6 基于RAM运行U-Boot烧写新U-Boot至FLASH的方法(危险) 10
1.7 附录1:hfrk的FLASH操作说明 11
1.8 附录2:u-boot 1.1.6 反汇编片断摘录 12
1.1 U-Boot 添加新Board步骤
本节内容摘录自u-boot 1.1.6的根目录README文件(可随意引用),作为添加新Board的基础。
细节内容参考附件
1.2 添加board 类型且适当修改目录内文件
拷贝U-Boot 1.1.1中board/hfrk 中所有内容至U-Boot 1.1.6的board/hfrk。其中包括两个目录board/hfrk/common 和 board/hfrk/hfrks3c44b0。
拷贝board/dave/B2/Makefile 至 board/hfrk/hfrks3c44b0/Makefile 覆盖原文件,同时修改覆盖后的Makefile如下:
原来Makefile Line 32/33 为
COBJS := B2.o flash.o
SOBJS := lowlevel_init.o
修改为:
COBJS := hfrks3c44b0.o flash.o
SOBJS := memsetup.o
拷贝U-Boot 1.1.1中include/configs/hfrks3c44b0.h 文件至U-Boot 1.1.6的include/configs/hfrks3c44b0.h。
1.3 修改cpu/s3c44b0目录文件 以及10M以太网芯片驱动
拷贝U-Boot 1.1.1 中 cpu/s3c44b0/serial.c 文件至 U-Boot 1.1.6中cpu/3c44b0/serial.c 覆盖,该拷贝过程修正serial.c中CONFIG_S3C44B0_CLOCK_SPEED == 60 的配置。或者可以基于源代码比较软件(如beyond compare)进行compare and merge修改操作。
修改start.S,主要改动如下:
(1)在112行左右找到 bl lowlevel_init 代码,修改为 bl memsetup。 该修改使用hfrk设计的内存初始化配置。
(2)在213行左右找到代码如下:
if CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
修改为:(添加修改红色部分,使用CLOCK_SPEED==60配置)
#if CONFIG_S3C44B0_CLOCK_SPEED==60
ldr r0, =0x88042 /* 60MHz (Quartz=10MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
找到U-Boot 1.1.6 中drivers/rtl8019.c drivers/rtl8019.h两只文件,与U-Boot 1.1.1中的rtl8019.h, rtl8019.c比较后,修改为U-Boot 1.1.1中对rtl8019的`10 M以太网芯片进行16bit操作模式。
rtl8019.h 中主要修改地址偏移,如下:
#define RTL8019_REG_00 (RTL8019_BASE + (0x00 << 1))
#define RTL8019_REG_01 (RTL8019_BASE + (0x01 << 1))
#define RTL8019_REG_02 (RTL8019_BASE + (0x02 << 1))
#define RTL8019_REG_03 (RTL8019_BASE + (0x03 << 1))
#define RTL8019_REG_04 (RTL8019_BASE + (0x04 << 1))
#define RTL8019_REG_05 (RTL8019_BASE + (0x05 << 1))
#define RTL8019_REG_06 (RTL8019_BASE + (0x06 << 1))
#define RTL8019_REG_07 (RTL8019_BASE + (0x07 << 1))
#define RTL8019_REG_08 (RTL8019_BASE + (0x08 << 1))
#define RTL8019_REG_09 (RTL8019_BASE + (0x09 << 1))
#define RTL8019_REG_0a (RTL8019_BASE + (0x0a << 1))
#define RTL8019_REG_0b (RTL8019_BASE + (0x0b << 1))
#define RTL8019_REG_0c (RTL8019_BASE + (0x0c << 1))
#define RTL8019_REG_0d (RTL8019_BASE + (0x0d << 1))
#define RTL8019_REG_0e (RTL8019_BASE + (0x0e << 1))
#define RTL8019_REG_0f (RTL8019_BASE + (0x0f << 1))
#define RTL8019_REG_10 (RTL8019_BASE + (0x10 << 1))
#define RTL8019_REG_1f (RTL8019_BASE + (0x1f << 1))
rtl8019.c中主要修改初始化两处寄存器配置:
put_reg (RTL8019_MULTIADDRESS0, 0x00);
put_reg (RTL8019_MULTIADDRESS1, 0x41);
put_reg (RTL8019_MULTIADDRESS2, 0x00);
put_reg (RTL8019_MULTIADDRESS3, 0x80);
put_reg (RTL8019_MULTIADDRESS4, 0x00);
put_reg (RTL8019_MULTIADDRESS5, 0x00);
put_reg (RTL8019_MULTIADDRESS6, 0x00);
put_reg (RTL8019_MULTIADDRESS7, 0x00);
1.4 修改主Makefile文件 (解决-MQ问题)
Makefile中添加hfrks3c44b0板卡,找到S3C44B0 Systems,在B2_config的板子后添加:
##########################################
## HFRK S3C44B0 Systems
###########################################
hfrks3c44b0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s3c44b0 hfrks3c44b0 hfrk
修改Makefile的交叉编译工具前缀,找到ARCH arm的编译前缀,把arm-linux-修改为arm-elf-,如下:
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux-
CROSS_COMPILE = arm-elf-
endif
以下的修改为解决Makefile中-MQ编译控制问题,由于笔者使用的arm-elf-gcc编译器基于hfrk的老版本,对-MQ的控制选项有些兼容问题,由于笔者能力有限,采用对Makefile以及config.mk中的内容进行适当修改以保证编译通过。(后续笔者找到更简单Makefile方案将更新本文档)
细节内容参考附件
1.6 基于RAM运行U-Boot烧写新U-Boot至FLASH的方法(危险)
采用JTAG可以烧写U-Boot至FLASH,需要启用JTAG、并行端口 以及 ADS工程等。
笔者养家糊口工作中,所有设备板卡Boot内容的烧写除出厂时第一次采用flash编程器烧写,后续的烧写全部采用软件自动升级方式。(笔者后续计划将给u-boot增加自动u-boot升级功能)
基于hfrk的U-Boot 操作FLASH的指令以及相关说明,我们可以基于U-Boot自动把新的U-Boot写入FLASH中。
首先基于flash中的U-Boot启动后,按任意键进入script模式,运行tftp 命令,把新编译的u-boot.bin加载至RAM内存0xc008000地址空间。如1.5中的加载过程,文件长度为143684, 0x23144/4 + 2 = 0x8C54。
其次采用erase命令擦除flash的u-boot存放区域,命令:
erase 0x00 0x3FFFF
最后采用cp命令,把RAM内存中的新u-boot写入FLASH:
cp 0x000 0xc008000 0x8c54
说明1:由于采用此方式升级新u-boot过程比较专业,并且过程中很有可能有异常情况,如果不非常熟练建议不要使用该方法。由于该方法升级u-boot方式造成使用者相关问题后果自负。
说明2:由于升级FLASH的u-boot失败,会造成系统无法启动,建议读者基于tftp加载新编译的u-boot能够正常使用后(如类似笔者1.5中的测试过程通过),再进行升级。
1.7 附录1:hfrk的FLASH操作说明
细节内容参考附件
1.8 附录2:u-boot 1.1.6 反汇编片断摘录
细节内容参考附件
u-boot: file format elf32-littlearm
Disassembly of section .text:
0c700000 <_start>:
c700000: ea00000a b c700030 <reset>
c700004: e28ff303 add pc, pc, #201326592 ; 0xc000000
c700008: e28ff303 add pc, pc, #201326592 ; 0xc000000
c70000c: e28ff303 add pc, pc, #201326592 ; 0xc000000
c700010: e28ff303 add pc, pc, #201326592 ; 0xc000000
c700014: e28ff303 add pc, pc, #201326592 ; 0xc000000
c700018: e28ff303 add pc, pc, #201326592 ; 0xc000000
c70001c: e28ff303 add pc, pc, #201326592 ; 0xc000000
0c700020 <_TEXT_BASE>:
c700020: 0c700000 ldceql 0, cr0, [r0]
0c700024 <_armboot_start>:
c700024: 0c700000 ldceql 0, cr0, [r0]
0c700028 <_bss_start>:
c700028: 0c72314c ldfeqe f3, [r2], -#304
0c70002c <_bss_end>:
c70002c: 0c757ec8 ldceql 14, cr7, [r5], -#800
0c700030 <reset>:
c700030: e10f0000 mrs r0, CPSR
c700034: e3c0001f bic r0, r0, #31 ; 0x1f
c700038: e3800013 orr r0, r0, #19 ; 0x13
c70003c: e129f000 msr CPSR_fc, r0
c700040: eb00001a bl c7000b0 <cpu_init_crit>
c700044: eb000056 bl c7001a4 <memsetup>