嵌入式Linux学习笔记(七)U-boot 使用

stm32 同时被 2 个专栏收录
40 篇文章 0 订阅
7 篇文章 0 订阅

一、U-boot 使用

  • ROM代码->FSBL(TF-A)->SSBL(uboot)->Linux。
  • Linux 系统要启动需要通过 bootloader 程序引导,芯片上电以后这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内核从 flash(NAND,NOR FLASH,SD,EMMC 等)拷贝到 DDR 中,最后启动 Linux 内核。

1、U-Boot 编译

  • 使用正点原子uboot源码。
  • 安装编译需要的库文件。
sudo apt-get install libncurses5-dev bison flex

在这里插入图片描述

  • 解压uboot包。
tar -vxf u-boot-stm32mp-2020.01-g3648da45-v1.3.tar.bz2

在这里插入图片描述
在这里插入图片描述

  • 编译boot。
make distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp157d_atk_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- DEVICE_TREE=stm32mp157d-atk all
上面命令每次编译的时候都要指定 ARCH、CROSS_COMPILE 和 DEVICE_TREE,这三个含义如下:

ARCH:指定所使用的平台架构arm。
CROSS_COMPILE:交叉编译器前缀为 arm-none-linux-gnueabihf-。
DEVICE_TREE:设备树文件。

在这里插入图片描述

  • 编译的时候每次都输入 ARCH 和 CROSS_COMPILE 比较麻烦,为了方便直接修改 uboot 的 Makefile 文件,对 ARCH 和 CROSS_COMPILE 进行赋值。不能在 Makefile 里面对 DEVICE_TREE 进行赋值。
    在这里插入图片描述
  • 修改完毕,可将指令简化:
make distclean //清除
make stm32mp157d_atk_defconfig //配置 uboot
make V=1 DEVICE_TREE=stm32mp157d-atk all //编译,V=1 表示显示编译过程
  • 编译完毕,生成文件u-boot.bin 和 u-boot.stm32。
  • u-boot.stm32 是在 u-boot.bin 前面添加了256 个字节头部信息(STM32MP1 内部 ROM 代码和 TF-A 在运行 uboot 的时候要求前面添加头部信息)。
    在这里插入图片描述

2、烧写U-Boot

  • 使用 STM32CubeProgrammer将u-boot.stm32 镜像烧写到开发板的 EMMC。
  • 修改前面创建的 tf-a.tsv 文件,在最后添加 uboot 烧写指令。
P 0x06 ssbl Binary mmc1 0x00080000 u-boot.stm32

在这里插入图片描述
在这里插入图片描述

  • 使用 STM32CubeProgrammer 软件通过 USB OTG 将 uboot 烧写到开发板上的 EMMC 里面,拨码开关,设置从 EMMC启动。
  • 打开 MobaXterm,出现“Hit any key tostop autoboot: ”,如果在 1 秒倒计时结束之前按下回车键,那么就会进入 uboot 的命令行模式。

3、U-Boot 测试

  • 对uboot进行整体测试,启动一下linux内核,因此直接一下子下载这些文件:
  • (1)FSBL:TF-A文件;
  • (2)SSBL:uboot文件;
  • (3)Linux:uImage和.dtb 打包的文件。
    在这里插入图片描述
    拨码开关:000,设置USB启动,然后刷新,连接USB1口下载。
    在这里插入图片描述
  • 下载完毕后拨动拨码开关从EMMC启动。
    在这里插入图片描述

4、U-Boot 环境变量bootcmd 和 bootargs

(1) bootcmd 环境变量

  • bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或 者 NAND Flash 中的Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。

  • 可以在 uboot 启动以后进入命令行设置 bootcmd 环境变量的值。如果 EMMC 或者 NAND 中没有保存 bootcmd 的值,那么 uboot 就会使用默认的值,板子第一次运行 uboot 的时候都会使用默认值来设置 bootcmd 环境变量。

  • 从 EMMC 启动系统

setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157datk.dtb;bootm c2000000 - c4000000' 
saveenv
boot
  • 使用 tftp 命令从网络启动 Linux
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000' 
saveenv
boot

(2) bootargs 环境变量

  • bootargs 保存着 uboot 传递给 Linux 内核的参数,比如指定 Linux 内核所使用的 console、指定根文件系统所在的分区等。
console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw

(3)配置变量

  • include/env_default.h文件中指定了很多环境变量的默认值,比如 bootcmd 的默认值就是 CONFIG_BOOTCOMMAND,bootargs 的默认值就是 CONFIG_BOOTARGS。可以直接在 stm32mp1.h 文件中通过设置宏CONFIG_BOOTCOMMAND 来设置 bootcmd 的默认值。

二、U-boot 命令使用

  • 常用命令:

1、ping 命令

ping 192.168.1.249

2、dhcp 命令

  • dhcp 用于从路由器获取 IP 地址,前提是开发板得连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。
dhcp

三、U-boot 移植

  • uboot都是借鉴开发板厂商的源码,根据自己设计的硬件稍作修改,后期做项目肯定是参照前辈的经验,因此做uboot移植,在正点原子开发板的uboot源码基础上稍作修改即可,正点原子的uboot已经依据ST官方uboot源码修改。

四、U-boot 图形化配置

  • uboot 可以通过 stm32mp15_trusted_defconfig 来配置,或者通过文件stm32mp1.h 来配置 uboot。比如配置上面的环境变量bootcmd。另外一种配置 uboot 的方法,就是图形化配置。

  • 在使用图形化配置之前需要安装一些支持库。

sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
  • 进入 uboot 根目录,输入如下命令:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp15_atk_trusted_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig

如果已经在 uboot 的顶层 Makefile 中定义了 ARCH 和 CROSS_COMPILE 的值,那么上述
命令可以简化为:

make stm32mp15_atk_trusted_defconfig
make menuconfig

在这里插入图片描述


  • 参照【正点原子】文档学习。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值