移植的uboot版本为1.4版,用的编译工具链为arm-elf-。不能用arm-linux编译,原因是用的c库不同。简单的说就是arm-linux是为有MMU硬件单元的处理器配置的,如ARM9器件,而arm-elf-则是用于无MMU的cpu的,如ARM7。(也试了一下,用arm-linux-编译得到的uboot.bin加载到SDRAM中运行后无显示)。arm-elf-gcc版本为2.93版本的(有点低,还需要修改cpus3c44b0config.mk,后面提到)。在uboot1.4版本中符合s3c44b0内核的板子为daveB2板,移植就是基于该板子的,当然实际板子有很多硬件情况与它不同,需要修改。
现在就分别讲讲所要修改的文件和具体修改吧:"uboot"表示uboot的根目录
ubootMakefile:在uboot中,默认的编译器为arm-linux-,所以首先要修改的就是把编译器改为arm-elf-:
ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif
只需要把arm-linux-改为arm-elf-就行
同时,要增加自己的板子在Makefile中的配置:
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
该句增加了B2板子在Makefile中的配置,其中向编译器传递了四个参数:cpu体系 cpu类型 板子 公司
可仿造该板子增加自己板子的设置,其中板子和公司可自取,为了文件,都取为44b0,增加配置如下:
44b0_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 44b0 44b0
ubootoard:该文件夹放置了所有uboot支持的板子。故要在此文件夹中增加自己的板子。移植嘛,就是在原有的基础上修改成符合自己的就行了。于是可以把dave复制成44b0放在该文件夹下。同时,把44b0所有插着B2标志的文件夹或文件都复制成44b0(这里我们就不删除daveB2吧)。然后我们修改操作就是针对44b0的,那才是我们需要的。
ubootoard44b044b044b0.c:该文件就两个函数:board_init(),dram_init()。其中dram_init()无需修改,不过却给了我们个信号:关于SDRAM的映射起始地址和SDRAM的大小。而board_init()似乎也是不需要怎么改的。主要是配置一下IO。口但B2板子没有初始化Port c。因为我的板子上有三个LED在Port c,所以还是初始化一下吧。也许后面要用到的话还得到这里来改
ubootincludeconfigs:我们的配置文件也还是要借用B2的,(哎,谁叫咱是兄弟呢)和前面一样,把所有标着B2的文件夹和文件都复制成44b0(不要删除了B2)。现在就修改一下44b0.h吧
ubootincludeconfigs44b0.h:这个文件就是配置板子的各个参数。配置项还是比较多的,主要是根据板子的实际硬件情况来修改相应的数值或定义。主要修改的如下:
#define CONFIG_B2-------->#define CONFIG_44b0
#define CONFIG_S3C44B0_CLOCK_SPEED 75
定义板子的系统时钟,我的板子配置成40M比较麻烦,后见分晓~~~
#undef CONFIG_USE_IRQ
不定义USE_IRQ堆栈。如果要在SDRAM中用到IRQ堆栈的话,这里就应该定义了
#define CONFIG_BOOTDELAY 5------>#define CONFIG_BOOTDELAY 6
定义UBOOT引导系统的选择延时:如果定义自动加载系统的话,超过了这个定义 的计数之后,UBOOT将自己加载系统。我把计数数改为6了,在SDRAM中调试的时候,看着显示的倒计时数为5开始时,就知道移植成功了
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
这个都是根据B2板子来设定的,而我的板子则不是它们,而是下面的:
#define CFG_MEMTEST_START 0x0C040000 起始值还是应该计算计算滴
#define CFG_MEMTEST_END 0x0C100000 /这个最大什为TEXT_BASE
#define CFG_LOAD_ADDR 0x0c700000 /* default load address */
默认的加载系统的地址,还是改了吧,这个地址太大了,不合适啊,
#define CFG_LOAD_ADDR 0x0c008000
#define PHYS_SDRAM_1 0xc0000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x01000000 /* 16 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define PHYS_FLASH_SIZE 0x00400000 /* 4 MB */
关于SDRAM和flash的起始地址和大小的宏定义。当然,也是不符合实际情况的
#define PHYS_SDRAM_1 0x0c000000 映射起始地址 0x0c000000
#define PHYS_SDRAM_1_SIZE 0x00800000 大小:8M
#define PHYS_FLASH_1 0x00000000 映射起始地址 0x00000000
#define PHYS_FLASH_SIZE 0x00200000 大小:2M
#define CFG_MAX_FLASH_SECT 256 /* max number of sectors on one chip */
flash最大可选sectors 也是要改的
#define CFG_MAX_FLASH_SECT 32
还有就是这个B2板子没有网卡,还应该加一个网卡的配置:
#define CONFIG_DRIVER_TRL8019
#define RTL8019_BASE 0x08000000
当然,还有很多其他的配置。目前为止还不知道哪些是需要的,哪些是不需要的,哪些是要 改的,哪些是不要改的,都还要在应用中才能发现哦
ubootcpus3c44b0lowlevel_init.S:关于s3c44b0存储器的配置。主要参考s3c44b0手册和SDRAM和FLASH手册,具体的已在前面的日志中说明了,在此不再罗嗦。
ubootcpus3c44b0serial.c:关于串口的——这个很重要哦,设置不好的话就看不到显示了。主要是关于串口初始化的,serial_init()调用serial_setbrg()来设置相关寄存器。这里要修改的就是依据相应的串口波特率来设置divisor。这里就能看到CONFIG_S3C44B0_CLOCK_SPEED的身影了。如果在44b0.h文件里没有定义这个宏或是这个宏的值定义不是75或66的话,那在编译的时候就会报错:#error CONFIG_S3C44B0_CLOCK_SPEED undefined。
ubootcpus3c44b0start.S:终于要说到这个文件了。其实当初觉的神秘,现在看来真是有点太把它当回事了。细看一下,和一个普通的startup.S没多大区别。主要难点还是几段代码和原理吧。关于start.S参考前面写的日志吧。这里主要讲修改的话就太简单了。要修改的寄存器初始化参数就是LOCKTIME和PLLCON。设为符合板子的值就可以了,LOCKTIME=2000,PLLCON=0x48032,设置主频Mclk=40Mhz就行了
这里是程序代码的修改。还有一个就是前面提到的在编译的时候碰到的问题:由于arm-elf-gcc版本太低了,导致在引用编译符号的时候参数错误:ubootcpus3c44b0config.mk中有如下行:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
提示也错的参数为:abi=apcs;只要做如下改动即可消除编译器的不适:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
至此,关于uboot1.4移植所要做的修改就完了。但问题还远远没有完吧:uboot应该放在哪个目录?make的时候经常碰到莫名的问题~~
还是那句话,路漫漫其修远~~~~
上一篇:uclinux编译
下一篇:uboot stage2 init_fnc_t *init_sequence[]代码分析
推荐阅读最新更新时间:2024-03-16 14:26