你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP1嵌入式Linux驱动开发指南V1.7——U-boot使用

[复制链接]
STMCU小助手 发布时间:2022-9-24 18:05
U-boot使用* r' r1 U. x, G1 O
在移植U-Boot之前,我们肯定要先使用一下U-Boot,得先体验一下U-Boot是个什么东西。STM32MP157开发板光盘资料里面已经提供了一个正点原子团队已经移植好的U-Boot,本章我们就直接编译这个移植好的U-Boot,然后烧写到EMMC里面启动,启动U-Boot以后就可以学习使用U-Boot的命令。. K" A1 k7 L, h5 h# F  w8 i7 i# H

0 ~1 Y: k1 `& z' U; E- o  e10.1 U-Boot简介! G/ M; ^+ g4 h% ~4 c  L
Linux 系统要启动需要通过bootloader 程序引导,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,EMMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核,bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样,bootloader 就相当于 BIOS。所以我们要先搞定bootloader,很庆幸,有很多现成的 bootloader 软件可以使用,比如 U-Boot、vivi、RedBoot 等等,其中以 U-Boot 使用最为广泛,为了方便书写,本书会将 U-Boot 写为 uboot。
$ t. u+ H: a7 G& w8 `uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。如图10.1.1所示:
, @/ X. O! F  R3 r0 {/ a0 `9 j8 ?! H4 q
ca922911dc7945bfb1b454c1f4568fee.png
. S% G/ T0 l" o# I' J2 G' u- i. _1 [7 ~) ~; [+ y% {, {8 F! Z
图10.1.1 uboot官网+ S# S; N. }  L
我们可以在 uboot 官网下载 uboot 源码,点击图10.1.1中左侧 Topics 中的“Source Code”,打开以后如图10.1.2所示:
$ Y; ]( A( n" \+ R4 U& }8 q$ y4 u9 d
7c9d18c8f8874b989d2af0ede2c1d006.png 5 J; i2 `3 M5 [& B# s
0 C5 _5 ?2 u4 C" @# Z
图10.1.2 uboot源码界面
% q  i  K9 K9 w点击图10.1.2中的“FTP”,进入其 FTP 服务器即可看到 uboot 源码,如图10.1.3所示:
6 \' {5 E: c# }) o
/ f5 c/ ~$ A3 S* M! M1 K/ H3 m- | ef7659ec2d2d46f6969fed58a97d9e0e.png . k9 I( M& H% R# G& t

% G! u& {2 V( c5 h" |+ `图10.1.3 uboot源码9 d7 x+ [6 O$ U7 c1 O: t
图10.1.3中就是 uboot 原汁原味的源码文件,目前最新的版本是 2020.10。但是我们一般不会直接用 uboot 官方的 U-Boot 源码的。uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。ST提供了2020.01版本的uboot,在6.1.1小节获取ST官方系统源码中我们已经得到了ST官方uboot源码, 进入到如下目录:8 P5 `) }8 p/ \/ X: e, _2 u
/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/ i  c$ e  E, D
uboot源码如图10.1.4所示:
& \4 d9 L: J( f1 z
2 c" M  r0 j3 k8 R 96b8ee207252410ca3bfa9e9b839cac3.png 5 [8 ]+ X5 h3 h+ V% _! C# @
" x( m# y9 X! `/ f
图10.1.4 ST官方uboot源码
( G9 {, h1 {; B( D: A图10.1.4中的“u-boot-stm32mp-2020.01-r0”就是ST官方uboot源码包,它支持了STM32MP1家族全系列芯片(后续ST也会一直更新,添加新的SOC进去),而且支持各种启动方式,比如EMMC、NAND 等等,这些都是 uboot 官方所不支持的。但是图10.1.4中的 uboot 是针对ST 自家评估板的,如果要在我们自己的板子上跑,那么就需要对其进行修改,使其支持我们自己做的板子,正点原子的 STM32MP157开发板就是自己做的板子,虽然大部分都参考了 ST 官方的STM32MP157 EVK开发板,但是还是有很多不同的地方,所以需要修改 ST 官方的 uboot,使其适配正点原子的 STM32MP157开发板。所以当我们拿到开发板以后,是有三种uboot 的,这三种 uboot的区别如表10.1.1所示:
8 _5 x! f/ L: Y9 g4 d( n种类 描述
& v2 L5 m2 B" ]0 B% y# ^/ e3 H% }uboot官方的uboot代码 由uboot官方维护开发的uboot版本,版本更新快,基本包含所有常用的芯片。
- j) X1 U) Z( Y; r半导体厂商的uboot代码 半导体厂商维护的一个uboot,专门针对自家的芯片,在对自家芯片支持上要比uboot官方的好。: {- J* ?8 L5 e( `6 g
开发板厂商的uboot代码 开发板厂商在半导体厂商提供的uboot基础上加入了对自家开发板的支持。& E/ z5 o4 ^) n( }: g6 j/ C* P6 U4 Z
表10.1.1 三种uboot的区别( q0 t: t" E8 @2 J/ X2 X
那么这三种uboot该如何选择呢?首先uboot官方的基本是不会用的,因为支持太弱了。最常用的就是半导体厂商或者开发板厂商的 uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的 uboot,如果你是购买的第三方开发板,比如正点原子的 STM32MP157开发板,那么就使用正点原子提供的 uboot 源码(也是在半导体厂商的 uboot 上修改的)。当然了,你也可以在购买了第三方开发板以后使用半导体厂商提供的 uboot,只不过有些外设驱动可能不支持,需要自己移植,这个就是我们常说的 uboot 移植。本节是 uboot 的使用,所以就直接使用正点原子已经移植好的 uboot,这个已经放到了开发板光盘中了,路径为:开发板光盘1、程序源码1、正点原子Linux出厂系统源码u-boot-stm32mp-2020.01-gdb8d2374-v1.0.tar.bz2。3 |- M( y' ?4 R: a* L+ c" k
10.2 U-Boot初次编译0 M2 |5 E! Q- {( z- Z9 N1 J
10.2.1 编译
4 R' t( E  v: X2 q首先需要在 Ubuntu 中安装一些库,否则编译uboot会报错,安装命令如下:# r4 c5 @/ b, M" Q9 C
sudo apt-get install libncurses5-dev bison flex
+ ~' q3 }6 i& K在 Ubuntu 中创建存放 uboot 的目录,比如我这里新建了一个名为“alientek_uboot”的文件夹用于存放正点原子提供的 uboot 源码。alientek_uboot文件夹创建成功以后使用 FileZilla 软件将正点原子提供的 uboot 源码拷贝到此目录中,正点原子提供的 uboot 源码已经放到了开发板光盘中,路径为:开发板光盘1、程序源码1、正点原子Linux出厂系统源码u-boot-stm32mp-2020.01-xxxxxxxx-v1.0.tar.bz2(“xxxxxxxxx”为uboot打包时候的版本号,每次打包其版本号都不同!所以大家不要纠结于开发板光盘中的uboot源码打包版本号是否和教程里面的一致)。将stm32mp-2020.01-xxxxxxxx-v1.0.tar.bz2拷贝到前面新建的 alientek_uboot 文件夹下,完成以后如图10.2.1.1所示:
7 A. r+ K0 H! ^0 x$ x
2 M- d! S/ l4 p 38f50f4ac2834a489de9c81c1af91a5e.png - R. T5 X/ @& `9 K8 ]4 Y% ?
; r  z5 c0 R9 m' @" ?7 Q" r9 M& O: X
图10.2.1.1 正点原子出厂uboot源码. S. P! {5 a; L3 A) Q  s8 f
使用如下命令对其进行解压缩:& z  O( q1 X# w* f& \8 N- n, M
tar -vxf u-boot-stm32mp-2020.01-gdb8d2374-v1.0.tar.bz2
7 C, l. l7 r+ y+ {解压完成以后如图10.2.1.2所示:
# ^6 k- H7 ^9 G4 g' D6 J/ P9 X8 {
" ?; R0 x- K3 m, m, F$ r. ~ 766c24f268ef4c3dbbf6750186619c9b.png 8 R& y- X! d2 E% w* H8 _% a

; |1 I* U: D" l% A7 y0 d1 Z# e% n图10.2.1.2 解压后的Uboot5 N6 \( o$ a: Y3 x: u' y
图10.2.1.2中除了u-boot-stm32mp-2020.01-gdb8d2374-v1.0.tar.bz2这个正点原子提供uboot源码压缩包以外,其他的文件和文件夹都是解压出来的 uboot 源码。执行以下命令,编译正点原子提供的uboot。9 E/ `. j. B5 j& a9 v, B4 ^

8 t" P- F6 [/ k' U$ p* _7 q
  1. make distclean- ]4 I: j; n+ z" n
  2. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp157d_atk_defconfig, l7 Z& N- r3 g  E5 k, P1 v
  3. make V=1 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- DEVICE_TREE=stm32mp157d-atk all
复制代码

. B5 C, X6 J' Q, `8 ^/ D3 f; G! [上面命令每次编译的时候都要指定ARCH、CROSS_COMPILE和DEVICE_TREE,这三个含义如下:
$ b0 B0 E5 j5 kARCH:指定所使用的平台架构,这里肯定是arm。, F3 f! V) Z; d7 s$ K* F
CROSS_COMPILE:所使用的交叉编译器前缀,本教程使用的是交叉编译器前缀为arm-none-linux-gnueabihf-。
, B; f# L6 A% S1 vDEVICE_TREE:设备树文件,uboot也支持设备树,所以在编译的时候需要指定设备树文件,不同的硬件其设备树文件肯定不同,这里为stm32mp157d_atk,也就是正点原子的STM32MP157开发板对应的设备树。3 d# G: P( n& X- d
编译的时候每次都输入ARCH和CROSS_COMPILE比较麻烦,为了方便起见,我们可以直接修改uboot的Makefile文件,在里面直接对ARCH和CROSS_COMPILE进行赋值,也就是直接将ARCH设置为arm,CROSS_COMPILE设置为arm-none-linux-gnueabihf-,修改完成以后如图10.2.1.3所示:
7 X$ _8 u* L! f* l8 V
+ a- u" v  q8 j" B1 ^$ S) J. j2 p 3c9faa983bff4f1d8a903dd40d427f2c.png
& o3 J+ p' f% c
$ ^; X. [0 D& v9 I+ @图10.2.1.3 设置ARCH和CROSS_COMPILE值
2 O+ d( ]4 ^" @5 j7 O' [2 W0 ^注意!不能在Makefile里面对DEVICE_TREE进行复制,因为没用,必须在编译的时候手动输入!( R) Z, G2 X2 ^3 H3 k" @
设置好Makefile里面的ARCH和CROSS_COMPILE以后就可以将编译命令简化为如下所示:) o) s$ j: {: S) N, E! w: C- t  u
; y+ F: C! S0 x7 e! u; B; }1 Z' Q
  1. make distclean                                                                                //清除
    ) |' G) N. `* M2 w- e- W2 n
  2. make stm32mp157d_atk_defconfig                                        //配置uboot
    ' B2 n* _  w/ M5 l" J0 Y
  3. make V=1 DEVICE_TREE=stm32mp157d-atk all                //编译
复制代码
- w! ?) p/ T) C# X, O& E+ T/ X2 r
上述命令和前面的相比就要简洁很多,最后的“make V=1”是真正的编译命令,V=1表示编译uboot的时候输出详细的编译过程,方便我们观察uboot编译过程。直接输入“make”命令的话默认使用单线程编译,编译速度会比较慢,可以通过添加“-j”选项来使用多线程编译,比如使用8线程编译,最后的编译命令就是:7 f- d+ y4 O0 Y" W3 G7 O
make V=1 DEVICE_TREE=stm32mp157d-atk all -j8 //8线程编译
4 A/ T, K1 }# `0 ^uboot编译完成如图10.2.1.4所示:! |' V7 X# |) i3 x1 x

4 v7 [! B3 U  ?8 ~* T% n: l2 }* Y ae6ca5deafc24523977347c1173b388a.png
, F! ]5 {7 d6 N% a- T5 ]% Y
( s$ @) S8 n7 N$ u5 v) F图10.2.1.4 uboot编译成功1 D0 R; d0 U. h( ^! ?' B
编译完成以后的 就会在uboot源码目录下生成相应的镜像文件,如图10.2.1.5所示:
/ N6 W5 H: p9 h8 w
, z0 Y# b, R1 ?2 @8 \ 96d5cc79b894403d8d5a9ce1bd1f7f79.png
% q  e. v4 m2 C" k9 [& G. d1 F( |0 T) S
图10.2.1.5 编译后生成的uboot可执行文件' X* h0 l, K* g: `3 q& k
可以看出,编译完成以后 uboot 源码多了一些文件,重点是u-boot.bin和u-boot.stm32这两个文件。u-boot.bin是uboot的二进制可执行文件,u-boot.stm32是在u-boot.bin前面添加了256个字节头部信息。STM32MP1内部ROM代码和TF-A在运行uboot的时候要求前面添加头部信息,所以这就是为什么uboot也有这个头部信息的原因。
; s' c& ?# R; \10.2.2 烧写
7 P. t: K# [6 m2 K! E3 r+ }; s使用STM32CubeProgrammer将上面编译出来的u-boot.stm32镜像烧写到开发板的EMMC里面,修改前面创建的tf-a.tsv文件,添加uboot烧写指令(其实在9.3.2小节已经讲过了),在最后面添加下面这行:( T3 v* G( l: Z: F; C; j/ S. _" _
示例代码10.2.2.1 uboot烧写指令2 s, F# P) L4 ^4 H% k' Q9 P+ P) \2 N
P 0x06 ssbl Binary mmc1 0x00080000 u-boot.stm324 `* _- T1 T9 R: B
修改以后的tf-a.tsv如图10.2.2.1所示:/ o1 ?6 c6 @9 y& N

1 b4 y$ t: {- ?4 ~4 \, y% l' R/ ^ c192d709c99249eb9d8d16e367cd3efa.png
* `% @) l. z. t
, |+ j) X2 w1 g& w) ]图10.2.2.1 修改后的tf-a.tsv
. e# a$ Q, L/ o最后将上一小节编译出来的u-boot.stm32,拷贝到前面创建的images目录下(在做TF-A实验的就有u-boot.stm32这个文件,我们只要替换就行)。0 v6 \* H' y5 ^" |) \  M( {
一切准备就绪以后就可以使用STM32CubeProgrammer软件通过USB OTG将uboot烧写到开发板上的EMMC里面,等到烧写完成。完成以后设置开发板上的拨码开关,设置从EMMC启动,然后用USB Type-C线将开发板上的USB_TTL接口与电脑连接起来,因为我们要在串口终端里面输入命令来操作uboot。
. o7 R: h; e. U" p6 Q打开MobaXterm,设置好串口参数,最后复位开发板。在 MobaXterm 上出现“Hit any key tostop autoboot: ”倒计时的时候按下键盘上的回车键,默认是 1 秒倒计时,在 1 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核了(如果内核存在的话,如果Linux内核不存在那么就会进入到uboot的命令行模式)。如果在 1 秒倒计时结束之前按下回车键,那么就会进入 uboot 的命令行模式,如图10.2.2.2所示:- Z, A  i1 M" Q2 b3 B

0 ?8 k8 o, ?) o c9bceaa8160b4e8e84e94a435deb8fa9.png 5 C3 c6 I5 ?+ j  B; Z  ~
# n: s9 ?: J  ]* i! T
图10.2.2.2 uboot启动log信息
; g5 {4 `  [1 Q1 O% u. m8 u从图10.2.2.2可以看出,当进入到 uboot 的命令行模式以后,左侧会出现一个“STM32MP=>”标志。uboot 启动的时候会输出一些信息,这些信息如下所示:( ^, v- W% Y  e$ B0 W3 e
: W2 y2 I$ g9 F5 `, D4 X9 Q
  1. 示例代码10.2.2.2 uboot启动log信息
    ( A# q! v, N! J: R
  2. 1  U-Boot 2020.01-stm32mp-r1 (Nov 24 2020 - 17:17:20 +0800)* Y* y0 @5 ^' s% b
  3. 2  2 x9 G; {" e1 f0 X  Q( T) T# D
  4. 3  CPU: STM32MP157DAA Rev.Z
    ' ^+ A$ P" I: T- x# i! h
  5. 4  Model: STMicroelectronics STM32MP157D eval daughter  V  f! y% |% i# e+ P6 M
  6. 5  Board: stm32mp1 in trusted mode (st,stm32mp157d-atk)% s. K( P' q( B" V8 a( T
  7. 6  DRAM:  1 GiB" k3 P! r. A9 c* Y  s0 m
  8. 7  Clocks:
      \1 R: f( g; K5 F
  9. 8  - MPU : 800 MHz. Z- C/ k' H9 ~! s* [8 g% A
  10. 9  - MCU : 208.878 MHz! r! \, Z. o5 X
  11. 10 - AXI : 266.500 MHz9 g* P5 M& d; f( w. y3 x
  12. 11 - PER : 24 MHz
    ( i' c! t) x) @
  13. 12 - DDR : 533 MHz; [  D$ Z% D8 V$ \* d/ r
  14. 13 WDT:   Started with servicing (32s timeout)
    ) C: V& V6 ]8 v! {8 X9 q
  15. 14 NAND:  0 MiB
    . G$ c7 ?  @( P, E
  16. 15 MMC:   STM32 SD/MMC: 0, STM32 SD/MMC: 16 d& l2 g. D1 A' c1 z
  17. 16 Loading Environment from MMC... OK
    : n+ J! }& A% a+ b* S
  18. 17 In:    serial
    ; E/ _& [! h8 J& a4 P9 w
  19. 18 Out:   serial
    ) |, d2 f$ F7 g2 ~
  20. 19 Err:   serial
    ! o* L+ w3 s# F! D+ u0 b
  21. 20 invalid MAC address in OTP 00:00:00:00:00:009 g) o3 `: A6 ^$ V0 t* I" w; M: z
  22. 21 Net:
    0 T8 p0 d- Q; o* l0 d
  23. 22 Error: ethernet@5800a000 address not set.# E& f2 u7 {  u: p
  24. 23 No ethernet found.! @7 r% O& |) X+ x2 L/ \. |; s
  25. 24 3 @0 ^- q! q5 {7 s3 S2 Q. O
  26. 25 Hit any key to stop autoboot:  0
    . i% V7 ]& G! l
  27. 26 STM32MP> . }- d6 M* V# Q) F
复制代码

6 r2 O' P" ?& u* T0 Y: n: m- z简单讲解一下uboot启动过程的log信息:& F( J, x7 M7 d& t2 l1 R& l- Z
第 1 行是 uboot 版本号和编译时间,可以看出,当前的 uboot 版本号是 2020.01,编译时间是 2020 年 11月 24 日 17: 17。
$ g, c( u: P5 }; ?第3行是CPU的信息,可以看出CPU型号为STM32MP157DAA。+ C3 F9 N& [* v: E: O3 B7 k+ I) B
第4行是板子信息,当前板子是ST公司的STM32MP157D eval开发板,这个信息是可以改的,因为正点原子是直接参考ST公司的EVK开发板移植的uboot,所以这部分信息也就没改。  I& T. O& P/ `& n
第5行是板子的一些信息,比如工作在trusted模式下。
* i4 v0 b. c. \, e. Q" L8 B第6行是DDR的大小为1GB。
' r* v# [5 Y9 L8 K" o第7~12行它们的频率分别为,MPU频率、MCU频率、A**线频率、PER的频率、DDR频率。0 p2 E" w$ T& d) |8 b
第13行是看门狗信息,喂狗时间为32s。- O% T  U- c4 n- n7 a* Z) L
第14行是NAND的大小,因为正点原子的STM32MP157开发板没有NAND,所以这里就是0MB。
* `; a! |6 R( x3 ]8 {第15行是板子上MMC设备,一共有两个,SD/MMC0 (SD卡)和SD/MMC1 (EMMC)。
" v; H7 g  O! U# L, Q8 E, q第16行是从MMC里获取环境变量。
8 d- T1 a6 c: t# I$ I第17~19行是标准输入、标准输出和标准错误所使用的终端,这里都使用串口(serial)作为终端。
' v4 j" X3 o  S: |/ F4 V, a: x/ f第20~23行是网络相关信息,网络的MAC地址从OTP里获取,因为我们的OTP没有设置MAC地址,所以就获取失败。这里的网络是可以用的,只是因为没有MAC地址所以提示没有找到网络,可以自行添加相关环境变量来设置MAC地址,后面会讲如何设置。
, Z8 R' A) F7 i! a; v* s4 A第 25 行是倒计时提示,默认倒计时 1 秒,倒计时结束之前按下回车键就会进入 Linux 命令行模式。如果在倒计时结束以后没有按下回车键,那么 Linux 内核就会启动,Linux 内核一旦启动,uboot 就会寿终正寝。
: k+ m' Y2 ?2 z8 C, q/ duboot的主要作用是引导kernel,我们现在已经进入 uboot 的命令行模式了,进入命令行模式以后就可以给 uboot 发号施令了。当然了,不能随便发号施令,得看看 uboot 支持哪些命令,然后使用这些uboot 所支持的命令来做一些工作,下一节就讲解 uboot 命令的使用。
+ J; H# E; L0 @- `+ R( B
% r* _. o$ U$ K+ R" t& M10.3 U-Boot命令使用
- H& V3 J6 N( D  b* C; U- i, g! F进入uboot的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前uboot所支持的命令,如图10.3.1所示:
# S* G, c' K% y& Q" y% l: h7 K0 N( ^9 s" d
2ba60dee3795408dbd9ca0b94bfeb8c7.png 6 |2 l, j% u; r0 Z0 e( f
  C4 i) a; ~( K
图10.3.1 uboot的命令列表(部分)2 C0 f$ f5 |# @4 i
图10.3.1中只是 uboot 的一部分命令,具体的命令列表以实际为准。图10.3.1中的命令并不是 uboot 所支持的所有命令,说过 uboot 是可配置的,需要什么命令就使能什么命令。所以图10.3.1中的命令是正点原子提供的 uboot 中使能的命令,uboot 支持的命令还有很多,而且也可以在 uboot 中自定义命令。这些命令后面都跟有命令说明,用于描述此命令的作用,但是命令具体怎么用呢?我们输入“help(或?) 命令名”既可以查看命令的详细用法,以“bootz”这个命令为例,我们输入如下命令即可查看“bootz”这个命令的用法:/ N! h$ O4 m! r: c* [
? bootz 或 help bootz
& B* [% w& T: J1 c结果如图10.3.2所示:, y( _* Q- g7 i0 D  j

% |. F; l2 C  g( I# Z  o 42e2ea6bb46a4a36b65b74c421aa2661.png
% x1 f: w! R/ z4 S' J  L* G7 K
1 V8 S8 N8 A3 F2 \7 T. D图10.3.2 bootz 命令使用说明  `5 N: \; }: S
图10.3.2列出了“bootz”这个命令的详细说明,其它的命令也可以使用此方法查询具体的使用方法。接下来我们学习一下一些常用的 uboot 命令。: M$ o' A6 Z5 n  B2 b# _
10.3.1 查询命令
! L" k% d: R$ W! l' C常用的和信息查询有关的命令有 3 个:bdinfo、printenv 和 version。先来看一下 bdinfo 命令,此命令用于查看板子信息,直接输入“bdinfo”即可,结果如图10.3.1.1示:8 `/ x" X; U7 g& F( x

8 l/ ~& T6 D7 ]. i; H c082881066634c67a8ef93610c5b10c9.png
( u* b9 [" W/ ~3 r% z4 y
+ ?& ]& j8 G4 P: p8 v图10.3.1.1 bdinfo 命令- z5 L$ J: B, [
从图10.3.1.1中可以看出 DRAM 的起始地址和大小、BOOT参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。命令“printenv”用于输出环境变量信息,uboot 也支持 TAB 键自动补全功能,输入“print”然后按下 TAB 键就会自动补全命令。直接输入“print”也可以,因为整个uboot命令中只有printenv的前缀是“print”,所以当输入print以后就只有printenv命令了。输入“print”,然后按下回车键,环境变量如图10.3.1.2所示:
! A6 k. o1 z) h
8 u. w- o9 w" G! L5 E7 m ee18bdb0067c430caed1f49ab2c13536.png
% q1 S; O7 L2 y$ x4 b' h# R" o4 S2 {% K3 K6 c6 ?0 v
图10.3.1.2 printenv 命令部分结果
) l1 t2 Z8 x! V. }图10.3.1.2只是printenv命令的部分内容,STM32MP1系列的环境变量有很多,比如 baudrate、board、board_name、boot_device、bootcmd、bootdelay等等。uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=1,也就默认延时 1秒。前面说的 1 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了。uboot 中的环境变量是可以修改的,有专门的命令来修改环境变量的值,稍后我们会讲解。
1 \) w3 {5 }3 ~* z9 C命令 version 用于查看 uboot 的版本号,输入“version”,uboot 版本号如图10.3.1.3所示:  a- h: y4 E  ~' U9 Y

  g6 _$ {: f) K# Z# @* R# g 2a5234d8806d434ab2381a84ee068f20.png
6 R6 g( _* c( D9 @! Q5 g( I- G$ U8 t3 w  J  |
图10.3.1.3 version命令结果- |; K( w$ y* A: H# g/ q3 x
————————————————* x# j# ?1 G) C6 y( }& _3 Z$ {) A
版权声明:正点原子' W1 T. M1 ?- F- i& _$ e
  w) `* Y' B6 ~+ j$ K1 ?

, j. b+ s. C2 d) P& Z
赞 收藏 评论0 发布时间:2022-9-24 18:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版