一、u-boot-1.1.4在yl2410上的移植过程: 1. 例行准备 3.2.1 修改Makefile
[uboot@localhost 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: 开发者/或经销商(vender)。 s3c24x0: 片上系统(SOC)。 3.2.2 在board子目录中建立yl2410 #cp rf board/smdk2410 board/yl2410 #cd board/yl2410 #mv smdk2410.c yl2410.c
3.2.3 在include/configs/中建立配置头文件 #cd ../..
#cp include/configs/smdk2410.h include/configs/yl2410.h 3.2.4 指定交叉编译工具的路径 #vi ~/.bashrc
export PATH=/usr/local/arm/2.95.3/bin:$PATH 3.2.5 测试编译能否成功
#make yl2410_config /*产生include/config.mk*/ #make
1. 在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. 修改了第一个错误后,继续make,出现了如下的报错:
make[1]: *** No rule to make target `hello_world.srec', needed by `all'. Stop. make[1]: Leaving directory `/home/mort/src/targa/u-boot/u-boot-TOT/examples'
make: *** [examples] Error 2 解决方法:
修改examples/Makefile 把126行和129行改为: %.srec: %.o %.bin: %.o 继续make
3. 出现 crane2410.a needed by smdk2410.o 解决方法:
修改board/crane2410/Makefile 将28行的
OBJS := smdk2410.o flash.o 改为
OBJS := crane2410.o flash.o 继续make获得u-boot
4. 初步调试,主要是在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 (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 & FLASH_VENDMASK) | (SST_ID_xF1601 & FLASH_TYPEMASK); 在int flash_erase (flash_info_t * info, int s_first, int s_last) #if defined(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; #else
MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS; *addr = CMD_PROGRAM; #endif
即可正确操作flash,其中monitor_flash_len(_bss_start - _armboot_start)和环境参数保存区是受保护的,标示为(RO)
6. 从norflash启动
打开选项CONFIG_S3C2410_NOR_BOOT 编译生成u-boot.bin
Loadb 0x32000000 115200 (set baud rate to 115200,download u-boot to 0x32000000 by Kermit protocol)
Cp.b 0x32000000 0 0x20000 (u-boot write to norflash) 重启,OK
7. 如要看到调试信息
在include/configs/yl2410.h添加 #define DEBUG
8. 打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根本就没有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 : Failed 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的所有代码以及被调用的代码不能超出4k,因为按nandflash启动模式,开始只有4k的运行空间。 编译获得u-boot.bin
详解u-boot
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)