uboot学习笔记

Boot概念

  • 启动引导,自举程序

 uboot学习笔记_第1张图片

由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同

uboot是对CPU架构和OS类型支持得比较多的一种开源引导程序

  • s5p6818启动流程

芯片最实是从iROM启动,叫BL0
iROM选择启动的下一阶段引导程序BL1

  • 单阶段启动:如果BL1可以完成内核加载,这就是单阶段启动
  • 多阶段启动:启动加载内核的工作由BL2之后的程序完成,这就是多阶段启动

为什么BL1不直接加载到DDR
SRAM比DDR更快
DDR需要初始化,而SRAM不需要

  • BL1启动Bootloader第二阶段BL2
  • BL2启动内核
  • 内核加载根文件系统

uboot学习笔记_第2张图片

 引导传参
所传数据结构必须约定一至
引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100
数据格式约定一至
比如用户传给内核的参数:

uboot介绍

        uboot分为很多种:

uboot学习笔记_第3张图片

Bootloader Monitor 描述 X86 ARM
LILO Linux磁盘引导程序
GRUB GNU的LILO替代程序
ntldr x86上引导windowsNT系列
armboot 专门为arm架构设计的boot
ppcboot 引导ppc架构操作系统
vivi 韩国Mizi公司针对三星ARM架构CPU设计 引导程序
redboot 基于eCos的引导程序  是
u-boot 通用引导程序,支持多种CPU架构、多种 操作系统

uboot目录结构

uboot学习笔记_第4张图片

  • arch:体系结构相关,按架构进行分类,如当前架构arch\arm\cpu\slsiap,第一阶段启动代码start.S就在这里,官方源码会包含多种架构和cpu,我们裁剪掉了(整个uboot的C语言起始函数boardinitr也在arch\arm\lib\board.c中)
  • board:开发板相关,根据厂商进行分类,本平台裁剪成board\s5p6818\x6818,有的版本会包含初级初始化内容:lowlevelinit.S
  • common:各种命令的实现,通常一个命令就是一个C文件
  • include:各种头文件和开发板配置文件,如:uboot-v2016.01-s5p6818-ad46cf5-20210307\include\configs\s5p6818_nanopi3.h
  • api:用于演示测试用的代码,通常不参与工程编译
  • disk:硬盘接口程序,disk驱动分区处理代码,嵌入式不常用
  • doc:开发使用文档,主要介绍不同平台的配置编译方法
  • drivers:设备驱动,如:网卡、SD卡、USB等
  • examples:一些独立运行的实例,通常不参与工程编译
  • fs:所能支持的文件系统,如fat、ubifs等,用于访问带文件系统的存储设备
  • lib:用于存放库和其他主要支持文件程序,中断处理、启动相关等
  • net:独立于网卡驱动的网络协议,如用于下载传输的TFTP协议,网络文件系统中的NFS协议等
  • tools:工具软件,如mkimage用于制作内核镜像,scripts用于生成指定的config.mk配置文件,还有支持GDB的调试工具等
  • post:上电自检程序,与旧的PPC相关,当前平台下未被编译到工程
  • prototype:参与6818开发的三星协作厂商的一些code在这里
  • scripts用于生成指定的config.mk配置文件,以及一些检查工具

友善之臂uboot编译:

git clone https://github.com/friendlyarm/u-boot.git 
cd u-boot
git checkout nanopi2-v2016.01
make s5p6818_nanopi3_config
make CROSS_COMPILE=aarch64-linux-   // make CROSS_COMPILE=aarch64-linux-   V=1(打印编译显示)

编译中的问题解决:

  • Linux.4.4.y u-boot编译遇到问题:

1.openssl/ssl.h这里是库文件缺失,执行命令

$ sudo apt-get install libssl-dev

2./bin/sh: 1:dtc:not found 缺dtc工具,执行命令

$ sudo apt-get install device-tree-compiler

3.dtc: invalidoption – ‘i’ 这里是dtc工具有问题,执行以下命令

$sudo wget -c

https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh

$ sudo chmod 777 dtc.sh

$ ./dtc.sh

编译成功截图:

uboot学习笔记_第5张图片

配置编译原理分析:

用户执行make s5p6818_nanopi3_config,其实是调用了一个conf bin文件去配置:

 make -f ./scripts/Makefile.build obj=scripts/kconfig s5p6818_nanopi3_config

        scripts/kconfig/Makefile

                scripts/kconfig/conf  --defconfig=arch/../configs/s5p6818_nanopi3_defconfig Kconfig

把配置写入了configs/s5p6818_nanopi3_defconfig ?

会生成include/config.h 文件

/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/s5p6818/nanopi3
#include 
#include 
#include 
#include 
#include 

uboot学习笔记_第6张图片

 configs/s5p6818_nanopi3.h中裁剪配置宏均以CONFIG_开头

        这个会被解析到 include/autoconf.mk文件中

        include/autoconf.mk最后又会被Makefile包含决定哪些需要编译

 uboot镜像产生:

链接脚本:arch/arm/cpu/armv8/u-boot.lds

make CROSS_COMPILE=aarch64-linux-  V=1 可以看到链接过程

uboot学习笔记_第7张图片

aarch64-linux-ld.bfd   -pie  --gc-sections -Bstatic -Ttext 0x43C00000 -o u-boot -T u-boot.lds arch/arm/cpu/armv8/start.o .........

  •  如果链接脚本和命令行都指定了一个段的链接地址,命令行优先
  • 裁剪镜像去格式处理:

        aarch64-linux-objcopy --gap-fill=0xff  -j .text -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .dtb.init.rodata -O binary  u-boot u-boot.bin

  • 镜像打包

tools/fip_create/fip_create --dump --bl33 u-boot.bin fip-nonsecure.bin

  •  fip-nonsecure.img 组成

tools/nexell/SECURE_BINGEN -c S5P6818 -t 3rdboot -l 0x7df00000 -e 0x00000000 -n tools/nexell/nsih/nanopi3.txt -i fip-nonsecure.bin -o fip-nonsecure.img

uboot 命令添加:

在common/文件夹下建立cmd_helloworld.c
还可以在include/configs/s5p6818_nanopi3.h 中增加一项宏定义:
  #define CONFIG_CMD_HELLOWORLD 1
包含必备头文件
  #include < common . h >
#include < command . h >
调用命令定义宏:
U_BOOT_CMD (
  hello , 3 , 0 , helloworld ,
  "hello command" ,
  "[ off ] [ baud ]\n" 5 " ‐ xxxxxxxxx"
  " yyyyyyyyyyyyy"
  );
完成命令回调函数  
static int helloworld(cmd_tbl_t *cmdtp, int flag, int argc,char * const a
rgv[])
{
     int i;
     for(i=0;i

在common/Makefile中增加一项
          obj y += cmd_helloworld . o
编译:make CROSS_COMPILE=aarch64-linux-

你可能感兴趣的:(UBOOT,个人笔记,学习)