详解u-boot 联系客服

发布时间 : 星期日 文章详解u-boot更新完毕开始阅读ae3f6c48fc4ffe473368aba9

一、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

Tftp 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启动模式,重启即可

二、流程图