Bootloader移植上

基本概念

  1. 什么是bootloader
    Bootloader是硬件启动的引导程序,是运行操作系统的前提;
    在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
    在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。

  2. bootloader的特点
    Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
    在移植系统时,首先为开发板移植Bootloader。
    Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

  3. bootloader的启动模式
    自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
    交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。

  4. 常用的bootloader介绍

    U-Boot是目前Bootloader中使用率最高的一种,特点是开源免费,应用广泛。U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。

  5. u-boot特点
    代码结构清晰、易于移植(见目录结构)
    支持多种处理器体系结构(见arch目录)
    支持众多开发板(目前官方包中有200多种,见board目录)
    命令丰富、有监控功能
    支持网络协议、USB、SD等多种协议和设备
    支持文件系统
    更新较活跃,使用者多,有助于解决问题

U-Boot常用命令(交互模式)

help

help 查看uboot支持的搜用命令

pri /prientenv

pri 或者 prientenv 查看uboot的环境变量

fs4412 # pri
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.1.158:/home/linux/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.160
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
bootdelay=3
ethact=dm9000
ethaddr=11:22:33:44:55:66
fileaddr=42000000
filesize=D13D
gatewayip=192.168.1.5
ipaddr=192.168.1.160
ipaddr192.168.31.5
netmask=255.255.255.0
serverip=192.168.1.158
stderr=serial
stdin=serial
stdout=serial
tftp=41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000

Environment size: 681/16380 bytes

setenv

setenv 设置环境变量 此命令也可用于删除环境变量

setenv ipaddr       //删除ipaddr变量

saveenv

saveenv 保存环境变量

ping

ping 检测网络是否联通

bootcmd

bootcmd 自启动命令,如果定义了该变量,在自启动模式下将会执行该环境变量中的命令。

U-boot # setenv bootcmd tftp 41000000 uImage\; bootm  41000000
U-boot # saveenv

bootm

bootm 用于运行内核
引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件。

bootm  kernel-addr ramdisk-addr  dtb-addr

bootm 41000000 - 42000000

tftp

tftp 通过网络下载程序

U-boot # tftp  41000000  application.bin        //41000000 保存的内存地址 application.bin 要下载的文件

Nor Flash操作

protect 对Nor Flash写保护 (Nor Flash造价贵 对内存位操作 读写速度快)

protect  on  0  10000 对区间[0x0, 0x10000]进行写保护
protect  off  0  10000  对上述区间取消写保护

erase 擦除Nor FLASH

erase  all    擦除FLASH所有的扇区
erase  0  10000  把FLASH区间 [0x0, 0x10000]擦除

Nand Flash操作

Nand Flash操作 (Nand Flash 造价便宜 对内存块操作 读写速度慢)

nand  read  addr  off  size
nand  write  addr  off  size
nand  erase [clean] [off  size] 

movi

movi  init ---初始化eMMC并显示相关信息 
movi  read  u-boot/kernel  addr
movi  write  u-boot/kernel  addr
movi  read  rootfs  addr   size
movi  write rootfs  addr   size
更多命令参考:
https://blog.csdn.net/weixin_45309916/article/details/109178989
http://www.360doc.com/content/18/0406/16/32862269_743313535.shtml

loadb

loadb 通过串口下载二进制文件(裸机开发常用)

fs4412 # loadb 40008000

go

go 执行逻辑程序(逻辑开发常用)

fs4412 # go 40008000

u-boot的目录层次结构:

/arch			    Architecture specific files
  /arc			    Files generic to ARC architecture
  /arm			    Files generic to ARM architecture
  /m68k			    Files generic to m68k architecture
  /microblaze		Files generic to microblaze architecture
  /mips			    Files generic to MIPS architecture
  /nds32		    Files generic to NDS32 architecture
  /nios2		    Files generic to Altera NIOS2 architecture
  /powerpc		    Files generic to PowerPC architecture
  /riscv		    Files generic to RISC-V architecture
  /sandbox		    Files generic to HW-independent "sandbox"
  /sh			    Files generic to SH architecture
  /x86			    Files generic to x86 architecture
  /xtensa		    Files generic to Xtensa architecture
/api			    Machine/arch independent API for external apps
/board			    Board dependent files
/cmd			    U-Boot commands functions
/common			    Misc architecture independent functions
/configs		    Board default configuration files
/disk			    Code for disk drive partition handling
/doc			    Documentation (don't expect too much)
/drivers		    Commonly used device drivers
/dts			    Contains Makefile for building internal U-Boot fdt.
/env			    Environment files
/examples		    Example code for standalone applications, etc.
/fs			        Filesystem code (cramfs, ext2, jffs2, etc.)
/include		    Header Files
/lib			    Library routines generic to all architectures
/Licenses		    Various license files
/net			    Networking code
/post			    Power On Self Test
/scripts		    Various build scripts and Makefiles
/test			    Various unit test files
/tools			    Tools to build S-Record or U-Boot images, etc.

/arch			    架构专用文件 支持的CPU都放在这里
  /arc			    通用于ARC架构的文件
  /arm			    ARM 架构的通用文件
  /m68k			    通用于m68k架构的文件
  /microblaze		    通用于microblaze架构的文件
  /mips			    通用于MIPS架构的文件
  /nds32		    NDS32架构的通用文件
  /nios2		    Altera NIOS2架构的通用文件
  /powerpc		    通用于PowerPC架构的文件
  /riscv		    通用于RISC-V架构的文件
  /sandbox		    通用于独立于HW的 "沙箱 "的文件。
  /sh			    通用于SH架构的文件
  /x86			    通用于x86架构的文件
  /xtensa		    Xtensa架构的通用文件
/api			    独立于机器/架构的外部应用程序的API
/board			    单板 一般是CPU厂商的demo版样机用的一些外设
/cmd			    U-Boot命令功能
/common			    独立于架构的其他功能  比如一些命令pri tftp等
/configs		    板卡默认配置文件
/disk			    磁盘驱动器分区处理代码
/doc			    文件(不要期望太高)
/drivers		    常用的设备驱动程序
/dts			    包含用于构建内部 U-Boot fdt 的 Makefile。
/env			    环境文件
/examples		    独立应用程序等的示例代码
/fs			    文件系统代码(cramfs, ext2, jffs2等)
/include		    头文件
/lib			    适用于所有架构的库例程
/Licenses		    各种许可证文件
/net			    网络代码 放置一些网络协议
/post			    开机自检
/scripts		    各种构建脚本和Makefile
/test			    各种单元测试文件
/tools			    建立S-Record或U-Boot图像的工具等。

平台相关
arch, board, include…
平台无关
common, net, fs, drivers…
工具和文档
tools, doc

编译u-boot

整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
U-BOOT编译生成的映像文件有下列几种:

u-boot.map    U-boot映像的符号表(方便源码跟踪)
u-boot        U-Boot映像的ELF格式
u-boot.bin    U-Boot映像原始的二进制格式(烧录用)
                注意exynos4412需加入BL1 BL2
u-boot.srec   U-Boot映像的S-Record格式

U-boot镜像下载烧录

烧录编译产生的镜像 u-boot.bin
初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
专用的烧录工具如h-jtag或DNW等
在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录
其它方式 如SD卡 , Fastboot命令
镜像固化位置
ROM、NOR FLASH、NAND FLASH EMMC等