简单说说U-boot的修改

本文详细介绍了U-boot的修改过程,包括了在at91rm9200系统上修改uboot-1.1.1版本的步骤,涉及了flash.c、flash.h、config.mk等文件的修改,以及内存分布、SDRAM和Flash的配置。文章还提到了移植到44B0X开发板的u-boot移植框架和代码结构分析,包括start.S的初始化、内存控制器设置、代码复制到RAM中等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单说说U-boot的修改
uboot是一个通用的免费开放源码的boot程序,支持很多的处理器。
以下是现在网上下载一个u-boot-1.1.1版本,用于at91rm9200系统的修改的例子。最后在redhat8.0上,用gcc2.95编译通过。
在网上下载了uboot-1.1.1版本。要用于自己的at91rm9200的系统,这个系统的情况是:
SDRAM: 32Mbytes NCS1
FLASH: 8Mbytes NCS0
涉及到的文件有四个:
common.h
flash.c
flash.h
”./board/at91rm9200dk/config.mk”
以下简单的说说。
一、首先读读uboot自带的readme文件,了解了一个大概。
二、看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。再看看flash.h,这个文件里面定义了flash_info_t为一个struct。包含了flash的一些属性定义。并且定义了所有的flash的属性,其中,AMD的有:AMD_ID_LV320B,定义为“#define
AMD_ID_LV320B 0x22F922F9”。
三、对于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:
“void flash_identification(flash_info_t
*info)”这个函数的目的是确认flash的型号。注意的是,这个函数里面有一些宏定义,直接读写了flash。并获得ID号。
四、修改:”./board/at91rm9200dk/config.mk”为
TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修改,和一级boot的定义的一致即可)。
五、再修改”./include/configs/at91rm9200dk.h”为
修改flash和SDRAM的大小。
六、另外一个要修改的文件是:
./borad/at91rm9200dk/flash.c。这个文件修改的部分比较的多。
1. 首先是OrgDef的定义,加上目前的flash。
2. 接下来,修改”#define FLASH_BANK_SIZE 0x200000”为自己flash的容量
3. 在修改函数flash_identification(flash_info_t * info)里面的打印信息,这部分将在u-boot启动的时候显示。
4. 然后修改函数flash_init(void)里面对一些变量的赋值。
5. 最后修改的是函数flash_print_info(flash_info_t * info)里面实际打印的函数信息。
6. 还有一个函数需要修改,就是:“flash_erase”,这个函数要检测先前知道的flash类型是否匹配,否则,直接就返回了。把这里给注释掉。

七、接下来看看SDRAM的修改。
这个里面对于“SIZE”的定义都是基于字节计算的。
只要修改”./include/configs/at91rm9200dk.h”里面的
“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字节为单位的。
八、还有一个地方要注意
就是按照目前的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 ->
21F16B10,这恰好是SDRAM的高端部分。另外,BSS为21F1AE34。

九、编译后,可以写入flash了。
1. 压缩这个u-boot.bin
“gzip –c u-boot.bin > u-boot.gz”
压缩后的文件大小为:
43Kbytes
2. 接着把boot.bin和u-boot.gz烧到flash里面去。
Boot.bin大约11kBytes,在flash的0x1000 0000 ~ 0x1000 3fff
免费参加,名额有限!2005DVTF;MP3 U盘礼物...
zlei 发表于 2005-1-16 12:31 ARM 论坛 ←返回版面
U-Boot 在44B0X 开发板上的移植以及代码分析(ZT)
armboot的原理
1、BIOS的源码,其作用是初始化硬件,并COPY Boot到SDRAM中
2、在SDRAM中运行BOOT达到在线升级的目的。
3、此源代码与硬件无关,在44b0x上测试通过
4、串口通讯协议自己制定,很好理解。在线升级很快
5、目前只支持SST39LVF160,可以自己修改成相信的NOR FLASH
U-Boot 在44B0X 开发板上的移植以及代码分析
1. u-boot 介绍
u-boot 是一个open source 的bootloader,目前版本是0.4.0。u-boot 是在ppcboot 以及armboot
的基础上发展而来,虽然宣称是0.4.0
版本,却相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是并不支持我们现在学习所用samsung
44B0X 的开发板。
为什么我们需要u-boot?显然可以将ucLinux 直接烧入flash,从而不需要额外的
引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自
动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。同时,u-boot
移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。

2. u-boot 移植的框架
移植u-boot 到新的开发板上仅需要修改和硬件相关的部分。在代码结构上:
1) 在board 目录下创建ev44b0ii 目录,创建ev44b0ii.c
以及flash.c,memsetup.S,u-boot.lds等。不需要从零开始,可选择一个相似的目录,直接复制过来,修改文件名以及内容。我在移植u-boot
过程中,选择的是ep7312 目录。由于u-boot 已经包含基于s3c24b0 的开发板目录,作为参考,也可以复制相应的目录。
2) 在cpu 目录下创建arm7tdmi 目录,主要包含start.S,interrupts.c
以及cpu.c,serial.c几个文件。同样不需要从零开始建立文件,直接从arm720t 复制,然后修改相应内容。
3) 在include/configs 目录下添加ev44b0ii.h,在这里放上全局的宏定义等。
4) 找到u-boot 根目录下Makefile 修改加入
ev44b0ii_config : unconfig
@./mkconfig $(@:_config=) arm arm7tdmi ev44b0ii
5) 运行make ev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作

3. u-boot 的体系结构
1) 总体结构
u-boot 是一个层次式结构。从上图也可以看出,做移植工作的软件人员应当提供串口驱动(UART Driver),以太网驱动(Ethernet
Driver),Flash 驱动(Flash 驱动),USB 驱动(USB Driver)。目前,通过USB 口下载程序显得不是十分必要,所以暂时没有移植USB
驱动。驱动层之上是u-boot 的应用,command 通过串口提供人机界面。我们可以使用一些命令做一些常用的工作,比如内存查看命令md。
Kermit 应用主要用来支持使用串口通过超级终端下载应用程序。TFTP 则是通过网络方式来下载应用程序,例如uclinux 操作系统。
2) 内存分布
在flash rom 中内存分布图ev44b0ii 的flash 大小2M(8bits),现在将0-40000 共256k 作为u-boot
的存储空间。由于u-boot 中有一些环境变量,例如ip 地址,引导文件名等,可在命令行通过setenv 配置好,通过saveenv
保存在40000-50000(共64k)这段空间里。如果存在保存好的环境变量,u-boot
引导将直接使用这些环境变量。正如从代码分析中可以看到,我们会把flash 引导代码搬移到DRAM 中运行。下图给出u-boot
的代码在DRAM中的位置。引导代码u-boot 将从0x0000 0000 处搬移到0x0C700000 处。特别注意的由于ev44b0ii uclinux
中断向量程序地址在0x0c00 0000 处,所以不能将程序下载到0x0c00 0000 出,通常下载到0x0c08 0000 处。

4. start.S 代码结构
1) 定义入口
一个可执行的Image 必须有一个入口点并且只能有一个唯一的全局入口,通常这个入口放在Rom(flash)的0x0 地址。例如start.S 中的
.globl _start
_start:
值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连接器脚本文件(lds)。
2) 设置异常向量(Exception Vector)
异常向量表,也可称为中断向量表,必须是从0
地址开始,连续的存放。如下面的就包括了复位(reset),未定义处理(undef),软件中断(SWI),预去指令错误(Pabort),数据错误(Dabort),保留,以及IRQ,FIQ
等。注意这里的值必须与uclinux 的vector_base 一致。这就是说如果uclinux
中vector_base(include/armnommu/proc-armv/system.h)定义为0x0c00 0000,则HandleUndef 应该在
0x0c00 0004。
b reset //for debug
ldr pc,=HandleUndef
ldr pc,&

<think>嗯,用户现在在问关于U-Boot编译的教程和问题解决。让我先看看之前的对话历史。用户之前询问过ARM Trusted Firmware中的EHF框架,现在转向U-Boot编译,可能是在开发嵌入式系统时需要配置启动加载程序。 用户提供的引用内容主要涉及U-Boot的编译过程,包括配置、依赖关系、生成的文件以及可能的权限问题。用户可能已经尝试过编译但遇到了问题,或者刚开始学习如何编译U-Boot,需要指导步骤。引用中提到的问题比如编译配置步骤、交叉编译器的安装、权限错误等,这些都是常见的编译问题。 首先,用户需要的是详细的编译教程,可能包括环境配置、步骤和常见问题解决。根据引用[4],编译过程包括安装交叉编译器、解压源码、配置、编译等步骤。用户可能对每一步的具体操作不太清楚,尤其是环境变量的设置和make命令的使用。另外,引用[5]提到权限问题,编译时使用root权限的风险,所以需要提醒用户避免使用root,并正确设置工具链路径。 用户还可能遇到生成的文件是否正确的问题,比如u-boot.bin和带头的文件是否需要特殊处理,如引用[3]中提到i.MX平台需要添加头信息才能烧录。所以教程中可能需要明不同平台的处理差异。 此外,用户可能遇到编译错误,比如依赖缺失、配置错误或工具链问题。需要整理常见错误及解决方法,例如检查交叉编译器是否正确安装,配置是否存在,或者make时的参数是否正确。 需要确保回答结构清晰,分步骤讲解,并包含问题解决部分。同时,要参考用户提供的引用内容,尤其是配置过程、文件依赖关系和权限问题,确保信息准确。最后,生成相关问题帮助用户进一步探索可能遇到的挑战,比如如何验证编译结果、处理特定开发板的配置等。</think>### U-Boot编译教程与常见问题解决 以下内容基于U-Boot编译流程及典型问题整理,结合ARM架构开发场景(如i.MX、RK3568等)。 --- #### **一、U-Boot编译完整流程** 1. **环境配置** - **安装交叉编译器**(以ARM为例): ```bash # 示例:安装arm-linux-gnueabihf工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf ``` 验证安装: ```bash arm-linux-gnueabihf-gcc -v ``` 若需自定义工具链(如Xilinx版本),需手动解压并配置环境变量[^4]。 - **设置环境变量**: ```bash export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- ``` 2. **源码准备** - 解压U-Boot源码: ```bash tar -xzvf u-boot-2023.01.tar.gz cd u-boot-2023.01 ``` 3. **配置与编译** - **清理旧配置**: ```bash make distclean ``` - **选择开发板配置**: ```bash make <xxx_defconfig> # 如mx6ul_14x14_evk_nand_defconfig ``` 配置文件路径:`configs/<xxx_defconfig>`[^1][^4]。 - **编译**: ```bash make -j$(nproc) # 多线程编译 ``` 4. **生成文件明** - `u-boot`:ELF格式可执行文件(含符号表)。 - `u-boot.bin`:二进制文件,可直接烧录[^2]。 - **特殊平台处理**(如i.MX):需使用工具添加头部信息[^3]。 --- #### **二、常见问题与解决方案** 1. **编译报错:交叉编译器未找到** - **原因**:环境变量未正确配置或工具链未安装。 - **解决**: ```bash # 检查CROSS_COMPILE路径 echo $CROSS_COMPILE # 若使用自定义工具链,确保路径已加入PATH export PATH=$PATH:/path/to/toolchain/bin ``` 2. **错误:`make xxx_defconfig`失败** - **原因**:配置文件不存在或依赖缺失。 - **解决**: - 确认开发板配置文件位于`configs/`目录。 - 安装依赖库: ```bash sudo apt-get install libssl-dev bison flex ``` 3. **权限问题(如RK3568编译报错)** - **原因**:使用`root`权限编译可能导致路径污染或权限冲突[^5]。 - **解决**: - 以普通用户身份编译,避免使用`sudo`。 - 确保源码目录权限正确: ```bash chown -R $USER:$USER u-boot-2023.01 ``` 4. **烧录后无法启动** - **原因**: - 未添加平台要求的头部信息(如i.MX需使用`mkimage`工具)。 - 烧录地址错误(需对齐`CONFIG_SYS_TEXT_BASE`)[^3]。 - **解决**: ```bash # 示例:i.MX生成含头部的镜像 ./tools/mkimage -n board/imximage.cfg -T imximage -e 0x87800000 -d u-boot.bin u-boot.imx ``` --- #### **三、进阶调试技巧** 1. **查看详细编译日志**: ```bash make V=1 # 显示完整命令 ``` 2. **分析符号表**: ```bash arm-linux-gnueabihf-objdump -D u-boot > u-boot.dis ``` 3. **检查链接脚本**: 查看`u-boot.lds`文件,确认代码段与数据段地址是否符合硬件要求。 --- **相关问题** 1. 如何为RK3568定制U-Boot的`xxx_defconfig`? 2. 如何解决U-Boot编译时的`openssl/bio.h: No such file`错误? 3. U-Boot烧录后无法识别SD卡的可能原因? 4. 如何验证U-Boot镜像的校验和? 若需更具体的平台(如i.MX、RK3568)问题分析,请提供报错日志或配置细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值