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

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

[复制链接]
STMCU小助手 发布时间:2022-10-1 18:37
实验原理
0 ^& c5 ~/ ^$ A8 a: A8 o+ ~概念
+ y& ?8 ]1 T& y  a: K$ n
简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。; X# E8 V. ?# b; J/ E& k
6 `; u4 w6 Y9 s! ~
通常,Bootloader是严重地依赖于硬件实现的,特别是在嵌入式中。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出一些通用的概念来指导用户特定的Bootloader设计与实现。9 I6 E, g0 [7 m! M( ~1 W  V
; K0 `' d! _; y6 w2 J; m8 Z, a
(1)Bootloader所支持的CPU和嵌入式开发板
6 c8 _8 ^9 x" T. K, m& v9 o5 ^1 k# P8 R) g! A* z* G# {
每种不同的CPU体系结构都有不同的Bootloader。有些Bootloader也支持多种体系结构的CPU,如后面要介绍的U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,Bootloader实际上也依赖于具体的嵌入式板级设备的配置。
% k; \1 S% m3 _/ t
# V+ q" B' Y. G6 o6 i; ~(2)Bootloader的安装媒介
, N* E! z2 l4 d' `/ E* t# Y
" z9 _7 E: I1 B) ]$ _: F. z* D  F系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。而基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(比如ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行Bootloader程序。0 F& s' U: n9 a

: n4 |, z4 R$ Y6 o6 y1 [(3)Bootloader的启动过程分为单阶段和多阶段两种。通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性。
% A$ u6 q' {! e$ K
$ {  Z$ U1 A! ?+ N2 ~' f$ t+ x(4)Bootloader的操作模式。大多数Bootloader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。! ~" e& P" L. o  C- Z& D5 J

: \! k' @' Q9 ]; Q7 V• 启动加载模式:这种模式也称为“自主”模式。也就是Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是嵌入式产品发布时的通用模式。
4 v- w2 O* }8 i' k+ {4 y8 @- A. V! a" W$ R7 i, }6 K; J
• 下载模式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。Bootloader的这种模系统是在更新时使用。工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。
7 @/ X& w0 v, x$ V+ o+ d0 M
5 B% R. t2 x5 R9 z/ g(5)Bootloader与主机之间进行文件传输所用的通信设备及协议,最常见的情况就是,目标机上的Bootloader通过串口与主机之间进行文件传输,传输协议通常是xmodem/ ymodem/zmodem协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。
. H- w9 \# m5 G$ q8 q! C! w% K* O* Q8 y8 M
Bootloader启动流程
# q- i" \7 Z9 X& ^- CBootloader的启动流程一般分为两个阶段:stage1和stage2,下面分别对这两个阶段进行讲解:
5 a7 Q2 n2 K1 x; r/ g# s8 w3 A* q
' a3 P* ]/ y' A(1)Bootloader的stage1& T1 H( a+ n5 ^* y$ g

( t# H; k: i% m+ p. X4 s( J在stage1中Bootloader主要完成以下工作。/ S8 b& n) s9 F' d! ]  @+ N
& x& ~" k0 _: I( A" J# |
• 基本的硬件初始化,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化LED、关闭CPU内部指令和数据cache灯。& ~6 _& s- I' R' M! A3 {
& M5 y3 v) p" t
• 为加载stage2准备RAM空间,通常为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载Bootloader的stage2准备好一段可用的RAM空间范围。
% U$ E. N- Z# R5 y8 B8 {0 O
. q5 K8 V( @0 T0 D• 拷贝stage2到RAM中,在这里要确定两点:①stage2的可执行映像在固态存储设备的存放起始地址和终止地址;②RAM空间的起始地址。+ i* \! k1 B0 h* `
: A, T' G: B) Q' ~( e9 E& R. c- D
• 设置堆栈指针sp,这是为执行stage2的C语言代码做好准备。$ `- t& E4 {! ~& m+ K( s) o

& M- K6 w* m2 l) ]; O(2)Bootloader的stage2
! ^9 a3 b. }. E* C/ x
. n$ r2 ]3 w0 s在stage2中Bootloader主要完成以下工作。
  M5 Y/ {  J. L3 G8 h
& B2 c% H* k# u1 s/ f+ @! Y# G• 用汇编语言跳转到main入口函数
/ [6 ~; a0 {/ |! l
  D5 D' d1 l, \( H: u1 l$ G由于stage2的代码通常用C语言来实现,目的是实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接Bootloader这样的程序时,不能使用glibc库中的任何支持函数。" {9 }& u5 G& A% y3 _! a% H) i

) K" X' m: S$ C, P$ r) Z: a• 初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。在初始化这些设备之前、可以输出一些打印信息。
  _* g. D9 x& E$ L+ T% z
7 @4 b( ^4 L4 O4 o; H- J• 检测系统的内存映射,所谓内存映射就是指在整个4GB物理地址空间中有指出哪些地址范围被分配用来寻址系统的RAM单元。4 E# ?% M+ \* |) Z! a9 q1 Z" i  u

7 y/ I4 v( C. j" E" q& M• 加载内核映像和根文件系统映像,这里包括规划内存占用的布局和从Flash上拷贝数据。
9 r# A* I8 ^- l" C! n
+ V. u5 W1 v6 X5 X; L& v  n, c8 g• 设置内核的启动参数。8 c) Y$ q9 E5 ?# W
/ o0 u  t1 k1 F6 u* h! x
Bootloader的种类
1 T3 b" f3 w1 l. H: c4 X嵌入式系统世界已经有各种各样的Bootloader,种类划分也有多种方式。除了按照处理器体系结构不同划分以外,还有功能复杂程度的不同。
4 r9 W2 e- o6 w/ \0 j7 s- I9 B/ a$ q: u
首先区分一下“Bootloader”和“Monitor”的概念。严格来说,“Bootloader”只是引导设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。“Monitor”在嵌入式系统开发过程中可以提供很好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以,习惯上大家把它们统称为Bootloader。
& x& b5 v! _" a0 j; _- k0 `2 Y- p" B7 l# t! r, V: U5 Y+ z$ b9 T
下表列出了Linux的开放源码引导程序及其支持的体系结构。表中给出了X86、ARM、PowerPC体系结构的常用引导程序,并且注明了每一种引导程序是不是“Monitor”。
' ]6 R2 }+ l, b6 {" I 1~%I9SCY35]A@M{]$A6E[GQ.png
- j( {' m8 u0 D4 T# z& T. f; N" @! ~$ X
对于每种体系结构,都有一系列开放源码Bootloader可以选用。9 z# h" I, M# z, h( v* e
4 s# G2 ~; ]+ b. x. ^8 s
(1)X86
/ d( R! m6 Y, r; g- `
6 R( k6 i: c/ x0 wX86的工作站和服务器上一般使用LILO和GRUB。LILO是Linux发行版主流的Bootloader。不过Redhat Linux发行版已经使用了GRUB,GRUB比LILO有更友好的显示接口,使用配置也更加灵活方便。* d* Q8 \3 D1 A9 G: u/ r+ W& v  `$ b

$ \( L0 X1 ]6 |! H3 T5 p& i" B在某些X86嵌入式单板机或者特殊设备上,会采用其他的Bootloader,如ROLO。这些Bootloader可以取代BIOS的功能,能够从Flash中直接引导Linux启动。现在ROLO支持的开发板已经并入U-Boot,所以U-Boot也可以支持X86平台。
. K9 E' W' i9 F7 u% l' q8 r3 f7 ~6 p
3 x9 H0 I$ ^' P; {% T, b(2)ARM
/ f( k0 _4 |% w( p* s- t1 g8 u" C8 e" u& m7 b: B
ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM Bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的BLOB,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
! c0 b0 N: X( V+ V6 s$ Z9 x( w2 K+ ~4 j' q0 F; q* d! n2 H
(3)PowerPC
$ i( L- K  X6 S8 y' l
( ^% D  V% ^. c. c% [9 mPowerPC平台的处理器有标准的Bootloader,就是PPCBOOT。PPCBOOT在合并armboot等之后,创建了U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是PowerPC平台的主要Bootloader。% P# \% e' Y' \* ?. [- r( Y
1 p7 K& e% B; k2 y. X
(4)MIPS: }5 v5 H# A' M# R" @5 }

) o3 i2 g5 T3 lMIPS公司开发的YAMON是标准的Bootloader,也有许多MIPS芯片商为自己的开发板写了Bootloader。现在,U-Boot也已经支持MIPS平台。
/ {9 G1 a/ i% ^8 l$ o
+ x9 y: F; S8 L(5)SH: x( O) {$ {" a  \4 U* o6 g

! |7 ^' k' @. E2 f) Z. [SH平台的标准Bootloader是sh-boot。RedBoot在这种平台上也很好用。
# C( b9 L. ^' a" p
7 [! X2 \# ~/ R(6)M68K
' g  x  a8 x+ A3 Z4 r3 S. N$ f0 j# b( s' D8 a0 I/ Y% ?: a' a9 k
M68K平台没有标准的Bootloader。RedBoot能够支持M68K系列的系统。& e! }+ [, _7 o
* ]4 R0 G* l2 z
值得说明的是RedBoot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等。RedBoot是以eCos为基础,采用GPL许可的开源软件工程。# i* J$ ?5 \) x- y/ O  M9 _8 V

* I8 h. A0 X' x, Q3 B, NU-Boot概述
0 N# w5 E$ c5 ^' DU-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的支持最完善。
. |% Y8 ~* x! q# G& a. d; f, b; j1 h) ]+ c* i4 O. i
U-Boot的特点如下。4 S; E6 _" b# n7 d" a; P

* Z" ~6 y: d# N• 开放源码;
! |# M# d/ N. z6 O/ r$ ~$ N% q, c" }' \( j) [
• 支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;: R1 ]: ?4 c% {2 T1 @+ d

! z3 g8 F  ]7 f, o2 O: a! z3 E% U• 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;3 f/ H9 S) `* c% G3 G8 i5 L" M2 p1 J

+ X( T2 M& h/ r- Z# B1 h8 X/ n( J• 较高的可靠性和稳定性;
4 Z9 C8 |, E0 ~  O7 z3 ^0 v5 ^' s4 Q) }" M" }. B
• 高度灵活的功能设置,适合U-Boot调试,操作系统不同引导要求,产品发布等;
1 I5 @. _8 b2 [
2 s" v7 L" ]/ Q) T: U2 h• 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
% T  C' v% r) N$ u' q) a$ P+ [" r0 o- C% x$ J3 K
• 较为丰富的开发调试文档与强大的网络技术支持。  Z7 v# N) y1 {, f( F! c$ k) p
7 R4 `8 [$ L* O! j# T6 H
U-Boot可支持的主要功能列表。- F8 F' t$ s7 u$ g8 ~/ p

7 \( a0 D, k; F! n: p" k3 Q# q) }4 m• 系统引导:支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统。支持NFS挂载,并从FLASH中引导压缩或非压缩系统内核。% w' k5 G4 f/ i* S
2 t1 P8 `& o- p% i" e) g
• 基本辅助功能:强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好。) ~4 m. {4 p5 T. n$ q

% U7 \# H# _! ~- R! [  C• 设备驱动:串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持。4 L  l% B( J& w/ b0 d0 {

& U, U8 _: f" U! X+ I' }• 上电自检功能:SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号。( S3 r9 p- y% K2 n6 K
8 K1 P% J: H7 E8 c, k3 Z; S. p
• 特殊功能:XIP内核引导。
1 i# f$ l  M* G5 a& U+ ], [  \! t
5 R$ k; U" M9 Z5 d+ R6 Q, SU-Boot的常用命令
8 b0 ~+ n* M2 K& ^; J2 qU-Boot上电启动后,按任意键可以退出自动启动状态,进入命令行。7 l3 N- Y9 c, G! X4 a( t
1 @* e0 b9 U$ S
U-Boot 2020.01-stm32mp-r1 (Aug 05 2020 - 05:32:37 +0000)
- c# r% W0 `3 Q$ d7 n6 a2 e- R, {# v+ I5 @. h
CPU: STM32MP157AAA Rev.B
. k9 B# u0 c- \; k! ?: _" F& }; Q7 O
Model: HQYJ FS-MP1A Discovery Board
5 M) \2 `$ L4 w9 [. L# z$ {1 q) F
7 X" p- N/ o: H. M4 G# x) yBoard: stm32mp1 in trusted mode (st,stm32mp157a-fsmp1a)
; C2 ]# l! K: N6 A% Y% o+ q! I8 w" m$ p' T- c4 i
DRAM: 512 MiB
4 s9 j% L2 x1 _  t7 a
9 @  C" z% k* m- _/ N+ E/ V$ a4 BClocks:
) t+ u6 t3 [! K# J( x1 w- v& l! _- [& }- C% \% L. N
- MPU : 650 MHz8 h. j  B: _6 j; ^

$ w8 i7 j4 ]# C9 o- MCU : 208.878 MHz
+ E. x9 v8 o0 D1 W# o8 N& x; @
- c" S2 w5 ^' ~- AXI : 266.500 MHz+ }; _/ T4 p" k

' U$ h9 ?5 r* `  }- PER : 24 MHz/ F7 F' U, k2 A  N
9 S  u* D. n7 m1 y& z$ ]
- DDR : 533 MHz: |; I7 _0 d" _4 C: n! K; `

+ x$ C* n& s3 @0 x0 C. HWDT: Started with servicing (32s timeout)3 |- s- z/ Z! b2 c; @

. P. E- c7 g( j2 X; t" J& s! f( U& QNAND: 0 MiB
! E* B+ p6 u1 M; q* g# u$ ?  i. I9 [0 I# M
MMC: STM32 SD/MMC: 0, STM32 SD/MMC: 10 K& k* n# P/ w* N

" r+ C% F, `& j& nLoading Environment from MMC... OK( U3 f8 M8 k3 K9 U4 D4 x( x8 K  d- o$ G
& I9 U5 K. l) J0 s. |$ L
In: serial5 t3 W# E/ M2 ?$ Z8 l2 k

7 Z0 m! R8 m; g6 A. K, POut: serial
& w. K! V& ^! N
9 Q0 X/ t& u( Y4 MErr: serial7 c  E/ Q& A! y2 Y! Y' W! i
8 B( R5 h& L! W! M5 D% f( O% }  g
Net: eth0: ethernet@5800a000
, _% G1 U5 U1 r6 O$ m3 M* C, B6 F% |& m& i7 N
Hit any key to stop autoboot: 0
4 V; s& R( X) f7 D' h" e6 S! Q
6 u" F. K0 ?# W0 |% H1 i  z" xSTM32MP>
, H0 y! b. G1 B$ k
) B* q1 X! d% N( y/ T在命令行提示符下,可以输入U-Boot的命令并执行。U-Boot可以支持几十个常用命令,通过这些命令,可以对开发板进行调试,可以引导Linux内核,还可以擦写Flash完成系统部署等功能。掌握这些命令的使用,才能够顺利地进行嵌入式系统的开发。/ d7 N: v4 u( j1 v
2 q$ `8 q3 o; n, p9 c
输入help命令,可以得到当前U-Boot的所有命令列表。每一条命令后面是简单的命令说明。
; Q+ I% ^6 \8 ?+ b  |! D# V$ f$ X# C0 Q- o" V8 V0 d) c0 p
  1. STM32MP> help
    3 z3 |1 c# N/ A' Q  }( v

  2. - A/ B6 {9 v. n+ j/ T& `6 H5 B
  3. ? - alias for 'help'
    , F: F7 w3 A, @7 a0 M4 Q

  4. . Y( X5 P+ H1 A+ S, V9 X
  5. adc - ADC sub-system4 k! K  o8 r$ C( f' S: N1 f2 t8 E
  6. & Q" t& u* C1 B0 q+ O6 q
  7. base - print or set address offset, y% Q, X. G3 T) `; [5 X! A
  8. 1 Y8 w4 Y) j5 u4 S# f& n' K* n) j" m3 L
  9. bdinfo - print Board Info structure
    4 l, f/ c& g- {7 w( E8 v2 I

  10. 0 `8 r- W6 E0 ~. r4 L
  11. blkcache- block cache diagnostics and control
    5 o$ l! x, Y+ o# M+ K* v

  12. . t( E' n$ f+ Z, s
  13. bmp - manipulate BMP image data, q+ ^+ Y! Z. w( Z2 T7 A( x8 `7 L
  14. 4 z# E! A5 m: k* `! P$ H
  15. bootefi - Boots an EFI payload from memory, l+ Q% I% o9 r/ ?- H( S
  16. " c& h( M2 f! S5 S" H; r1 g
  17. bootm - boot application image from memory$ r' N# I, r) k& x+ y
  18. : u/ v4 F1 D$ H$ J  x' }# f2 \' M, w
  19. bootp - boot image via network using BOOTP/TFTP protocol. j- n# `! N6 x2 ]3 P
  20. , i: D( U! c8 b# r8 s$ o+ _/ ?% n
  21. bootz - boot Linux zImage image from memory  @! |" K) f* t' }

  22. / o* ?# u, @) ?! ^
  23. chpart - change active partition
    , n9 _; F: p$ I& S$ O

  24. 3 K# e' F9 q5 K( b! L7 x3 F
  25. clk - CLK sub-system
    ( f  l/ D) |% P& ~1 g
  26. % c3 D( {- Y- a/ F# N
  27. cls - clear screen+ k& f7 [  I4 E) T8 H2 W

  28. 3 v& r: p9 c" s% B+ A
  29. cmp - memory compare
    - W0 _) W1 ]& q
  30. ( N; I: g2 Y, S
  31. coninfo - print console devices and information
    . s( y0 ], q; @3 c

  32. 2 ^) y) G5 G' v: z" [% e0 a5 C
  33. cp - memory copy( F$ @! p( I# G# n

  34. ) P6 H& l1 H8 m8 i' y
  35. crc32 - checksum calculation, r' V7 j! S6 _  Q* [8 C# ?
  36. $ x1 B$ x& y& F, L
  37. date - get/set/reset date & time4 X& Z$ N4 ~/ N

  38. : G# \( p9 _6 G1 C1 [
  39. dcache - enable or disable data cache
    0 m2 ?% z3 i3 z

  40. & F) s' ]6 v2 x4 ]) o- O
  41. dfu - Device Firmware Upgrade
    $ i: W2 A) J$ Q  t6 v

  42. ) z2 ~: c" c( }- c# K* `
  43. dhcp - boot image via network using DHCP/TFTP protocol
    9 p- g! R6 o8 ^( n3 V" e
  44. 7 Q* A4 c6 y, I7 m- f" M+ O2 a
  45. dm - Driver model low level access
      }8 J0 o4 D2 C; Q8 ^

  46. 4 x6 S' y. [% o3 [& T+ Y
  47. dtimg - manipulate dtb/dtbo Android image% H6 Z* Y" X" s1 l  a5 T1 @

  48. + W! q0 t' ]! C4 ?! c* {; W  t  s
  49. echo - echo args to console
    - N. n% O3 G) c
  50. , R: Q4 h, h( _0 [" i
  51. editenv - edit environment variable/ i+ p! X2 F# F8 \# `3 O$ F
  52. / W- o8 S4 O$ M" q8 g$ y. p  X
  53. env - environment handling commands
    ) b6 Z# _1 L! @8 L' ]) L( Q

  54. 7 |3 l: n( [6 h- J( H8 ]& \% `
  55. erase - erase FLASH memory
    * i: Z+ |5 b8 S% X* k% f
  56. . v3 v% T( t7 Z) [2 m
  57. exit - exit script
    9 f- h8 V$ F$ t- Y+ D$ X9 u4 D
  58. " ]+ P. a2 Z4 U4 t* a* J
  59. ext2load- load binary file from a Ext2 filesystem
    $ V& a& F5 ]+ V, I( U4 a- T! ]
  60. 5 z( U+ @9 ]# B5 \3 C9 M6 j
  61. ext2ls - list files in a directory (default /)5 h& D3 J0 J. Z7 `5 x8 ]% U3 {) E
  62. , I( x2 `1 m9 U8 S# ]. U( n
  63. ext4load- load binary file from a Ext4 filesystem
    : \$ l- H5 }# d& x8 J' M! K+ {; m$ `

  64. $ E- }/ ?7 O  z
  65. ext4ls - list files in a directory (default /)
    : |6 L1 V) k- A. k

  66. # J- c" _0 H, n' {3 J
  67. ext4size- determine a file's size
    4 c( Q% ?4 K+ f8 ?9 y
  68. 4 M4 J/ c7 d; v- r8 Q8 P
  69. ext4write- create a file in the root directory2 E+ |) n1 J1 d9 w: W, A

  70. . [+ R( Z  s- B  Y1 s& ]
  71. false - do nothing, unsuccessfully& G+ x( d* y$ B9 k% @( J
  72. 2 K7 K8 n2 Z( B6 B* z5 v) K# ?
  73. fastboot- run as a fastboot usb or udp device, k% V  H/ |& }2 ~
  74. 9 D* y0 \  e  j& @2 E
  75. fatinfo - print information about filesystem
    # ]7 N: q! y4 ^" w3 v

  76. 3 x" |/ X( P7 _) \( E
  77. fatload - load binary file from a dos filesystem
    " e  m  g3 r! q4 \

  78. * ^1 f0 \! j" z4 L" U! ?4 ^
  79. fatls - list files in a directory (default /)
    8 Y4 P0 g+ Q, n4 M" d

  80. + {$ r; ^8 J  [. f, |* E
  81. fatsize - determine a file's size+ O& c: x- H! R/ \  y

  82. ' ~: T% a5 f- Q
  83. fdt - flattened device tree utility commands# m; E! g5 P' l4 M
  84. 0 y8 D' F; u/ a- H: u
  85. flinfo - print FLASH memory information3 m6 E7 w$ [; o7 @
  86. ( J6 b1 n) ?' s* u! U1 o/ f, n
  87. fstype - Look up a filesystem type
      L# {& Y. g) d  d. S5 F
  88. 7 q  B% r% q6 K( N2 B
  89. fuse - Fuse sub-system
    2 U$ a/ t, N* F  P7 _. a. W- `
  90. . x* w; S+ w% [6 K" a
  91. go - start application at address 'addr'
    $ u- h% y' D/ P, D' {1 z& L

  92. 9 J) O7 p; h" R" u7 E& \
  93. gpio - query and control gpio pins/ H! n" V0 Q! Y* _$ h' O9 j, Q# p

  94. . e4 X, _6 K' ^! |: N! [
  95. gpt - GUID Partition Table4 X) N5 i* W2 b4 G8 l9 G

  96. 5 }! _- O. {4 H, W" a, l. I. t8 a
  97. help - print command description/usage2 d! \5 k, k) `: H; e0 l/ D# U, z
  98. $ A; h, T7 r$ G* k% U: y* S
  99. i2c - I2C sub-system4 Q/ z- n( D& e* \

  100. % n9 i+ V: {) H7 Y8 h- K. Z
  101. icache - enable or disable instruction cache! ^, P6 r1 d" e7 G% L0 ?% {3 k
  102. 7 k+ }+ N- o1 q5 t9 a7 N6 m
  103. itest - return true/false on integer compare, L# p/ M* w* \+ j( v5 r. x" S
  104. : V% J% _4 _5 c, q. {( X
  105. lcdputs - print string on video framebuffer+ A. ^7 N4 `  a9 n

  106. 7 v- c" ~) F/ u: R* D& H, \
  107. led - manage LEDs2 f, C+ f, e7 c* n( J

  108. ' l& w- T6 ~6 m' T; j1 b. B
  109. load - load binary file from a filesystem4 P6 y3 F+ s" F5 S; a

  110. ( c5 U; }7 G. _: I8 Z
  111. loadb - load binary file over serial line (kermit mode)
    / A  ]* N3 ]( d+ _

  112. 7 E5 _  T4 n. n7 L& |+ _! m% f
  113. loads - load S-Record file over serial line+ S8 ^3 E, R& y1 P# ~) I- j
  114. & J" f: o/ t$ \3 E/ I, ?+ e
  115. loadx - load binary file over serial line (xmodem mode)
    * ]) h2 Z' j  X) a
  116. 8 l$ }+ X" L$ [+ `; w7 J
  117. loady - load binary file over serial line (ymodem mode)
    8 E7 q+ [" q* @
  118. % e; l2 \; z  h1 ?7 E
  119. loop - infinite loop on address range9 [* I5 l- ]/ }  ?9 `
  120. 0 Y8 V5 G  L0 U  ^4 v$ c& T3 v
  121. ls - list files in a directory (default /)
    , F5 K% O) m  G  q  t& H

  122. + ^$ \2 E' [3 b' c8 l8 c
  123. md - memory display
    * Q, H" s+ c1 W8 U( X1 a: a

  124. % Z9 `# g+ \9 s3 l# s* y
  125. mdio - MDIO utility commands8 A2 J, g3 _/ G* K( E2 L. [. D
  126. $ G& d- l3 k7 C  R% |  r
  127. meminfo - display memory information
    $ d2 Z6 c( D( r+ _
  128. ' E4 B. k7 _# w3 U$ I/ i
  129. mii - MII utility commands2 _" i/ w* n* X4 ~

  130. 1 K" q1 R8 M$ Q
  131. mm - memory modify (auto-incrementing address)& J" P/ s" a6 {6 _$ v8 q5 i

  132. 6 s+ S# e" a4 K8 B, Z
  133. mmc - MMC sub system
    9 x' M* K2 h& X9 n; J
  134. 5 t3 N# ?7 f* m8 Z  Q( _9 \" u
  135. mmcinfo - display MMC info
    . s9 Q  o' X/ p" m  I' V

  136. 0 E& j3 V' H- Z6 q) `
  137. mtdparts- define flash/nand partitions
    " m; C% @- I$ M, v  a6 B
  138. ) T, c* x) f* f" n
  139. mtest - simple RAM read/write test; C% F/ L$ ~: t. L# {6 K

  140. 2 Y0 O4 v8 c! z# z' n4 E( N
  141. mw - memory write (fill)! D2 J; Q5 ~/ |5 _8 i5 h; H3 K2 d
  142. : `$ J; P, q' L2 Z% R2 [
  143. nand - NAND sub-system
    " X9 `9 g- r, J* i! w- S3 j" N1 i
  144. 0 F  X- [+ ~( ]* J. F
  145. nboot - boot from NAND device) L: X* j9 b! y% J9 Q# c! J& x

  146. - d5 f" l# b  }* m
  147. nfs - boot image via network using NFS protocol2 b  S' P) [! n  j! E5 y. q8 O0 u( [

  148. - ~* q4 C+ O8 F$ K
  149. nm - memory modify (constant address)
    0 [' g  J+ m* x
  150. 5 U* I6 t$ j- _! ^. x- b" I/ K2 _
  151. part - disk partition related commands% q8 m" |% A( G% q
  152. / v3 n, w( o+ b
  153. ping - send ICMP ECHO_REQUEST to network host% }& Q6 n6 M' o% R- A$ T

  154. ' l& @6 B. R( _; L& f& p9 n
  155. pinmux - show pin-controller muxing
    ; A# B; L7 T  g  s7 ?
  156. 1 _# }( a" w% Z+ p" ~9 }7 \
  157. pmic - PMIC sub-system
    ' [: Z/ U0 r) O4 T$ P

  158. ' w  t8 W/ p. \6 D
  159. poweroff- Perform POWEROFF of the device
    ! g; o  g1 w( J9 y4 P
  160. 2 a- b) l& S; N5 O/ w/ Z
  161. printenv- print environment variables
    + c, [; I' m: Q3 C( q
  162. ) d* G; d, p; E. \( s- [
  163. protect - enable or disable FLASH write protection5 Z7 u4 L, {: l' Y  X

  164. / C0 p! V+ {# N5 F2 S
  165. pxe - commands to get and boot from pxe files
    . [8 m7 u2 n: v
  166. + y% M4 J" b) Z0 j( n4 @4 U, I. ]1 w
  167. regulator- uclass operations( b; r# n# t0 a8 H

  168. ' A( {, x; X3 W+ g( ]6 r
  169. reset - Perform RESET of the CPU# A) Q* [" j0 u3 y; G; s% L2 P
  170. ) P7 ~- o. F3 ^( u4 p
  171. rproc - Control operation of remote processors in an SoC: H" d9 r! D6 L% j) C1 x6 _

  172. $ H/ K5 @+ _$ f$ k
  173. run - run commands in an environment variable0 I, B% F0 o; [" X$ `% k" r* \

  174. ) V4 v2 w; l6 D  {: U; I
  175. save - save file to a filesystem' ?' O5 c' U# R( o! Z- W

  176. , i5 i& G/ X/ }% _8 W
  177. saveenv - save environment variables to persistent storage
    % Y9 H8 R- r/ B+ w

  178. ( f3 L' `" T. m# g1 i9 v/ ~# g
  179. setcurs - set cursor position within screen
    : j' Q: t, f5 R
  180. 1 b4 |# h* a. [+ O" ]: h
  181. setenv - set environment variables7 O" q! N% }: E: n

  182. 6 f& N0 g: {/ [8 j
  183. setexpr - set environment variable as the result of eval expression8 r# g/ C& G, T" a2 K8 n1 N+ [
  184. % ]" w+ N" w  n. _8 P9 l: {
  185. sf - SPI flash sub-system
    ' T: p2 G& o* p6 z

  186. 6 z# h6 ^, d, O
  187. showvar - print local hushshell variables/ F! a" T  p9 A) h* Q6 f7 ?1 G, o7 Z
  188. 4 T0 E$ k2 M+ Z' c
  189. size - determine a file's size. [* K2 h: a  F* ?" Q: G2 Z

  190. % D3 O5 O, d5 B- e/ _
  191. sleep - delay execution for some time
    6 [, }! @9 q; A2 _3 m; f
  192. 5 ~2 z; ]# d6 z& h9 j* G
  193. source - run script from memory
    5 r- _5 c3 J/ O8 q
  194. # i. n# c- A* Y1 k( \
  195. sspi - SPI utility command
    ) L% p1 M0 ?) P7 h' p5 a2 d" P
  196.   w% b4 K. c; |5 j: L
  197. stboard - read/write board reference in OTP$ u. U1 U0 ~1 [; }

  198. $ b# J5 T& Y7 X  ?
  199. stm32key- Fuse ST Hash key
    + e3 l% i/ G0 ^, c4 o* Q

  200. : N0 J; d2 w6 q6 h9 j8 f( q
  201. stm32prog- <link> <dev> [<addr>] [<size>]1 A+ L4 D+ X$ o' a( I2 F6 G3 A. g
  202.   u' B( v- ^- E
  203. start communication with tools STM32Cubeprogrammer on <link> with Flashlayout at <addr>
    6 L  c  f. e- t5 F7 g
  204. 4 x7 E. ]0 p5 r8 {
  205. sysboot - command to get and boot from syslinux files1 y' \! M- T* {( c
  206. / S4 K; T# d- j; c' S
  207. test - minimal test like /bin/sh
    2 _  A% R9 Q) t5 ?" i( y

  208. & \! ]$ v/ {' n" s; |0 o* v
  209. tftpboot- boot image via network using TFTP protocol7 ~; g( h% Z" X  G2 P. b- I
  210. : V  O6 }- @- D6 w0 S/ \
  211. time - run commands and summarize execution time  V* X- I! |$ Y# c/ f; u

  212. ! L9 z* T" s3 u& y* T
  213. timer - access the system timer
    / L( m; f& X# n) I. f

  214. $ Q( U6 q, e/ _4 M+ b
  215. true - do nothing, successfully! ?4 p- B1 `- t' H7 u3 \/ e
  216. ( D/ B6 [  Q; _: J7 k! P/ @- v
  217. ubi - ubi commands- J" H* C0 e5 \- _3 x$ k- _/ L6 U

  218. : d# c" W+ y- H  N0 q) q
  219. ubifsload- load file from an UBIFS filesystem
    % Z2 }1 E: w6 J: O) B! }
  220. ' w  T( F& W9 r7 u
  221. ubifsls - list files in a directory
    / A- g  G- }0 V+ s6 T  g5 r
  222. 4 {3 w8 i8 e: B+ x9 {1 N
  223. ubifsmount- mount UBIFS volume
    * ^% j$ o4 u! ^  B5 B

  224. 1 M* W0 i- v# |4 \
  225. ubifsumount- unmount UBIFS volume# z: Z! b. q1 d6 M9 Y1 B' i8 j
  226. 9 _7 W; f) z. G% q9 C; |
  227. ums - Use the UMS [USB Mass Storage]
    3 A3 Z% c+ X3 T& A: H8 u
  228. 0 ^& J( o/ a6 Y6 e6 M" O
  229. usb - USB sub-system
    7 Q& `. n# P9 w3 ?: b
  230. + x, ^% y) t5 H2 P# x4 x+ |
  231. usbboot - boot from USB device3 U- ^! g. L9 ^

  232. . x& k: U6 D- M  H$ ^- r
  233. version - print monitor, compiler and linker version  m  C$ _2 m, g4 T
  234. ) x/ F5 p3 X! e4 g
  235. STM32MP>
复制代码

! x- G( t8 e5 sU-Boot还提供了更加详细的命令帮助,通过help命令还可以查看每个命令的参数说明。由于开发过程的需要,有必要先把U-Boot命令的用法弄清楚。. w* U1 @4 J3 ^0 ?$ z" E) w2 z& X* N

& b) F% c2 D2 ~+ W- N$ P实验目的
- [, z3 r, n; [  e+ g' F熟悉交叉工具链的使用、u-boot常用命令、u-boot的代码结构和移植方法。7 W* M- [) v. ]7 Z, C
0 F0 z# B' p& L
实验平台. J5 z9 p/ P: |2 s
FS-MP1A平台
2 B1 h7 m: n, D9 R0 H" Y1 F
$ z5 P- `! {1 x  ?* L实验步骤
6 [; S" f- J# ~5 q8 X本实验基于u-boot 2020.01版本,然后添加意法半导体提供的补丁文件。在意法半导体官方的u-boot中移植我们自己的u-boot。
3 S4 s% W! {, D! [5 V" X+ C& I4 ?
! d  V# z7 j# d0 }1 u! s; [导入源码" m) L0 }/ \" Q/ Z. J" o
建立源码目录- m  V" z; y9 h
+ w3 R, A, m, `/ c1 `6 Y: R5 _
linux@ubuntu:$ cd ~
/ k# C! [& |: B' f5 p2 l) v  h9 o: b2 x, Q1 I6 {% g) o1 Z. [
linux@ubuntu:$ mkdir FS-MP1A# {! a& k2 w  a$ g0 j- U

9 o9 G) @, h' D5 P' A4 p8 |8 D将下的
7 H- i9 _9 C5 ?' `+ pen.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz压缩包,导入到ubuntu下的${HOME}/FS-MP1A目录下。
" i& l# E* ?" ]8 V
6 g, _, m) a7 t( Z% ~ 438b84ed2dca0bd78afd6bbbf0793a7f.png + M9 n0 X# z9 W7 u# l5 L& m
5 g" U* D, G7 K7 f6 @8 k  A
解压缩源码包/ _' N9 {8 s9 ~0 J1 x2 W

$ Q9 Z) }2 B( A( x" |: I( X; X  C6 dlinux@ubuntu:$ tar xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz$ Z1 d' l. g5 Q! i5 d6 |$ B5 F- x

4 q1 ?4 V2 y, z( k4 [. A- x4 n解压完成后得到“# g: I: t! d7 t( X& n
stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录
* X) j  j/ K; V
4 J" P# X$ K2 E" f2 S# l, `' X 043f5e35efc500ba2005105ec4758c47.png
: _/ U6 t9 r$ o  z% \1 T& {* |% H7 K; U4 |
进入uboot目录下
! u- D% ^, ^8 ]/ M
$ h- S, P! ?+ ~3 [5 g8 b7 [3 Olinux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0
: }) b/ M4 R' \& ]0 I
6 f7 L" U0 B& D) D4 i  _ a6db9222a790704e2b00032b086ea7ca.png + Y* o2 k* Y, U" m# u4 U

8 m$ L" s3 C# R6 M+ h该目录下以patch结尾的文件为ST官方提供的补丁文件;
! u( r! _0 L6 A6 q  [: l) b/ `6 fu-boot-stm32mp-2020.01-r0.tar.gz为标准u-boot源码包。" F* O# P8 ]/ D* }2 V& L

3 z* o; l) E, b% |7 Z7 @- z/ D& n解压标准u-boot源码包# x- m7 U3 u6 c! D3 o' o8 J! e
5 g9 j) t+ m( _  z8 s) P
linux@ubuntu:$ tar -xvf u-boot-stm32mp-2020.01-r0.tar.gz# x2 ?1 R- J' w4 N( l" K) Z0 `2 D

3 x% R& h! x8 K0 T% Y% L, ?9 z: a解压完成后得到u-boot-stm32mp-2020.01目录* I* V9 o) Q, k1 o# A+ D* ]$ a0 I9 {

3 ]! C; Y: P+ ~) \ 7279631ff3fc64037f917b97e6c78947.png
3 @- k7 o5 y# S) X
* |% ]' p7 t, h( Q& z& I) z进入u-boot源码目录下:2 z7 D; L% r! }8 B' a. P' O+ \7 J

. U0 z4 }+ c) n6 v1 Xlinux@ubuntu:$ cd u-boot-stm32mp-2020.01  C; x% B' k; w3 ?. F" q4 r

) n# U# H( Y/ G2 i% @9 n/ b c3f9631abc3d460a2749305b5a910ce0.png # C- [0 R# a( Q" y6 K: X$ E
% _- ~5 ]% w  ]! f% n
将ST官方补丁文件打到u-boot源码中:
; }3 U; C( f% O' ?+ ^; J
; m) d. \3 B& f. G; V; z* z, jlinux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done$ x, z( }4 U& I  E9 D+ B
- a7 e% O! L1 t) n2 ]
7e0aca2c3a15ebbec01a08e9715fbbb8.png
- t- A( l7 w) Y0 ]# j& r. ]8 D7 O% V1 @9 C" P3 A- f
TF卡分区
5 C. g# v8 X8 b3 X' ?. p% ]/ W
要对TF卡进行烧录,需要先将TF接入到ubuntu系统中。4 C" z) N4 h6 `# n0 c+ Y$ R9 w
; D8 B8 B; p" q$ G
查看TF卡分区1 q8 y+ l: e$ T) X# m# |

6 A6 u" U$ }0 k" `linux@ubuntu:$ ls /dev/sd*
( q0 q$ C: y* t2 Y- ?- a
2 L6 `' L& K# s$ I 53cce74c6f120fcbb5f0acd4c26d318e.png * \# p  m4 `- r5 k0 b/ X" u

5 P3 B  W% [$ q) h2 }- T由上图所示只有“/dev/sdb1”一个分区则需要重新进行分区。! p2 u  C7 O# J: {& c+ {
0 E8 H9 V0 i- C9 I! c' M
首先删除原有分区
9 _) g, P" S, R* N4 B! H" G8 c% G6 S  L! H4 Y7 e# k
linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos. i! K6 C# L3 D" Q

% C$ w- R$ O/ `1 e4 ?0 m如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。
% E/ t% C! ?) z4 Z
' G  a0 C0 T. G* l0 X' P% v. X( T 3e049e3ebdfaf78a2eb89d647593b5ab.png
1 P* P$ A6 M, v" k3 t2 J% q. B2 }& q  p* a
卸载设备
! Z" g( M  o$ r: O2 n: S+ F9 q4 w) V# d0 ]$ T
linux@ubuntu:$ umount /dev/sdb1) |- t8 t  I6 n  q( G. z

4 j- \; x  M# u# u卸载完成后重新执行删除分区命令
4 m9 n1 ~  ~/ h0 p9 q, i0 d0 h8 |8 R. s, k, d
linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos
" B: Z" H6 E2 h" S  [* f8 ^9 {% y5 D8 H+ {+ j3 Y0 A
对tf进行重新分区* W) r. P( t* R7 a# J& l

9 c8 l3 m7 ~, f0 k/ slinux@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 -g8 U# F, Z$ T2 E9 f
2 i: Z. U* _) X! T; Z& u
26b38966b016ad77c7e4f0b6c4a5653a.png
% \( A$ i2 W1 N) W# `6 ?+ X6 R* G9 s
注意:最后-p /dev/sdb参数中的/dev/sdb需要按照实际ubuntu中的tf节点为准,否则可能发生不可预料的后果。' b4 [) q" v/ K, E) S

: ~& }0 S4 b7 U9 h, O# K. _  J$ b( q建立自己的平台

1 P5 y9 I1 }! G  e1.配置工具链
4 X: h( ?' C1 A  m5 I; a导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
8 \4 a- E# t& d  m
% b- W- ]: N, b7 K. s5 t3 x5 t4 |linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi  P0 n! W/ ?7 E9 c

  U, ]6 y' N4 U" ~验证开发工具是否安装正确,显示版本信息如下图所示。$ Z& a0 W; o* U: b- K
4 c1 @4 G5 i! }. P4 ?
linux@ubuntu:$ $CC --version' c) y7 i& L* \4 O

/ L, N; I9 G$ ?: V) W# X5 L 01665b3a15a18442fd5986ceca9ce5bf.png ; K0 ?' B- N: x+ r- D1 Q# ?9 b0 u

/ B$ U" t- u9 g* ?0 l# [2.增加板级相关文件
7 D6 f4 S- K, R6 \% m$ Z& W) f进入到u-boot源码目录
. M7 w; e9 X/ x8 D
4 v+ x( d8 t+ wlinux@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/
- Q3 C9 m3 l/ D" @3 k2 K: H& a; \& S* o' C# O, k( u! \$ n5 c3 k& d
添加自己的默认配置文件( a( M" I1 I: s: W# N7 Z4 N

- t0 J- v: |1 N0 Plinux@ubuntu:$ cp configs/stm32mp15_basic_defconfig configs/stm32mp15_fsmp1a_basic_defconfig9 e6 ]! W8 j8 Y/ P
( X/ a& f: j3 k6 C" o5 ~( ~" M
添加设备树文件
# T0 Y. V& w" D5 F$ g6 x/ S! s7 U4 h, N, H: m6 f
linux@ubuntu:$ cp arch/arm/dts/stm32mp15xx-dkx.dtsi arch/arm/dts/stm32mp15xx-fsmp1x.dtsi: r# @) q0 ~! \6 L" c( p. ~$ h0 ]. q

( p! E' p( ?5 y4 M# ?" Ulinux@ubuntu:$ cp arch/arm/dts/stm32mp157a-dk1.dts arch/arm/dts/stm32mp157a-fsmp1a.dts
- o( Y$ R' h/ I3 ?7 k
2 p3 E# T8 l  f: Q* jlinux@ubuntu:$ cp arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi3 ~3 p7 h6 Q- i8 ]! d- y  V
. S# |; u2 N# X' z# t- p% w2 s
修改5 l6 K' I& v. p( _. F- n8 S& ?
arch/arm/dts/stm32mp157a-fsmp1a.dts将
2 N3 r0 j) `3 Y" P; m9 J
8 ~' E/ q+ i% A% c% R1 C#include "stm32mp15xx-dkx.dtsi"4 b, D, X. z& C# M  X; W5 r, k
! `- {1 H; g4 q" O; w- K" Y  W  T2 z
修改为
  E1 f/ l; g/ ~) y5 x2 W5 S2 D; d0 R0 Y  d* t6 I7 H1 N0 C
#include "stm32mp15xx-fsmp1x.dtsi"' V; b, w. f5 `9 s

, x  q: e1 S9 |9 ~6 E# d+ _修改arch/arm/dts/Makefile,在stm32mp157a-dk1.dtb下添加stm32mp157a-fsmp1a的内容:2 G) y2 y9 Z: X" C4 P9 x) M/ t$ ?
2 R" r. M0 X. }) @0 d; t& A1 ^( v! [; v
4b56a175b5abbcbc76039b9de49c15a0.png
9 k0 c' L6 A( b; t7 q
) }/ J7 ^$ |+ O9 t5 w3.配置u-boot
9 D* q4 l9 h' w# b; _. M使用新添加的默认配置:
) p0 n/ O  h7 N! V7 O5 E5 E" \" x) l; C% \
linux@ubuntu:$ make stm32mp15_fsmp1a_basic_defconfig& |# y0 ?; h0 G6 G7 Y, V1 ?& G

$ t5 J4 F7 V# ~ 172e0a878206b7486e81c400ca48f3e8.png
; q% S0 V6 k6 B% S
( n6 Y) G8 B( f/ T6 W0 u& [" I可以使用make menuconfig进行图形化配置# i0 I2 P. M* M$ w6 z

# Y5 J6 d4 c' W. k/ K ad38ea39c9c8e7880228a4c293425798.png 7 A$ ^' ]  o$ T# U6 M# b
8 V6 A4 {- W: w# R" v% }7 {' R
4.编译源码
+ l. I& V8 ^: v5 ]执行如下指令编译u-boot:
  i9 [9 d$ h1 S% X. d9 A9 m9 x# r- \
linux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all) y( e6 j! G; d# ^5 N% m

9 A/ u" g. D7 h编译成功后,最后显示内容(部分截图)如下:& o; x6 T* _- g1 d
2 I, j0 d+ s0 s# a
4387be4180571775c5e1c43fe71817aa.png & E1 f. W2 n8 M; L( i4 O% h
# L3 u* Y$ V2 ~- b0 C
编译完成后会得到如下文件:' G4 K# C! Q* x8 v5 o
8 y/ X' A4 P/ L" i" w, S" `
564a417aeed1ee420e4e7745c9b9385a.png
$ D/ @7 h: ]. }" J8 E- Z3 p: @. F9 g" f9 Q! K9 q
5.固件烧写
4 P, M! z" J% ]: I2 E$ T由于在移植过程中会多次烧写固件并且会导致正常u-boot无法启动,因此推荐使用TF卡启动的方式来验证。7 H, ?: d0 M) V* s; S

/ s! F, Y1 |* v8 s! l: }* b将TF接入ubuntu系统后,查看TF卡分区* f: Q0 r) |2 D# ^) @, H
  _4 }# P8 r+ a- A
linux@ubuntu:$ ls /dev/sd*- q, E1 s# P* T

7 G8 L" O4 [: ?6 \1 x3 x+ e 882f1861430fbc8873c30c1ada4f7542.png 8 O- ]5 m- G8 M3 \4 t% e

5 R, Q) Z2 x5 r0 _. U9 n: {, B- U/dev/sdb为TF卡设备。如果该设备下只有/dev/sdb1一个分区则重新分区。* x1 l. r  N" f9 m' K8 L3 B5 c

9 |3 J6 c5 r: h执行如下指令烧写u-boot:
( r) q, ~, X) Q5 Z8 P+ l- L! T; Y) @& |% D5 N; V! [
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync& g- i- E+ e3 G
7 f) D2 t& |2 B4 ~1 U' C; |
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
, e  f+ u% K7 g) M8 @- T) Q6 A
$ j  @# t8 E! x% P% W- tlinux@ubuntu:$ sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync
2 ]( {, H1 F: Z/ H9 r. y  ?4 p5 ^
6.启动开发板, b4 n7 t5 M5 L' h: G0 Y
将拨码开关设置为SD卡启动方式:
7 T4 B7 o  _8 H4 N; Y  N4 r, c% j0 @7 O; S/ d
NAZB(RR~J79VD))[V]}4W32.png
& A1 b2 j1 d1 g6 w8 P/ l& H' B. K, v' x4 L
将制作好的TF卡插入开发板,上电后会出现如下错误提示:
% P. P% s- y) G* P1 i7 T/ i3 q9 y9 ~' U9 ?7 g
ccf867996d8293e9bbc8c5c980813cad.png
. x2 b# ~9 y1 X- s( C( U+ r# W9 A, P" s- Z( o! q
错误提示电源初始化错误,需重新调整电源相关配置
8 ?- `/ a9 a# D: l/ C
! `' ~8 ?2 ?4 l  p5 O& t4 s# N0 ^* g调整设备树电源配置
% A' j+ s1 Y" d- |$ l2 Q) \% w由于官方参考板DK1采用电源管理芯片做电源管理,而FS-MP1A采用分离电路作为电源管理,本例需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容
$ J- x& z2 Z: R. n- H
% R8 W8 u% A0 S1.去掉原有电源管理内容
6 g- J/ j* R9 H8 w1 ]DK1参考板电源管理芯片挂在I2C4上,而FS-MP1A并未使用I2C4总线,所以直接将I2C4相关内容完全删除即可。, t% O' g  O1 ?9 x4 x- O

2 r! u2 \7 y3 ?: a修改
% U# v- ~+ v0 D; @4 m3 _7 S0 rarch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件
. H' z. D* X* o
* L/ G! Z$ @7 d0 S( o$ P. l4 s3 \将文件中i2c4节点相关内容整体删除,删除内容如下:7 B( X6 g# ]8 a  \) ^( p

# m# n" R" ~8 L0 w
  1. &i2c4 {
    , H0 b. E- D  `& b7 g. N% L  ~9 y

  2. # f& Y7 x4 K5 ?8 U% g8 W% P
  3. pinctrl-names = "default", "sleep";7 s+ g3 W% I  t: \% v8 E/ |

  4. ( Z- K$ w4 V- A2 ]( r
  5. pinctrl-0 = <&i2c4_pins_a>;
    + u: k* g' m8 ]1 I/ G- ]

  6. 0 b9 s! A) F. O; ]0 j6 G
  7. pinctrl-1 = <&i2c4_pins_sleep_a>;
    * t# D4 D) k2 U" _* D  `

  8. 3 m- e, l  ?* }% ~
  9. i2c-scl-rising-time-ns = <185>;
    - p/ i& G7 i0 e- x9 d& |, U8 t
  10. / x3 u+ ^: H2 C) h0 w, D: b
  11. i2c-scl-falling-time-ns = <20>;3 ~( \" U3 x: r  y' ?" i

  12. 1 H, m, j7 ^5 P$ n' N
  13. clock-frequency = <400000>;4 }6 z- L  n) b2 O+ r6 A2 p
  14. 5 J5 m3 ?& ]0 Y' `8 ?5 B. L. O- T
  15. status = "disabled";. b- D2 |/ }+ G( Q2 e+ B

  16. 6 n# M, I" w9 l% k8 n7 C" k
  17. /*内容太长此处省略*/
    5 F. \6 q# j: `! F: H8 M& u, X

  18. : c, U7 O9 m" L  [7 h7 ?4 p
  19. watchdog {( H* H- N7 c/ j$ K$ Y7 F
  20. 2 A" b5 R1 D5 e7 G- X0 E) b
  21. compatible = "st,stpmic1-wdt";
    , p4 E: }: m3 a4 T: M
  22. 8 g: Q$ O+ o8 E
  23. status = "disabled";
    ; Y2 |2 y2 Q# d4 G. e

  24. / {0 B8 R5 L6 U2 T7 K7 `
  25. };& n9 U) u) V3 e; ?9 `/ s8 J, p9 [
  26. / u8 y4 i' t. Z# w$ ~6 V7 ?
  27. };% |7 c( R7 g: e( U( u
  28. 1 F3 g& A! s/ V7 Q
  29. };
复制代码
8 k1 W) u: W  K) ~# j* z0 @$ a; v0 g
修改7 l" z) J) W0 @. ]) l% U! @' P
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,删除如下内容:
2 m" C4 O5 N4 S$ \! Q! ?, j+ _* X4 N: @$ Z. L
  1. &cpu0{
    " T+ D$ r; D. ~% k# i8 F
  2. % c  S0 D2 L5 [& p0 u
  3. cpu-supply = <&vddcore>;6 N! Q9 A' s9 s6 E* H2 i; h+ o0 U
  4. * Q, D# c+ ^" O; P' }" E. b+ d: s+ k) m
  5. };; D2 Q4 @; C! ~& i

  6. + Y4 `4 G; G, c; ?/ X$ U4 w
  7. &cpu1{
    # q' e/ r3 b8 P: V. [
  8. ) f5 V+ f9 i6 E6 j3 P
  9. cpu-supply = <&vddcore>;, j3 K3 s1 [3 {  V' L* z2 X

  10. ( K. I' M; [; ?# w9 v) g, V3 \( }
  11. };. l$ F$ f4 x9 X9 z) c7 E
复制代码
, \* X6 P8 M9 `$ A4 ?) p
修改
% J  C/ ~( g9 ^% v: o, l$ ~
  1. arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi
复制代码

' ?- B* ?/ @, B' d' ^文件7 _4 g% W# D- B) I* Q

2 u9 U% A1 Q7 ~! M3 T( h删除如下内容:
% n; D, c) z. b% {+ R
9 B% f6 M2 r0 I* R
  1. &pmic {
    ( H* w/ V' h: V8 s, m; Q: ^

  2. # \; Q/ W- g- _, S, g5 A3 p
  3. u-boot,dm-pre-reloc;. L: I/ h* H# Z4 T: O3 F1 U

  4.   v* N. Z4 v- E. J
  5. };
复制代码
$ k" u! y$ j! d& |$ v, V6 z$ m
由于官方参考板DK1 I2C4总线上有个USB type C的控制器,上文删除I2C4节点的同时将type C控制器的描述删除,所以需要将引用type C控制器的内容删掉。
: ~7 R- l2 G( C, e( A! M: W# v. W6 `, W1 _5 h3 N! \: ]& A; Y
修改, h7 m" ~0 [' I& [% R, ]
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,删除红色部分内容:
! [* d9 D0 D7 o8 g$ G1 D5 D5 @0 s  d# s: [) ^2 f
  1. &usbotg_hs {( x4 c- w5 X$ Y" M) U# F7 n; y7 {$ v
  2. / _" P7 ~. ^& T$ H( c
  3. phys = <&usbphyc_port1 0>;6 P. j9 [4 V2 X& }7 A  x
  4. 3 h: w/ i+ @- V! Q' I7 C, K/ j
  5. phy-names = "usb2-phy";
    # y, e1 L# p8 K  m8 @

  6. % L. i7 M, K3 \% S) X1 W
  7. usb-role-switch;
    8 b: k; v; w) I$ d8 l3 u
  8. 6 a# Z8 |$ v5 h9 v  _8 P9 U
  9. status = "okay";( u$ l6 [- N1 k

  10. 7 |! _) {' I6 [3 K# B, U
  11. port {
    - Y% W" O0 w  z( K1 w. U# s9 l
  12. / M1 m! X/ d4 i. I2 S" ^
  13. usbotg_hs_ep: endpoint {
    : K. g5 ?7 C" k# `8 E
  14. % z4 e! C/ @7 y- T7 R4 u, e' X
  15. remote-endpoint = <&con_usbotg_hs_ep>;4 n' a( S% d, u! a# T) ?

  16. - K3 I  [7 }, Q: x5 g+ y
  17. };5 \- X; @" ?. ~. s1 [6 ]: p6 m
  18. 4 [- X% H2 F/ o" t1 c$ V* L
  19. };3 m) }8 w4 D/ `
  20. % a1 a5 ~3 z; m$ e
  21. };
复制代码
% `; I" r- |5 C$ r% p
2.添加固定电源配置+ s# A# y0 Z) e; }
修改1 L$ E. f; r' t8 l: I
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件
/ b3 N6 q2 |4 f$ {" Z6 x" c" w' U3 f) N
固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):. Z, Z9 ~8 d% @# d# s; V# L: q% _

1 Q3 `  C$ w5 p
  1. vin: vin {
    1 O2 ?/ b; n8 V2 f" L8 ], o

  2. # p( h0 V8 `$ N" v) n+ R$ ~- q
  3. compatible = "regulator-fixed";
    $ r, E0 I: T0 Y

  4. " b8 ~4 ]* l5 U/ g2 ?  J  c/ |$ x
  5. regulator-name = "vin";8 l# r' Q! o/ i" W) A! |" [" `

  6. 4 J# \# B1 q- W
  7. regulator-min-microvolt = <5000000>;3 d5 j& G! d8 {3 L) x, m# Q: D
  8. / Q3 ]$ E4 T( t  a' h
  9. regulator-max-microvolt = <5000000>;& y8 T9 Y: N- k5 P5 N4 L
  10. + v5 Z" Q  `5 g$ Z8 A8 ?$ h
  11. regulator-always-on;
    ' h+ }0 Q5 @1 ^9 h( {' y+ X

  12. % k2 z0 O! f- c1 q, m
  13. };
    & S) A- d' r5 K% m( m3 D

  14. 8 w9 }$ I3 Q" h7 W5 a$ ]+ j
  15. v3v3: regulator-3p3v {$ H& V5 \& a2 ~8 e2 r% w
  16. $ Q  |1 Z4 J+ |, l
  17. compatible = "regulator-fixed";0 j& ]0 K) ?1 t0 ?2 w' Q, l: {
  18. ( [; _5 q8 l( @* H7 H
  19. regulator-name = "v3v3";
    " T( l. k# u5 U5 ]' S. Q

  20. : F; B% r' B) t4 i" f
  21. regulator-min-microvolt = <3300000>;) ?+ V- T1 e+ M# N: t6 G. G6 p7 a1 f
  22. , E; \- ^# _1 m9 C$ E- V9 T
  23. regulator-max-microvolt = <3300000>;( e% c. L- U* X6 P1 u3 N! f5 m, [
  24. 3 P: s$ k1 o1 Z9 E$ o. A$ c
  25. regulator-always-on;
    ' c! y  |4 {. s0 j6 I. |
  26. 4 F/ i  g7 z0 F0 ?7 O$ f6 X
  27. regulator-boot-on;, Z1 o% u$ Y, Z9 z1 ^0 b

  28. - `( b0 B+ S) q1 S$ v1 I
  29. };9 Q" X% G. L6 r- B0 c2 V
  30. ) x8 M/ W* \. ^+ d4 Q6 I$ k0 Z
  31. v1v8_audio: regulator-v1v8-audio {, H" t  A! y! N' n/ J
  32. 5 M8 ~) j1 `# p# ~9 j$ B
  33. compatible = "regulator-fixed";
    5 t/ w: N7 H* C1 H9 f
  34. . n# ?& W, |/ Z
  35. regulator-name = "v1v8_audio";! P2 ~2 _* d& c0 w+ r# d2 }6 m

  36. # O: o% A- O) w* L
  37. regulator-min-microvolt = <1800000>;
    , F" V, G8 ?/ s, N& T
  38.   D% e( f$ I9 {0 N2 K" W% t
  39. regulator-max-microvolt = <1800000>;
    - v1 M- B: s- f
  40. " C% k9 Y/ f) P$ c* W8 v
  41. regulator-always-on;
    6 {2 V9 n1 u* _$ B

  42. 8 v4 o0 g0 }7 |4 O! M
  43. regulator-boot-on;! z1 @0 d( r" l% a% B% y

  44. 4 A( R3 [4 L6 ]1 Q
  45. };( j. [8 I/ v7 X

  46. : [$ n9 ^: U  u3 m6 R  j
  47. v3v3_hdmi: regulator-v3v3-hdmi {
    3 \/ t/ u' g! D4 Q( ~; {

  48. ( [! {5 X1 v# z2 }
  49. compatible = "regulator-fixed";
    * ~( z$ n7 A7 }* N. x9 T8 u
  50. + B$ j1 I" Z7 y! W
  51. regulator-name = "v3v3_hdmi";
    ( G" @: J! W( \; y! A# Q- H
  52. 1 |& @& C* @) N7 b% U1 i8 \
  53. regulator-min-microvolt = <3300000>;
    4 ^( Z6 i3 \" A, L. ?
  54. / o' S8 i- X+ _, M* \- y9 r4 }/ ?
  55. regulator-max-microvolt = <3300000>;! k- r1 \1 ?3 i, V" Q- J

  56. 7 c6 \  {! B( C$ D  B; u' |8 z6 g3 h4 D! s
  57. regulator-always-on;8 c3 a' ]: q. z6 y$ _  ^. ?7 Q" A% l

  58. - G( L0 L; }: {: q2 a2 }8 _% D
  59. regulator-boot-on;# Q& o: ]  }& }6 I, Y

  60. ! v9 I9 c: e+ y2 x$ S
  61. };
    6 D* E, P% K/ y! A! f0 D. _5 G8 W

  62. $ Q9 M7 ]& w5 ], N
  63. v1v2_hdmi: regulator-v1v2-hdmi {, f: a! a9 N1 v9 I0 Y7 p
  64. ( R2 y0 G. ~0 X* e# g
  65. compatible = "regulator-fixed";* w/ {- y# ]- @" N7 U: {
  66. * p) r- W7 I' T0 G' I
  67. regulator-name = "v1v2_hdmi";5 R* X" i! V: j  x: {( H
  68. 4 A  _; b& d+ K% h* d
  69. regulator-min-microvolt = <1200000>;3 J$ F/ b' a# z/ C

  70. # T7 B2 Z3 d4 p8 {8 E* @: v
  71. regulator-max-microvolt = <1200000>;6 c9 b& O* w$ [5 n6 D' N, [

  72. : ^7 g" A; _% v# e) h& r; o3 R
  73. regulator-always-on;
    / o, K9 {' J% r0 i3 K- [
  74. - w* p* U" [! K7 X: Q+ a5 j
  75. regulator-boot-on;& B+ m8 n  ]% b3 I0 m2 r! k$ V

  76. ) U/ r7 Q# l+ U8 C; X1 v/ E5 Q
  77. };, q% [7 ^8 q) }1 A
  78. * w" C5 E# w. N% A
  79. vdd: regulator-vdd {3 B. G' v9 Q* A8 E% P

  80. $ l( f3 ]. `& g- O3 L) K
  81. compatible = "regulator-fixed";0 `0 b: w" o7 T' c- \$ y

  82. # r; A0 z: L# q' i
  83. regulator-name = "vdd";
    / _( L  F2 u0 T) ^

  84. : f9 a6 k) |; p. R
  85. regulator-min-microvolt = <3300000>;+ u9 P4 J# Z/ B' X: B" @3 `" T( K8 ]

  86. 6 P' @6 z( Q1 |' V
  87. regulator-max-microvolt = <3300000>;
    0 R7 P/ N- w3 y
  88. 9 ?, U& H9 _% q0 L+ B3 f% f
  89. regulator-always-on;8 o4 T+ e1 k7 V

  90. 1 G. n# W, q! J/ v7 R
  91. regulator-boot-on;6 p# v, ]6 c" r1 d5 y$ C: r1 x
  92. # b* m4 M2 Z  Y6 N
  93. };
    6 {& ^) i) X7 O  X

  94. : z: a+ _5 b  @% J5 `2 U
  95. vdd_usb: regulator-vdd-usb {$ p" x% G4 ]1 N9 |0 d1 H
  96. 9 J- d! A' c' |! ~
  97. compatible = "regulator-fixed";/ r2 g$ o3 A$ y% {  y, d
  98. 7 Q8 w+ T' A( j& l2 f" \  Q! h
  99. regulator-name = "vdd_usb";
    , ^; X7 y' F. A1 [# Q! ?: W5 Z& d
  100. 1 }6 h9 B! ^5 O3 @# d3 k: Z: K
  101. regulator-min-microvolt = <3300000>;
    " N: a4 m2 M9 ]) f% K  ~

  102. ) p/ N8 f* ~* Q" X
  103. regulator-max-microvolt = <3300000>;
    - A# Z! L) x' }. X' q
  104. ' g3 W+ K; q3 Z0 y' X* ]# N" y6 ]  _' Z6 r
  105. regulator-always-on;
    ( X1 p" R" Y5 P0 ~4 S5 e
  106. % W' M3 r% ]; U! N; p7 `* M5 z
  107. regulator-boot-on;
    & H  r/ s) b' M  E
  108.   {: D0 f; E% C$ N/ Q7 i
  109. };2 ?% _* j* l% x$ G/ H4 j/ ]

  110. % e; G$ E, ?9 z! C0 ]/ H
  111. };
复制代码
# B5 O$ I2 u3 }: S& a. r
3.配置uboot+ Y6 O4 _( m9 \) G
linux@ubuntu:$ make menuconfig+ J! e1 c: X9 ?: s3 N$ ~: `8 ^

" l+ M6 P. E/ v% C6 X* b- [- ~7 N去掉PMIC的配置选项,按空格将方括号内*号去掉:8 N  Z+ a  }/ B" N
1 {8 P! T+ s- H) ^
Device Drivers --->5 C- A% N9 G1 T2 f& \, T

% |! l, C" z. N0 ]! N. MPower --->! n. v9 s) m4 P; k- T" o

& u$ F# W( }" u6 V: _7 E[ ] Enable support for STMicroelectronics STPMIC1 PMIC
8 ^1 I, L) [+ W7 v( m. L. _8 F3 U2 k$ s6 B
2.更新配置文件# r! Q# j" W7 p* T
linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_basic_defconfig
+ s2 K1 I% M+ W1 @) d3 O  m# Z7 O& H8 c9 W5 C' I  }
3.重新编译源码
. s; }! N+ M$ n3 k* O  x" H. elinux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all
' H) T+ ~: r% t/ e& |$ O7 {9 X/ A/ B/ x& K& ?
4.烧写后启动$ z7 F/ w+ t  e9 b
重新烧写后启动现象如下:
3 u; p& |2 j  D/ t
1 h( G# y' B3 \: f7 I) Y+ K* z f95d4e5b406a6550853a782dac2985ef.png
: A+ p/ n$ W$ Q! E; O
3 w$ ^6 r( b2 L7 C. [提示显示TF卡未被检测到。5 B1 t: Z8 `6 Z9 r' F- k

7 b! l2 b% w* r3 f) y% D0 uTF卡支持
1 O# |( ?$ @  @4 m: `系统检测TF卡拔插是通过CD脚的状态确认,通过原理图可知,TF卡对应MMC1的CD脚是与STM32MP1的PH3连接
$ k/ q" F2 @& C7 |# r4 U
+ d1 V) H5 n# E afdd33ce1c9b6b3f076d297a53834bf3.png * h' H% n" _+ ~

. \9 Q  C$ R" G: {对照设备树中MMC1的描述,发现设备树种原有CD脚的配置与FS-MP1A板子不一致,需调整为PH3。& \+ C. q+ [8 P2 f% U* Y  N
+ c( d6 ?8 o7 B% h" G; |
修改
2 v9 P1 c- y, `$ t+ P  Z5 |. S5 Varch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,调整MMC1中CD的配置:
! ]( V$ I% [  z; L9 w8 o0 D% |2 o1 L( G. J" G% X
将如下内容8 [. \0 ~5 x; @

3 k! y; A* Q# l+ e% D+ h8 b
  1. &sdmmc1 {
    # u4 [( K5 K& J2 O7 Z6 q

  2. , J' {5 w, t  w0 Z* g
  3. pinctrl-names = "default", "opendrain", "sleep";1 |3 d# l1 S% x, H7 k
  4. + Q- C4 C7 m) B* h; W- O
  5. pinctrl-0 = <&sdmmc1_b4_pins_a>;# |5 C- ~* m/ J5 B$ ?  {1 J9 |
  6. - \5 }3 D3 \6 J& X
  7. pinctrl-1 = <&sdmmc1_b4_od_pins_a>;6 ^3 s. d* j; V) B6 p8 J
  8. 8 V, ^1 H" T# q
  9. pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;! R/ h  O$ M, Q" [. A- X) d
  10. % e( n( P4 R8 a4 N' J' @4 z$ U
  11. cd-gpios = <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    ; P; v6 J7 f$ x
  12. ( j. M5 w: T# p
  13. disable-wp;
    7 X& s; w4 @/ E# V' g% l: U$ h+ _- p# {

  14. + ~  Q* |: _, A& {6 N0 J
  15. st,neg-edge;, L; b3 c% M1 a/ J4 a

  16. " G  u2 D0 H; a1 Q. G- _& a
  17. bus-width = <4>;
    * z3 t6 \' D: J" M6 K

  18. # F( c- e  ~. }/ p0 O: n
  19. vmmc-supply = <&v3v3>;* u- ?  f3 L/ a! {2 \% o
  20. # k1 Z+ b! c) V% s; g
  21. status = "okay";. N7 m% K6 E& o2 o+ i8 o
  22. . K- m% \$ B! h/ U$ O
  23. };
复制代码

2 X( r, j# h" {: w2 U) h* \" {! J修改为
$ k+ b" ^" R5 h- v7 u" ?% z# p5 U" L$ p! ?) k
/ \  X, I2 L) f" ]( h0 T+ u
  1. &sdmmc1 {
    ) D6 _, P0 Z0 u+ W0 y
  2. 9 P$ j1 p+ l8 h4 N! O9 \
  3. pinctrl-names = "default", "opendrain", "sleep";
    / D2 M! m. b1 ~: r5 o1 [

  4. 6 x/ {- E, g. P4 S  G
  5. pinctrl-0 = <&sdmmc1_b4_pins_a>;6 j! y/ C& j- U" ]- E

  6. ; }! [  Y/ K9 ~3 O, @" L* q" H
  7. pinctrl-1 = <&sdmmc1_b4_od_pins_a>;  y* O4 ?( n* C+ ?" ?) p; [
  8. 6 B& K1 O8 \3 V1 b! n  g
  9. pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;. }+ p+ L2 P. {, e$ v
  10. + G) M4 M9 ^" c+ l
  11. cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    6 C+ ?. F5 t3 L2 M0 p- o! {7 t
  12. 7 U9 H# Q6 H2 ?+ z2 E
  13. disable-wp;
    0 ^1 p8 Q, G  |

  14. - C' h, k6 [: F) ]: i: X- L
  15. st,neg-edge;
    , v" W% }' \9 d4 K" `& M% [
  16. 5 f, |1 T$ g9 M' k
  17. bus-width = <4>;
    * N3 }9 Y0 x& G' ]" c5 Q5 r
  18.   N0 K4 B. S6 ?" S
  19. vmmc-supply = <&v3v3>;
    : A5 p" W0 |  W/ y8 T( z
  20. 5 D# d  D* c/ n/ P
  21. status = "okay";8 D5 I& C+ N! g- F$ o2 J/ X
  22. & w9 Z4 U; b# G# S6 h( Y0 O9 u
  23. };
复制代码
% J; o; N1 y3 @7 ]$ l
重新编译烧写后现象如下:
& E3 N3 D+ H0 a4 s9 G3 r' j4 J% d+ @: P; ?( z
16441359b00dce8519c705dc4807c273.png
! K* s) u" d' j5 X0 ^3 v+ j1 T' ^+ `4 `! r# b4 s
去掉ADC功能, K% _* R3 p6 a1 M
上一小节已经成功启动到了u-boot的控制终端,但是可以看到还有一些错误。本小节将解决如下错误。
; Q, i. c4 E/ c+ Y1 I4 T& y+ R+ K8 i
9 X* d7 Y0 r7 z; M. p5 q f160a1d62b7c81a78ec6031990037399.png
1 c4 z: z7 \" t1 D$ b& m% ], N& _1 [$ A3 ~* G2 n* ?+ F7 c. |9 ~; b
官方参考板DK1通过ADC检测开机电流,如果供电电流不足3A则启动失败,FS-MP1A没有设计这个功能,所以需要去掉这部分功能,否则就会报上图中显示的错误,由于u-boot期间ADC主要功能是检测开机电流,这里直接去掉ADC功能即可。2 E0 f8 z$ g: w  \7 d6 h; |7 X
3 r( \5 V4 _. K' a2 [1 w- u
配置uboot去掉ADC功能:按空格键去掉[ ]的星号5 g" t5 ~3 X8 o, m
) a8 J0 K8 @. r4 }$ I  e6 u
linux@ubuntu:$ make menuconfig8 ^5 L! u5 X6 O0 T7 |
" N4 O: k: G# h/ E
Command line interface --->
6 j+ h+ f4 v3 u1 o2 ], w. g; H' n3 J0 Z0 |5 ?8 b" ]
Device access commands --->
7 J; c0 j, F9 U8 z% t) P: D1 V7 V( }) B2 T% @) G( z2 J
[ ] adc - Access Analog to Digital Converters info and data0 ~+ V4 k  R; t$ t- K: `) h7 y
. x' Q+ m% [8 z  J, U
Device Drivers ---># G6 d# p8 {! X% P2 F

$ j3 E! |8 k: K% o, ^+ \; ^[ ] Enable ADC drivers using Driver Model; q3 E% v! ~, c: P
6 A  y: A6 _% _( a  _
更新配置文件8 N  C2 f0 n! a+ X% x
' B( i3 h1 X9 N. q/ w
linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_basic_defconfig% y- K7 y% z, E0 N
) o4 f( g4 U/ k
重新编译烧写后adc相关错误已经没有了。$ q. z2 K! L2 g  D6 S
2 M% s  y, f9 l. I
0d706dc4c2f5c7e06f9ae191529fde14.png 5 z. ^3 l8 a% H% o7 p
, ^0 {4 @, _8 }
关闭ltdc
1 \; d9 L; p& g, y& d5 i( r由于在u-boot阶段我们不使用显示设备,因此需要将ltdc相关配置关闭。
- I- q3 r; Y1 S' g2 Z4 Y* d
+ u( N4 d) H' H# m! x6 F修改
& r4 X- ~# a. Yarch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件0 u9 F8 I* j! L+ p$ W$ E9 N
& z8 d1 i3 \9 Q) t. ^& ^; s
  1. <dc {4 _& v- s- c! f# H/ e  H3 o/ c+ _

  2. 0 k: G0 _5 ?; \& G; d6 m3 u) g2 y
  3. pinctrl-names = "default", "sleep";1 [! X3 q( B5 h+ C+ f% x

  4. 2 N3 l! Z$ o6 _3 k! K
  5. pinctrl-0 = <<dc_pins_a>;
    # W% i2 N, J( e! U8 L- |- o) ~
  6. : M. s# n3 L7 ~6 d! G. [, T
  7. pinctrl-1 = <<dc_pins_sleep_a>;
    8 b( i" y; G* H, x) y( J1 l4 t

  8. 6 `' ]1 l# U' c
  9. status = "okay";+ J9 o; [7 e1 m8 C4 }* G4 R' Y

  10.   }0 Q7 w* J1 X  [8 G
  11. port {% d/ p- S) n+ K

  12. - q( q! Y0 k/ O2 O
  13. #address-cells = <1>;: {3 M# ~, {* V2 P0 ?
  14. % [0 V% `* |* P
  15. #size-cells = <0>;" z8 {+ D! o) E7 b! Q
  16. . Y& v# w% v" |; F& r' C% B7 d
  17. ltdc_ep0_out: endpoint@0 {
    ' G0 k( G: Y1 M3 g6 J/ F
  18. . u9 C* x; f1 z5 h! [3 n
  19. reg = <0>;; z* A/ J  f( u7 E

  20. : v; ]# S0 G0 O- S. q2 ~
  21. remote-endpoint = <&sii9022_in>;# m" c1 v- t; m% e  K: M9 ~2 q

  22. 6 c) W: Q; k/ g& L" o7 H
  23. };0 T; z4 J; K/ B; `! J
  24. " ^) E+ I7 n# x3 g: Y8 J$ U) v- P! y
  25. };% v7 C+ M9 f6 s7 W" F+ m0 W
  26. 4 y& i$ f0 n4 N. p/ ~$ J
  27. };
    ' m( F( S" d& s( ~
复制代码

# q4 ~7 K. Y; F1 F修改为
5 y. l. _& B1 l; Z# n# {/ n, W0 ]  q( ~4 }$ y5 w3 E
  1. <dc {, ^$ u& f/ j! b1 V4 W3 k$ T+ j# p
  2. 9 I+ ?* I  L; ]% V
  3. pinctrl-names = "default", "sleep";/ U7 c1 f2 s0 [& {

  4. 8 [* k+ P% o: \$ X! g
  5. pinctrl-0 = <<dc_pins_a>;0 U9 i# f' i' }) Y, m# V" b3 z

  6. ) W4 N* {( q* B( \, K" G% p
  7. pinctrl-1 = <<dc_pins_sleep_a>;
    6 \. y) `* L5 I+ w! V; Z! \
  8. ( G2 \) B- U5 |9 D% z8 S8 y
  9. status = "disabled";
    3 j4 _0 W; ~8 X4 j, T0 Z  D
  10. - ?1 f  R! F0 m$ P
  11. port {
    ) C+ G9 ?+ v; U* r  S  @0 [# m

  12. : I( E  n7 j. q1 N2 D# F7 ^. m
  13. #address-cells = <1>;  n1 L7 K* D# ]0 L

  14. 8 ^) l1 m: j5 z2 B
  15. #size-cells = <0>;
      Y* X5 v, K6 O. E; X0 Q9 d! e

  16. * B- f# g* l2 V7 V* L
  17. ltdc_ep0_out: endpoint@0 {3 [$ i- `/ x+ y. N
  18. 9 i5 E- R" K7 J! ?5 b% S5 c  Q7 X
  19. reg = <0>;
    " v- r% n# X4 [7 q
  20. , @! O2 P2 U3 w. R; B
  21. remote-endpoint = <&sii9022_in>;
    ! D& q$ w* N5 L5 d
  22. ' \( a7 x! {- d: h4 i0 j
  23. };
    * e) l, [& s4 Q3 l  C5 ]

  24. # ]9 H5 G# \7 D8 I$ q5 v
  25. };+ O3 ]! B: h4 f

  26. 9 w6 ^0 g% f+ C4 c! m8 E. e
  27. };
复制代码
7 M* d& d$ C! U/ q7 X2 m
然后重新编译烧写( O- o( d8 _$ r4 ]# D

- M0 F; \7 V! ?/ D有线网卡配置: P' b) Q, v/ q6 T! @9 f/ q2 K0 B3 L
启动设备进入u-boot控制台之后,可以发现启动信息中有网卡未被发现的错误信息,这个错误是由于u-boot没有设置正确的MAC地址,由启动信息可以看到,启动后网卡的MAC为00:00:00:00:00:00。这是由于在OTP中没有固化默认的MAC地址,解决这个问题可以通过烧写OTP配置来进行默认MAC地址配置,但是由于操作OTP配置的风险较高,如果操作不当可能会导致不可预料的结果。  w+ {/ n5 m1 s$ ]  K/ c* n! T0 C

' D8 E7 p% J* w% G/ Z1.如果u-boot期间不使用网卡这个错误可以忽略。. r' I9 r/ i6 j% a, P

- T) ?! ^5 ~% M  W% L) {; S( _如果需要使用网卡解决这个问题比较简单的方法有两个:
  w( g2 m3 s& R9 x" X. K2 }% {+ A: c# {+ k' X. [
2.U-boot启动后通过命令设置一个MAC地址
, ^8 u5 j7 L# F& B' B+ }5 \STM32MP> env set -f ethaddr 1A:1FB:0E:69:FD& G" Z, ~3 w) m( E* E# L0 Y9 [

+ I+ r$ Z$ o* ^. u1 D9 ], h6 G, h* g这种方式设置完成后即刻生效,重启后网卡即可正常工作。! \- t' M+ e& t% L: f- Y3 G, g

! P3 H. j3 m" L  `修改include/configs/stm32mp1.h,增加默认环境变量
: H. A3 f! k- c+ U8 ~' l- J修改如下内容:2 U2 x8 K7 y) m  q

, w2 i+ z6 z7 Y9 q& \, e
  1. #define CONFIG_EXTRA_ENV_SETTINGS \9 L6 a, b# k1 k! T. R( `
  2. " @$ l; D/ g+ |  f% P1 ?! `$ k" ]. h
  3. "bootdelay=1\0" \- s: p: L! ~% g, L1 T
  4. 4 ^- [1 `8 b; n- n/ B7 R4 `4 J: s
  5. "kernel_addr_r=0xc2000000\0" \; @5 N6 K% e7 D+ o  j

  6. ; i* D# H6 a5 m2 \/ x! D% [
  7. "fdt_addr_r=0xc4000000\0" \
      m: u8 l9 H; ]2 |$ |

  8. ( T: z: q. Y$ v. X5 X! a* C
  9. "scriptaddr=0xc4100000\0" \
复制代码
为:) K9 v( B! T. N4 l" P
' J1 U7 s3 I, n% x# T: e
  1. #define CONFIG_EXTRA_ENV_SETTINGS \( D6 P1 g+ m$ S) F( a

  2. ) \& R4 C: r1 p: g5 R! E
  3. "bootdelay=1\0" \( {- m) k6 J( ^2 D+ D2 R; o5 ]8 y" H
  4. 8 P# F+ }5 o& S+ |4 z* n
  5. "ethaddr=00:80:E1:42:60:17\0" \
    , l1 @4 y; m, p9 {
  6. 4 L, Z6 J8 ^7 G3 @
  7. "kernel_addr_r=0xc2000000\0" \. |7 {/ f. n" g. w1 t
  8. $ u! \' L2 \" T2 ?5 |6 `, ?9 ]. T
  9. "fdt_addr_r=0xc4000000\0" \
    * ?2 o5 s# [1 o4 P1 N
  10. ( _) P. ^- l; n# H/ p
  11. "scriptaddr=0xc4100000\0" \
复制代码

0 C1 a6 ]$ a8 ^; N这种方式需重新编译烧写后才能生效。$ n# Z# @+ S) k: b6 U: m# W4 p" O
8 c% t" }1 B/ x) c8 N6 H
重新编译烧写后网卡即可正常工作:* n, Y( ]+ O! i+ C. A

% w2 k& M9 Q- O0 T$ b4 n" B; D 4dd7f1edca4dacd8448c0a7a908a4bcd.png : |, ]8 K, G8 P5 v

, r6 G8 N+ U( N) G1 X将网线插入开发板中可以进行网络测试。$ c$ h& x! |& Y1 M8 u% O( J

/ Q+ Q8 y. a# Y% r使用dhcp命令获取ip地址:$ X% \. d& ?1 l

5 w. S  W; l0 a! p6 J/ a% n2 V1 qSTM32MP> dhcp4 f. Z* K" [( r4 @

8 u2 t6 W$ A) y" m/ Q% J 5d41bc978db2c84ac5953e56615574a6.png
; F  X7 p* }$ u4 C# Z8 Q( f9 h) }/ w! w8 c8 `, V  M
可以看到这里获取到的ip地址为192.168.11.81, l$ N( c/ v6 l- [0 U
8 b7 A" ]) M9 A8 G
Ping网关测试:1 h0 v9 X" m( S

6 x$ K5 i0 }( K% k/ M. [: sBoard $> ping 192.168.11.1
  l' y# f. H" g
: R; Q+ b! V2 x0 u: w: b' k a6ebd286b122c74b2abb3e52b33eeb92.png
: N3 E! B( w  `4 T0 R$ D
; i% c6 o  w) o" nPing外网测试:$ ]- B. C7 M2 J5 z4 N; p

3 T: X0 ^0 M) H( M9 fBoard $> ping 8.8.8.8. D" `8 w# _' W
0 [' z" b# _+ e
3e92282bae57bdd4049c1fee35ac2a8f.png
+ X- B9 p+ E# B8 L% O( R" q3 b. y2 E( \3 w2 ^% j
eMMC移植
6 D, c  P8 l4 U- p参考原理图可知eMMC使用的是SDMMC2总线,当前所使用的设备树文件中没有SDMMC2的支持,所以需要增加相关内容才能正常驱动eMMC。, ~: q" a; G* h7 ]" ?. m: t) n

' [# P7 Z$ N$ ?/ N 006f7f060b89519272af27864b829e56.png & Y2 P, o& d; K: Q& y. x

, W3 {- U# l2 y0 L( U由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:
+ Y; d# I) W" ]
7 W5 C  I0 T1 u  B2 K }WN3%I)9%DK06X}92O8(I.png - a# V2 K( Y2 ]8 P
2 e( i; b" N  h
1.管脚定义2 k' ~. j; ]. m9 e! m! O. {
在u-boot中STM32MP1默认管脚定义在文件7 O) B) k' U4 }
arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:
3 k& B! L7 U) \4 K! P# e5 S( q5 [3 E4 J: @
查看后确认有SDMMC2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:* x- W0 H+ e8 g- W

' {$ i5 Z9 o/ S4 h' ~3 v
  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 {
    # E: ~2 T2 n: [: u3 x
  2. + [6 T3 Q* Q$ ?) N' x( J4 b$ U
  3. pins1 {
    ' u: D& c: K& B! ]7 S1 @2 U9 B
  4. ! I8 ?6 F& }5 Z9 _6 v: a
  5. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */4 @; E# N& V; [3 C  N) {( ~, X

  6. " I9 P1 k4 Q" z) {2 C
  7. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    ' `0 R# u; f, ]4 ~- q
  8. & H  N+ D9 L6 c) l, A
  9. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
    1 O  `& e0 d) g. V* J$ O7 g

  10. # {: \. @& k8 a/ M' s
  11. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */! D4 Y9 |' V/ y
  12. . Q7 H3 p! Q4 W! {* g6 A
  13. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */; c. }( @* |7 p

  14. 9 f4 @1 v- h' |1 l3 Z: ^; ?
  15. slew-rate = <1>;
    . M' {/ }3 S2 S, `8 Z

  16. 0 U6 ?  g* A$ i0 P3 `! S
  17. drive-push-pull;
    . |# V' _( G" T+ f/ T- u

  18. 5 @, u, z  S0 v; A# H1 P% c& |
  19. bias-pull-up;8 x8 m' y: G% Z7 @; c- w5 F& A
  20. 9 n& d. F1 O' |  w
  21. };
    : A; y- e/ W/ T% O5 _

  22. 1 e  a) K9 Z  f1 ~4 F8 R
  23. pins2 {
    . O* J% `/ \% j2 A

  24. + ~. O# U$ d; S0 i. r
  25. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
    # g. Y+ K9 W+ p8 ?
  26. 5 P/ l. `1 b, N) b* U6 v3 h/ q8 o
  27. slew-rate = <2>;, e) a" F/ q/ ^  K- j8 F
  28. 8 ?- o/ p) d+ s9 ?. S' x
  29. drive-push-pull;9 a- Q% b# I" [& K( e0 \

  30. 7 O( y5 Q3 Z" q. i2 u
  31. bias-pull-up;: \" a! O" o5 \; K

  32. ; S, {2 O2 h" |/ ]+ j
  33. };
    % n/ R: t" a% B( w) J

  34. * X! {9 C4 b0 Q
  35. };7 ~; P) U( H* m  }

  36. 2 x7 a# W$ T$ i; g
  37. sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {
    1 u+ N: J" Y* F$ H
  38. 5 A/ m$ g' _: k& H
  39. pins1 {2 L) q# u7 i) {5 w

  40. * g4 Q9 l5 u4 l$ F+ y/ f
  41. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    - h4 n) Z. v# S5 _4 q/ w: ~
  42. $ S  t% H/ c9 p0 ]! |6 }+ Q
  43. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    : O! h: F1 g' z5 g; Y

  44. + o8 f- ]; f- F. ~* P5 q
  45. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
    & @/ `& c1 q: o! m  _4 V

  46. 0 v9 D$ z3 I. Y! Z$ w- n- X8 w7 `; ^
  47. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */. x/ b- m1 p, Q6 W0 S& W0 N7 p- ?7 K
  48. * M6 p. W2 L5 J) ~$ `
  49. slew-rate = <1>;+ U; L! C# p! m" x9 \
  50. 9 e* v/ j- v- L4 m* }
  51. drive-push-pull;
    1 L' I1 Z* D3 y. A  H" @

  52. 8 {7 Q+ X/ q( O- o4 e
  53. bias-pull-up;& |  I9 ~+ \8 x9 `. F) |9 v$ \1 F

  54. % Z: |# l1 [; d, N
  55. };
    ! S( y$ S3 X. g: _! g, y

  56. % b- J) C* b, ~; t* ?0 q
  57. pins2 {2 p) f+ e0 b* b( l
  58. 2 |* S& Q' u8 A6 J
  59. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */0 Q# p/ n- }9 ^: l, g! X* ]

  60. ! d/ e9 ^+ s" G& h6 b! @
  61. slew-rate = <2>;" D) l3 K, k, A* E3 h
  62. " q4 e7 c& j" G+ D3 n
  63. drive-push-pull;( R" U1 E7 P( C. F
  64. 7 m6 B, J. [2 @) K, R( r% P
  65. bias-pull-up;" O" n) `  v# `7 }* h4 ]: p( H
  66. * V5 O) d" `2 |+ F3 W1 x% X
  67. };
    8 D, v/ v; O* P, E4 p
  68. 3 w0 \) P  K9 G, a
  69. pins3 {+ O7 h: X- h$ g5 k4 Z2 L# A

  70. * w+ r! |7 U4 G6 A
  71. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
    - f/ {" c4 L% I% B
  72. . c* x! c) e% v3 Z# V9 O
  73. slew-rate = <1>;& A0 ~8 Q! V, Z1 d
  74. & H- v8 `+ @6 ^- O
  75. drive-open-drain;
    & i9 W( |8 {0 y* h- z. T2 P) K

  76. ! R0 D% @5 ^5 o) N( n$ f% Q
  77. bias-pull-up;
    # W# D7 ~% H4 R) ~

  78. 2 U- N" i4 J* Y* T3 F% j1 j, Q
  79. };! v- B$ f5 D, q& X, u$ u
  80. ( o+ W& l5 f, @+ t4 l; C: h
  81. };
    ' m- K- }/ d( @- n- E' N6 f

  82. : E2 X% E( V$ o# H: Q) M
  83. sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {( q7 U+ d) S: l

  84. / n! i8 v+ A- U9 z: s
  85. pins {
    - e# ^# z) o- }2 K
  86.   N7 Q. M9 G7 s! `" ^! d( ]; C9 G
  87. pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */" {7 w; ?" Z# E0 R% }
  88. + q2 O9 H- h/ ^6 _: e/ c
  89. <STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */
    8 }3 N3 g( M; H) j9 x2 j" x1 R

  90. 4 j- y" J+ }" H# v9 z- f- Z6 S
  91. <STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */
    ' O( ~" R' [# A% G4 J8 h% K) Z
  92. : f& Y; V* D! h
  93. <STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */3 j0 _3 B9 p$ C# B

  94. & H# T5 r; c# e1 X% h
  95. <STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */8 m, ~' }3 a, \

  96. * A$ V- O9 o  A, w0 U% M% [/ J# b0 F
  97. <STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */7 A! Q" t4 B3 [" ?2 u" M, w

  98. , a/ v5 c$ f- T% h2 I" O. a4 P1 m
  99. };
    7 I, A2 [0 n; C+ t( w% A3 X9 E

  100. ) y/ b" A/ g; d& r, l$ Q
  101. };
    " S9 c2 k8 `) }0 R; Y+ c

  102. 2 k9 Q3 V# k8 |- p
  103. sdmmc2_b4_pins_b: sdmmc2-b4-1 {9 @" N; n1 p: R1 B: v( R! y
  104. ; C! q( f* J+ E  X7 p, b& K$ T
  105. pins1 {
    ( w# n# @0 Q2 P6 t
  106. " ^9 e$ F7 l: c- u$ }
  107. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */( n; c6 ~! I6 z2 ]* m9 d# h

  108. , a' E- N" X+ Y3 g. |
  109. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */+ ?% Z+ g) C; o$ I4 [( _, h3 P1 P

  110. 1 w; v4 M' p+ g1 G5 G
  111. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */; Y5 a) h5 b8 ?! J5 x5 `/ L0 J
  112. ' a% H  J! J3 `, Q
  113. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */3 @, s5 t. {0 J
  114. 6 n& a, x2 x" C
  115. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */' o) F  n: [6 ~1 g) }+ n7 n
  116. 4 [7 W8 ~( {5 d, |7 g& ]7 k
  117. slew-rate = <1>;& q3 o( C; q+ a+ |! V( c( a. y

  118. 8 x9 t  J  `9 G) y* k! [7 p0 X7 t
  119. drive-push-pull;
    5 A5 _4 w5 R7 }3 x

  120. 8 u6 m+ N6 {5 Y0 U
  121. bias-disable;0 H$ ]. m0 z2 e: j  f& }9 F" Q; _

  122. . H6 y# }9 W+ A3 o8 X! x( q/ Y# B& |
  123. };) A% c* h5 Z: J  X/ x# B( k
  124. $ y; u1 e3 H, `) [# r5 A4 B/ f
  125. pins2 {
    ; p+ c! q3 e5 d
  126. / b% A' `) f0 c7 E. @1 {
  127. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */+ {4 Y! M# o3 w% K* ]6 m
  128. 1 T( m6 C8 \' A" S) f
  129. slew-rate = <2>;+ W! \7 }' e( l. [

  130.   u% F7 _5 g# ~9 T. c) x6 W: o
  131. drive-push-pull;
    7 u* V$ P( k  M& y8 Q' X6 g% V
  132. - `% A# Y; L, y9 n, a
  133. bias-disable;
    2 y! U1 R: J6 ?, c0 @
  134. 1 U/ v" n+ l) m, L6 x
  135. };6 h9 P! l; _* Q2 @
  136. ) T: W- N: Q( W- L
  137. };
    # M1 r( A% @3 g$ `% X+ z

  138. : n# j% S1 O: h$ Q& ~- S3 n
  139. sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {
    " ^% [* U2 [5 t! ]- I) ^

  140. ! T# M& l4 G2 T. }  G: Y; r2 Z
  141. pins1 {
    " D8 \/ j( g  t( l  S
  142. ! Q- l# F1 G" ^& L* U$ L8 [
  143. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    ) \- U6 O& s2 v5 T- D# {" H% }: g  p. V

  144. 8 g; ^4 q% |# O; D
  145. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */6 Z1 V& `5 S- w7 |6 B
  146. 8 ?% y& L. G4 Z. }- V
  147. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
    9 y4 E0 h$ C+ ]6 B6 a" z

  148. 7 |" @' A& N& L4 `. E: Y. G
  149. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
    ( ?* t- }+ R7 p6 C- W! D/ \

  150. . {8 B9 |9 {! Z" ?! Z7 j
  151. slew-rate = <1>;
    2 T% Y9 D2 M4 |" c
  152. / p3 o# v9 h0 \: }4 z5 j* W. f
  153. drive-push-pull;
      ~: m" ^4 ?, q# ]; E

  154. ! B) F( T1 n7 ~7 I$ c- [9 j1 O3 z
  155. bias-disable;8 A* T& x1 P: M* E3 j( Z

  156. / O5 {# Q5 z5 z7 e2 v" F+ n
  157. };
    , K( w6 g4 U& A; }

  158. : E, K, a; q. I4 \! j! S
  159. pins2 {/ [3 s; z/ d: z1 z' K. `

  160. 7 h( P- v# R7 Q+ s
  161. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
    : d* j, c, B  u) [! u
  162. 8 d  J) T5 n( L% A, T& \6 L$ C. |
  163. slew-rate = <2>;1 z1 E* @/ ]7 `6 E
  164. # c  L2 c; l6 r+ e9 n
  165. drive-push-pull;$ |8 X2 h  K* O$ S- ?

  166. ) t3 V' M7 p3 u2 p
  167. bias-disable;
    $ a( E  H: b: }6 e
  168. * x& N. s* v4 }5 s7 A: E
  169. };) L3 N5 ^4 C' f! D; Z9 p4 r2 l0 ^) Q

  170. ( M2 b: r9 W2 P; Z) S5 {6 a
  171. pins3 {9 D6 {4 [! x4 s4 j* V

  172. 2 ?  o4 Z. s: ?: c, s5 P$ @
  173. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */8 D+ t" G, ?$ C; ]  \' |
  174. : I" X4 d) y4 o) _
  175. slew-rate = <1>;
    & @  e% E' @' ~; \- g
  176. ! N+ W" j  N5 b6 ?$ d. H  ]" W3 {
  177. drive-open-drain;+ ?( ~7 O% u$ P' h6 g" }
  178. 6 m8 j. `4 c$ E
  179. bias-disable;
    * R( n/ M1 |, i. S! y; }
  180. ' d4 B" ~8 |6 S$ Q: L& N3 w
  181. };: D) ]$ E! [, l
  182. & O: z3 D' S/ G' a" ?
  183. };+ p6 ?$ v7 W! }/ q2 q

  184. 9 R! |4 ^9 {6 z0 l, l7 {4 Q
  185. sdmmc2_d47_pins_a: sdmmc2-d47-0 {
    - q/ L! T0 e8 \" x! K3 J; I/ z8 P

  186. 4 e6 n1 A" y" s( _
  187. pins {
    1 R* V/ R& _4 y* G5 q
  188. ) i! A/ J  b+ `% F5 K& c
  189. pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */
    1 [3 u  ]% [  @+ s0 T1 A$ a& {

  190. 1 r0 E5 N) L4 F8 l5 N' q, a' W) z8 e/ w9 Z1 ~
  191. <STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */
    * S5 t& ~9 x1 N3 G0 D
  192. 6 p4 {& E# F. w8 K" l
  193. <STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */
    2 r) E& D# M- ^0 a
  194. 3 g, b  h% Y% f& N, i' r0 F
  195. <STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */
    ' ~$ O- m7 i, \) ~+ l' q2 |

  196. * H4 l8 A* F; H  M& e+ I
  197. slew-rate = <1>;
    1 J4 l# j7 {( e' h
  198. + Y. p: i  w1 D+ X2 Z! k
  199. drive-push-pull;
    ' V2 R  U" K3 V! v

  200. 9 x* z: i' l3 @* h
  201. bias-pull-up;5 z# f; |& x. U) P

  202. . H& I! L5 n* j+ y0 c
  203. };$ I9 M/ y# `* j2 B0 _
  204. ) t8 b, g6 C" v" P
  205. };! p2 B# r: v) z2 n& w
  206. ! _( N% \9 z& ^2 |" e
  207. sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {
    3 d3 X  Q# t# T0 }! [3 c
  208. , ]2 {$ X% l- A+ Z; i
  209. pins {
    % L' D, k1 f8 C: A. [6 A

  210. $ \5 P- g1 w9 x8 g& b$ x5 n" K6 E
  211. pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */; A( |# c0 S* r( j$ v, L3 y5 a

  212. ( a& P2 E2 I5 T5 [: k
  213. <STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */# A: W+ T$ N+ r& d" S" d' J5 z1 S1 T# m

  214. 9 R6 e! y) |- w$ {2 G: a" H; x
  215. <STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */$ J- a& h, M/ p! I) C; c

  216. - r$ S5 I9 M  d+ i4 M+ O5 k
  217. <STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */. ^$ x9 I7 d: G; O: @! G7 _
  218. 2 a# M6 P$ i' ?/ Q
  219. };
    * L7 z3 o' C7 Q9 h  Z% j0 B; H3 b1 h/ h

  220. ! U9 X8 l6 V" _& h4 c& Y4 a
  221. };
复制代码
) g& Q, x, z" z- M# k6 O
2.增加SDMMC2节点信息
8 }" k. U6 i. p3 Q3 \修改: w3 X8 w1 F% G7 J9 z" {( ]& ?
arch/arm/dts/stm32mp15xx-fsmp1x.dtsi增加SDMMC2的信息3 |7 M' V0 `; I' N( t3 Z+ J

( R+ ?5 D6 I" g7 E  h在原有sdmmc1节点下增加sdmmc2的内容,添加内容可参考
; r5 E- A8 h* @& T! I" \6 [& Yarch/arm/dts/stm32mp15xx-edx.dtsi中sdmmc2的写法,内容如下:
9 {. o9 n# s* U
& `5 u  E4 t. {
  1. &sdmmc2 {
    2 f- E  O) ?, v

  2. / }$ v8 d3 S9 [# ?( I5 w( ]
  3. pinctrl-names = "default", "opendrain", "sleep";: A$ @4 b: h; c# I0 \
  4. - i) ]& T, C; \
  5. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;. T$ f$ d$ m7 e" E6 u2 H; s1 K
  6. ! s- t6 u& q6 b  Y4 d& a; P: Z
  7. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;* \; |  o% D. E7 s

  8. . l. R! ~2 K, f4 a% R4 n
  9. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;
    9 E0 R$ M: J, s) T3 B/ T& W
  10. 1 V" q5 ~5 s/ S' F6 G/ L1 t8 n
  11. non-removable;0 ?8 ?8 n+ U# T
  12. . b: |2 @/ P- v. R
  13. no-sd;
    # g, M* {4 Q( O  W
  14. 6 y% k5 X9 l8 Y
  15. no-sdio;2 d3 h- ~9 R. Z! E  P& D8 t  C- A
  16. # H% Y  J/ C1 T- }
  17. st,neg-edge;
    . u5 X8 ~- G. t: t- [) m! z2 S
  18. + |. q$ r: D+ u- ^% A" L5 g" b: S
  19. bus-width = <8>;
    ! q) i2 h( F7 Y
  20. 8 a0 q0 V) p  V$ T% t
  21. vmmc-supply = <&v3v3>;
    2 \% ~. F8 Y6 y. ]* Y& x
  22. " `2 H% v! k0 O; ]+ a
  23. vqmmc-supply = <&vdd>;
    " X6 S% P0 l3 ~0 a9 `1 K: ]

  24. ; ^& x3 k- ^% I& t
  25. mmc-ddr-3_3v;
    2 W5 Q: B3 X* c/ K8 ?8 |* L
  26. / f$ E: q2 U/ u+ h0 k
  27. status = "okay";- x6 S. f; C8 X  u2 t8 x
  28. / _* I' h/ U" B% D# [
  29. };
复制代码

) q3 o8 D* A1 m3.增加mmc映射" s+ @7 ?4 i$ h
修改1 C  I; G/ ]/ t, y' W
arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi文件,调整启动通道。  w6 b; H1 I1 D7 _7 b
4 L4 c1 X: c( U1 P
修改如下内容:- v2 o0 S" l) S# |, L1 |
. k8 T' r4 ~2 U2 d
  1. aliases {2 V6 q6 V" I& ?5 l. W% @
  2.   _+ e9 [! |- ^0 z# `5 V# p5 ~
  3. i2c3 = &i2c4;. g* d9 k( M" j$ T$ b) D
  4. ( g. }* R1 l/ C8 z( T3 s
  5. mmc0 = &sdmmc1;
    + @; P9 X1 {5 F7 J* j6 c

  6. 9 |3 B) M* X; Y2 C5 ]1 U
  7. usb0 = &usbotg_hs;
    9 Q! @7 Q  U0 X" V0 t( y/ y

  8. , _, p3 f8 o6 X4 u! j
  9. };
复制代码
( M# Y& m9 K- _3 f2 Q
修改为(红色字体为增加内容):! m' X& g( |2 p" m: M8 j
  y0 z0 L: c2 q3 j- `
  1. aliases {
    9 k! |! g" J& s" y9 O# o1 [9 j6 ~8 P

  2. / B6 M5 X' S5 c: A7 C: S
  3. i2c3 = &i2c4;
    * q/ N" `" A# H4 b5 t$ L, M
  4. # \: U9 b7 }( @+ ^) ~. Y  d8 {
  5. mmc0 = &sdmmc1;% k& T1 v. W/ _6 U3 \+ ^0 @/ z
  6. & X* C' c+ I0 h" Z3 d" v
  7. mmc1 = &sdmmc2;) R6 j, }  a1 `2 n

  8. 9 \" N' y+ U6 |, R" E1 ]
  9. usb0 = &usbotg_hs;7 U9 e+ q+ J3 m5 |+ F9 W* l
  10. 8 y: J: G1 c% z8 j
  11. };
复制代码
: ~7 s# I" v8 U0 ^) s
在sdmmc1节点后sdmmc2的内容(红色字体部分为添加内容):
( n7 n8 _; r' x% c# M9 d# ~" V  @
  1. &sdmmc1 {6 |7 g" m0 o9 Y
  2. 3 M: G* U2 \( x$ z6 _
  3. u-boot,dm-spl;
    * Q1 U" p9 j( |# n0 V

  4. $ v2 n+ B- R5 f0 H7 p
  5. };
    ! E, E' O0 A3 j

  6. & e7 v0 q- G; N$ Z! ?$ p5 f6 o
  7. &sdmmc2 {6 W6 n( S4 D7 P; w

  8. ) U* U' T1 K' M8 J  m& t
  9. u-boot,dm-spl;, y/ H) L# h. h( b7 V& f
  10. 3 |4 `( n$ l/ Y
  11. };3 `$ G2 \3 H1 E; d+ c1 K' p
复制代码
: c- k9 M+ {# ^
4.测试
# \% R7 X% c8 H" N重新编译烧写后启动信息对比前文多一个MMC:; J. k, V+ b6 l- l1 _
# t; b! l+ |8 i& w& @* [
2cac56e284a80e97f9198b8b70ef60dd.png
1 D1 s' A+ G. h) D/ x
* G7 j0 ~6 \( _# A$ z3 W  OeMMC的验证需要通过linux更新,相关操作可参考《通过linux更新eMMC中的u-boot》章节。0 f% a  j2 e5 S. ?3 W. f0 ^* _; h7 C3 W
/ m9 J- p2 k0 F+ N0 J" ~& [
生成Trusted镜像

' @6 `7 v( t) A& Z前面我们做的相关配置都是基于basic的配置,而实际FS-MP1A使用的uboot是基于Trusted配置的镜像,后边的《Trusted Firmware-A移植》章节会使用到Trusted镜像。$ z. _  _, S' C# Y9 y
0 c: z8 g4 J4 h8 K6 n
1.建立基础的Trusted配置文件8 F: R$ x6 u$ v9 q+ C
linux@ubuntu:$ cp configs/stm32mp15_trusted_defconfig configs/stm32mp15_fsmp1a_trusted _defconfig
; L6 f; t& a; t, ?% k& E  W, G0 V
linux@ubuntu:$ make stm32mp15_fsmp1a_trusted_defconfig
7 X+ u( r: y$ I& m. P- S
  n9 z. ]" n8 m1 v- W0 _2.去掉PMIC的配置选项,按空格将方括号内*号去掉:! `- }0 v* r7 _% j; R
linux@ubuntu:$ make menuconfig- J: p, t2 }) |/ S' z+ L1 i

+ s9 j% S4 W  S" C( LDevice Drivers --->7 q4 [5 e4 U: s  Z

9 j& Q9 p+ K5 S0 g$ R$ ?Power --->! G- X/ G- O5 V
- [; T7 t5 Q9 k5 q# V
[ ] Enable support for STMicroelectronics STPMIC1 PMIC
8 R4 t# S4 {5 e9 A% M7 n4 M8 ?+ e  G5 w
3.去掉ADC功能:按空格键去掉[ ]的星号# T5 }  i' y- ~+ e" m0 R2 }+ Y8 t) e
linux@ubuntu:$ make menuconfig
3 V. L+ R# N- V5 m. m, e& W. L2 }* k
Command line interface --->
& m) F% }* b6 h% J
. R- r) [$ i& R+ L! C8 ~" t( kDevice access commands --->5 |+ D& y7 \" u6 L9 d

4 N6 V% i5 G) d. P+ e[ ] adc - Access Analog to Digital Converters info and data
1 d9 X! F" f. ^, l: ~: n
4 H* e% C+ U+ ?Device Drivers --->' F6 Z# |5 n6 }6 _4 S: h

& y; {4 q- h$ v) y. s' Y; f' c[ ] Enable ADC drivers using Driver Model
- j0 i+ {8 `* o( V- w+ V6 K( M  V8 ]! Q' M
4.修改配置文件
/ ^' r9 s/ ]6 F$ _- A3 @linux@ubuntu:$ cp .config configs/stm32mp15_fsmp1a_trusted_defconfig( _" d) Z/ t. N5 c# j

! f: G' S' \" {9 S修改上层目录下的Makefile.sdk编译脚本在UBOOT_CONFIGS配置项中添加“stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32”在DEVICE_TREE配置项中添加“stm32mp157a-fsmp1a”3 s2 u# |& w/ c; r
UBOOT_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
: Q+ I" w& @$ E( e9 E% ~9 ]8 P! _- ]  ~) A" P/ z' H
DEVICE_TREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
/ u) ~9 j3 f9 g" a5 _% w1 {+ Z. `
. C3 }4 h8 Z+ f  V7 G5.编译trusted镜像- P" K) a' g5 w8 E4 z5 J- K  Y
linux@ubuntu:$ make distclean6 e: E. ^2 {% H5 ^  ~) b

/ x  r7 Y8 G! Z4 H5 x+ t( Xlinux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32
$ ?- @- n3 p8 Q) ^- K
  e* }3 k# B2 m- v6 ?, i ad036c93e9e4360337f601e438f24f21.png   m) A& g) L) j$ n: C  [" R

% W$ j6 ?# m% J; f1 s; f编译完成后生成的镜像文件在上级目录下的build-trusted文件夹中有一个“u-boot-stm32mp157a-fsmp1a-trusted.stm32”9 f1 O& |& b3 [
linux@ubuntu:$ cd ../ build-trusted+ V8 W9 f4 V- I  W+ A& V# u/ k' J
; Z5 ^8 ~  T) B1 t2 c
linux@ubuntu:$ ls
: B- |, k6 n6 s8 x- ]3 ?+ y( o' N* H
. E+ y; Y% o1 Q e0ff14fcb1c57db1a2e2b6cdd0ea9abe.png 0 M1 a" j; ~0 O9 o& Z, X# O
  V3 P4 Q, k8 v
u-boot-stm32mp157a-fsmp1a-trusted.stm32即为我们后续会使用的镜像文件。
$ }3 k2 |6 ?5 N# y! K0 _————————————————
' z' K- e3 e2 r# S, ^5 p版权声明:华清远见IT开放实验室
$ ^, \0 N1 m8 C/ A
" _; a! Z1 G8 E& l# d1 [/ {9 f: Z
4 ^* T$ Z7 _( J- p5 R2 `2 c4 u
收藏 评论0 发布时间:2022-10-1 18:37

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版