详解u-boot.doc_第1页
详解u-boot.doc_第2页
详解u-boot.doc_第3页
详解u-boot.doc_第4页
详解u-boot.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、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: 开发者/或经销商(vender)。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 测试编译能否成功#make yl2410_config/*产生include/config.mk*/#make1. 在make的过程中,出现:cc1: invalid option abi=apcs-gnu解决方法:出错的文件是/cpu/s3c44b0/下的config.mk:将PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,-mabi=apcs-gnu)改成:PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu),)2. 修改了第一个错误后,继续make,出现了如下的报错: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/crane2410/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_SIZE0x00200000 /* 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;#elseMEM_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.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 norflash)重启,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根本就没有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.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-boot.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_BASE) $(PLATFORM_LDFLAGS)2. 关于ADR的编译原理adrr0, _start/* r0 - current position of code */_start在flash运行是0,在sdram运行是0x33f80000答:伪指令:ADR;ADRL;ALIGN;DCx;EQUx;OPTADR:小范围的地址读取伪指令.ADR 指令将基于PC 相对偏移的地址值读取到寄存器中.在汇编编译源程序时,ADR 伪指令被编译器替换成一条合适的指令.通常,编译器用一条ADD 指令或SUB 指令来实现该ADR 伪指令的功能,若不能用一条指令实现,则产生错误,编译失败.所以adrr0, _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)的数据,因为*(.data)在*(.text)之后,超出了4k。注意:在修改cpu/arm920t/start.S, nandflash启动模式不能引用_TEXT_BASE,因为_TEXT_BASE:.wordTEXT_BASE放于数据段,超出了4k的限制,可以用立即数或者宏定义替代。4. nandflash启动模式下保存环境变量u-boot启动后,出现“Warning - bad CRC, using default environment”,没有正确的环境变量。查看S3C2410的数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论