当前位置:首页 > > 充电吧
[导读]作者:华清远见讲师Bootloader:简单地说,Bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境

作者:华清远见讲师


Bootloader:

简单地说,Bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好准备。

所以Bootloader执行时要加载Linux内核,内核挂载根文件系统rootfs。一般在嵌入式Linux系统中,Flash设备中需要包含以上几部分,如下图:

常见的Bootloader:

u-boot,blob

Bootloader启动:

第一阶段(iRAM,8KB):

1. 关中断(FIQ和IRQ),关D-Cache(I-Cache可以打开),设置SVC模式,关MMU(内存管理单元),关Watchdog

2. 配置串口

3. 配置系统时钟

4. 初始化SDRAM(设置栈指针寄存器sp),以上都用汇编语言实现

5. C语言实现初始化NAND(eMMC,UFS)

6. 将bootloader拷贝到内存,并跳到SDRAM继续执行。

第二阶段(SDRAM):

7. 初始化网卡

8. 将内核(zImage/uImage)和设备树(Device Tree Blob)拷贝到SDRAM,准备启动参数(bootargs),跳到内核地址运行。

u-boot常用命令:

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。

1.帮助命令help。

运行help 命令可以看到U-Boot 中所有命令的作用,如果要查看某个命令的使用方法,

运行“help 命令名”,比如“help bootm”。

可以使用“?”来代替“help”,比如直接输入“?”、“? bootm”。

------------------------------------------------------------------------------------------------------------

2.下载命令。

U-Boot 支持串口下载、网络下载,相关命令有:loadb、loads、loadx、loady 和tftpboot。

前几个串口下载命令使用方法相似,以loadx 命令为例,它的用法为“loadx [ off ][ baud ]”。“[]”表示里面的参数可以省略,off 表示文件下载后存放的内存地址,baud 表示使用的波特率。如果baud 参数省略,则使用当前的波特率;如果off 参数省略,存放的地址为配置文件中定义的宏CFG_LOAD_ADDR。

tftpboot 命令使用TFTP 协议从服务器下载文件,服务器的IP 地址为环境变量serverip。

用法为“tftpboot [loadAddress] [bootfilename]”,loadAddress 表示文件下载后存放的内存地址,bootfilename 表示要下载的文件的名称。如果loadAddress 省略,存放的地址为配置文件中定义的宏CFG_LOAD_ADDR;如果bootfilename 省略,则使用开发板的IP 地址构造一个文件名,比如开发板IP 为192.168.1.17,则默认的文件名为C0A80711.img。

nfs 命令使用NFS 协议下载文件,用法为“nfs [loadAddress] [host ip addr:bootfilename]”。

“loadAddress、bootfilename”的意义与tftpboot 命令一样,“host ip addr”表示服务器的IP 地址,默认为环境变量serverip。下载文件成功后,U-Boot 会自动创建或更新环境变量filesize,它表示下载的文件的长度,可以在后续命令中使用“$(filesize)”来引用它。

-----------------------------------------------------------------------------------------------------------

3.内存操作命令。

常用的命令有:查看内存命令md、修改内存命令md、填充内存命令mw、复制命令cp。这些命令都可以带上后缀“.b”、“.w”或“.l”,表示以字节、字(2 个字节)、双字(4 个字节)为单位进行操作。比如“cp.l 30000000 31000000 2”将从开始地址0x30000000 处,复制2 个双字到开始地址为0x31000000 的地方。

md 命令用法为“md[.b, .w, .l] address [count]”,表示以字节、字或双字(默认为双字)为单位,显示从地址address 开始的内存数据,显示的数据个数为count。

mm 命令用法为“mm[.b, .w, .l] address”,表示以字节、字或双字(默认为双字)为单位,从地址address 开始修改内存数据。执行mm 命令后,输入新数据后回车,地址会自动增加,按“Ctrl+C”键退出。

mw 命令用法为“mw[.b, .w, .l] address value [count]”,表示以字节、字或双字(默认为双字)为单位,往开始地址为address 的内存中填充count 个数据,数据值为value。

cp 命令用法为“cp[.b, .w, .l] source target count”,表示以字节、字或双字(默认为双字)

为单位,从源地址source 的内存复制count 个数据到目的地址的内存。

-----------------------------------------------------------------------------------------------------------

4. 启动命令。

不带参数的“boot”、“bootm”命令都是执行环境变量bootcmd 所指定的命令。

“bootm [addr [arg…]]”命令启动存放在地址addr 处的U-Boot 格式的映象文件(使用U-Boot 目录tools 下的mkimage 工具制作得到),[arg…]表示参数。如果addr 参数省略,映象文件所在地址为配置文件中定义的宏CFG_LOAD_ADDR。

“go addr [arg…]”与bootm 命令类似,启动存放在地址addr 处的二进制文件,[arg...]表示参数。

“nboot [[[loadAddr] dev] offset]”命令将NAND Flash 设备dev 上偏移地址off 处的映象文件复制到内存loadAddr 处,然后,如果环境变量autostart 的值为“yes”,就启动这个映象。如果loadAddr 参数省略,存放地址为配置文件中定义的宏CFG_LOAD_ADDR;如果dev 参数省略,则它的取值为环境变量bootdevice 的值;如果offset 参数省略,则默认为0

-----------------------------------------------------------------------------------------------------------

5. 环境变量命令。

“printenv”命令打印全部环境变量,“printenv name1 name2?”打印名字为name1、name2、?的环境变量。

“setenv name value”设置名字为name 的环境变量的值为value。

“setenv name”删除名字为name 的环境变量。

上面的设置、删除操作只是在内存中进行,“saveenv”将更改后的所有环境变量写入Flash中。

-----------------------------------------------------------------------------------------------------------

6. 从SD卡烧写

sdfuse,将FAT分区SD卡中镜像文件烧写到启动设备

sdfuse flashall,烧写全部分区,包括bootloader、kernel、ramdisk、Recovery、system、userdata、cache和fat.

sdfuse flash [ ] 烧写制定分区

sdfuse erase 擦除制定分区

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭