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

STM32MP157 Linux系统移植开发篇4: BootLoader(Uboot)移植

[复制链接]
STMCU小助手 发布时间:2022-10-1 18:37
实验原理5 I; O: l' x- U9 s- X* f- r
概念
7 V* S, O0 O" ~6 x
简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。+ e  ^$ _5 x* j: Q% m/ ^7 X
  X0 J+ t7 h' U% D1 l4 f
通常,Bootloader是严重地依赖于硬件实现的,特别是在嵌入式中。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出一些通用的概念来指导用户特定的Bootloader设计与实现。
: F# F' U& X" l0 z* R7 B9 W. a, K  y9 I/ i/ g
(1)Bootloader所支持的CPU和嵌入式开发板
; R# U$ d. M# I* g/ O: Z1 \) B  g4 ?2 P; a0 g! a) F
每种不同的CPU体系结构都有不同的Bootloader。有些Bootloader也支持多种体系结构的CPU,如后面要介绍的U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,Bootloader实际上也依赖于具体的嵌入式板级设备的配置。
- N' y& y3 P. ~: R
/ I; M% J9 y( w# f(2)Bootloader的安装媒介
( ]2 T, y4 S5 {8 w, z7 Z; Y* [9 U/ F5 d$ z. L$ d3 I* d/ P
系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。而基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(比如ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行Bootloader程序。
/ x$ I' h% W- D! `) [) x1 B4 ^- m) i6 [
(3)Bootloader的启动过程分为单阶段和多阶段两种。通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性。
6 D& ]0 S; R& t& [7 V6 N
3 K. ?; a& |  N) P( z. s(4)Bootloader的操作模式。大多数Bootloader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。7 Q' y% e" t1 M4 M/ `% K
. `6 _- H3 O! y% v/ z+ m
• 启动加载模式:这种模式也称为“自主”模式。也就是Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是嵌入式产品发布时的通用模式。
6 v/ ~+ o8 y9 j7 f% `; |6 ~  t. Z
: i: h8 B8 X( X8 W7 N+ e• 下载模式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。Bootloader的这种模系统是在更新时使用。工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。
0 W, t+ v! \+ U- d
. e) z, y% v( _7 Q(5)Bootloader与主机之间进行文件传输所用的通信设备及协议,最常见的情况就是,目标机上的Bootloader通过串口与主机之间进行文件传输,传输协议通常是xmodem/ ymodem/zmodem协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。$ w, _+ P* U. W; O

2 w' U4 v  ]. Y- ^" L8 q" b- |Bootloader启动流程
& F/ _% E8 Y  t  V; MBootloader的启动流程一般分为两个阶段:stage1和stage2,下面分别对这两个阶段进行讲解:
1 Z3 x+ j0 Q# D* d, W6 t7 [$ O! g) i( D( q" w
(1)Bootloader的stage1
7 G6 U* y+ @- |1 V" k6 o1 @( T
: z/ y, ?/ {  |. v% @在stage1中Bootloader主要完成以下工作。
$ w% J5 q8 p1 g4 [' Z4 w; `: W! v$ B4 }1 Y5 \- B
• 基本的硬件初始化,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化LED、关闭CPU内部指令和数据cache灯。
6 H" t) O  K6 I1 u
* i$ a# ^. ?5 n; s% I7 ^+ q" A% q• 为加载stage2准备RAM空间,通常为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载Bootloader的stage2准备好一段可用的RAM空间范围。
$ d7 c0 `' K7 L. ~+ J
  t0 ^9 I3 s& Z/ O( U# [• 拷贝stage2到RAM中,在这里要确定两点:①stage2的可执行映像在固态存储设备的存放起始地址和终止地址;②RAM空间的起始地址。
" i0 l3 s4 V$ B& M* G# n. y) y/ o/ }1 F: Q7 j
• 设置堆栈指针sp,这是为执行stage2的C语言代码做好准备。9 p- ?& o: v: r* P

& g; e6 H: ^3 u; h6 Y" @5 E(2)Bootloader的stage2
5 L' K5 f; N4 K& R& T
) R) U* B; E  P6 e- r在stage2中Bootloader主要完成以下工作。; [& ?4 a0 {5 D! Z: N

4 r0 |9 G5 Q6 E• 用汇编语言跳转到main入口函数
/ E5 A: I- g& i8 e  N. E1 L- Q& e. b, f# H. H& {# N
由于stage2的代码通常用C语言来实现,目的是实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接Bootloader这样的程序时,不能使用glibc库中的任何支持函数。
2 h. d0 g# ~- A/ E- X; U9 c9 C% ]+ Q$ I( }% N3 r
• 初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。在初始化这些设备之前、可以输出一些打印信息。
) L" e8 _$ I, E3 S+ H5 b# f% v6 D- S1 D; \5 v
• 检测系统的内存映射,所谓内存映射就是指在整个4GB物理地址空间中有指出哪些地址范围被分配用来寻址系统的RAM单元。
! d& J1 Q7 y/ n" O+ [' F
+ V: H+ u9 z( T8 P3 A& y0 T" I: Q% w• 加载内核映像和根文件系统映像,这里包括规划内存占用的布局和从Flash上拷贝数据。) [" E6 a4 g8 ?+ ]9 h" m

0 q0 _% {# j6 n$ X• 设置内核的启动参数。% t5 X5 i% W$ r3 r4 _
4 \' _, S1 R4 g; K2 k3 M3 t& o
Bootloader的种类
9 R: y" y# y, b# c' W' i! Y+ _嵌入式系统世界已经有各种各样的Bootloader,种类划分也有多种方式。除了按照处理器体系结构不同划分以外,还有功能复杂程度的不同。6 Q, O$ U8 {3 g: J* v2 F
0 m/ Q, D; Y6 |  G9 G
首先区分一下“Bootloader”和“Monitor”的概念。严格来说,“Bootloader”只是引导设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。“Monitor”在嵌入式系统开发过程中可以提供很好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以,习惯上大家把它们统称为Bootloader。
" c/ `3 }* m: B% f3 N1 X% e7 J
2 `  l3 v9 _3 n下表列出了Linux的开放源码引导程序及其支持的体系结构。表中给出了X86、ARM、PowerPC体系结构的常用引导程序,并且注明了每一种引导程序是不是“Monitor”。
8 B1 V* ?' _/ _( r 1~%I9SCY35]A@M{]$A6E[GQ.png 2 H( F5 }2 `8 v. S2 m0 r
; Y* G. h# e3 v7 ?
对于每种体系结构,都有一系列开放源码Bootloader可以选用。# ]5 X) r) Y- a( y4 b( a( b) v

, F' ?! y$ ?- S5 v2 }, H(1)X86; N  U! W, _( S+ J6 K5 O
6 j% r% x8 E% f/ ~& h
X86的工作站和服务器上一般使用LILO和GRUB。LILO是Linux发行版主流的Bootloader。不过Redhat Linux发行版已经使用了GRUB,GRUB比LILO有更友好的显示接口,使用配置也更加灵活方便。7 B* f- H/ r- F8 s( o
- _% N6 a" R( _% |
在某些X86嵌入式单板机或者特殊设备上,会采用其他的Bootloader,如ROLO。这些Bootloader可以取代BIOS的功能,能够从Flash中直接引导Linux启动。现在ROLO支持的开发板已经并入U-Boot,所以U-Boot也可以支持X86平台。
/ ^0 O4 J( `) S# |. z4 F% ~; a; y2 q+ I  D. B: v+ ~/ n7 r7 l
(2)ARM
$ p8 G7 O% V( R; I, a( K* L5 T4 w6 |# W/ ^/ y
ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM Bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的BLOB,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。, t* v3 O9 w6 K$ R! J! R9 H0 ~
, ?& ]. [4 S3 T+ W0 C
(3)PowerPC0 q$ f# K1 b5 b5 R- `

' D7 {  s' g7 Q" o1 [PowerPC平台的处理器有标准的Bootloader,就是PPCBOOT。PPCBOOT在合并armboot等之后,创建了U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是PowerPC平台的主要Bootloader。
5 j& N* w4 W) h" j# f( W9 G7 z7 {! j+ H& o5 V3 w$ b. R
(4)MIPS0 o8 z# R- {# O$ F; o
( M; M( ]% k- h
MIPS公司开发的YAMON是标准的Bootloader,也有许多MIPS芯片商为自己的开发板写了Bootloader。现在,U-Boot也已经支持MIPS平台。. X8 V6 U5 k3 G, c
$ L/ h5 H8 C9 n' C/ N
(5)SH
! O, k+ y+ V1 U$ J+ t- Z2 X
( F! X$ H' S$ W0 x: I9 Q4 @) Q% KSH平台的标准Bootloader是sh-boot。RedBoot在这种平台上也很好用。
* Z- o! U, C4 H/ j. A! {
1 M' }1 h; y, H1 b& U5 e+ \(6)M68K
4 q! l: V1 \3 Z* D7 z+ p+ R' \
0 R# y% m, s" |% y" i6 @M68K平台没有标准的Bootloader。RedBoot能够支持M68K系列的系统。/ x. j% b; R5 x4 ^1 v- M' K
( s3 j) m8 a( A! W% h+ O3 t: ]
值得说明的是RedBoot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等。RedBoot是以eCos为基础,采用GPL许可的开源软件工程。6 V9 L2 C. Y$ G: S+ i: b
) y% T  A8 U: b1 `& h
U-Boot概述$ ^4 M/ J, ?+ F& ~# b6 T
U-Boot(UniversalBootloader),是遵循GPL条款的开放源码项目。它是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,而且还支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks,LynxOS、pSOS、QNX、RTEMS、ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前为止,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。" w3 }0 p6 W2 u) J1 K4 T4 B# B
2 C: G& C) c7 r* ~
U-Boot的特点如下。8 g/ c' U9 a8 N4 V, E
1 [9 `; d3 a% L* A( s
• 开放源码;
+ ?* b. Q; `+ R! Q* G, ^" q2 S: b0 J3 i3 r9 E
• 支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;: l5 I, z4 @) x" O
8 q! [8 c- |8 L0 o0 f0 w6 g+ o5 f2 h
• 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
: h+ Z3 f! S0 ~0 M2 i* O2 V( b9 e. ~7 q5 `
• 较高的可靠性和稳定性;
$ ]% x4 G; o. k. U4 S) `7 D, N7 a9 \2 j" Q* S
• 高度灵活的功能设置,适合U-Boot调试,操作系统不同引导要求,产品发布等;# n% |' s/ K+ B8 b" u* D: N

( s( h+ H* O4 I9 B$ R7 D6 [• 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
+ J, }8 W7 O, Q9 o# o$ M
$ w# M2 X: a* W$ Z+ h4 z( B• 较为丰富的开发调试文档与强大的网络技术支持。2 U( V$ ?. o% e/ n# J

0 t  P! V/ Q- bU-Boot可支持的主要功能列表。
* C  x6 k0 q7 D# ?# D. m6 H9 Y: T0 J
• 系统引导:支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统。支持NFS挂载,并从FLASH中引导压缩或非压缩系统内核。' o8 Q) D- v1 S4 D  I

; _, G) H' ^! F• 基本辅助功能:强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好。
5 q+ O2 y6 n) ?' S: u8 @6 V
/ w' g& d% |7 ]  z" F- }• 设备驱动:串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持。) j/ F  c' _7 r1 _
0 F2 N" h' v+ ?  F
• 上电自检功能:SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号。: L+ D! m( g3 r- }9 e- C  b

9 |" v" G; D9 w: B, q; b; \• 特殊功能:XIP内核引导。
! C& l3 }; U% ~) x3 k0 E
  n% I5 F- j8 a0 S: sU-Boot的常用命令
/ P% j; a4 P% e. S, ^+ x1 tU-Boot上电启动后,按任意键可以退出自动启动状态,进入命令行。$ K2 q' M3 G  ~: F: h% J, e$ Q

9 X. W& a$ w9 o2 ~& {U-Boot 2020.01-stm32mp-r1 (Aug 05 2020 - 05:32:37 +0000)+ |4 k( ~4 e/ V& P
/ G' F3 F1 V0 V: k
CPU: STM32MP157AAA Rev.B
% C* c; y2 B8 T% j# P' K- W( ^5 E; ~. l9 t1 F
Model: HQYJ FS-MP1A Discovery Board
& R/ P9 L7 U/ D0 ~$ E3 _2 V' V9 p% q% k9 T0 [  g; R: A" P* j
Board: stm32mp1 in trusted mode (st,stm32mp157a-fsmp1a)
# s1 U8 d/ k4 v0 g
. G) K$ X+ }+ r" ODRAM: 512 MiB0 I  `- B( S5 I/ S5 r3 @# b
; p- |- z) h) k2 g9 Y
Clocks:' e1 x: ~! d! e" n8 |# @

3 B9 e4 p# q, c) D4 j- MPU : 650 MHz  X8 f9 {8 Y5 e2 k. v
5 ~' r& z" o5 c) H
- MCU : 208.878 MHz/ u/ r( E4 [' U$ i
1 o* X4 c# Z- t; I2 o& l8 Z
- AXI : 266.500 MHz, l( T2 l; R$ X$ F2 K+ y- p, V2 D% q

' |( C4 M% P7 f5 b0 s- PER : 24 MHz
" q+ a7 q3 {! \, |: P( _) E
) o% e) X: E9 i3 R) j6 V- DDR : 533 MHz. K; O+ Q- ~1 Q0 v; C! Y- n# I
, h5 ^, j" ~$ z6 L
WDT: Started with servicing (32s timeout). ?1 ?  B3 l: A7 ]( c
  t2 H3 v9 x( h
NAND: 0 MiB
* f4 ~) g+ U; a- Q4 F  s% M0 w4 L. Q( N5 C- j7 m
MMC: STM32 SD/MMC: 0, STM32 SD/MMC: 1
4 u, ]4 Q( A/ K& ]) v0 N; Z! @4 H2 ]2 a5 v' _9 c" `8 N/ P9 Z5 H
Loading Environment from MMC... OK
  b' a0 k; W' {) v8 F- ]6 A5 |' w3 _; o' i1 z
In: serial' k$ r8 c5 G2 ~+ P- L/ Q
: C7 P! N# D: {! v" W) a5 X. C
Out: serial
9 q3 u- a. y$ }$ _' V6 f: U' y5 R' I5 P6 k' u
Err: serial
; \, ]5 |0 s* s: g& v0 X2 W2 u7 R6 L/ j# [) \
Net: eth0: ethernet@5800a000
; y) G) S: Q3 e# f7 R
7 `! _, d4 m8 J! m- q9 `8 a1 v4 _  R* M  GHit any key to stop autoboot: 0
% K" ~  g0 F* ]) h
. a: U* b% ~2 Q* i9 O' o3 l9 Y8 dSTM32MP>5 R4 T4 A* e7 R* {' c  O1 z

1 e% V7 W9 Y  Y2 w7 g+ Q在命令行提示符下,可以输入U-Boot的命令并执行。U-Boot可以支持几十个常用命令,通过这些命令,可以对开发板进行调试,可以引导Linux内核,还可以擦写Flash完成系统部署等功能。掌握这些命令的使用,才能够顺利地进行嵌入式系统的开发。
* v" f2 E- S% j  D( d
% |& \' }. ?" ~3 q! [% K- L3 D- b输入help命令,可以得到当前U-Boot的所有命令列表。每一条命令后面是简单的命令说明。/ ~4 {/ h: @; v

2 `! B' k2 ?& ]- e% v! h: t6 E, N2 [
  1. STM32MP> help
    9 ?* \7 E' ~/ ?, M. @) h

  2. % v& f! x! G# g# ^
  3. ? - alias for 'help'; o- N7 r/ S6 }
  4. % ?' @+ t# s+ l6 k8 G
  5. adc - ADC sub-system
    8 E4 h- ^5 L4 r( u8 T3 q
  6. 8 v  U, [3 w5 _7 I# l
  7. base - print or set address offset6 M7 Z, K. K" C' Z. G! L

  8. ; ~/ h0 z6 Z% H2 k. E0 b" K- U
  9. bdinfo - print Board Info structure: Q! d5 F6 i) \+ n' F3 x3 r

  10. % {1 Z: L% H0 x$ A0 S2 ?+ X
  11. blkcache- block cache diagnostics and control
    0 p4 }  _; Y8 r) z6 l
  12. 0 x8 w% g0 G2 s
  13. bmp - manipulate BMP image data
      O8 Y; `  f" [7 X' f' C4 H

  14. $ W  I: Z$ A8 W! @) R8 `; E
  15. bootefi - Boots an EFI payload from memory
    - U9 H! W1 B  e$ l2 r+ F& Y) u6 Z' }
  16. ) q' I& j( a& M0 J9 O
  17. bootm - boot application image from memory
    - p  u4 \% \2 y  p

  18. ( D/ r/ B6 I6 V' R4 t
  19. bootp - boot image via network using BOOTP/TFTP protocol
    4 k+ C- V: ~* ]& |. B/ J# L
  20. 5 y2 D( o2 ^- i0 y
  21. bootz - boot Linux zImage image from memory% E1 \7 E( a$ w! V' t7 `; y

  22. % |+ R9 [7 p9 u' C5 w
  23. chpart - change active partition
    * p9 \: T. J, @4 J

  24. 6 ~' Q5 D4 T% x: _1 u2 D
  25. clk - CLK sub-system3 T! u9 A1 @1 c/ w/ ]% Z& L
  26. 4 h: s" f9 ^. s* p( j2 M
  27. cls - clear screen! d, s% C  `7 w

  28. & ^5 _0 r- h$ D( H, U" j
  29. cmp - memory compare- j, ~' n2 W. c0 d7 S$ Z

  30. ' I& W- N' [0 `  c7 S& O& {* _4 `
  31. coninfo - print console devices and information) z5 V5 \# C0 X3 x4 \
  32. ' V! h+ V# {7 ^% S3 ^
  33. cp - memory copy* j- r# F' a# c2 P9 A; w% w
  34. , @- p% W9 c& T5 w
  35. crc32 - checksum calculation
    , l" k& l. E8 ~' s3 B) Q4 I
  36. + f3 @( w& c7 f9 o
  37. date - get/set/reset date & time
    * z- K0 [2 E' A/ K

  38. * \0 I! K8 v- N3 x8 E# x
  39. dcache - enable or disable data cache" v' J' W1 v9 L; T

  40. ' g3 b9 a* L; O% z
  41. dfu - Device Firmware Upgrade4 C& J. ?' ^; y( _" h1 b
  42. ' l0 ]5 n8 D  g) |( T$ `
  43. dhcp - boot image via network using DHCP/TFTP protocol
    , j+ [8 t4 V! ~8 G7 X$ a0 k' Q

  44. 1 R* V. Y) H: y/ I) G
  45. dm - Driver model low level access6 \5 o' ~. d0 p: }- Q$ I8 z

  46. * L  `3 L; }& T' c. @: s
  47. dtimg - manipulate dtb/dtbo Android image
    ( U; z, i! z7 _  i+ B+ X2 @  G+ l
  48. 3 [: Y) |0 w) h2 z- y
  49. echo - echo args to console8 M& R# k  P' ^( `9 K

  50. + ]  I" K$ ]% r
  51. editenv - edit environment variable: A& [& E  R# M9 o+ _9 P

  52. % Z# O# I2 w) T. k
  53. env - environment handling commands1 |( c2 A$ [  `: ^6 m' d% J* c  \1 _

  54.   W" m! a) J/ e. ~+ g9 g) h
  55. erase - erase FLASH memory, u6 D* x. l* w9 h8 g
  56. ; L) w% G- a* q+ r1 o: j
  57. exit - exit script
    8 L) s! c! K8 Q' _6 \: _
  58.   O% H$ d' X8 }8 m# ?. `1 x
  59. ext2load- load binary file from a Ext2 filesystem
    , B- y" z+ K- ^. O

  60. + t3 ^3 |- l4 p8 K
  61. ext2ls - list files in a directory (default /)
    5 d! s8 o3 g! g# {$ y$ e+ |) r2 K

  62. . l% {( c/ O9 o5 w" _
  63. ext4load- load binary file from a Ext4 filesystem
    9 b( \0 P4 N0 v
  64. , U  w/ }; R8 B  b% _
  65. ext4ls - list files in a directory (default /)
    ! w+ ~3 b/ L4 e4 y1 O5 `

  66. & N3 |( H& u) ^1 G8 N
  67. ext4size- determine a file's size
    # P0 K7 V+ p2 Q( a! m% T

  68. * ]! O) @9 c" J; v$ p# _
  69. ext4write- create a file in the root directory
    8 [7 d8 _) H/ c! K! Y
  70. 6 n* j+ n" h% Y& x
  71. false - do nothing, unsuccessfully
    9 r. i, L7 R2 x5 o" ~
  72. 8 |! P7 w' e" \" A$ w# J% @
  73. fastboot- run as a fastboot usb or udp device
    " l. G2 P+ u! W7 Y8 L/ K$ g9 |
  74. - f( w6 Y4 N: ~9 b# \
  75. fatinfo - print information about filesystem5 B' R2 c$ L9 y

  76. + m9 M3 m* n5 ~+ d8 e. P
  77. fatload - load binary file from a dos filesystem
    9 q9 K+ Y/ Q) K& O* `; A9 ~* w

  78. * z9 g( }7 @& ?/ Y9 b
  79. fatls - list files in a directory (default /)* `% A7 Z( A, p# D5 F2 h
  80. 5 Q5 ~7 s* d- M4 j
  81. fatsize - determine a file's size; w7 y  Q6 J0 ?& }/ L8 k! B
  82. ; B% [7 K; I! J4 m
  83. fdt - flattened device tree utility commands
    0 C+ z# t- a; ~! Y7 s

  84. ) f5 u; {+ S1 A  }
  85. flinfo - print FLASH memory information
    5 h8 d2 L5 e" {
  86. 2 l5 W  y- B* W' p
  87. fstype - Look up a filesystem type) O9 ^2 ?9 g  j- u; Z
  88. 4 D' T; {* i; g* ]- Y" F
  89. fuse - Fuse sub-system# T. M9 A# ~9 `5 @  u" s6 m$ v" s
  90. 0 b3 \: w; ?& Y, F
  91. go - start application at address 'addr'
    ; r+ q2 O3 K, e0 A2 s# [) J5 T
  92. 0 |) H9 `3 t8 N: A
  93. gpio - query and control gpio pins
    & F$ X9 R& v0 |& M8 U" f
  94. , M* N4 H# X  G
  95. gpt - GUID Partition Table
    ' F0 ^! H8 s8 k6 |

  96. 9 C4 \, y7 J$ q+ i! m! I
  97. help - print command description/usage4 _( @+ ]+ l- }4 l2 ?' G4 F8 q: v

  98. " ]9 z& {1 a4 K% g  x' _, q' i& x
  99. i2c - I2C sub-system% f9 e0 Q5 f% z3 g6 D# C

  100. ( w% I1 \; x5 K
  101. icache - enable or disable instruction cache& q6 U8 \! P; B) h! b0 r5 f
  102. - [  n5 ~6 L/ D* }+ S
  103. itest - return true/false on integer compare" ?' F! O4 }3 S, h' \. o7 @. k

  104. ) Z+ t! z. w! f9 Q! J( X: a
  105. lcdputs - print string on video framebuffer* n9 c$ q9 X7 u

  106. ; t# f) W) R* [
  107. led - manage LEDs) G/ e& m' M' O$ n( q2 n' g5 T

  108. 7 o: Z+ Q/ k, B, ~/ w
  109. load - load binary file from a filesystem
    8 k5 O+ ]2 B; s  {7 S
  110. " _1 q6 G' y7 x3 ^
  111. loadb - load binary file over serial line (kermit mode)) z  R. J- O& @4 T6 T
  112. $ D1 V* z& h* S+ r8 A3 X" n7 U
  113. loads - load S-Record file over serial line* ?( ?; c! Y" F' b9 }8 B/ w- l+ G

  114. 0 G1 d- ?- Y7 g
  115. loadx - load binary file over serial line (xmodem mode)- b9 _2 s) `4 d' e" `/ h5 a7 j

  116. 7 q. J3 |* u# c) f2 `
  117. loady - load binary file over serial line (ymodem mode)+ L4 n$ M4 [; w% |
  118. ' i1 G# j' m. G' U
  119. loop - infinite loop on address range
    * T! j" d9 ~, u5 X, s6 T+ _- ^
  120. * L; d# u- ^4 R
  121. ls - list files in a directory (default /)( p6 R, ?( z0 c! @
  122. # l# e6 M  d7 m* m
  123. md - memory display, v& h2 ?5 j, l# Q: X; g( q1 a
  124. ) }. i6 @" j3 n1 l$ z" t( i8 O* |
  125. mdio - MDIO utility commands4 t+ C+ \$ m$ H7 e- [

  126. ! d: Y) M9 Q+ R/ R1 d# Y
  127. meminfo - display memory information5 Z, T4 I, M- R
  128. / Z4 P( r  }5 K7 j$ R
  129. mii - MII utility commands
    / t! Q: V4 M& {9 h
  130. 4 J. @1 k* o+ r2 g3 T) Y, L* K; h
  131. mm - memory modify (auto-incrementing address)& s. T: M; ~( r! [" ?+ D1 P
  132. 5 {. m; ~5 K- L7 b* H' Z5 c
  133. mmc - MMC sub system( ?9 l* j5 _8 a% e
  134. ; a8 g: z3 j4 ?: B( u. y
  135. mmcinfo - display MMC info. W# K+ ?# L) [- @  w' |
  136. 2 {+ m% t! {; M" p
  137. mtdparts- define flash/nand partitions9 a/ F6 O; @+ p+ `8 h4 Y

  138. 0 o* U( R8 |8 L+ |
  139. mtest - simple RAM read/write test
      }. x% k+ o8 v2 ^9 K, v; D
  140. # ~+ M- f" u2 N
  141. mw - memory write (fill)
    # W* [0 b7 c# z
  142. + q/ C$ U: Y# P/ O8 T( a
  143. nand - NAND sub-system6 i7 i; s* ~# ?6 l( z" B! O
  144. 5 `4 d6 c7 m* P; @
  145. nboot - boot from NAND device
    / x; Z+ z6 t, J7 l

  146. . K* P# l% ~, s2 Z) g$ [
  147. nfs - boot image via network using NFS protocol9 Q  [3 ]' o/ |* ?# c7 t, \
  148. % ]% A$ Y2 z" d( ~) u& t
  149. nm - memory modify (constant address)! j3 R/ d7 G$ z" ?

  150. 9 v) N4 A1 y' q0 ]6 d! F% B
  151. part - disk partition related commands
    - G4 `' Y" d$ H$ q8 t, i  F4 V; O
  152. , {9 h8 f; g0 {* l
  153. ping - send ICMP ECHO_REQUEST to network host
    . B, i8 D" B$ Y+ ~( B# o

  154. " K/ Y8 l& [: x: f
  155. pinmux - show pin-controller muxing
    ( I  c3 q2 x* O( {# w+ T
  156. ) |8 S5 s) E  Z! R- r  ~
  157. pmic - PMIC sub-system
    9 I' x8 j# h: ^1 T( }3 C

  158. 6 A4 d4 r% Y- O0 K! I  \2 F" I
  159. poweroff- Perform POWEROFF of the device: J1 @: E/ v# C% `
  160. # p* h6 f+ x/ N. I
  161. printenv- print environment variables" M+ Q9 B8 w8 O; C8 P

  162. 1 X$ O) ^! p/ m8 c( Z
  163. protect - enable or disable FLASH write protection: {6 l4 Z: l0 i; [4 f  c3 P

  164. ) _. w. V$ d# l- g7 _; l
  165. pxe - commands to get and boot from pxe files
    + O( N2 R9 t" m' R6 r* B9 d

  166. : i- P9 e! B: l; X0 N1 g
  167. regulator- uclass operations
    7 O6 Q0 r  N# o$ p2 g# m) b
  168. ) R2 S- C% S% K! u/ A6 J7 ~" o
  169. reset - Perform RESET of the CPU
    8 n; l; N" r1 F. U- ^
  170. " s0 o( G* S+ N  O
  171. rproc - Control operation of remote processors in an SoC
    8 y9 Z) O: _) {% y; ?

  172.   ^  @) f7 e, o$ S( L
  173. run - run commands in an environment variable- a; x6 x3 t: l( v' `+ O8 i# ^  `
  174. 4 t: |1 V  O/ h$ @1 i
  175. save - save file to a filesystem
    : D* B# \6 n- b- A
  176. 2 ?- E0 J/ q' I7 a1 I( j  v' s2 l& Q
  177. saveenv - save environment variables to persistent storage
    , K) {+ ~- e4 u. Z8 H0 ]

  178. % Q3 f2 R+ X. x0 H: H
  179. setcurs - set cursor position within screen
    9 p1 [) X0 e# l/ a2 p0 p

  180. 8 j6 [, [# {5 v6 X/ B
  181. setenv - set environment variables: |0 m3 f( `* D& @
  182. ! @: {' x* w3 R5 ?
  183. setexpr - set environment variable as the result of eval expression) t& b' ^0 \, P) `$ d5 H
  184. 1 U$ W/ k6 }9 A; C8 I
  185. sf - SPI flash sub-system) W2 T% u. O: W+ Y6 e  X' Y

  186. # l0 o- f, T2 c5 l2 s
  187. showvar - print local hushshell variables3 @4 o* }5 Y) ]' c+ S1 K

  188. - d- y- S' f0 k9 q
  189. size - determine a file's size
    0 Y2 f) F9 p3 c' t# P8 z+ m

  190. - |- ~' C# Z4 v' l" M
  191. sleep - delay execution for some time6 J$ N$ K' Z- ?& ?8 Y/ l
  192. 5 g8 G7 C; g& h' v: a+ }* H
  193. source - run script from memory
    1 @( N+ T* Y1 x4 C- ^; H% D3 }

  194. & G" [7 P* @# a1 K5 _
  195. sspi - SPI utility command
    # w5 P- b. D! d

  196. ) ^& y. S; ~6 e2 F0 b/ W
  197. stboard - read/write board reference in OTP
    - m- t) S- w6 [( i

  198. 8 i8 E0 K) R& @  T
  199. stm32key- Fuse ST Hash key
    5 H- |+ j! o% U/ V. w- A! g) {
  200. ! l  R/ A- b1 u0 D! I( f
  201. stm32prog- <link> <dev> [<addr>] [<size>]
    # ?! N/ g% A; u5 i$ ]  h6 b

  202. $ m9 y+ Z1 n2 Y' P+ T; m8 `
  203. start communication with tools STM32Cubeprogrammer on <link> with Flashlayout at <addr>5 Q6 Q9 q1 }8 e0 G$ W

  204. * l; s8 ~. x9 `: I) Z! K1 u
  205. sysboot - command to get and boot from syslinux files9 O( r1 Q' n) y7 X& G; l

  206. $ J( ]( k  w5 `' L- V4 A6 r4 S
  207. test - minimal test like /bin/sh7 |% ?3 B( q% V
  208. 3 @4 O8 P8 H# x" I3 O
  209. tftpboot- boot image via network using TFTP protocol
    ( w0 }' x8 t' X0 M* o) ]

  210. 8 B+ g- p4 @+ t" l7 y! b
  211. time - run commands and summarize execution time  {# l0 w8 Y- |$ D4 |9 d6 d
  212.   I+ W" H! K' q  x7 M
  213. timer - access the system timer* O( ?$ F0 |, \. c, B5 B
  214. 6 }  i: c2 ]7 I& k0 ?
  215. true - do nothing, successfully
    6 ?: n8 g8 R0 e

  216. - J- x3 r7 I5 ]
  217. ubi - ubi commands
    2 d' _% Y6 S2 Q" O+ E
  218. % [, x0 q) @) K& n: @
  219. ubifsload- load file from an UBIFS filesystem
    + u; w4 Y; b/ _/ t2 g5 Q6 [

  220. - S3 x! i# x: c  b5 f0 t0 B4 S9 L
  221. ubifsls - list files in a directory
    . }: Z' x, ?% i9 r6 V# }
  222. 6 ], N/ k4 g/ T) q; b" m
  223. ubifsmount- mount UBIFS volume
    $ I# O6 Y8 h7 A7 o; F. ^; d9 p9 {+ O
  224. ) `- q" Q# F- t( C
  225. ubifsumount- unmount UBIFS volume
    8 r( K3 p! R  c
  226. 1 l  U% x4 a! ~, U. x+ W
  227. ums - Use the UMS [USB Mass Storage]; D1 v1 S9 H3 @1 H

  228. ) ~/ h) i0 D" j$ T/ i0 p
  229. usb - USB sub-system* i4 B/ w1 U  h1 X; G
  230. 9 N* }  ~3 u# X: t) A
  231. usbboot - boot from USB device
    3 J' q; u( A  Y3 B' t1 R

  232. ' ?3 H+ f# x4 Z% ^- X# e! z
  233. version - print monitor, compiler and linker version
    # r: x0 |7 V$ Z* }" V) v# l

  234. 2 B5 A) B7 O  J9 E) r! y/ _
  235. STM32MP>
复制代码

) z+ T4 w( j) U0 B4 ~0 M. CU-Boot还提供了更加详细的命令帮助,通过help命令还可以查看每个命令的参数说明。由于开发过程的需要,有必要先把U-Boot命令的用法弄清楚。
1 S& f  E0 A, ]7 b2 C2 J
/ w  h* k# D! E* w" A实验目的
* J8 g( d) x% Z: r. O熟悉交叉工具链的使用、u-boot常用命令、u-boot的代码结构和移植方法。, @9 A0 h' j9 Z+ e# ?* }" v

) c8 Z, R) @1 Z9 U9 x# k4 m实验平台" {7 H; w+ z% B7 i3 ~
FS-MP1A平台  M, _$ A2 s; M9 r% R
9 q) `% V# Z) l
实验步骤  M8 }4 W& T' f$ s5 Z7 k8 g
本实验基于u-boot 2020.01版本,然后添加意法半导体提供的补丁文件。在意法半导体官方的u-boot中移植我们自己的u-boot。+ p) t/ R: k' t% W# U8 y$ m

( s- w. b- D- R9 t导入源码
- G- g' c# U) M5 w) Q建立源码目录+ D% c9 z- o" g+ u4 o0 }
4 S# a3 h! S- _& ^" h
linux@ubuntu:$ cd ~8 F) `" J; v9 d2 ~6 n

* p& h4 s& t/ Vlinux@ubuntu:$ mkdir FS-MP1A% w6 D! z* w% V) Y
% Y; J& ?$ L$ l* @! Z
将下的
' t$ [# ~* a1 G. g. {; Xen.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz压缩包,导入到ubuntu下的${HOME}/FS-MP1A目录下。
5 Y" T0 T! B# T4 ^) m8 g$ c: O3 r6 R: w1 H. g7 Y( e9 u4 }
438b84ed2dca0bd78afd6bbbf0793a7f.png 2 f6 g# o8 n- p3 u
: |0 F: B9 y- f
解压缩源码包$ P6 Z% @, ]0 \  ]3 f, f

8 B' [7 E/ X1 ~  n' R) p" z6 ]linux@ubuntu:$ tar xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz
2 D% [  ^4 b! q- V  e& f, @# z; W" x0 ^3 A% f7 |
解压完成后得到“
) A8 w# s( w& h- [, k2 Wstm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录6 E, }) w% i2 i2 d3 l

& X* g+ K1 M. O4 a( [! b2 [# j 043f5e35efc500ba2005105ec4758c47.png - T# K! x0 n! _+ L/ c, D5 `3 \

9 l0 K+ d' s7 M0 b- A进入uboot目录下
0 b1 J5 T& s& g+ A  N$ W, C! _& x; w6 B& m0 {0 S
linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0; Y8 ^3 C, }7 o; D# u

5 R& a6 R$ q2 ^1 N0 A a6db9222a790704e2b00032b086ea7ca.png
. l; m5 w" U/ S$ ^* p
* p! i, ?! P- K3 `# S( m该目录下以patch结尾的文件为ST官方提供的补丁文件;
9 S0 z$ `# L8 X- F/ C3 u5 x# pu-boot-stm32mp-2020.01-r0.tar.gz为标准u-boot源码包。
& J6 W  j4 p/ V& }' A6 d* o3 y
" D; Y* t/ b& J" u. u解压标准u-boot源码包& [" p/ B" u( M; D' u
# U5 R2 x) M+ d
linux@ubuntu:$ tar -xvf u-boot-stm32mp-2020.01-r0.tar.gz
7 o: ^. f8 ?" G% [# P6 m9 J  R& e, \* R: B7 E2 m
解压完成后得到u-boot-stm32mp-2020.01目录/ d& U2 ^0 u* W1 n- s

% H4 T( ~' j# G) ]3 X" b& f 7279631ff3fc64037f917b97e6c78947.png
! }% j! S' Q2 q$ ?. t. c! K/ n" Z( Q3 P/ u2 o8 C
进入u-boot源码目录下:8 e' x( m- d) `" ^. \

- I8 W& O  Y: |# h) clinux@ubuntu:$ cd u-boot-stm32mp-2020.01
# h' G5 Q) \3 {/ n4 U' o9 m
: v7 x* q( `' ~  H% O: _ c3f9631abc3d460a2749305b5a910ce0.png
0 h1 b1 L5 |) p* H" d  q6 }! ]- r7 P/ b4 j. b( X
将ST官方补丁文件打到u-boot源码中:
3 }. W- h) R7 v6 `% W4 ~
6 _. k* k% r8 t  C5 vlinux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done- R9 c7 }9 E" \4 r

5 _- ]" }0 S+ m# g- L$ M6 c 7e0aca2c3a15ebbec01a08e9715fbbb8.png
2 Y1 k  ?6 p; g! c
' \! _1 n5 d5 Y9 }/ x( w/ z7 f9 }TF卡分区
/ @( c' C8 _) v$ p0 |2 q# q
要对TF卡进行烧录,需要先将TF接入到ubuntu系统中。: q$ O$ B# y1 T

+ _* W6 }& d/ W! ?( ~4 j$ u: X% U查看TF卡分区
8 X1 F7 v- ]" t1 U1 |2 m6 O+ o( d; }# T& c: o. t- [5 |& F
linux@ubuntu:$ ls /dev/sd*- E2 d% K: R; E& V/ B

5 x, `2 ?& I0 T9 A$ m; c2 [ 53cce74c6f120fcbb5f0acd4c26d318e.png * E: x+ }+ X& S; w8 l) [9 p9 W& @
% |- Y# B! \; T* l* H
由上图所示只有“/dev/sdb1”一个分区则需要重新进行分区。, m% U5 H6 A( C: Q# J

% v% B. C8 f( w* K% K6 h首先删除原有分区& {1 y+ I9 V; ]# e
1 n# T/ `' Y2 E; t! T5 @1 ~  {3 E4 l! G
linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos$ }+ V/ l. q( V. @( r/ i) ^* R" a
7 T$ S/ q0 m, }5 r
如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。
! b3 G% p; b' O; x1 o7 e. r: ^
! J3 }) y; X$ r8 H+ O 3e049e3ebdfaf78a2eb89d647593b5ab.png
( [/ C& k4 p7 d& K: f0 t2 ?* U% w( R/ W2 K2 V, s" f$ N
卸载设备
8 @0 l1 i) d8 ?8 \, z% I' z
' l1 ]! h1 |( A4 s- Q2 |# x  f3 Rlinux@ubuntu:$ umount /dev/sdb1% ~% j+ ?* _8 w" T

: ]# d' q0 A  |' m4 U# t! ^, u# T卸载完成后重新执行删除分区命令  x. j9 e3 U9 D  Z7 c

) b* h) }  L8 Elinux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos7 b/ o  U' [% o  L- ~
6 o( h- j. |4 e( {% M2 ~- i2 X
对tf进行重新分区9 d- A0 ^' R( z0 I: K, J6 K' J
) ~7 p8 S4 }4 z' ^
linux@ubuntu:$ sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g7 X3 k% |' c$ t3 u1 H. l5 s
$ U* B8 [+ h( S. Y( T+ x+ `6 L
26b38966b016ad77c7e4f0b6c4a5653a.png - t  @6 S9 X0 s) |6 p
: x4 ?% @' c( v" ]4 i) J: K& U8 f
注意:最后-p /dev/sdb参数中的/dev/sdb需要按照实际ubuntu中的tf节点为准,否则可能发生不可预料的后果。
8 z5 l( x& e. f+ \7 W, y: N5 W
1 |/ ?' R9 W3 w6 z$ o6 \2 y% y建立自己的平台
/ j5 T: m* @% N; W3 Y- v
1.配置工具链
% r0 P8 k0 [- z# b导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
0 Y# ?5 Y9 D$ O4 h( Y! P8 E% {/ n' m& V$ j8 v
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi  W: v( @9 W; n9 q# ^6 {

! X/ }% s3 T! y; f验证开发工具是否安装正确,显示版本信息如下图所示。% m4 O  F. ]: F# L( S
0 y4 ?: ?; t! X) B2 D4 i
linux@ubuntu:$ $CC --version8 i0 S& i$ I) z6 W1 {
. m! h, e; s) ?0 |! F3 v
01665b3a15a18442fd5986ceca9ce5bf.png
- e& u5 Z5 D6 H3 I1 I; G/ l: \' x* x; `- c9 F
2.增加板级相关文件
* A% K( K  A9 g6 C3 @进入到u-boot源码目录; a2 ^' }  i7 n  w& n0 ~
' F% z5 `* x4 }) i* }
linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01/
3 |. }0 d1 c6 o' z0 J; E" e' g
. ?$ y/ ]6 D5 e9 E! e  |添加自己的默认配置文件3 Y8 `) a4 H5 M
$ p. Z# c, y! e
linux@ubuntu:$ cp configs/stm32mp15_basic_defconfig configs/stm32mp15_fsmp1a_basic_defconfig
4 ]1 |5 m1 ^( ]9 B' G) h. l! u  i+ d+ Y( X0 h9 t
添加设备树文件
; }5 g* a4 R4 z% _
; D5 B) K3 I6 f% ]. alinux@ubuntu:$ cp arch/arm/dts/stm32mp15xx-dkx.dtsi arch/arm/dts/stm32mp15xx-fsmp1x.dtsi
. C* y+ W% X( M4 Z0 J+ F! F
3 _5 Z9 u! [1 `/ E- }linux@ubuntu:$ cp arch/arm/dts/stm32mp157a-dk1.dts arch/arm/dts/stm32mp157a-fsmp1a.dts& N" ~9 o( h& [' o" W3 u
9 h; E. G( I2 s6 ~( r
linux@ubuntu:$ cp arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi
/ m. X- ]2 k7 Y  C! ?  e' G; v2 @& v# a- N
修改0 W7 D% v7 X  [
arch/arm/dts/stm32mp157a-fsmp1a.dts将# b0 s5 p9 m' H; Z6 m

4 Q8 z1 \& n$ w1 w/ p4 l. I; y3 G4 c#include "stm32mp15xx-dkx.dtsi"
8 i, b  p! r" E9 u) j) I4 C" I3 o4 E4 v1 l
修改为$ n4 q& i" `3 l$ W6 `8 O

: m4 r: P  ?0 q#include "stm32mp15xx-fsmp1x.dtsi"
/ h, R! t& w, F) k1 h7 g# N
/ ]) U( P0 ?( x( N* ]4 b修改arch/arm/dts/Makefile,在stm32mp157a-dk1.dtb下添加stm32mp157a-fsmp1a的内容:
, A4 O5 A! W% R3 X
# U  ?4 P1 W( M3 m 4b56a175b5abbcbc76039b9de49c15a0.png
3 N) `& b" |! o8 I
* g6 r- O; f; H- Y+ U7 _/ V8 q9 b3.配置u-boot
6 k& Q6 J- [* g- i6 {* q* }使用新添加的默认配置:
2 E9 l9 }. ]( M8 X/ w# R  V, w% s3 i4 n; d) h3 M2 ~6 B* [$ z: B9 p
linux@ubuntu:$ make stm32mp15_fsmp1a_basic_defconfig
. [$ A7 W- u  _5 _4 q* A6 N$ F' b0 ^+ n: M7 B6 \8 m7 |1 M
172e0a878206b7486e81c400ca48f3e8.png
+ d. f9 v  e% l5 F3 f; F! G5 T7 m- x/ W7 d
可以使用make menuconfig进行图形化配置( r9 z( q2 {0 ^$ {

) e5 j! Z. y, A/ z  B$ P ad38ea39c9c8e7880228a4c293425798.png
( H9 @6 X; P6 z4 p1 Z
, d8 R4 Z' z' N$ y4.编译源码
3 J% g8 p) v, I8 S+ v" i执行如下指令编译u-boot:- p! V& ]! j* F8 C: K8 S. Z, J& ]
' K+ q1 X- F: y1 {
linux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all
8 j( O8 g: G8 l& W
# U3 b  t3 p+ r6 f( L编译成功后,最后显示内容(部分截图)如下:/ G; |  h& O$ Y+ e# @% C

1 d# \. A! b( h/ u5 ~9 c+ o0 D 4387be4180571775c5e1c43fe71817aa.png
3 m7 s2 ^  @6 f, S
/ g5 q' S1 W8 w5 }  x编译完成后会得到如下文件:# v! F' ]1 D  V) B- P

+ @6 l  _* `; W2 | 564a417aeed1ee420e4e7745c9b9385a.png + U3 ]  Z  ^! \; T- f6 ~
4 b% I* Q. n- u- }6 V$ Z
5.固件烧写
% Z3 V- @$ j* j- l& [- L9 D9 m由于在移植过程中会多次烧写固件并且会导致正常u-boot无法启动,因此推荐使用TF卡启动的方式来验证。1 Q: c: H" S: x3 C; d

' R3 t( E1 J& ]# s将TF接入ubuntu系统后,查看TF卡分区
1 p9 j! V6 A( H: X3 {+ w6 i  q
. b; ~* k8 T% H" z( W8 n3 v/ `, @linux@ubuntu:$ ls /dev/sd*/ B" t  r) P( W! L
- i0 r* \. z0 l$ _6 p- v& z
882f1861430fbc8873c30c1ada4f7542.png
* H/ l* i% k: k) v7 J! H4 M  E) Y3 \6 S) x1 _- t* S
/dev/sdb为TF卡设备。如果该设备下只有/dev/sdb1一个分区则重新分区。
  x# h1 |4 B3 C; l: A4 p
& t" o3 L7 f% m& x/ D执行如下指令烧写u-boot:; w5 K- j8 M* m7 M
  o: F0 n$ p0 j1 y6 w+ F
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
: O% \& N* ^! ?& A9 k* ]: t  V/ s1 o2 |& B. C) {4 R
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync" O2 |' w$ I% A* i" z" }7 m! `, k
! r+ ~1 ]$ h) k6 d3 G
linux@ubuntu:$ sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync) {- R* a0 S+ r

% f6 z" _3 v' ?" W0 r8 x6.启动开发板' z; @% _9 I- i5 _
将拨码开关设置为SD卡启动方式:. z* P) s* `# w- }( o/ E( w

( a% k; d8 ^. g1 L) ]: W NAZB(RR~J79VD))[V]}4W32.png 4 S$ H5 A- A1 }6 m* m* C
5 @9 T7 Q0 Z% {& }1 K* p* F
将制作好的TF卡插入开发板,上电后会出现如下错误提示:( ?# k! x# b9 n5 O$ z

7 Y9 ~$ I2 s# O& p2 x ccf867996d8293e9bbc8c5c980813cad.png
& ^0 k# k( j! ~/ z. f0 `6 T2 h% j! L: o% i) Z, c
错误提示电源初始化错误,需重新调整电源相关配置! l! P! G4 a6 u& W+ l  ~
9 y- l: F+ ?' V4 V* R
调整设备树电源配置9 T: [) t- T% q, K+ k
由于官方参考板DK1采用电源管理芯片做电源管理,而FS-MP1A采用分离电路作为电源管理,本例需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容
* `# |. c$ ?" J0 y) i4 _' X2 ?) O  j% D3 P. f& j" j# c
1.去掉原有电源管理内容4 |" E& O, ?. `
DK1参考板电源管理芯片挂在I2C4上,而FS-MP1A并未使用I2C4总线,所以直接将I2C4相关内容完全删除即可。, u4 ]3 J! b9 n  L

, @0 n& R0 M% N9 ?/ a: w( i/ c8 U修改9 ~  u5 t- x7 H/ B6 q- H* f
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件
# f2 T  F1 `* _; ]2 W& W* v. m# F( e$ H( W0 ?6 r
将文件中i2c4节点相关内容整体删除,删除内容如下:: h/ S; L6 q7 e  W, p/ i- X

6 @) o& n" L; ^+ T$ o/ y; M* T. a& F
  1. &i2c4 {
    , J6 d; Z+ ^$ U7 ~1 P& i# v
  2. 2 e2 U7 S  r+ q" b$ b
  3. pinctrl-names = "default", "sleep";, h3 }7 _3 u( t

  4. * B& y/ k8 ?$ K% t9 l* }/ Y: _
  5. pinctrl-0 = <&i2c4_pins_a>;
    : f  p8 H0 e9 S% ^. M9 ~4 l" p2 }

  6. 5 \; e3 O4 e9 N% @7 m+ V2 d
  7. pinctrl-1 = <&i2c4_pins_sleep_a>;
    8 c/ ?# J3 f( k" P4 {  A

  8. % i' Q. X, b( F4 ]& h4 M
  9. i2c-scl-rising-time-ns = <185>;
    0 I* t. I; ~' p% z
  10. " q  p. }" R  c3 f/ {! G7 e
  11. i2c-scl-falling-time-ns = <20>;% U. R2 S1 b- k: K7 {6 z/ {+ G; Q
  12. , h; g& v" Z& o
  13. clock-frequency = <400000>;9 \3 z8 t5 N8 h* v; n  z

  14. - U3 n, p7 E$ |8 K
  15. status = "disabled";, c% {2 q3 u) X/ L1 r2 Q+ p
  16. 1 ~' f  V6 D+ A7 G% c8 w! S$ `
  17. /*内容太长此处省略*/
    ' q/ c9 g0 a. l/ i
  18. + J9 z5 u+ n; y9 t% P
  19. watchdog {
    ; V+ q: p+ p- |1 W# r& _

  20. , k4 y3 ]7 g& H/ P; x7 h
  21. compatible = "st,stpmic1-wdt";  K; V& B1 T6 t' I6 b' P

  22. 6 e  k& |0 q9 X7 m% Z# M8 G5 s
  23. status = "disabled";( ]* M/ Q- C4 v
  24. $ c6 M4 x, s& V
  25. };" ]9 b, V* a' k6 f; Q, [

  26. # s6 C1 D  d0 t5 j, y
  27. };
    ; Z1 F# a6 @. Y, [0 {
  28. / J2 y! V' j) f" h3 ~
  29. };
复制代码

9 M0 _8 R+ T7 I修改' k! r# x- u( u, N
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,删除如下内容:
6 B) k: i7 N( F* w
3 B% S- q$ K4 `, j/ f
  1. &cpu0{8 P. c" e( }# I% u

  2. . N$ W- Y( f( Z4 z* V8 E5 g8 k
  3. cpu-supply = <&vddcore>;( V, J* |( p0 h8 u

  4.   c- K5 W6 q. m2 t( j4 S3 J0 h: Y
  5. };
    7 J8 T5 R6 f: z: \: K$ i  t  {( E
  6. 7 M: {! L/ ]- V6 d
  7. &cpu1{7 ^; q: r6 ]0 E+ ~1 Q; _4 G) `- l
  8. . ]) B$ ]+ l3 b# N# ^( b5 b
  9. cpu-supply = <&vddcore>;
    ( J' n6 X- ~7 T! j9 ~5 b

  10. & G4 x# I/ d1 }( U
  11. };/ o2 N: g6 E- w7 B$ \9 e
复制代码

1 h: F. y) X9 \7 R* v2 T+ ^修改, W' k, O5 a5 o/ r" w
  1. arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi
复制代码
& S! K+ z) M3 B- Y7 ~
文件
) p6 a* h( }: ?6 I' ]0 d0 L$ h: ~  S- A. O$ k1 L
删除如下内容:
" o: M1 `+ n2 M7 R/ R* O( T0 u. W) Y, @2 f9 }' ?8 ^% y3 e/ `
  1. &pmic {% H& D. x6 M* m
  2. 2 H. X- h; s" R" c( c; L
  3. u-boot,dm-pre-reloc;
    ) e0 H) T! j% ]4 }

  4. # f" h1 ]. c  A( C/ w5 W
  5. };
复制代码
4 S8 F$ d& o$ V5 J' N6 w
由于官方参考板DK1 I2C4总线上有个USB type C的控制器,上文删除I2C4节点的同时将type C控制器的描述删除,所以需要将引用type C控制器的内容删掉。( P0 ^" V/ h9 g4 h& [
/ D2 s, W, ~$ p% @+ V4 Z7 e
修改
# Z( G7 e# S% }, o" ^# Tarch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,删除红色部分内容:
9 A6 w7 v2 u+ y  d' x4 {5 q( j# L6 c- p3 G
  1. &usbotg_hs {* g% \9 V9 i3 l6 {# i- Q: b9 \; }
  2. , [. `2 i! \- o
  3. phys = <&usbphyc_port1 0>;
    1 n, n3 L. K/ V4 k: d# @
  4. # Y! F8 C( ]$ l- B8 A# N" [
  5. phy-names = "usb2-phy";
    1 Q3 {4 X' @5 d
  6. # t. M& v3 H8 R* ?3 V
  7. usb-role-switch;& Y: U% P& J: H) {

  8. ' u7 z) n( J/ U# Z& }
  9. status = "okay";
    $ {* ~+ R' X8 l' z/ J" ]5 l
  10. + J3 `6 l( @; y, a0 j. a
  11. port {1 d% ~. o% _. M; O, X
  12. * x3 d! v" |; V- \  i
  13. usbotg_hs_ep: endpoint {
    1 Y+ j+ _7 K9 x

  14. 2 ?6 {% K! M* u) i' `
  15. remote-endpoint = <&con_usbotg_hs_ep>;% o( c/ ~* `  n. q" a/ z8 o8 |2 W

  16. 9 j* _# c4 p! J9 V/ L' n
  17. };
    3 ~! ~6 A6 L  m- ]  M) s' P9 s
  18. ' P1 z2 b  w- l/ ~
  19. };2 t  g7 e% d* j  I

  20. - ?7 D8 G, w$ e0 S' p& P4 {
  21. };
复制代码
. t+ z/ b. o- U" c; R
2.添加固定电源配置% I. \! h: v- B& M+ U# x
修改# _& H- P7 }0 @: V$ q
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件
6 N, Z+ ^; g, Y1 k" `3 p4 V/ v* e
固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):1 d% i* }- N5 w  H' q% E
) w9 ]5 |( H( T, u1 d; ]' d  O! ]
  1. vin: vin {
    ) L; Y* o6 X! N
  2. & h3 i4 T  {9 h: P
  3. compatible = "regulator-fixed";
    ; N7 C1 @! y5 L2 C
  4. + i7 t' V: \* Q1 F- A% k9 X% I- C( `
  5. regulator-name = "vin";
    % q' A( R1 D+ A' A6 U
  6. ; Z1 ~: V) A# @
  7. regulator-min-microvolt = <5000000>;0 o8 i! @. F0 P# l5 q1 k) ~% i
  8. 3 O7 E- M/ G6 R, b; }
  9. regulator-max-microvolt = <5000000>;
    , E& U% D: D; j9 d5 E/ K
  10. , s/ c+ r6 ?" M  D! n1 C
  11. regulator-always-on;
    ) S- f! |: K+ T9 q) W

  12. " f. b2 G0 V3 C, X- A  T
  13. };! Z+ O/ I, k' C" Y

  14. & X( a( O5 N( E8 M/ a, q3 a0 N
  15. v3v3: regulator-3p3v {
    5 G7 e* E  R; K

  16. # g2 Y+ ~( P, _3 N) r2 ?
  17. compatible = "regulator-fixed";' O, N' x! H" i2 @6 H1 f
  18. # Q$ q$ S" u* ?+ y8 a
  19. regulator-name = "v3v3";! ~" b, Y4 T6 E, O; g
  20. - U, Z4 c+ @: k/ V: G# d" t9 q
  21. regulator-min-microvolt = <3300000>;
    9 K0 A& G4 ^4 T4 _. ~" [

  22. % ?4 P5 B8 Q, h  Z+ Z, K
  23. regulator-max-microvolt = <3300000>;6 i8 n/ F, n% @' ]8 X8 Z

  24. " r6 @' Y3 \2 T, l
  25. regulator-always-on;
    8 |6 K' W' k; w/ S& u

  26. , Q/ R! E$ p8 y
  27. regulator-boot-on;
    / |  h- s/ H9 D1 p
  28. , W3 g: K8 f0 [' I: w9 j8 S! F1 u
  29. };
    $ }# j  R/ n, r! _0 j9 n) }/ ?  s
  30. % }+ e) ^# Y/ Y5 {! ~4 [; i
  31. v1v8_audio: regulator-v1v8-audio {: K3 m! w7 T) @

  32. $ i& |; o; z$ l( U0 v
  33. compatible = "regulator-fixed";$ i' a6 d0 m8 G5 V% F& Q

  34. 7 z  w( O. m: v% Z* s" p- k4 ]
  35. regulator-name = "v1v8_audio";
    9 Q% u; ]! r/ v

  36. 4 M+ U5 V( V' j; E1 a7 u/ z
  37. regulator-min-microvolt = <1800000>;: U7 V5 y. f# {/ M, y) Q1 q
  38. ; d6 v7 x0 ]( r' I$ ^
  39. regulator-max-microvolt = <1800000>;  [+ i" M8 P. q# l
  40. ( f1 Z8 ^; U2 ?  @3 T; [
  41. regulator-always-on;
    1 l) m# y% s; d+ U9 i) A4 w

  42. 1 h  ]! d" M3 i3 H: ^
  43. regulator-boot-on;
    2 T) E4 [; X  o

  44. 3 n0 j; \. n0 C& z( ^9 W) V
  45. };
    " u( F2 n, Z! H# c9 E
  46. : Z5 u& G' n7 V& k$ q7 z
  47. v3v3_hdmi: regulator-v3v3-hdmi {
    7 r2 N0 T& W( Q3 F' @7 N

  48.   x9 b3 j: f4 P
  49. compatible = "regulator-fixed";4 v) h. N1 ~8 q3 E  t2 y/ [; ^
  50. & A) L: T5 O, }& |% T; J
  51. regulator-name = "v3v3_hdmi";$ J3 F3 m- |' o' D0 k
  52. + j, w& a/ Y" B% i
  53. regulator-min-microvolt = <3300000>;
    " B0 i2 N3 `7 X1 ?" c5 d0 r

  54. ! L* [9 V1 v0 q- i% e4 f$ B) @
  55. regulator-max-microvolt = <3300000>;3 Q+ @4 X. h0 U% l5 P  W

  56. : G7 o" R4 q7 g% Q8 |
  57. regulator-always-on;
    ! o8 [1 j! ~  t6 K  a3 {
  58. 5 G- ~! y2 {/ F; ^& F0 ^
  59. regulator-boot-on;6 x- p/ C2 `4 `, S" Z. M6 E3 z
  60. 5 C3 n6 f2 y9 U# P. m
  61. };
    * z1 S+ M6 x3 O' S( w
  62. 6 {, K9 {2 K2 q' v7 Q& t& \- \! o
  63. v1v2_hdmi: regulator-v1v2-hdmi {
    " i8 N8 S2 I5 x0 M4 N
  64. / n8 v) ?" Y% \+ ?- |% r1 j
  65. compatible = "regulator-fixed";
    6 h: C2 X& i$ c+ A% _$ f
  66. - H- ^& {8 M* K% K  \/ ^
  67. regulator-name = "v1v2_hdmi";
    $ ?7 h0 r# J$ }5 s" ]6 m

  68. 6 e! O  S% t) h  U9 y9 J
  69. regulator-min-microvolt = <1200000>;& p7 H( @8 X% d
  70. 4 Y# }# x& t! c9 f: Z
  71. regulator-max-microvolt = <1200000>;
    9 c& N) Y2 d: z4 y
  72.   D& Z7 O% t5 O# j1 o" V" \6 b6 {
  73. regulator-always-on;) e& P8 k9 A  {8 I/ W6 `2 U
  74. " @/ g% m( g' `  D& ?/ l
  75. regulator-boot-on;
    2 x' z8 Y3 |8 i3 D" G
  76. ( M& h: {+ ~# r. t/ L' }% Y# |
  77. };. B9 d$ o+ n6 F8 i* e3 }- o
  78. * N; Q0 ~0 a) T5 _" s, o0 z
  79. vdd: regulator-vdd {
    ; u# L8 r9 a- r/ w+ e) L- Y- A3 H

  80. + K7 z$ @) X- v8 [* M$ L1 a! Y
  81. compatible = "regulator-fixed";
    ' j! C  ~8 D, ^6 h  Z& w" m
  82. 5 o! Z0 h- v0 H# s; _8 O7 B
  83. regulator-name = "vdd";, F" u7 `. b$ P; M

  84. - R3 K6 O5 @9 f4 U" o1 o
  85. regulator-min-microvolt = <3300000>;
    , L, r9 m, z1 `  O- F
  86. 3 i: |$ P! v! @5 c: u
  87. regulator-max-microvolt = <3300000>;' x4 s: Z' c7 g, w9 ^+ I8 h! D/ Q
  88. ! Z5 K* _8 r# J% f
  89. regulator-always-on;+ q4 z. r, ^, V0 ^- d, b
  90. ( O& e+ g) `( @3 r" g5 G
  91. regulator-boot-on;8 u; O% u, g" N& G/ g
  92. : J6 R4 G  Q( J8 p
  93. };0 x5 h) f; l& l+ _

  94. - G/ G4 T, M" {  L
  95. vdd_usb: regulator-vdd-usb {
    ; @; w6 ?, r1 F- P( D
  96. 1 |$ r. t! |3 }2 |# C5 N, w
  97. compatible = "regulator-fixed";
    1 S; g( X% W# |( N

  98. 2 W9 d. W3 |3 E; `" q& L+ h
  99. regulator-name = "vdd_usb";
    # @4 A4 z0 y* g- {/ I7 q! r$ I% Y0 n
  100. $ b4 k! ?" q$ O
  101. regulator-min-microvolt = <3300000>;
    / a8 a$ J& S" y* k) t, @* |2 b

  102. # ^9 c- C0 H  ]3 \3 V5 y% i
  103. regulator-max-microvolt = <3300000>;0 h$ }8 y9 j, z+ S

  104.   {# y/ f" k! i4 c4 |( h- O
  105. regulator-always-on;% U& G# N4 y! H
  106. 1 S: V% @$ x# X: }2 R3 X
  107. regulator-boot-on;
    2 A- W: W. S9 g9 h' n- |
  108. 9 x4 b1 S0 L) B# k9 C' r6 ^
  109. };8 }+ x3 O2 S1 G; d: b, ?( R. t
  110. & w* l" W) \6 A; L6 Y6 b  A
  111. };
复制代码
- y8 V$ u+ i+ K/ O0 ~9 L/ p
3.配置uboot. ?( Q. y) g$ U( J$ q
linux@ubuntu:$ make menuconfig
0 D6 y4 b9 `. [, C( L' }/ `2 i
/ i$ Z  E1 K2 }& e$ Y去掉PMIC的配置选项,按空格将方括号内*号去掉:% h7 r4 c, U9 N) z& }, E+ g# [0 A9 J, E

# V/ ~1 S& z* ~% I  aDevice Drivers --->
$ p- ^$ b8 W8 T% w9 R& Z$ ~# i7 }: @- o' w
Power --->  w6 C1 h4 _$ ^( w, j: O

0 I: u+ c$ H! v) k  K8 v0 q; r% `8 K[ ] Enable support for STMicroelectronics STPMIC1 PMIC6 x% n+ X& `1 q$ {; w3 G5 p: M

# S& J7 Z3 b9 O) d2.更新配置文件( Y2 e7 }& q0 g5 {% c: k* x9 W
linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_basic_defconfig
# y+ S3 `% Y- v% _7 D, U4 F3 y5 z) v8 b
3.重新编译源码* G' [6 U: F" E
linux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all
7 \0 p5 g; X6 J4 W( S  U6 ^$ D0 ~/ [9 s( j
4.烧写后启动' M- S- M: t- K) O
重新烧写后启动现象如下:! H4 a9 E% b' S. [4 b+ \

0 l0 d6 N( f! B' k8 }2 `9 c; W- P* T f95d4e5b406a6550853a782dac2985ef.png 1 D2 e' R+ r6 A  ^$ g9 _! B

( Y; s9 f2 B1 U: w提示显示TF卡未被检测到。. o+ m3 n! Y. c. y7 v: g
( \$ `9 |6 }0 y+ N
TF卡支持
% ]# o( L" A# D7 j4 D系统检测TF卡拔插是通过CD脚的状态确认,通过原理图可知,TF卡对应MMC1的CD脚是与STM32MP1的PH3连接  d5 F2 S- {9 q* g$ [$ F

% i+ `' Q* z: z  M/ I6 |$ V0 | afdd33ce1c9b6b3f076d297a53834bf3.png
# R3 w+ X/ M! e+ t# M5 A1 g& }2 J$ r  m
对照设备树中MMC1的描述,发现设备树种原有CD脚的配置与FS-MP1A板子不一致,需调整为PH3。
0 B* u7 K# o+ U) z$ g, h# Z2 n$ X7 R7 G, Q; U! B
修改
8 A, d+ }4 w, a0 Jarch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,调整MMC1中CD的配置:5 l+ i' l& A  f1 A% V4 S) r

* f8 m, u1 y5 L, m! t7 m  ]( z将如下内容" m$ Y& n' K- _2 c2 e  d
  @# ^* i5 u$ S1 l$ F( [
  1. &sdmmc1 {
    4 I# t' Y3 B. E: H$ ?9 B% {
  2. / {8 z, ?/ L6 r3 a7 j' }  P/ I
  3. pinctrl-names = "default", "opendrain", "sleep";
    5 q: t+ j0 a4 T4 |7 ~
  4. $ t; d) Y* h' ~: Z9 a( j/ t' ?
  5. pinctrl-0 = <&sdmmc1_b4_pins_a>;3 ?( u3 K* S, O, H3 g1 `6 ^0 c: c/ p
  6. 9 Q, V9 X# ?6 E2 g0 ]
  7. pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
      m( G- e7 j. R

  8. 3 |- ]  J/ U  E) T  n. w
  9. pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;! L  X  p+ M4 i2 L' i

  10. 7 V4 j# @8 o# ~) x" h3 U9 ^0 ~
  11. cd-gpios = <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    " s" J0 J6 i8 K: D! i( `# u- e2 O

  12. ; V0 I; T0 y/ z! _# ~
  13. disable-wp;( F8 f9 t0 @' K: w0 u1 {2 C

  14. # K: Y( \* n3 x& A3 o  Z, t
  15. st,neg-edge;
    : v8 }( K$ q# B" M$ L( F. Z" F  j

  16.   E* E) R: \7 _2 }% H
  17. bus-width = <4>;
    5 L+ ^# R; t( H3 Q1 e

  18. 2 J/ S8 o' m/ d; T
  19. vmmc-supply = <&v3v3>;
    3 L# m1 W; j/ [1 D

  20. , @/ G, W: a; T6 I- A7 a8 V
  21. status = "okay";8 K' p2 _+ h4 s: e0 j, \
  22. + y5 g( P: e1 ~! D/ I
  23. };
复制代码
& t$ L& x4 W/ A: N6 }' ?
修改为
1 r7 V; O( G5 C8 g( z
9 k# A$ Y! I. I# }
  1. &sdmmc1 {
    6 S! t$ H# h6 ]! z- }, w0 i
  2. 0 l3 B1 J, f+ R. n' _! D+ n% k- Q
  3. pinctrl-names = "default", "opendrain", "sleep";9 a- X) k! t0 c$ L
  4. ' c- ?: [5 ~* i% L
  5. pinctrl-0 = <&sdmmc1_b4_pins_a>;
    5 n, Y4 Y. ~& d$ v. r( ]4 C- t: j! K  Q

  6. 2 s( G0 q0 B/ P
  7. pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
    - `* W! N1 I! o  ~- H7 l
  8. $ @9 k* R) s4 d
  9. pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
    2 t! m/ [+ p, |, j; B

  10. * y. k5 L9 ~9 l* }' B- i2 l
  11. cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;7 c2 Q+ Z  j2 {% p
  12. $ v1 d5 U! ?5 b  O
  13. disable-wp;
    / A4 c; q9 {. a

  14. % X7 j- N# D; I
  15. st,neg-edge;
    2 O/ X  {( l+ H: i

  16. ; M  n; z7 x) Z6 ^7 g
  17. bus-width = <4>;
    * F  }1 s7 H9 f( ~  i! I/ @, n4 `$ m& }

  18. . ]+ D4 o0 n8 U& {9 a
  19. vmmc-supply = <&v3v3>;& r  X% s1 K9 ]2 O/ w
  20. $ P0 P3 n9 a6 ]% J
  21. status = "okay";
    9 p4 `/ C. M5 ~5 U& U
  22. " {0 |5 a+ e% u0 u7 O
  23. };
复制代码

8 j' t: D" L- m8 K& Z重新编译烧写后现象如下:
; q/ \1 S/ x  G* h
# X9 |% L1 A" u' H8 n) ~ 16441359b00dce8519c705dc4807c273.png
6 b, C2 ]  R7 v2 S% T2 D2 U( ]! C9 H4 Q, a( B" f
去掉ADC功能! u; L- }' {+ S- Q, U# t
上一小节已经成功启动到了u-boot的控制终端,但是可以看到还有一些错误。本小节将解决如下错误。0 N5 P* W$ A. j* K

- ]! m+ i/ J. S9 \$ m# h. P f160a1d62b7c81a78ec6031990037399.png
) `1 K4 u/ V1 H( @, Q- k9 k  [1 x3 d, H) I5 a# r
官方参考板DK1通过ADC检测开机电流,如果供电电流不足3A则启动失败,FS-MP1A没有设计这个功能,所以需要去掉这部分功能,否则就会报上图中显示的错误,由于u-boot期间ADC主要功能是检测开机电流,这里直接去掉ADC功能即可。9 x& `$ }( ~* t' u: ?3 H
- G4 M  x5 h/ q3 s# I
配置uboot去掉ADC功能:按空格键去掉[ ]的星号% `! a/ k& l* E. [, c8 ?
& G% I& C4 `3 F; R, D; J
linux@ubuntu:$ make menuconfig7 D" b. z  T4 b% [3 c( Q4 v

, P: I3 y4 ]5 u7 u6 fCommand line interface --->
5 s- ]  \5 X$ e6 ]9 x
: H; f* U. S7 O8 O# n6 L8 _Device access commands --->. J/ f( |' @5 r$ x: y& `' d
1 i& l! q7 {9 v) A# u
[ ] adc - Access Analog to Digital Converters info and data
3 |  y& m+ G1 Q- X3 x3 G6 y
) H) }( l4 R3 t4 LDevice Drivers --->
* u& \4 E- @! E8 H' I5 _2 Y2 |9 j, t) |6 g; _4 b8 K1 M0 Q. H
[ ] Enable ADC drivers using Driver Model
0 B5 S  A0 v. I' h/ j; `. `) B. O3 Q/ V2 e1 k- |  U" G
更新配置文件
# d' r) y  C+ v% z1 O# |2 i0 M4 Y9 X3 H/ [9 Q
linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_basic_defconfig1 k# F1 r$ W3 G8 Z$ m
( U+ H- S$ s! T2 Z! z- Y, l+ B1 f
重新编译烧写后adc相关错误已经没有了。
: _. `1 k3 `3 Y# }# k) \
) F6 l! l( j  n& N5 Z 0d706dc4c2f5c7e06f9ae191529fde14.png 3 d( m) |1 h; g% a

; s: U( Q+ |( f, U关闭ltdc
/ |$ n1 F1 L% v( {6 k5 {& D由于在u-boot阶段我们不使用显示设备,因此需要将ltdc相关配置关闭。. ^4 g; c! m' r9 i" H
/ }; b- G. N  k% \  A: @
修改
3 p: O1 T! I( _8 narch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件
( y* B# }& t% E$ }/ \
0 e# x4 y/ n" j9 J
  1. <dc {
    : a$ }) y6 q( b5 h9 t* f
  2.   K6 ~8 U) F8 O7 ~3 _1 ^
  3. pinctrl-names = "default", "sleep";5 y  R3 |" |. U* D: T- w
  4. % ~% t/ c+ O1 r; s
  5. pinctrl-0 = <<dc_pins_a>;
    7 j4 I: L; u9 {* m; s
  6. $ e2 L% F3 |$ R# K. N9 Y; R4 ]
  7. pinctrl-1 = <<dc_pins_sleep_a>;' t; C1 Y7 ]0 t. J+ R6 X( C$ L1 O+ ]; C

  8. 6 r' e- A4 T" M3 c2 u
  9. status = "okay";
    6 |. I. M0 L$ q5 G* d
  10. 7 E1 @& R( Z& O
  11. port {
    5 y' @- n. {+ x/ l! J7 b

  12. . w, W" w1 v  h. A9 Z- p, Q5 r
  13. #address-cells = <1>;
    3 R8 [, }9 r. V: w
  14. ' e& i+ W* I0 f) m% h7 Q/ J, \! z
  15. #size-cells = <0>;
    : v' F- y1 R5 U  Y
  16. 9 o! t7 x  b6 S: ~
  17. ltdc_ep0_out: endpoint@0 {
    ! ]% ?5 ]. W+ w! U1 B
  18. : O  \9 m* g% c' J2 t& P& z- e
  19. reg = <0>;( N( q+ x5 A9 R. w4 U

  20. / l6 h7 D8 A5 s& a) r' m
  21. remote-endpoint = <&sii9022_in>;1 Z& H7 Y  i9 ^6 m$ d

  22. 3 w5 i$ `" }3 S* i* u( y
  23. };
    " ~# U! A+ H2 V$ T
  24. : w, E4 k9 R$ z9 Y$ p$ e/ _
  25. };$ T2 ^+ l+ }5 Q: I
  26. " J2 S, L) |* B/ N7 M1 P
  27. };
      Y$ ]% |5 ~2 t
复制代码

0 y8 @  a9 g0 n! j5 d. W4 _8 Y" ]7 \修改为
* W/ l; S! h! c$ u$ e6 h& d, {) O+ V9 P7 p5 Z0 A
  1. <dc {
    . z0 F1 b3 m; c# m4 Z3 G/ ~

  2. ) k$ Y8 K6 W8 p8 H0 U
  3. pinctrl-names = "default", "sleep";  v5 u2 {7 Z+ r4 z$ i9 J
  4. 8 W; a7 s; v+ V7 k3 m5 h: W
  5. pinctrl-0 = <<dc_pins_a>;
    % b9 Q% n! X% Y9 Q, J! `
  6. 8 s5 c+ K! `2 N, t5 Z7 {: L
  7. pinctrl-1 = <<dc_pins_sleep_a>;. O8 ^* v0 w' t& t% M6 W8 j9 U
  8. 4 M& x. S! ]; \3 {- s
  9. status = "disabled";; `# Q5 z" b; z7 {

  10. ( @2 `5 r! f- q7 A7 u; z
  11. port {& K4 k% S& i+ J" e" l0 [
  12. & d9 C. v4 C. {3 S: I; r
  13. #address-cells = <1>;5 z* b0 ]( K7 w( I4 p; I9 H

  14. & D$ {, q, I+ m+ t" y8 K
  15. #size-cells = <0>;
    7 G) i( @# j! `1 }9 L
  16. ( O2 m( D+ x2 d+ m+ o
  17. ltdc_ep0_out: endpoint@0 {
    3 z5 ?+ z" f) b) Q' b# |' f% s
  18. & i& \: z' k) C( r
  19. reg = <0>;6 B1 x% V& s! C
  20. ) C! T' ]" M4 s
  21. remote-endpoint = <&sii9022_in>;4 a# J( R, I! V; e8 }( d

  22. ( b: R9 ~/ i. y& \6 t& _+ |2 `
  23. };
    / B. i0 C$ k5 r/ X7 s4 S

  24. 1 @8 x2 V0 j% g  _
  25. };& ?+ W- O% r/ [9 n" g

  26. ( G& z6 Q1 g7 O7 b
  27. };
复制代码

0 N1 Z- L- R; V+ U* O" V6 L然后重新编译烧写$ ^+ R( D1 B: }. N$ r( t6 r

! l1 U( @1 f  F  H) L5 G- w8 X9 c有线网卡配置. t6 ~8 Q" C. ^% r4 N% b
启动设备进入u-boot控制台之后,可以发现启动信息中有网卡未被发现的错误信息,这个错误是由于u-boot没有设置正确的MAC地址,由启动信息可以看到,启动后网卡的MAC为00:00:00:00:00:00。这是由于在OTP中没有固化默认的MAC地址,解决这个问题可以通过烧写OTP配置来进行默认MAC地址配置,但是由于操作OTP配置的风险较高,如果操作不当可能会导致不可预料的结果。
4 T) `: M0 m0 ]1 v7 }. i' L$ r
  j, G6 D5 r0 ]9 J- X& w1.如果u-boot期间不使用网卡这个错误可以忽略。0 L& w" z+ O! V; I& H' I+ ]

4 d- w# r$ z5 c3 X如果需要使用网卡解决这个问题比较简单的方法有两个:  I3 C( U' K1 N1 r
2 h. U4 T& s5 @6 W
2.U-boot启动后通过命令设置一个MAC地址, `7 ?8 u: N' e! H. C' e
STM32MP> env set -f ethaddr 1A:1FB:0E:69:FD0 d! m5 v! P  B

+ E) u, F8 A+ L  r; _, Z这种方式设置完成后即刻生效,重启后网卡即可正常工作。: ~' P5 P) g) U* |

; Y0 D9 |% A( ]! J& @% E$ ~修改include/configs/stm32mp1.h,增加默认环境变量
0 E0 M5 w9 s9 d! h* S' p. p' L修改如下内容:
# e  z" |0 C4 w# w
4 ]* l7 Z' G0 O+ T) y/ ]0 p2 |
  1. #define CONFIG_EXTRA_ENV_SETTINGS \) M# m2 j* J& I8 U& t1 c
  2. 8 G- F  |: ]3 u5 L2 c6 U
  3. "bootdelay=1\0" \+ l+ ~+ F- f* E) A

  4. 1 Q% @9 k$ K0 B
  5. "kernel_addr_r=0xc2000000\0" \
    : I0 f+ W/ u  M7 R# e
  6. , ]; q/ u  q: M
  7. "fdt_addr_r=0xc4000000\0" \! g" G2 l! ]8 h6 ]0 X' l
  8. $ C3 p. h5 H4 e5 Z* f% x8 m: `
  9. "scriptaddr=0xc4100000\0" \
复制代码
为:
9 M& w3 _" b. j7 D* u
' u5 q7 P! Y0 e; T8 _* B
  1. #define CONFIG_EXTRA_ENV_SETTINGS \) i* c" i. @- ?7 Y
  2. 4 `5 K# }0 s' n+ p* X
  3. "bootdelay=1\0" \+ G9 R* ~2 ?2 n

  4. 9 a$ n- L% S0 y4 K* a) i& d
  5. "ethaddr=00:80:E1:42:60:17\0" \. G( ~) h4 H% B8 d
  6. ) g1 y( ?5 \& V3 B
  7. "kernel_addr_r=0xc2000000\0" \
    / }. ?; v( E$ B1 R
  8. / b) l: o! Y: `& e
  9. "fdt_addr_r=0xc4000000\0" \
    ! ^; G# R" P3 y
  10. 8 m4 u2 t" l* g9 l
  11. "scriptaddr=0xc4100000\0" \
复制代码
/ w( A6 G  I7 p) I/ D5 W3 V
这种方式需重新编译烧写后才能生效。
8 M8 x4 c7 x, v  Q- T8 h  D% T, u7 e0 v; f/ ]
重新编译烧写后网卡即可正常工作:) F  L* g$ o4 s9 v/ T& x
4 \. E6 O. B8 Q) g% H1 M4 ?
4dd7f1edca4dacd8448c0a7a908a4bcd.png " V# Q1 T, B! c4 l4 A5 V5 G
1 g+ ^. ^3 K) a; Q4 i
将网线插入开发板中可以进行网络测试。
9 O* B' v1 F, d2 h# ?. L  s3 `8 Y! l" E/ \1 v' z1 @
使用dhcp命令获取ip地址:+ X2 {2 K. p% J7 Z  O

2 C2 ^! X* b# m' F/ bSTM32MP> dhcp" Z2 v9 n, o" i

4 @1 C; E7 L+ {1 u; R7 b 5d41bc978db2c84ac5953e56615574a6.png
: @6 Z2 M- q6 h2 s% N( n* `6 ]' L1 ?0 O& w
可以看到这里获取到的ip地址为192.168.11.81
7 y4 E/ W: y" V5 |1 Q  ~; m& q9 ^" O8 O2 @  U/ A& L, ^0 ?
Ping网关测试:, |7 s+ N% ~. `' a5 x( J
3 w+ a/ J% l% F1 O, d$ g
Board $> ping 192.168.11.1
& Z: a) [6 M3 n, J! \; o/ L) M
  n' l8 M. s& m1 Y a6ebd286b122c74b2abb3e52b33eeb92.png 1 b# L  A4 M- |) A; |/ I7 U- \

; S' [1 o+ ?5 Z, A5 @Ping外网测试:6 ~2 T$ p" O1 |) m

* i% k# K/ O* C5 J# D0 ?Board $> ping 8.8.8.8
7 X& _) Y: e7 X+ D2 p/ v' c
, E) P' v/ h2 V% V6 g 3e92282bae57bdd4049c1fee35ac2a8f.png   v. u5 K' [9 Q' t3 I) J+ I/ A' E

; w& n9 ?9 w! B4 W# x  g# b: {eMMC移植
+ f! ?7 R% ~! Z! a4 C9 z参考原理图可知eMMC使用的是SDMMC2总线,当前所使用的设备树文件中没有SDMMC2的支持,所以需要增加相关内容才能正常驱动eMMC。
! ^8 m; D. D9 ]5 e3 b& A
7 M1 k& i- ]/ r& }. l& l6 e6 O 006f7f060b89519272af27864b829e56.png
9 s* E( h  f& h2 w1 D  {5 P6 B- m. [7 `% X' ]
由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:% g2 G1 u; V; l! B

5 q' F% K$ ^, M1 X }WN3%I)9%DK06X}92O8(I.png 6 P" x' [+ v1 Q( s) f9 G- R
" |6 X. r$ H! C
1.管脚定义
6 O5 ]* F9 d; z5 A7 F$ C在u-boot中STM32MP1默认管脚定义在文件
! e1 k) O- v, [+ farch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:
# @4 {( M8 H0 L# A7 s& v+ T" Y9 u( A1 W6 ~
查看后确认有SDMMC2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:1 N4 u4 z  [) t/ n- |& d& a4 d
; Y, J- [" t2 \% K0 c
  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 {7 j9 r/ x7 B3 \4 Z
  2. % p% ~: a/ ~% Q
  3. pins1 {8 a( x4 I* F. U0 e1 X8 \/ h
  4. 3 n; D3 j0 i7 g; O( t
  5. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    - s; F. T" X( [  b1 t. K
  6. 6 U- `+ Y) u$ F8 @# U
  7. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    & {7 ]- ]# Z3 k( Q3 j

  8. 7 i) }* w7 K1 `4 A: c! r3 B9 s! J
  9. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
    & ]* J  c! B4 u* P( h3 [6 g. m2 }

  10. - x4 M& V  w1 \7 a: Q. Q% F
  11. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
    9 ?- ^) ?/ v2 _3 i
  12. $ a; k# B% h, y( K% N2 j; Z
  13. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
    7 T; P' X3 z9 `' n: F
  14. $ `3 x1 v( u( O
  15. slew-rate = <1>;% {4 a, N# T' J5 z8 U/ Q, H- }5 Q0 g
  16. , J7 v) z2 l1 P) q1 [# g/ w
  17. drive-push-pull;
    + b, m# S& k7 r7 z/ A& X% ^5 ^- B2 J
  18. ; q& ?$ X8 a$ h0 [! A! R9 h7 Q+ q
  19. bias-pull-up;
    6 _) e1 K+ p+ H. u0 F- C  O& X3 s

  20. 5 y, U0 b( o! {7 y5 O
  21. };
    - h% V. ?5 \* C6 E( p4 C9 Y
  22. 3 E3 N  Q  A- W8 H7 d$ ^" y
  23. pins2 {
    , n4 k4 {; B; P/ V& B2 ~" d( X! Y3 o/ T
  24. " a3 r: A/ J1 X) l/ ^5 Y
  25. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */6 J1 H3 ]% E5 c$ H- [

  26. , [/ G3 q7 l0 X- M, k0 f/ W6 k) n
  27. slew-rate = <2>;* |6 o& O2 Q2 |
  28. 8 v4 s9 u( C: S% F- O( |' V/ z$ Z
  29. drive-push-pull;
    6 y  T  V, W" q" d% p3 y
  30. " o# c7 M/ `( k( f+ ?8 g! ?
  31. bias-pull-up;2 n) Y) v* I  l5 F

  32. ' I4 A, q+ E' l+ ?. a' p
  33. };/ `8 U& L( L0 l* i' L5 h: A& R
  34. ( f) Q" r2 I" n5 y8 h
  35. };
    * P/ {9 \5 L9 e) k4 \5 @4 p
  36. $ V  N! v* g+ U# v% j: ]
  37. sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {
    - f6 U2 s" N9 C: J! O$ ]& P' p5 t
  38. % f5 m) |* Y" t) ^9 G
  39. pins1 {, O( ?, {* |  u+ K8 c3 ^; U
  40. 2 K/ t7 r( @& d7 k0 N7 E0 ~* U
  41. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    $ P( L2 _8 s. R% D- u8 w$ x

  42. " _+ n" p. u$ @0 ]2 |0 `3 m
  43. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */6 }% K$ T: x( j& L& C4 h

  44. / g7 k. B5 m6 I2 n" @1 W& Q. z- d+ N
  45. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
    9 d* _9 H# P# ^# J  ~: a
  46. 8 v7 c+ m0 B2 N. V$ B
  47. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */( J0 J+ j/ S2 a. K, X& U, O8 o
  48. 9 D2 x1 B6 f7 X9 i6 S  q# w% d0 _
  49. slew-rate = <1>;/ e; v8 y0 e( B1 V

  50. 7 E2 \* r" _- M4 t& e
  51. drive-push-pull;
    8 e/ }- I0 ]0 L5 c- l2 ?

  52. ' w. B: z. I# i  f# J' j
  53. bias-pull-up;* u) T6 x- h$ g8 u- w
  54. 5 C5 E5 j2 ]' p7 H  m& u# E- ?
  55. };) h0 b4 m- i- Z" H* z; Z

  56. / |: q1 S) U* P/ q
  57. pins2 {' l' x+ a3 l% z( O4 \' g3 s

  58. ! m' {% {% K- M9 T. U' M: i! Q
  59. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */( f3 V- D5 G+ m8 w, a% J
  60. - D. c2 m5 y, W
  61. slew-rate = <2>;  C- c& Y4 F+ u0 z* J9 X4 e
  62. 2 b# J* F* u: B
  63. drive-push-pull;5 ^- J; ?9 E( s6 V

  64. 8 S' K$ i9 A; ^1 V* @- \
  65. bias-pull-up;4 \% D% h  r  w% A4 p

  66. ( O& U; t; L8 Q) Z$ _
  67. };
    ( I; I6 U3 B( m  d, g; F

  68. 0 {" M3 z" t: `* B7 X3 g; W( z
  69. pins3 {+ x2 Q1 y" \/ r, @  Y8 |. g

  70. " i$ Q2 C3 h% H5 ?) X
  71. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */" G, f$ {2 @$ ]9 k

  72.   M8 ^1 H9 ?* [( b, I
  73. slew-rate = <1>;! f% ^2 U  |8 m1 K* p& b
  74. & A( M& N5 X5 Y1 _' L
  75. drive-open-drain;
    * Z( N) g" H. {/ m# b9 L: R1 s
  76.   V/ L: F4 ?* Q( W& ^
  77. bias-pull-up;8 g" L4 t$ Q: x/ y1 o
  78. : R& K  B& ^; {1 V1 X* y0 L
  79. };
    ( M7 B0 e5 B, r0 }6 d2 R& B

  80. 4 t) g! K5 a1 u) o5 m* [
  81. };
    - j9 d2 F  L( R7 J# h; c0 f* }+ _
  82. # D- D3 c6 O' _  E
  83. sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {- Z7 Y0 }: Q- |6 O7 L* F6 n
  84. ( T4 ?; p! g; R2 m/ C
  85. pins {
    ! a4 l, [3 D+ t9 l. z

  86. & t% C8 f- c" g1 Q, F% P# D3 p8 u
  87. pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */
    / v5 X9 o2 N6 ^
  88. " @# {) Z! ]! V2 M
  89. <STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */
    & u5 r1 i' }- o

  90. # [; |. p: n7 v
  91. <STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */' Y2 v) U( R: o
  92. ( ^/ c5 h* s) s* J' F
  93. <STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */
    1 {- {/ ]8 d# @; L% V: P
  94. 3 X# @+ o% E" s" n# l+ Y" Z5 k
  95. <STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */
    " r  P0 ]" H3 A, U+ z) Y

  96. 4 U5 g4 F, d: V6 t2 S4 E" b; S  |
  97. <STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */
    8 l8 W3 C# I! K3 R. V

  98. ( L! |% e$ z% A, Q$ o+ T) r
  99. };5 I* e' e/ G3 d! t& N
  100. / d3 g6 ?: p$ U/ g/ @# G
  101. };6 ~" h1 C! |1 M
  102. 9 N" Q; y' `# Z1 L0 m1 c2 `* {
  103. sdmmc2_b4_pins_b: sdmmc2-b4-1 {
    * `* `6 X" ~2 L0 \: ]" G. G0 `: \

  104. , H" n% i( X8 f6 n- g* n7 I4 ?. r' ]
  105. pins1 {
    4 M- m& N0 U. N. u: j
  106. ' R5 C2 B6 U7 r7 s  S
  107. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    3 h- ?( R- Y. h: X
  108.   U& S5 a6 o* A% O& l6 }* d
  109. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */9 W, a2 W/ }8 W' e- S

  110. 1 E# x5 T$ m4 }" N& N7 w
  111. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */9 l) X9 `  U' v- C3 s8 O) L/ D

  112. 0 c6 ~0 S! |& {
  113. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
    $ o2 ^1 M  V. Z
  114. ) x6 C# b/ f  A2 F( a& e9 B
  115. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
    " d( Y7 D- V( F

  116. - w+ @) e6 a3 a5 H: W
  117. slew-rate = <1>;3 p' {7 w: @7 j: {
  118. ) z9 Y) y( W7 o# r, B$ |
  119. drive-push-pull;
    ' {2 T* z8 s4 \7 m
  120. : l. D# Q4 t& _) y; C* f* l& f* |7 `
  121. bias-disable;5 E. ]. a+ x7 ~8 L* e% Z
  122. * a: s( P2 {! Y1 G8 t% l' z: R
  123. };2 `" y7 {; d0 y% l

  124. : ?$ |* [5 e- `% B" `, E
  125. pins2 {1 M3 A% e% a) C$ P7 h+ d1 F) a4 n

  126. ( o% v6 a, X: q0 W
  127. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
    4 p7 C8 A6 K* P& b/ ]6 Q

  128. 9 L; @: }# u+ o- D' U
  129. slew-rate = <2>;
    $ A& I& S! \3 _

  130. ! F% y0 Q6 W# C8 F
  131. drive-push-pull;1 V, A1 |7 q" P. y% @. _

  132. ; k6 h* O( j8 f! `( L( ?
  133. bias-disable;5 h0 a% T( a7 v8 X; _# |% n

  134. ' }( h9 X+ K. V4 A+ ~3 q) C' u  ^' B& f
  135. };
    / d: x0 n3 U+ p5 I2 G! ~
  136. . t, X% Y% E$ c2 v4 o- S
  137. };
    & C, l7 R6 G* I3 D. q) X0 G
  138. . J0 N/ V! L* U4 r: m6 G9 ^
  139. sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {( y; f: K+ `( ~0 i0 j9 a. X/ P

  140. # y* e/ y  Y' k; Z1 S
  141. pins1 {
    8 r# Z4 F7 j# F8 E0 \! w  s
  142. 0 X- J& y+ |2 y* P# p' W
  143. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */6 m0 Z' \; _, ]$ s# `

  144. 7 }7 B! z0 c* c
  145. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    ! a' a, h3 [/ O' z4 ]7 _( ]
  146. ! g0 u) j+ X- q4 ], k8 W0 T1 d
  147. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */' r6 P! u0 b3 p; @5 k0 t
  148.   C4 Z2 a6 \9 _1 I0 f( C
  149. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
    ' @! E; D8 z7 [" p( K# l
  150. ( v- U/ H/ ~+ L2 U% e; l& y
  151. slew-rate = <1>;
    7 ?6 c- T4 D* Y' |7 S

  152. " B* V2 Z! w5 l3 P% ?2 K# o4 @& N& u
  153. drive-push-pull;% _1 J& Z5 r" f" g  H) z( f! h7 m

  154. ) W( @2 T! i0 X) s. a
  155. bias-disable;
    0 [& B* s& j) O  G6 c3 Z: v# U

  156.   G+ F1 m4 P7 B9 _6 }  V
  157. };
    + D& G/ j# Y# r8 S1 i

  158. % D8 i8 W# D" ^$ v9 q, C
  159. pins2 {
    : C- V0 M" E8 b$ n1 b3 `; a& [
  160. 7 J; y" K$ L6 _( Y% T
  161. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */: j( Y9 ]% }# r
  162. + B# V. u- Z. T" U6 p7 R
  163. slew-rate = <2>;" W2 A; ?$ ~0 j/ V
  164. ' q' \* d8 I3 M) U1 p  Y4 Z
  165. drive-push-pull;
    " J) l, D: z2 i

  166. & ~& K; ]1 k; @+ s8 s
  167. bias-disable;; U  y4 Z9 ^* Y! j+ O
  168. / R. v4 w8 N3 O" t/ [: m
  169. };
    ! r0 I( x' H1 q- u

  170. ! S# m$ V5 T* j" c8 p+ [9 \
  171. pins3 {
    / a7 M3 @- J8 w7 r) ^/ p( [( V& u

  172. : C% b) ^1 o! W% }8 _: T
  173. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
    , V, ]" W7 H- u3 P5 c5 e' ]- Z

  174. ! n$ y: \0 ?2 b% b/ i% C  a  l" _
  175. slew-rate = <1>;: E9 O$ I8 ]8 j- W" t* q

  176. + l6 H5 h" v0 s7 B, n
  177. drive-open-drain;
    : }- e6 P$ H1 ~1 D" Q

  178.   O0 ]  ?( s' j3 q6 C6 u* q
  179. bias-disable;
    " }7 }. e- i8 I8 |2 V/ u
  180. ! B: N' b% O! b, T2 j) S2 l( u
  181. };
    / o8 q4 u5 z) S- y% b  u& N

  182. 5 `2 H( x+ ?& k! V7 |3 O* `; \
  183. };" [% U4 u- W; S" W% A

  184. ) E$ e& S3 {) A7 ~/ k
  185. sdmmc2_d47_pins_a: sdmmc2-d47-0 {
    # }& K3 z7 m$ k% j* L# s
  186. , m1 D$ P4 g- `. w
  187. pins {
    ! p; d2 V$ ^5 D( \1 ?

  188. 3 t6 i4 {0 B! F7 ~
  189. pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */
    # U( ^: M; e1 Q- j" U, r; t4 U, |

  190. , R3 v+ ^3 W4 v7 ~
  191. <STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */
    / e. }* C, a0 z
  192. ( l1 m( G# J$ C% E
  193. <STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */2 W2 O: m; W; Q$ V2 |
  194. 2 k9 r! E1 b  V& R7 W9 @% r0 A
  195. <STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */% f( g% c* w  Y+ N7 B
  196. 7 u- t2 }' r  s$ |
  197. slew-rate = <1>;2 L1 W  k: e9 H5 @! K
  198.   r4 i% P5 D! ?1 @) M7 `$ G5 K
  199. drive-push-pull;
    / `, r9 F/ h" H: g3 G9 ~8 f( N0 n7 r8 Q7 @
  200. 2 {9 E7 [" B* @2 A/ a# }( d
  201. bias-pull-up;
    , V6 @4 C2 H! @& r8 u# [5 p. c

  202. * F2 c. A7 x, j- C
  203. };7 @( O) o  I( Q0 u. s# h
  204. 7 g% S1 \* t8 Z+ T7 G
  205. };) z, {  G8 S. K5 ^& l! P
  206. 0 h, v5 ]5 F/ l4 ?2 \
  207. sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {
    6 B# X) K" X% h

  208. 7 P: M( D2 Y4 t. `. R
  209. pins {
    8 K! \: a. D' f6 ^# e

  210. 5 M; R" F1 h! e2 k% t
  211. pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */
    1 O4 K; G3 G1 w, Y+ }- R) s) a( Q
  212. $ a' E" Q+ V4 ~6 D9 Q. i7 Y
  213. <STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */
    " |5 y% \) }$ ?8 B: L  A

  214. * R. l3 q' c: m# B! l, O
  215. <STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */
    ' ?( ?+ [) P( ^. ?! e- N( j

  216. 8 n- o5 z; g- m3 c
  217. <STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */8 k$ ?  S% x& @% s6 D- G
  218. ; n! ^5 }4 @+ X/ A: x: c
  219. };
    + U2 R. @& y1 W. e7 h, W
  220. % [0 D4 b- r9 H
  221. };
复制代码

: D% w9 J# P3 C) a" x, U- B2.增加SDMMC2节点信息
/ `+ Y9 {! x3 c- N% {5 H修改
+ j6 [0 l6 K- zarch/arm/dts/stm32mp15xx-fsmp1x.dtsi增加SDMMC2的信息9 P% {( {% W- T* D  u/ t) {" \8 |

5 ~" f6 k5 y& p在原有sdmmc1节点下增加sdmmc2的内容,添加内容可参考0 D( c' d3 _# i7 r
arch/arm/dts/stm32mp15xx-edx.dtsi中sdmmc2的写法,内容如下:
! q6 `- N5 ?8 T# X& c0 A5 i# |2 X* X: n0 X
  1. &sdmmc2 {3 t6 \( c4 m. s( Y4 J7 h

  2. 2 [" P" _; v! t( {
  3. pinctrl-names = "default", "opendrain", "sleep";! \4 D+ ~$ P$ k# ?
  4. 1 d. M/ [7 c8 Q/ L9 }' ~
  5. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;& _+ @; ~7 t+ d9 s" U

  6. 3 t' z! d  _1 |/ y
  7. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;
    " y% [" n1 r4 v
  8. 5 [7 K. Y, C, f3 R; o, X3 E
  9. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;. q& s1 v) t2 |' u
  10. 4 B' q/ L. Y2 `3 @9 C
  11. non-removable;
    7 [8 e$ S; a3 r* i
  12. , t8 D. B7 @$ ^$ P, y6 Q5 V; q+ T
  13. no-sd;
    9 [  p9 m: S% q0 M6 E* M
  14. 3 S7 t# z0 b0 s6 W. Q
  15. no-sdio;
    4 a$ c! K! }$ X* m

  16. 4 u& `& p3 `/ G' a" F+ r7 K# [
  17. st,neg-edge;
    / u% L* ?" J8 G" \* ~; V! c- S+ X( b
  18. ' U; O4 @, f. e: `9 ]
  19. bus-width = <8>;
    2 Q9 N1 E! i8 d
  20. # q+ S* n. d7 w
  21. vmmc-supply = <&v3v3>;
    % w9 J/ [" m0 B0 }  F3 x' N9 ]
  22. 5 x' M$ S2 V. Y" P- A" P
  23. vqmmc-supply = <&vdd>;: V6 s% ~+ V' W7 A& q
  24. 4 A$ M; w* T) ~& s
  25. mmc-ddr-3_3v;; X- J% G, U! c3 d
  26. / L* v, g! |7 E" r
  27. status = "okay";# k( d* Q% F# F1 _7 {* J$ J
  28. & n5 N/ |" K% E6 J7 W4 K1 m" p1 j
  29. };
复制代码
3 S# E' j- J3 m. h
3.增加mmc映射
3 ?/ m# e: }! H) n修改
& [6 K- F: H4 c! }$ R8 J4 ~( {. Y8 a9 P9 s8 Uarch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi文件,调整启动通道。8 |: ~2 F, K5 P' |, Z

8 g/ T$ D# C7 {6 ]2 _4 j. `修改如下内容:" c  l# n( u5 j" ^4 s
. J% u& ~. [) P3 w  Y9 E
  1. aliases {& ~0 R8 j/ v6 ]+ u
  2. 2 P' F8 n: K8 U# n
  3. i2c3 = &i2c4;  Y6 g( i( k2 m; q6 v' n
  4. 7 c. B" l3 v$ Q7 Q& R
  5. mmc0 = &sdmmc1;) s/ n# u; }5 o$ r; N1 H
  6. ; C) L/ {* |$ b0 u: x4 @" H
  7. usb0 = &usbotg_hs;+ S) P. g- ?: u/ w  a9 k6 ?5 W. d
  8.   a3 R5 r  j* g% m6 a# g/ h1 f) u
  9. };
复制代码
( C6 l- Q/ l' g4 _$ |" w
修改为(红色字体为增加内容):
* o5 ]6 U3 h( E( _7 Y/ Q& U' L& l6 A2 A. T  x3 G/ Q/ r# V: M, L
  1. aliases {) f' f' z& g5 ?4 N  {2 \! B+ Q  m! {. y- l

  2. . Q  J% f$ g2 m1 {
  3. i2c3 = &i2c4;$ w9 h& ]/ ?- i. a& [

  4. ' B) I- K' Z2 s) Z9 N
  5. mmc0 = &sdmmc1;- N6 d6 ~' B$ E7 h" n$ ]4 Z" B
  6. ( d8 w% p# i7 ?  |( ^, S% z, B
  7. mmc1 = &sdmmc2;8 H- h9 T" ?' X; K
  8. , [5 u6 `2 G& ]& Z, D- V
  9. usb0 = &usbotg_hs;
    % m! I+ F! q: k' z

  10. # z7 X/ }5 p$ s- n: Y/ c% i
  11. };
复制代码
2 K9 q4 [; [2 Y! s# v7 G; M
在sdmmc1节点后sdmmc2的内容(红色字体部分为添加内容):9 Q, D, _3 O4 j, @- o
2 T: p) s: f+ g& m9 J( S
  1. &sdmmc1 {
    ; s' ]& i. \# T5 Y5 X6 B4 w
  2. 7 m, S# G8 {5 [) P
  3. u-boot,dm-spl;) T( l  K5 W) l; H8 ^) g# E2 J

  4. 5 a$ t& S$ H1 r/ D3 @, l
  5. };) f  S3 K6 h4 x
  6. " y4 m6 D3 ?/ s5 D9 F9 K" e, i
  7. &sdmmc2 {
    0 d4 Y; s  B; b7 u) e
  8. - E! z# Q5 q# s
  9. u-boot,dm-spl;6 s$ |7 x( `2 S2 a% j

  10. 4 H$ J7 w. }5 I, E9 p3 [
  11. };
    ( w6 J% f# L; v1 D& Y- {2 _
复制代码

% R: b( w) ]7 t$ D3 B& r4.测试
$ D6 Q# B5 |# a# |$ R重新编译烧写后启动信息对比前文多一个MMC:4 V, F( P% Z' `  q. O. t# R& y& w3 y
  P# n% z9 V% K6 c
2cac56e284a80e97f9198b8b70ef60dd.png
* B2 X" i  Z, @) W  A( E# ?0 N- g& d5 ], e  B# i5 P
eMMC的验证需要通过linux更新,相关操作可参考《通过linux更新eMMC中的u-boot》章节。
6 `  M6 ]+ o, R, C% a, Y- t* W
% Y3 N& A6 y: J- A  R4 s生成Trusted镜像

; f6 E8 c7 S5 R前面我们做的相关配置都是基于basic的配置,而实际FS-MP1A使用的uboot是基于Trusted配置的镜像,后边的《Trusted Firmware-A移植》章节会使用到Trusted镜像。
. F5 S) o8 g' d! V; g" |/ g; M
3 r3 T) }* H* _: g$ t4 g1.建立基础的Trusted配置文件
' g' m  H. I' `7 |6 `' ?linux@ubuntu:$ cp configs/stm32mp15_trusted_defconfig configs/stm32mp15_fsmp1a_trusted _defconfig) J6 x3 a3 C2 F! h6 v

) C5 d2 c7 p4 r& i2 a! I% N0 _, vlinux@ubuntu:$ make stm32mp15_fsmp1a_trusted_defconfig
7 v$ Q. a5 M5 W. Z# X2 h! {+ o" o# v, x! j% F$ q/ H
2.去掉PMIC的配置选项,按空格将方括号内*号去掉:
' o" g' s# ]8 ilinux@ubuntu:$ make menuconfig
& e) N' l2 K+ E' L
! {3 F, \- B' I% R/ GDevice Drivers --->1 k7 Q6 i* Q: P. Y% j

0 x3 U+ A- s) n% h' f4 kPower --->$ g9 f4 A; ?3 p# E7 y/ T7 @

* M& n: u2 J( g! |[ ] Enable support for STMicroelectronics STPMIC1 PMIC0 B+ f8 L" u( r, d1 @4 A: |

2 |0 G, M( o5 x& M3.去掉ADC功能:按空格键去掉[ ]的星号0 T$ O& u! f$ h" T% I/ H
linux@ubuntu:$ make menuconfig
5 H8 F6 s5 \! ?
/ [* q' O2 n& t# n: P9 @Command line interface --->
4 n* w8 }2 ~/ Z) P9 N# Q
2 G' G: ]" n) W6 ~& Y; JDevice access commands --->$ K: S- h4 X6 G/ u! X: E6 X
! K( h5 `+ P; P3 X$ C0 y) S
[ ] adc - Access Analog to Digital Converters info and data' r/ w% l3 G, W
# l$ L! a5 C! i# }( C
Device Drivers --->5 q- |5 G0 n6 |) {( U; L( _# a& o

1 V0 L$ R' L! S6 f# S# X  ^[ ] Enable ADC drivers using Driver Model
- \/ X" T9 Z  ]; n7 D) k/ ?4 U6 \# S/ |9 ], C
4.修改配置文件" B3 U5 m/ k1 i
linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_trusted_defconfig
! z) Q  Q% |6 c7 U- B. }$ V$ G3 G1 }% |* t/ b
修改上层目录下的Makefile.sdk编译脚本在UBOOT_CONFIGS配置项中添加“stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32”在DEVICE_TREE配置项中添加“stm32mp157a-fsmp1a”
; ?3 f  `+ K, F" u9 Y0 y9 fUBOOT_CONFIGS ?= stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32 stm32mp15_trusted_defconfig,trusted,u-boot.stm32 stm32mp15_trusted_defconfig,optee,u-boot.stm32 stm32mp15_basic_defconfig,basic,u-boot.img* G. K# [. e' g: K! G- ]. W
  q- F! ?: f1 i  j4 m, J& m3 P
DEVICE_TREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1% B# D5 ^! M1 {

2 o9 E) `* T" T( U9 K5 ?5.编译trusted镜像
# u8 q5 W! {; W' Plinux@ubuntu:$ make distclean- q2 C* v: A7 f5 F4 t

1 ^8 q- }( ?; l" {- E- Tlinux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32
9 v/ u) S$ f* I
1 _( P& h& u, g( K# x ad036c93e9e4360337f601e438f24f21.png 6 r9 S% y3 x2 b  q

! f! \; m3 A5 Y& o3 \- b编译完成后生成的镜像文件在上级目录下的build-trusted文件夹中有一个“u-boot-stm32mp157a-fsmp1a-trusted.stm32”9 v' [' v; X1 f: L
linux@ubuntu:$ cd ../ build-trusted
1 K! J9 ]. ^; J6 E% T4 |- K6 ?9 \- q/ y1 Z% ?9 f4 X: J. E1 R# L
linux@ubuntu:$ ls
; m1 D' L* X3 c% q) C1 T' @: K. h% t" ]7 V9 V* K0 ]8 {+ Y7 `$ p8 Z
e0ff14fcb1c57db1a2e2b6cdd0ea9abe.png
* {1 c5 C. ]( ^3 p
' d; i' J: s6 V- F0 ou-boot-stm32mp157a-fsmp1a-trusted.stm32即为我们后续会使用的镜像文件。
  ]9 D$ J# t  x4 X% v————————————————- {$ q5 W$ A8 p
版权声明:华清远见IT开放实验室
4 ^9 S6 U+ Y6 L( K2 M. N! Z, ^
. k2 j" t3 o6 n+ b* X' W0 p9 v
$ ^2 s! \& p0 [7 D: I
赞 收藏 评论0 发布时间:2022-10-1 18:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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