1、一、u-boot-1.1.4在yl2410上的移植过程:1. 例行准备3.2.1 修改Makefileubootlocalhost uboot#vi Makefile#为crane2410建立编译项yl2410_config : unconfig./mkconfig $(:_config=) arm arm920t yl2410 NULL s3c24x0各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。yl2410: 开发板的型号(BOARD),对应于board/yl2410目录。NULL: 开发者/或经销商(ve
2、nder)。s3c24x0: 片上系统(SOC)。3.2.2 在board 子目录中建立yl2410#cp rf board/smdk2410 board/yl2410#cd board/yl2410#mv smdk2410.c yl2410.c3.2.3 在include/configs/中建立配置头文件#cd ./.#cp include/configs/smdk2410.h include/configs/yl2410.h3.2.4 指定交叉编译工具的路径#vi /.bashrcexport PATH=/usr/local/arm/2.95.3/bin:$PATH3.2.5 测试编译能否
3、成功#make yl2410_config /*产生 include/config.mk*/#make1. 在make的过程中,出现:cc1: invalid option abi=apcs-gnu解决方法:出错的文件是/cpu/s3c44b0/下的config.mk:将PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)改成:PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)2. 修改了第一个错误后,继续mak
4、e,出现了如下的报错:make1: * No rule to make target hello_world.srec, needed by all. Stop.make1: Leaving directory /home/mort/src/targa/u-boot/u-boot-TOT/examplesmake: * examples Error 2解决方法:修改examples/Makefile 把126行和129行改为:%.srec: %.o%.bin: %.o继续make 3. 出现 crane2410.a needed by smdk2410.o解决方法:修改board/crane2
5、410/Makefile 将28行的 OBJS := smdk2410.o flash.o改为OBJS := crane2410.o flash.o继续make获得u-boot4. 初步调试,主要是在 sdram 上调试要打开 CONFIG_SKIP_LOWLEVEL_INIT即可看到打印信息5. 读写 NorFlash(SST39VF1601 )在 include/configs/yl2410.h 添加#ifdef CONFIG_SST_39VF1601#define PHYS_FLASH_SIZE 0x00200000 /* 2MB */#define CFG_MAX_FLASH_SECT
6、 (35) /* max number of sectors on one chip */#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x1F0000) /* addr of environment */#endif修改 board/yl2410/flash.c 参考 board/dave/common/flash.c#elif defined(CONFIG_SST_39VF1601)(SST_MANUFACT 在 int flash_erase (flash_info_t * info, int s_first, int s_last)#if defined
7、(CONFIG_SST_39VF1601) /* Ali + */*addr = CMD_ERASE_BLOCK;#else*addr = CMD_ERASE_CONFIRM;#endif在 volatile static int write_hword (flash_info_t * info, ulong dest, ushort data)#if defined(CONFIG_SST_39VF1601) /* Ali + */MEM_FLASH_ADDR1 = CMD_PROGRAM;#elseMEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;*addr = CMD
8、_PROGRAM;#endif即可正确操作 flash,其中 monitor_flash_len(_bss_start - _armboot_start)和环境参数保存区是受保护的,标示为(RO)6. 从 norflash 启动打开选项 CONFIG_S3C2410_NOR_BOOT编译生成 u-boot.binLoadb 0x32000000 115200 (set baud rate to 115200,download u-boot to 0x32000000 by Kermit protocol)Cp.b 0x32000000 0 0x20000 (u-boot write to no
9、rflash)重启,OK7. 如要看到调试信息在 include/configs/yl2410.h 添加#define DEBUG8. 打 ping 命令时,输出 “* ERROR: ethaddr not set”,板上网卡 CS8900 本身没有固化MAC 地址,自己在 include/configs/yl2410.h 设定一个,或者运行时设定环境参数,接下来使用 ping 和 tftp 都正常9. 支持 nandflash 读写在 include/configs/yl2410.h 添加 CFG_CMD_NAND编译,在 cmd_nand.c 产生很多错误,原因是 yl2410 根本就没有
10、 nandflash 的驱动支持,如:NAND_DISABLE_CE()NAND_ENABLE_CE()NAND_WAIT_READY()WRITE_NAND_COMMAND()WRITE_NAND_COMMANDW()WRITE_NAND_ADDRESS()WRITE_NAND()这些函数的实现都很简单,参考 at91rm9200dk.h,对 nand 的驱动支持全部添加在include/configs/yl2410.h加载运行,nand write 0x32000000 0x20000 0x200 (向 nand flash 写 512 字节),报错,nand_write_page : F
11、ailed write verify, 应该是 sector(page)没擦除,nand erase 0x20000 0x200,出错,提示边界没对齐,查得资料获知,erase 单位是一个 block(16k),program 单位是一个 sector(512B),按要求先擦除后写入,正确10. 支持 nandflash 启动在 cpu/arm920t/start.S 添加对 nandflash 重定位的支持,在 board/yl2410/nand_boot.c 添加对nandflash 的初始化和读取操作,在 nandflash 启动时被 start.s 调用,注意 nand_boot.c
12、的所有代码以及被调用的代码不能超出 4k,因为按 nandflash 启动模式,开始只有 4k 的运行空间。编译获得 u-boot.binTftp 0x32000000 u-boot.bin (load u-boot.bin to 0x32000000)Nand erase 0 0x20000 (erase nandflash first 128k)Nand write 0x32000000 0 0x20000 (write u-boot.bin to nandflash)设置跳线到 nandflash 启动模式,重启即可二、流程图三、答疑1. 关于入口地址在board/yl2410/u-bo
13、ot.lds:OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS. = 0x00000000;. = ALIGN(4);.text :cpu/arm920t/start.o (.text)*(.text)_start的入口地址为 0x00000000,为何编译出来的代码。链接地址是从 0x33f80000(TEXT_BASE)开始的?答:lds文件中的起始地址为0x00000000是不起作用的,由链接参数替代的。见 u-boot-1.1.4/config.mk, L145:LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_
14、BASE) $(PLATFORM_LDFLAGS)2. 关于ADR的编译原理adr r0, _start /* r0 - current position of code */_start在flash运行是0,在sdram运行是0x33f80000答:伪指令:ADR;ADRL;ALIGN;DCx;EQUx;OPTADR:小范围的地址读取伪指令.ADR 指令将基于PC 相对偏移的地址值读取到寄存器中.在汇编编译源程序时,ADR 伪指令被编译器替换成一条合适的指令.通常,编译器用一条ADD 指令或SUB 指令来实现该ADR 伪指令的功能,若不能用一条指令实现 ,则产生错误,编译失败.所以adr r
15、0, _start,实际产生的汇编是sub r0,pc,#0x9c ; #0x33f800003. 关于nandflash启动如何保证nandflash启动模式下,启动代码定位在前4k一个是直接在start.s用汇编写nandflash的初始化和重定位代码,或者用C写nandflash 启动代码nand_boot.c,进而修改编辑board/yl2410/u-boot.lds在 *(.text) 之前添加board/yl2410/nand_boot.o (.text)(当然,运气好的话,不用也可以 )为了避免代码运行超出4k,nand_boot.c不能调用其它库函数,不能引用数据段(.data
16、)的数据,因为*(.data) 在*(.text)之后,超出了4k。注意:在修改cpu/arm920t/start.S, nandflash启动模式不能引用_TEXT_BASE,因为_TEXT_BASE:.word TEXT_BASE放于数据段,超出了 4k 的限制,可以用立即数或者宏定义替代。4. nandflash 启动模式下保存环境变量u-boot 启动后,出现“Warning - bad CRC, using default environment”,没有正确的环境变量。查看S3C2410的数据手册,在图表“S3C2410A Memory Map after Reset”中显示,如果“Using NAND flash for boot ROM”,bank 0(128M)仅映射到片内的4k sram,所以同时位于bank 0的norflash无效,这时候的环境变量只能保存于nandflash,修改include/configs/yl2410.h相关的宏定义,重新烧入到nandflash,启动后,输入“saveenv ”即可。5. 关于mmuu-boot不需要中断重定位,可以关闭mmu