实验原理
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
- 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
- STM32MP> help
3 z3 |1 c# N/ A' Q }( v
- A/ B6 {9 v. n+ j/ T& `6 H5 B- ? - alias for 'help'
, F: F7 w3 A, @7 a0 M4 Q
. Y( X5 P+ H1 A+ S, V9 X- adc - ADC sub-system4 k! K o8 r$ C( f' S: N1 f2 t8 E
- & Q" t& u* C1 B0 q+ O6 q
- base - print or set address offset, y% Q, X. G3 T) `; [5 X! A
- 1 Y8 w4 Y) j5 u4 S# f& n' K* n) j" m3 L
- bdinfo - print Board Info structure
4 l, f/ c& g- {7 w( E8 v2 I
0 `8 r- W6 E0 ~. r4 L- blkcache- block cache diagnostics and control
5 o$ l! x, Y+ o# M+ K* v
. t( E' n$ f+ Z, s- bmp - manipulate BMP image data, q+ ^+ Y! Z. w( Z2 T7 A( x8 `7 L
- 4 z# E! A5 m: k* `! P$ H
- bootefi - Boots an EFI payload from memory, l+ Q% I% o9 r/ ?- H( S
- " c& h( M2 f! S5 S" H; r1 g
- bootm - boot application image from memory$ r' N# I, r) k& x+ y
- : u/ v4 F1 D$ H$ J x' }# f2 \' M, w
- bootp - boot image via network using BOOTP/TFTP protocol. j- n# `! N6 x2 ]3 P
- , i: D( U! c8 b# r8 s$ o+ _/ ?% n
- bootz - boot Linux zImage image from memory @! |" K) f* t' }
/ o* ?# u, @) ?! ^- chpart - change active partition
, n9 _; F: p$ I& S$ O
3 K# e' F9 q5 K( b! L7 x3 F- clk - CLK sub-system
( f l/ D) |% P& ~1 g - % c3 D( {- Y- a/ F# N
- cls - clear screen+ k& f7 [ I4 E) T8 H2 W
3 v& r: p9 c" s% B+ A- cmp - memory compare
- W0 _) W1 ]& q - ( N; I: g2 Y, S
- coninfo - print console devices and information
. s( y0 ], q; @3 c
2 ^) y) G5 G' v: z" [% e0 a5 C- cp - memory copy( F$ @! p( I# G# n
) P6 H& l1 H8 m8 i' y- crc32 - checksum calculation, r' V7 j! S6 _ Q* [8 C# ?
- $ x1 B$ x& y& F, L
- date - get/set/reset date & time4 X& Z$ N4 ~/ N
: G# \( p9 _6 G1 C1 [- dcache - enable or disable data cache
0 m2 ?% z3 i3 z
& F) s' ]6 v2 x4 ]) o- O- dfu - Device Firmware Upgrade
$ i: W2 A) J$ Q t6 v
) z2 ~: c" c( }- c# K* `- dhcp - boot image via network using DHCP/TFTP protocol
9 p- g! R6 o8 ^( n3 V" e - 7 Q* A4 c6 y, I7 m- f" M+ O2 a
- dm - Driver model low level access
}8 J0 o4 D2 C; Q8 ^
4 x6 S' y. [% o3 [& T+ Y- dtimg - manipulate dtb/dtbo Android image% H6 Z* Y" X" s1 l a5 T1 @
+ W! q0 t' ]! C4 ?! c* {; W t s- echo - echo args to console
- N. n% O3 G) c - , R: Q4 h, h( _0 [" i
- editenv - edit environment variable/ i+ p! X2 F# F8 \# `3 O$ F
- / W- o8 S4 O$ M" q8 g$ y. p X
- env - environment handling commands
) b6 Z# _1 L! @8 L' ]) L( Q
7 |3 l: n( [6 h- J( H8 ]& \% `- erase - erase FLASH memory
* i: Z+ |5 b8 S% X* k% f - . v3 v% T( t7 Z) [2 m
- exit - exit script
9 f- h8 V$ F$ t- Y+ D$ X9 u4 D - " ]+ P. a2 Z4 U4 t* a* J
- ext2load- load binary file from a Ext2 filesystem
$ V& a& F5 ]+ V, I( U4 a- T! ] - 5 z( U+ @9 ]# B5 \3 C9 M6 j
- ext2ls - list files in a directory (default /)5 h& D3 J0 J. Z7 `5 x8 ]% U3 {) E
- , I( x2 `1 m9 U8 S# ]. U( n
- ext4load- load binary file from a Ext4 filesystem
: \$ l- H5 }# d& x8 J' M! K+ {; m$ `
$ E- }/ ?7 O z- ext4ls - list files in a directory (default /)
: |6 L1 V) k- A. k
# J- c" _0 H, n' {3 J- ext4size- determine a file's size
4 c( Q% ?4 K+ f8 ?9 y - 4 M4 J/ c7 d; v- r8 Q8 P
- ext4write- create a file in the root directory2 E+ |) n1 J1 d9 w: W, A
. [+ R( Z s- B Y1 s& ]- false - do nothing, unsuccessfully& G+ x( d* y$ B9 k% @( J
- 2 K7 K8 n2 Z( B6 B* z5 v) K# ?
- fastboot- run as a fastboot usb or udp device, k% V H/ |& }2 ~
- 9 D* y0 \ e j& @2 E
- fatinfo - print information about filesystem
# ]7 N: q! y4 ^" w3 v
3 x" |/ X( P7 _) \( E- fatload - load binary file from a dos filesystem
" e m g3 r! q4 \
* ^1 f0 \! j" z4 L" U! ?4 ^- fatls - list files in a directory (default /)
8 Y4 P0 g+ Q, n4 M" d
+ {$ r; ^8 J [. f, |* E- fatsize - determine a file's size+ O& c: x- H! R/ \ y
' ~: T% a5 f- Q- fdt - flattened device tree utility commands# m; E! g5 P' l4 M
- 0 y8 D' F; u/ a- H: u
- flinfo - print FLASH memory information3 m6 E7 w$ [; o7 @
- ( J6 b1 n) ?' s* u! U1 o/ f, n
- fstype - Look up a filesystem type
L# {& Y. g) d d. S5 F - 7 q B% r% q6 K( N2 B
- fuse - Fuse sub-system
2 U$ a/ t, N* F P7 _. a. W- ` - . x* w; S+ w% [6 K" a
- go - start application at address 'addr'
$ u- h% y' D/ P, D' {1 z& L
9 J) O7 p; h" R" u7 E& \- gpio - query and control gpio pins/ H! n" V0 Q! Y* _$ h' O9 j, Q# p
. e4 X, _6 K' ^! |: N! [- gpt - GUID Partition Table4 X) N5 i* W2 b4 G8 l9 G
5 }! _- O. {4 H, W" a, l. I. t8 a- help - print command description/usage2 d! \5 k, k) `: H; e0 l/ D# U, z
- $ A; h, T7 r$ G* k% U: y* S
- i2c - I2C sub-system4 Q/ z- n( D& e* \
% n9 i+ V: {) H7 Y8 h- K. Z- icache - enable or disable instruction cache! ^, P6 r1 d" e7 G% L0 ?% {3 k
- 7 k+ }+ N- o1 q5 t9 a7 N6 m
- itest - return true/false on integer compare, L# p/ M* w* \+ j( v5 r. x" S
- : V% J% _4 _5 c, q. {( X
- lcdputs - print string on video framebuffer+ A. ^7 N4 ` a9 n
7 v- c" ~) F/ u: R* D& H, \- led - manage LEDs2 f, C+ f, e7 c* n( J
' l& w- T6 ~6 m' T; j1 b. B- load - load binary file from a filesystem4 P6 y3 F+ s" F5 S; a
( c5 U; }7 G. _: I8 Z- loadb - load binary file over serial line (kermit mode)
/ A ]* N3 ]( d+ _
7 E5 _ T4 n. n7 L& |+ _! m% f- loads - load S-Record file over serial line+ S8 ^3 E, R& y1 P# ~) I- j
- & J" f: o/ t$ \3 E/ I, ?+ e
- loadx - load binary file over serial line (xmodem mode)
* ]) h2 Z' j X) a - 8 l$ }+ X" L$ [+ `; w7 J
- loady - load binary file over serial line (ymodem mode)
8 E7 q+ [" q* @ - % e; l2 \; z h1 ?7 E
- loop - infinite loop on address range9 [* I5 l- ]/ } ?9 `
- 0 Y8 V5 G L0 U ^4 v$ c& T3 v
- ls - list files in a directory (default /)
, F5 K% O) m G q t& H
+ ^$ \2 E' [3 b' c8 l8 c- md - memory display
* Q, H" s+ c1 W8 U( X1 a: a
% Z9 `# g+ \9 s3 l# s* y- mdio - MDIO utility commands8 A2 J, g3 _/ G* K( E2 L. [. D
- $ G& d- l3 k7 C R% | r
- meminfo - display memory information
$ d2 Z6 c( D( r+ _ - ' E4 B. k7 _# w3 U$ I/ i
- mii - MII utility commands2 _" i/ w* n* X4 ~
1 K" q1 R8 M$ Q- mm - memory modify (auto-incrementing address)& J" P/ s" a6 {6 _$ v8 q5 i
6 s+ S# e" a4 K8 B, Z- mmc - MMC sub system
9 x' M* K2 h& X9 n; J - 5 t3 N# ?7 f* m8 Z Q( _9 \" u
- mmcinfo - display MMC info
. s9 Q o' X/ p" m I' V
0 E& j3 V' H- Z6 q) `- mtdparts- define flash/nand partitions
" m; C% @- I$ M, v a6 B - ) T, c* x) f* f" n
- mtest - simple RAM read/write test; C% F/ L$ ~: t. L# {6 K
2 Y0 O4 v8 c! z# z' n4 E( N- mw - memory write (fill)! D2 J; Q5 ~/ |5 _8 i5 h; H3 K2 d
- : `$ J; P, q' L2 Z% R2 [
- nand - NAND sub-system
" X9 `9 g- r, J* i! w- S3 j" N1 i - 0 F X- [+ ~( ]* J. F
- nboot - boot from NAND device) L: X* j9 b! y% J9 Q# c! J& x
- d5 f" l# b }* m- nfs - boot image via network using NFS protocol2 b S' P) [! n j! E5 y. q8 O0 u( [
- ~* q4 C+ O8 F$ K- nm - memory modify (constant address)
0 [' g J+ m* x - 5 U* I6 t$ j- _! ^. x- b" I/ K2 _
- part - disk partition related commands% q8 m" |% A( G% q
- / v3 n, w( o+ b
- ping - send ICMP ECHO_REQUEST to network host% }& Q6 n6 M' o% R- A$ T
' l& @6 B. R( _; L& f& p9 n- pinmux - show pin-controller muxing
; A# B; L7 T g s7 ? - 1 _# }( a" w% Z+ p" ~9 }7 \
- pmic - PMIC sub-system
' [: Z/ U0 r) O4 T$ P
' w t8 W/ p. \6 D- poweroff- Perform POWEROFF of the device
! g; o g1 w( J9 y4 P - 2 a- b) l& S; N5 O/ w/ Z
- printenv- print environment variables
+ c, [; I' m: Q3 C( q - ) d* G; d, p; E. \( s- [
- protect - enable or disable FLASH write protection5 Z7 u4 L, {: l' Y X
/ C0 p! V+ {# N5 F2 S- pxe - commands to get and boot from pxe files
. [8 m7 u2 n: v - + y% M4 J" b) Z0 j( n4 @4 U, I. ]1 w
- regulator- uclass operations( b; r# n# t0 a8 H
' A( {, x; X3 W+ g( ]6 r- reset - Perform RESET of the CPU# A) Q* [" j0 u3 y; G; s% L2 P
- ) P7 ~- o. F3 ^( u4 p
- rproc - Control operation of remote processors in an SoC: H" d9 r! D6 L% j) C1 x6 _
$ H/ K5 @+ _$ f$ k- run - run commands in an environment variable0 I, B% F0 o; [" X$ `% k" r* \
) V4 v2 w; l6 D {: U; I- save - save file to a filesystem' ?' O5 c' U# R( o! Z- W
, i5 i& G/ X/ }% _8 W- saveenv - save environment variables to persistent storage
% Y9 H8 R- r/ B+ w
( f3 L' `" T. m# g1 i9 v/ ~# g- setcurs - set cursor position within screen
: j' Q: t, f5 R - 1 b4 |# h* a. [+ O" ]: h
- setenv - set environment variables7 O" q! N% }: E: n
6 f& N0 g: {/ [8 j- setexpr - set environment variable as the result of eval expression8 r# g/ C& G, T" a2 K8 n1 N+ [
- % ]" w+ N" w n. _8 P9 l: {
- sf - SPI flash sub-system
' T: p2 G& o* p6 z
6 z# h6 ^, d, O- showvar - print local hushshell variables/ F! a" T p9 A) h* Q6 f7 ?1 G, o7 Z
- 4 T0 E$ k2 M+ Z' c
- size - determine a file's size. [* K2 h: a F* ?" Q: G2 Z
% D3 O5 O, d5 B- e/ _- sleep - delay execution for some time
6 [, }! @9 q; A2 _3 m; f - 5 ~2 z; ]# d6 z& h9 j* G
- source - run script from memory
5 r- _5 c3 J/ O8 q - # i. n# c- A* Y1 k( \
- sspi - SPI utility command
) L% p1 M0 ?) P7 h' p5 a2 d" P - w% b4 K. c; |5 j: L
- stboard - read/write board reference in OTP$ u. U1 U0 ~1 [; }
$ b# J5 T& Y7 X ?- stm32key- Fuse ST Hash key
+ e3 l% i/ G0 ^, c4 o* Q
: N0 J; d2 w6 q6 h9 j8 f( q- stm32prog- <link> <dev> [<addr>] [<size>]1 A+ L4 D+ X$ o' a( I2 F6 G3 A. g
- u' B( v- ^- E
- start communication with tools STM32Cubeprogrammer on <link> with Flashlayout at <addr>
6 L c f. e- t5 F7 g - 4 x7 E. ]0 p5 r8 {
- sysboot - command to get and boot from syslinux files1 y' \! M- T* {( c
- / S4 K; T# d- j; c' S
- test - minimal test like /bin/sh
2 _ A% R9 Q) t5 ?" i( y
& \! ]$ v/ {' n" s; |0 o* v- tftpboot- boot image via network using TFTP protocol7 ~; g( h% Z" X G2 P. b- I
- : V O6 }- @- D6 w0 S/ \
- time - run commands and summarize execution time V* X- I! |$ Y# c/ f; u
! L9 z* T" s3 u& y* T- timer - access the system timer
/ L( m; f& X# n) I. f
$ Q( U6 q, e/ _4 M+ b- true - do nothing, successfully! ?4 p- B1 `- t' H7 u3 \/ e
- ( D/ B6 [ Q; _: J7 k! P/ @- v
- ubi - ubi commands- J" H* C0 e5 \- _3 x$ k- _/ L6 U
: d# c" W+ y- H N0 q) q- ubifsload- load file from an UBIFS filesystem
% Z2 }1 E: w6 J: O) B! } - ' w T( F& W9 r7 u
- ubifsls - list files in a directory
/ A- g G- }0 V+ s6 T g5 r - 4 {3 w8 i8 e: B+ x9 {1 N
- ubifsmount- mount UBIFS volume
* ^% j$ o4 u! ^ B5 B
1 M* W0 i- v# |4 \- ubifsumount- unmount UBIFS volume# z: Z! b. q1 d6 M9 Y1 B' i8 j
- 9 _7 W; f) z. G% q9 C; |
- ums - Use the UMS [USB Mass Storage]
3 A3 Z% c+ X3 T& A: H8 u - 0 ^& J( o/ a6 Y6 e6 M" O
- usb - USB sub-system
7 Q& `. n# P9 w3 ?: b - + x, ^% y) t5 H2 P# x4 x+ |
- usbboot - boot from USB device3 U- ^! g. L9 ^
. x& k: U6 D- M H$ ^- r- version - print monitor, compiler and linker version m C$ _2 m, g4 T
- ) x/ F5 p3 X! e4 g
- 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% ~
+ 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
: _/ 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 _
+ 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+ ~) \
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
# 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 ]
- 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
* \# 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
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
% \( 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
; 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
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# ~
; 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
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
& 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" `
$ 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
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
& 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
. 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- &i2c4 {
, H0 b. E- D `& b7 g. N% L ~9 y
# f& Y7 x4 K5 ?8 U% g8 W% P- pinctrl-names = "default", "sleep";7 s+ g3 W% I t: \% v8 E/ |
( Z- K$ w4 V- A2 ]( r- pinctrl-0 = <&i2c4_pins_a>;
+ u: k* g' m8 ]1 I/ G- ]
0 b9 s! A) F. O; ]0 j6 G- pinctrl-1 = <&i2c4_pins_sleep_a>;
* t# D4 D) k2 U" _* D `
3 m- e, l ?* }% ~- i2c-scl-rising-time-ns = <185>;
- p/ i& G7 i0 e- x9 d& |, U8 t - / x3 u+ ^: H2 C) h0 w, D: b
- i2c-scl-falling-time-ns = <20>;3 ~( \" U3 x: r y' ?" i
1 H, m, j7 ^5 P$ n' N- clock-frequency = <400000>;4 }6 z- L n) b2 O+ r6 A2 p
- 5 J5 m3 ?& ]0 Y' `8 ?5 B. L. O- T
- status = "disabled";. b- D2 |/ }+ G( Q2 e+ B
6 n# M, I" w9 l% k8 n7 C" k- /*内容太长此处省略*/
5 F. \6 q# j: `! F: H8 M& u, X
: c, U7 O9 m" L [7 h7 ?4 p- watchdog {( H* H- N7 c/ j$ K$ Y7 F
- 2 A" b5 R1 D5 e7 G- X0 E) b
- compatible = "st,stpmic1-wdt";
, p4 E: }: m3 a4 T: M - 8 g: Q$ O+ o8 E
- status = "disabled";
; Y2 |2 y2 Q# d4 G. e
/ {0 B8 R5 L6 U2 T7 K7 `- };& n9 U) u) V3 e; ?9 `/ s8 J, p9 [
- / u8 y4 i' t. Z# w$ ~6 V7 ?
- };% |7 c( R7 g: e( U( u
- 1 F3 g& A! s/ V7 Q
- };
复制代码 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
- &cpu0{
" T+ D$ r; D. ~% k# i8 F - % c S0 D2 L5 [& p0 u
- cpu-supply = <&vddcore>;6 N! Q9 A' s9 s6 E* H2 i; h+ o0 U
- * Q, D# c+ ^" O; P' }" E. b+ d: s+ k) m
- };; D2 Q4 @; C! ~& i
+ Y4 `4 G; G, c; ?/ X$ U4 w- &cpu1{
# q' e/ r3 b8 P: V. [ - ) f5 V+ f9 i6 E6 j3 P
- cpu-supply = <&vddcore>;, j3 K3 s1 [3 { V' L* z2 X
( K. I' M; [; ?# w9 v) g, V3 \( }- };. l$ F$ f4 x9 X9 z) c7 E
复制代码 , \* X6 P8 M9 `$ A4 ?) p
修改
% J C/ ~( g9 ^% v: o, l$ ~- 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- &pmic {
( H* w/ V' h: V8 s, m; Q: ^
# \; Q/ W- g- _, S, g5 A3 p- u-boot,dm-pre-reloc;. L: I/ h* H# Z4 T: O3 F1 U
v* N. Z4 v- E. J- };
复制代码 $ 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
- &usbotg_hs {( x4 c- w5 X$ Y" M) U# F7 n; y7 {$ v
- / _" P7 ~. ^& T$ H( c
- phys = <&usbphyc_port1 0>;6 P. j9 [4 V2 X& }7 A x
- 3 h: w/ i+ @- V! Q' I7 C, K/ j
- phy-names = "usb2-phy";
# y, e1 L# p8 K m8 @
% L. i7 M, K3 \% S) X1 W- usb-role-switch;
8 b: k; v; w) I$ d8 l3 u - 6 a# Z8 |$ v5 h9 v _8 P9 U
- status = "okay";( u$ l6 [- N1 k
7 |! _) {' I6 [3 K# B, U- port {
- Y% W" O0 w z( K1 w. U# s9 l - / M1 m! X/ d4 i. I2 S" ^
- usbotg_hs_ep: endpoint {
: K. g5 ?7 C" k# `8 E - % z4 e! C/ @7 y- T7 R4 u, e' X
- remote-endpoint = <&con_usbotg_hs_ep>;4 n' a( S% d, u! a# T) ?
- K3 I [7 }, Q: x5 g+ y- };5 \- X; @" ?. ~. s1 [6 ]: p6 m
- 4 [- X% H2 F/ o" t1 c$ V* L
- };3 m) }8 w4 D/ `
- % a1 a5 ~3 z; m$ e
- };
复制代码 % `; 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- vin: vin {
1 O2 ?/ b; n8 V2 f" L8 ], o
# p( h0 V8 `$ N" v) n+ R$ ~- q- compatible = "regulator-fixed";
$ r, E0 I: T0 Y
" b8 ~4 ]* l5 U/ g2 ? J c/ |$ x- regulator-name = "vin";8 l# r' Q! o/ i" W) A! |" [" `
4 J# \# B1 q- W- regulator-min-microvolt = <5000000>;3 d5 j& G! d8 {3 L) x, m# Q: D
- / Q3 ]$ E4 T( t a' h
- regulator-max-microvolt = <5000000>;& y8 T9 Y: N- k5 P5 N4 L
- + v5 Z" Q `5 g$ Z8 A8 ?$ h
- regulator-always-on;
' h+ }0 Q5 @1 ^9 h( {' y+ X
% k2 z0 O! f- c1 q, m- };
& S) A- d' r5 K% m( m3 D
8 w9 }$ I3 Q" h7 W5 a$ ]+ j- v3v3: regulator-3p3v {$ H& V5 \& a2 ~8 e2 r% w
- $ Q |1 Z4 J+ |, l
- compatible = "regulator-fixed";0 j& ]0 K) ?1 t0 ?2 w' Q, l: {
- ( [; _5 q8 l( @* H7 H
- regulator-name = "v3v3";
" T( l. k# u5 U5 ]' S. Q
: F; B% r' B) t4 i" f- regulator-min-microvolt = <3300000>;) ?+ V- T1 e+ M# N: t6 G. G6 p7 a1 f
- , E; \- ^# _1 m9 C$ E- V9 T
- regulator-max-microvolt = <3300000>;( e% c. L- U* X6 P1 u3 N! f5 m, [
- 3 P: s$ k1 o1 Z9 E$ o. A$ c
- regulator-always-on;
' c! y |4 {. s0 j6 I. | - 4 F/ i g7 z0 F0 ?7 O$ f6 X
- regulator-boot-on;, Z1 o% u$ Y, Z9 z1 ^0 b
- `( b0 B+ S) q1 S$ v1 I- };9 Q" X% G. L6 r- B0 c2 V
- ) x8 M/ W* \. ^+ d4 Q6 I$ k0 Z
- v1v8_audio: regulator-v1v8-audio {, H" t A! y! N' n/ J
- 5 M8 ~) j1 `# p# ~9 j$ B
- compatible = "regulator-fixed";
5 t/ w: N7 H* C1 H9 f - . n# ?& W, |/ Z
- regulator-name = "v1v8_audio";! P2 ~2 _* d& c0 w+ r# d2 }6 m
# O: o% A- O) w* L- regulator-min-microvolt = <1800000>;
, F" V, G8 ?/ s, N& T - D% e( f$ I9 {0 N2 K" W% t
- regulator-max-microvolt = <1800000>;
- v1 M- B: s- f - " C% k9 Y/ f) P$ c* W8 v
- regulator-always-on;
6 {2 V9 n1 u* _$ B
8 v4 o0 g0 }7 |4 O! M- regulator-boot-on;! z1 @0 d( r" l% a% B% y
4 A( R3 [4 L6 ]1 Q- };( j. [8 I/ v7 X
: [$ n9 ^: U u3 m6 R j- v3v3_hdmi: regulator-v3v3-hdmi {
3 \/ t/ u' g! D4 Q( ~; {
( [! {5 X1 v# z2 }- compatible = "regulator-fixed";
* ~( z$ n7 A7 }* N. x9 T8 u - + B$ j1 I" Z7 y! W
- regulator-name = "v3v3_hdmi";
( G" @: J! W( \; y! A# Q- H - 1 |& @& C* @) N7 b% U1 i8 \
- regulator-min-microvolt = <3300000>;
4 ^( Z6 i3 \" A, L. ? - / o' S8 i- X+ _, M* \- y9 r4 }/ ?
- regulator-max-microvolt = <3300000>;! k- r1 \1 ?3 i, V" Q- J
7 c6 \ {! B( C$ D B; u' |8 z6 g3 h4 D! s- regulator-always-on;8 c3 a' ]: q. z6 y$ _ ^. ?7 Q" A% l
- G( L0 L; }: {: q2 a2 }8 _% D- regulator-boot-on;# Q& o: ] }& }6 I, Y
! v9 I9 c: e+ y2 x$ S- };
6 D* E, P% K/ y! A! f0 D. _5 G8 W
$ Q9 M7 ]& w5 ], N- v1v2_hdmi: regulator-v1v2-hdmi {, f: a! a9 N1 v9 I0 Y7 p
- ( R2 y0 G. ~0 X* e# g
- compatible = "regulator-fixed";* w/ {- y# ]- @" N7 U: {
- * p) r- W7 I' T0 G' I
- regulator-name = "v1v2_hdmi";5 R* X" i! V: j x: {( H
- 4 A _; b& d+ K% h* d
- regulator-min-microvolt = <1200000>;3 J$ F/ b' a# z/ C
# T7 B2 Z3 d4 p8 {8 E* @: v- regulator-max-microvolt = <1200000>;6 c9 b& O* w$ [5 n6 D' N, [
: ^7 g" A; _% v# e) h& r; o3 R- regulator-always-on;
/ o, K9 {' J% r0 i3 K- [ - - w* p* U" [! K7 X: Q+ a5 j
- regulator-boot-on;& B+ m8 n ]% b3 I0 m2 r! k$ V
) U/ r7 Q# l+ U8 C; X1 v/ E5 Q- };, q% [7 ^8 q) }1 A
- * w" C5 E# w. N% A
- vdd: regulator-vdd {3 B. G' v9 Q* A8 E% P
$ l( f3 ]. `& g- O3 L) K- compatible = "regulator-fixed";0 `0 b: w" o7 T' c- \$ y
# r; A0 z: L# q' i- regulator-name = "vdd";
/ _( L F2 u0 T) ^
: f9 a6 k) |; p. R- regulator-min-microvolt = <3300000>;+ u9 P4 J# Z/ B' X: B" @3 `" T( K8 ]
6 P' @6 z( Q1 |' V- regulator-max-microvolt = <3300000>;
0 R7 P/ N- w3 y - 9 ?, U& H9 _% q0 L+ B3 f% f
- regulator-always-on;8 o4 T+ e1 k7 V
1 G. n# W, q! J/ v7 R- regulator-boot-on;6 p# v, ]6 c" r1 d5 y$ C: r1 x
- # b* m4 M2 Z Y6 N
- };
6 {& ^) i) X7 O X
: z: a+ _5 b @% J5 `2 U- vdd_usb: regulator-vdd-usb {$ p" x% G4 ]1 N9 |0 d1 H
- 9 J- d! A' c' |! ~
- compatible = "regulator-fixed";/ r2 g$ o3 A$ y% { y, d
- 7 Q8 w+ T' A( j& l2 f" \ Q! h
- regulator-name = "vdd_usb";
, ^; X7 y' F. A1 [# Q! ?: W5 Z& d - 1 }6 h9 B! ^5 O3 @# d3 k: Z: K
- regulator-min-microvolt = <3300000>;
" N: a4 m2 M9 ]) f% K ~
) p/ N8 f* ~* Q" X- regulator-max-microvolt = <3300000>;
- A# Z! L) x' }. X' q - ' g3 W+ K; q3 Z0 y' X* ]# N" y6 ] _' Z6 r
- regulator-always-on;
( X1 p" R" Y5 P0 ~4 S5 e - % W' M3 r% ]; U! N; p7 `* M5 z
- regulator-boot-on;
& H r/ s) b' M E - {: D0 f; E% C$ N/ Q7 i
- };2 ?% _* j* l% x$ G/ H4 j/ ]
% e; G$ E, ?9 z! C0 ]/ H- };
复制代码 # 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
: 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
* 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- &sdmmc1 {
# u4 [( K5 K& J2 O7 Z6 q
, J' {5 w, t w0 Z* g- pinctrl-names = "default", "opendrain", "sleep";1 |3 d# l1 S% x, H7 k
- + Q- C4 C7 m) B* h; W- O
- pinctrl-0 = <&sdmmc1_b4_pins_a>;# |5 C- ~* m/ J5 B$ ? {1 J9 |
- - \5 }3 D3 \6 J& X
- pinctrl-1 = <&sdmmc1_b4_od_pins_a>;6 ^3 s. d* j; V) B6 p8 J
- 8 V, ^1 H" T# q
- pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;! R/ h O$ M, Q" [. A- X) d
- % e( n( P4 R8 a4 N' J' @4 z$ U
- cd-gpios = <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
; P; v6 J7 f$ x - ( j. M5 w: T# p
- disable-wp;
7 X& s; w4 @/ E# V' g% l: U$ h+ _- p# {
+ ~ Q* |: _, A& {6 N0 J- st,neg-edge;, L; b3 c% M1 a/ J4 a
" G u2 D0 H; a1 Q. G- _& a- bus-width = <4>;
* z3 t6 \' D: J" M6 K
# F( c- e ~. }/ p0 O: n- vmmc-supply = <&v3v3>;* u- ? f3 L/ a! {2 \% o
- # k1 Z+ b! c) V% s; g
- status = "okay";. N7 m% K6 E& o2 o+ i8 o
- . K- m% \$ B! h/ U$ O
- };
复制代码
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- &sdmmc1 {
) D6 _, P0 Z0 u+ W0 y - 9 P$ j1 p+ l8 h4 N! O9 \
- pinctrl-names = "default", "opendrain", "sleep";
/ D2 M! m. b1 ~: r5 o1 [
6 x/ {- E, g. P4 S G- pinctrl-0 = <&sdmmc1_b4_pins_a>;6 j! y/ C& j- U" ]- E
; }! [ Y/ K9 ~3 O, @" L* q" H- pinctrl-1 = <&sdmmc1_b4_od_pins_a>; y* O4 ?( n* C+ ?" ?) p; [
- 6 B& K1 O8 \3 V1 b! n g
- pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;. }+ p+ L2 P. {, e$ v
- + G) M4 M9 ^" c+ l
- cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
6 C+ ?. F5 t3 L2 M0 p- o! {7 t - 7 U9 H# Q6 H2 ?+ z2 E
- disable-wp;
0 ^1 p8 Q, G |
- C' h, k6 [: F) ]: i: X- L- st,neg-edge;
, v" W% }' \9 d4 K" `& M% [ - 5 f, |1 T$ g9 M' k
- bus-width = <4>;
* N3 }9 Y0 x& G' ]" c5 Q5 r - N0 K4 B. S6 ?" S
- vmmc-supply = <&v3v3>;
: A5 p" W0 | W/ y8 T( z - 5 D# d D* c/ n/ P
- status = "okay";8 D5 I& C+ N! g- F$ o2 J/ X
- & w9 Z4 U; b# G# S6 h( Y0 O9 u
- };
复制代码 % J; o; N1 y3 @7 ]$ l
重新编译烧写后现象如下:
& E3 N3 D+ H0 a4 s9 G3 r' j4 J% d+ @: P; ?( z
! 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
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
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
- <dc {4 _& v- s- c! f# H/ e H3 o/ c+ _
0 k: G0 _5 ?; \& G; d6 m3 u) g2 y- pinctrl-names = "default", "sleep";1 [! X3 q( B5 h+ C+ f% x
2 N3 l! Z$ o6 _3 k! K- pinctrl-0 = <<dc_pins_a>;
# W% i2 N, J( e! U8 L- |- o) ~ - : M. s# n3 L7 ~6 d! G. [, T
- pinctrl-1 = <<dc_pins_sleep_a>;
8 b( i" y; G* H, x) y( J1 l4 t
6 `' ]1 l# U' c- status = "okay";+ J9 o; [7 e1 m8 C4 }* G4 R' Y
}0 Q7 w* J1 X [8 G- port {% d/ p- S) n+ K
- q( q! Y0 k/ O2 O- #address-cells = <1>;: {3 M# ~, {* V2 P0 ?
- % [0 V% `* |* P
- #size-cells = <0>;" z8 {+ D! o) E7 b! Q
- . Y& v# w% v" |; F& r' C% B7 d
- ltdc_ep0_out: endpoint@0 {
' G0 k( G: Y1 M3 g6 J/ F - . u9 C* x; f1 z5 h! [3 n
- reg = <0>;; z* A/ J f( u7 E
: v; ]# S0 G0 O- S. q2 ~- remote-endpoint = <&sii9022_in>;# m" c1 v- t; m% e K: M9 ~2 q
6 c) W: Q; k/ g& L" o7 H- };0 T; z4 J; K/ B; `! J
- " ^) E+ I7 n# x3 g: Y8 J$ U) v- P! y
- };% v7 C+ M9 f6 s7 W" F+ m0 W
- 4 y& i$ f0 n4 N. p/ ~$ J
- };
' 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
- <dc {, ^$ u& f/ j! b1 V4 W3 k$ T+ j# p
- 9 I+ ?* I L; ]% V
- pinctrl-names = "default", "sleep";/ U7 c1 f2 s0 [& {
8 [* k+ P% o: \$ X! g- pinctrl-0 = <<dc_pins_a>;0 U9 i# f' i' }) Y, m# V" b3 z
) W4 N* {( q* B( \, K" G% p- pinctrl-1 = <<dc_pins_sleep_a>;
6 \. y) `* L5 I+ w! V; Z! \ - ( G2 \) B- U5 |9 D% z8 S8 y
- status = "disabled";
3 j4 _0 W; ~8 X4 j, T0 Z D - - ?1 f R! F0 m$ P
- port {
) C+ G9 ?+ v; U* r S @0 [# m
: I( E n7 j. q1 N2 D# F7 ^. m- #address-cells = <1>; n1 L7 K* D# ]0 L
8 ^) l1 m: j5 z2 B- #size-cells = <0>;
Y* X5 v, K6 O. E; X0 Q9 d! e
* B- f# g* l2 V7 V* L- ltdc_ep0_out: endpoint@0 {3 [$ i- `/ x+ y. N
- 9 i5 E- R" K7 J! ?5 b% S5 c Q7 X
- reg = <0>;
" v- r% n# X4 [7 q - , @! O2 P2 U3 w. R; B
- remote-endpoint = <&sii9022_in>;
! D& q$ w* N5 L5 d - ' \( a7 x! {- d: h4 i0 j
- };
* e) l, [& s4 Q3 l C5 ]
# ]9 H5 G# \7 D8 I$ q5 v- };+ O3 ]! B: h4 f
9 w6 ^0 g% f+ C4 c! m8 E. e- };
复制代码 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:1F B: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- #define CONFIG_EXTRA_ENV_SETTINGS \9 L6 a, b# k1 k! T. R( `
- " @$ l; D/ g+ | f% P1 ?! `$ k" ]. h
- "bootdelay=1\0" \- s: p: L! ~% g, L1 T
- 4 ^- [1 `8 b; n- n/ B7 R4 `4 J: s
- "kernel_addr_r=0xc2000000\0" \; @5 N6 K% e7 D+ o j
; i* D# H6 a5 m2 \/ x! D% [- "fdt_addr_r=0xc4000000\0" \
m: u8 l9 H; ]2 |$ |
( T: z: q. Y$ v. X5 X! a* C- "scriptaddr=0xc4100000\0" \
复制代码 为:) K9 v( B! T. N4 l" P
' J1 U7 s3 I, n% x# T: e
- #define CONFIG_EXTRA_ENV_SETTINGS \( D6 P1 g+ m$ S) F( a
) \& R4 C: r1 p: g5 R! E- "bootdelay=1\0" \( {- m) k6 J( ^2 D+ D2 R; o5 ]8 y" H
- 8 P# F+ }5 o& S+ |4 z* n
- "ethaddr=00:80:E1:42:60:17\0" \
, l1 @4 y; m, p9 { - 4 L, Z6 J8 ^7 G3 @
- "kernel_addr_r=0xc2000000\0" \. |7 {/ f. n" g. w1 t
- $ u! \' L2 \" T2 ?5 |6 `, ?9 ]. T
- "fdt_addr_r=0xc4000000\0" \
* ?2 o5 s# [1 o4 P1 N - ( _) P. ^- l; n# H/ p
- "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
: |, ]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
; 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
: 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
+ 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
& 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
- 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- sdmmc2_b4_pins_a: sdmmc2-b4-0 {
# E: ~2 T2 n: [: u3 x - + [6 T3 Q* Q$ ?) N' x( J4 b$ U
- pins1 {
' u: D& c: K& B! ]7 S1 @2 U9 B - ! I8 ?6 F& }5 Z9 _6 v: a
- pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */4 @; E# N& V; [3 C N) {( ~, X
" I9 P1 k4 Q" z) {2 C- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
' `0 R# u; f, ]4 ~- q - & H N+ D9 L6 c) l, A
- <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
1 O `& e0 d) g. V* J$ O7 g
# {: \. @& k8 a/ M' s- <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */! D4 Y9 |' V/ y
- . Q7 H3 p! Q4 W! {* g6 A
- <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */; c. }( @* |7 p
9 f4 @1 v- h' |1 l3 Z: ^; ?- slew-rate = <1>;
. M' {/ }3 S2 S, `8 Z
0 U6 ? g* A$ i0 P3 `! S- drive-push-pull;
. |# V' _( G" T+ f/ T- u
5 @, u, z S0 v; A# H1 P% c& |- bias-pull-up;8 x8 m' y: G% Z7 @; c- w5 F& A
- 9 n& d. F1 O' | w
- };
: A; y- e/ W/ T% O5 _
1 e a) K9 Z f1 ~4 F8 R- pins2 {
. O* J% `/ \% j2 A
+ ~. O# U$ d; S0 i. r- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
# g. Y+ K9 W+ p8 ? - 5 P/ l. `1 b, N) b* U6 v3 h/ q8 o
- slew-rate = <2>;, e) a" F/ q/ ^ K- j8 F
- 8 ?- o/ p) d+ s9 ?. S' x
- drive-push-pull;9 a- Q% b# I" [& K( e0 \
7 O( y5 Q3 Z" q. i2 u- bias-pull-up;: \" a! O" o5 \; K
; S, {2 O2 h" |/ ]+ j- };
% n/ R: t" a% B( w) J
* X! {9 C4 b0 Q- };7 ~; P) U( H* m }
2 x7 a# W$ T$ i; g- sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {
1 u+ N: J" Y* F$ H - 5 A/ m$ g' _: k& H
- pins1 {2 L) q# u7 i) {5 w
* g4 Q9 l5 u4 l$ F+ y/ f- pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
- h4 n) Z. v# S5 _4 q/ w: ~ - $ S t% H/ c9 p0 ]! |6 }+ Q
- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
: O! h: F1 g' z5 g; Y
+ o8 f- ]; f- F. ~* P5 q- <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
& @/ `& c1 q: o! m _4 V
0 v9 D$ z3 I. Y! Z$ w- n- X8 w7 `; ^- <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */. x/ b- m1 p, Q6 W0 S& W0 N7 p- ?7 K
- * M6 p. W2 L5 J) ~$ `
- slew-rate = <1>;+ U; L! C# p! m" x9 \
- 9 e* v/ j- v- L4 m* }
- drive-push-pull;
1 L' I1 Z* D3 y. A H" @
8 {7 Q+ X/ q( O- o4 e- bias-pull-up;& | I9 ~+ \8 x9 `. F) |9 v$ \1 F
% Z: |# l1 [; d, N- };
! S( y$ S3 X. g: _! g, y
% b- J) C* b, ~; t* ?0 q- pins2 {2 p) f+ e0 b* b( l
- 2 |* S& Q' u8 A6 J
- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */0 Q# p/ n- }9 ^: l, g! X* ]
! d/ e9 ^+ s" G& h6 b! @- slew-rate = <2>;" D) l3 K, k, A* E3 h
- " q4 e7 c& j" G+ D3 n
- drive-push-pull;( R" U1 E7 P( C. F
- 7 m6 B, J. [2 @) K, R( r% P
- bias-pull-up;" O" n) ` v# `7 }* h4 ]: p( H
- * V5 O) d" `2 |+ F3 W1 x% X
- };
8 D, v/ v; O* P, E4 p - 3 w0 \) P K9 G, a
- pins3 {+ O7 h: X- h$ g5 k4 Z2 L# A
* w+ r! |7 U4 G6 A- pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
- f/ {" c4 L% I% B - . c* x! c) e% v3 Z# V9 O
- slew-rate = <1>;& A0 ~8 Q! V, Z1 d
- & H- v8 `+ @6 ^- O
- drive-open-drain;
& i9 W( |8 {0 y* h- z. T2 P) K
! R0 D% @5 ^5 o) N( n$ f% Q- bias-pull-up;
# W# D7 ~% H4 R) ~
2 U- N" i4 J* Y* T3 F% j1 j, Q- };! v- B$ f5 D, q& X, u$ u
- ( o+ W& l5 f, @+ t4 l; C: h
- };
' m- K- }/ d( @- n- E' N6 f
: E2 X% E( V$ o# H: Q) M- sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {( q7 U+ d) S: l
/ n! i8 v+ A- U9 z: s- pins {
- e# ^# z) o- }2 K - N7 Q. M9 G7 s! `" ^! d( ]; C9 G
- pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */" {7 w; ?" Z# E0 R% }
- + q2 O9 H- h/ ^6 _: e/ c
- <STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */
8 }3 N3 g( M; H) j9 x2 j" x1 R
4 j- y" J+ }" H# v9 z- f- Z6 S- <STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */
' O( ~" R' [# A% G4 J8 h% K) Z - : f& Y; V* D! h
- <STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */3 j0 _3 B9 p$ C# B
& H# T5 r; c# e1 X% h- <STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */8 m, ~' }3 a, \
* A$ V- O9 o A, w0 U% M% [/ J# b0 F- <STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */7 A! Q" t4 B3 [" ?2 u" M, w
, a/ v5 c$ f- T% h2 I" O. a4 P1 m- };
7 I, A2 [0 n; C+ t( w% A3 X9 E
) y/ b" A/ g; d& r, l$ Q- };
" S9 c2 k8 `) }0 R; Y+ c
2 k9 Q3 V# k8 |- p- sdmmc2_b4_pins_b: sdmmc2-b4-1 {9 @" N; n1 p: R1 B: v( R! y
- ; C! q( f* J+ E X7 p, b& K$ T
- pins1 {
( w# n# @0 Q2 P6 t - " ^9 e$ F7 l: c- u$ }
- pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */( n; c6 ~! I6 z2 ]* m9 d# h
, a' E- N" X+ Y3 g. |- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */+ ?% Z+ g) C; o$ I4 [( _, h3 P1 P
1 w; v4 M' p+ g1 G5 G- <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */; Y5 a) h5 b8 ?! J5 x5 `/ L0 J
- ' a% H J! J3 `, Q
- <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */3 @, s5 t. {0 J
- 6 n& a, x2 x" C
- <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */' o) F n: [6 ~1 g) }+ n7 n
- 4 [7 W8 ~( {5 d, |7 g& ]7 k
- slew-rate = <1>;& q3 o( C; q+ a+ |! V( c( a. y
8 x9 t J `9 G) y* k! [7 p0 X7 t- drive-push-pull;
5 A5 _4 w5 R7 }3 x
8 u6 m+ N6 {5 Y0 U- bias-disable;0 H$ ]. m0 z2 e: j f& }9 F" Q; _
. H6 y# }9 W+ A3 o8 X! x( q/ Y# B& |- };) A% c* h5 Z: J X/ x# B( k
- $ y; u1 e3 H, `) [# r5 A4 B/ f
- pins2 {
; p+ c! q3 e5 d - / b% A' `) f0 c7 E. @1 {
- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */+ {4 Y! M# o3 w% K* ]6 m
- 1 T( m6 C8 \' A" S) f
- slew-rate = <2>;+ W! \7 }' e( l. [
u% F7 _5 g# ~9 T. c) x6 W: o- drive-push-pull;
7 u* V$ P( k M& y8 Q' X6 g% V - - `% A# Y; L, y9 n, a
- bias-disable;
2 y! U1 R: J6 ?, c0 @ - 1 U/ v" n+ l) m, L6 x
- };6 h9 P! l; _* Q2 @
- ) T: W- N: Q( W- L
- };
# M1 r( A% @3 g$ `% X+ z
: n# j% S1 O: h$ Q& ~- S3 n- sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {
" ^% [* U2 [5 t! ]- I) ^
! T# M& l4 G2 T. } G: Y; r2 Z- pins1 {
" D8 \/ j( g t( l S - ! Q- l# F1 G" ^& L* U$ L8 [
- pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
) \- U6 O& s2 v5 T- D# {" H% }: g p. V
8 g; ^4 q% |# O; D- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */6 Z1 V& `5 S- w7 |6 B
- 8 ?% y& L. G4 Z. }- V
- <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
9 y4 E0 h$ C+ ]6 B6 a" z
7 |" @' A& N& L4 `. E: Y. G- <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
( ?* t- }+ R7 p6 C- W! D/ \
. {8 B9 |9 {! Z" ?! Z7 j- slew-rate = <1>;
2 T% Y9 D2 M4 |" c - / p3 o# v9 h0 \: }4 z5 j* W. f
- drive-push-pull;
~: m" ^4 ?, q# ]; E
! B) F( T1 n7 ~7 I$ c- [9 j1 O3 z- bias-disable;8 A* T& x1 P: M* E3 j( Z
/ O5 {# Q5 z5 z7 e2 v" F+ n- };
, K( w6 g4 U& A; }
: E, K, a; q. I4 \! j! S- pins2 {/ [3 s; z/ d: z1 z' K. `
7 h( P- v# R7 Q+ s- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
: d* j, c, B u) [! u - 8 d J) T5 n( L% A, T& \6 L$ C. |
- slew-rate = <2>;1 z1 E* @/ ]7 `6 E
- # c L2 c; l6 r+ e9 n
- drive-push-pull;$ |8 X2 h K* O$ S- ?
) t3 V' M7 p3 u2 p- bias-disable;
$ a( E H: b: }6 e - * x& N. s* v4 }5 s7 A: E
- };) L3 N5 ^4 C' f! D; Z9 p4 r2 l0 ^) Q
( M2 b: r9 W2 P; Z) S5 {6 a- pins3 {9 D6 {4 [! x4 s4 j* V
2 ? o4 Z. s: ?: c, s5 P$ @- pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */8 D+ t" G, ?$ C; ] \' |
- : I" X4 d) y4 o) _
- slew-rate = <1>;
& @ e% E' @' ~; \- g - ! N+ W" j N5 b6 ?$ d. H ]" W3 {
- drive-open-drain;+ ?( ~7 O% u$ P' h6 g" }
- 6 m8 j. `4 c$ E
- bias-disable;
* R( n/ M1 |, i. S! y; } - ' d4 B" ~8 |6 S$ Q: L& N3 w
- };: D) ]$ E! [, l
- & O: z3 D' S/ G' a" ?
- };+ p6 ?$ v7 W! }/ q2 q
9 R! |4 ^9 {6 z0 l, l7 {4 Q- sdmmc2_d47_pins_a: sdmmc2-d47-0 {
- q/ L! T0 e8 \" x! K3 J; I/ z8 P
4 e6 n1 A" y" s( _- pins {
1 R* V/ R& _4 y* G5 q - ) i! A/ J b+ `% F5 K& c
- pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */
1 [3 u ]% [ @+ s0 T1 A$ a& {
1 r0 E5 N) L4 F8 l5 N' q, a' W) z8 e/ w9 Z1 ~- <STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */
* S5 t& ~9 x1 N3 G0 D - 6 p4 {& E# F. w8 K" l
- <STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */
2 r) E& D# M- ^0 a - 3 g, b h% Y% f& N, i' r0 F
- <STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */
' ~$ O- m7 i, \) ~+ l' q2 |
* H4 l8 A* F; H M& e+ I- slew-rate = <1>;
1 J4 l# j7 {( e' h - + Y. p: i w1 D+ X2 Z! k
- drive-push-pull;
' V2 R U" K3 V! v
9 x* z: i' l3 @* h- bias-pull-up;5 z# f; |& x. U) P
. H& I! L5 n* j+ y0 c- };$ I9 M/ y# `* j2 B0 _
- ) t8 b, g6 C" v" P
- };! p2 B# r: v) z2 n& w
- ! _( N% \9 z& ^2 |" e
- sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {
3 d3 X Q# t# T0 }! [3 c - , ]2 {$ X% l- A+ Z; i
- pins {
% L' D, k1 f8 C: A. [6 A
$ \5 P- g1 w9 x8 g& b$ x5 n" K6 E- pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */; A( |# c0 S* r( j$ v, L3 y5 a
( a& P2 E2 I5 T5 [: k- <STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */# A: W+ T$ N+ r& d" S" d' J5 z1 S1 T# m
9 R6 e! y) |- w$ {2 G: a" H; x- <STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */$ J- a& h, M/ p! I) C; c
- r$ S5 I9 M d+ i4 M+ O5 k- <STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */. ^$ x9 I7 d: G; O: @! G7 _
- 2 a# M6 P$ i' ?/ Q
- };
* L7 z3 o' C7 Q9 h Z% j0 B; H3 b1 h/ h
! U9 X8 l6 V" _& h4 c& Y4 a- };
复制代码 ) 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. {- &sdmmc2 {
2 f- E O) ?, v
/ }$ v8 d3 S9 [# ?( I5 w( ]- pinctrl-names = "default", "opendrain", "sleep";: A$ @4 b: h; c# I0 \
- - i) ]& T, C; \
- pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;. T$ f$ d$ m7 e" E6 u2 H; s1 K
- ! s- t6 u& q6 b Y4 d& a; P: Z
- pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;* \; | o% D. E7 s
. l. R! ~2 K, f4 a% R4 n- pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;
9 E0 R$ M: J, s) T3 B/ T& W - 1 V" q5 ~5 s/ S' F6 G/ L1 t8 n
- non-removable;0 ?8 ?8 n+ U# T
- . b: |2 @/ P- v. R
- no-sd;
# g, M* {4 Q( O W - 6 y% k5 X9 l8 Y
- no-sdio;2 d3 h- ~9 R. Z! E P& D8 t C- A
- # H% Y J/ C1 T- }
- st,neg-edge;
. u5 X8 ~- G. t: t- [) m! z2 S - + |. q$ r: D+ u- ^% A" L5 g" b: S
- bus-width = <8>;
! q) i2 h( F7 Y - 8 a0 q0 V) p V$ T% t
- vmmc-supply = <&v3v3>;
2 \% ~. F8 Y6 y. ]* Y& x - " `2 H% v! k0 O; ]+ a
- vqmmc-supply = <&vdd>;
" X6 S% P0 l3 ~0 a9 `1 K: ]
; ^& x3 k- ^% I& t- mmc-ddr-3_3v;
2 W5 Q: B3 X* c/ K8 ?8 |* L - / f$ E: q2 U/ u+ h0 k
- status = "okay";- x6 S. f; C8 X u2 t8 x
- / _* I' h/ U" B% D# [
- };
复制代码
) 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
- aliases {2 V6 q6 V" I& ?5 l. W% @
- _+ e9 [! |- ^0 z# `5 V# p5 ~
- i2c3 = &i2c4;. g* d9 k( M" j$ T$ b) D
- ( g. }* R1 l/ C8 z( T3 s
- mmc0 = &sdmmc1;
+ @; P9 X1 {5 F7 J* j6 c
9 |3 B) M* X; Y2 C5 ]1 U- usb0 = &usbotg_hs;
9 Q! @7 Q U0 X" V0 t( y/ y
, _, p3 f8 o6 X4 u! j- };
复制代码 ( M# Y& m9 K- _3 f2 Q
修改为(红色字体为增加内容):! m' X& g( |2 p" m: M8 j
y0 z0 L: c2 q3 j- `
- aliases {
9 k! |! g" J& s" y9 O# o1 [9 j6 ~8 P
/ B6 M5 X' S5 c: A7 C: S- i2c3 = &i2c4;
* q/ N" `" A# H4 b5 t$ L, M - # \: U9 b7 }( @+ ^) ~. Y d8 {
- mmc0 = &sdmmc1;% k& T1 v. W/ _6 U3 \+ ^0 @/ z
- & X* C' c+ I0 h" Z3 d" v
- mmc1 = &sdmmc2;) R6 j, } a1 `2 n
9 \" N' y+ U6 |, R" E1 ]- usb0 = &usbotg_hs;7 U9 e+ q+ J3 m5 |+ F9 W* l
- 8 y: J: G1 c% z8 j
- };
复制代码 : ~7 s# I" v8 U0 ^) s
在sdmmc1节点后sdmmc2的内容(红色字体部分为添加内容):
( n7 n8 _; r' x% c# M9 d# ~" V @
- &sdmmc1 {6 |7 g" m0 o9 Y
- 3 M: G* U2 \( x$ z6 _
- u-boot,dm-spl;
* Q1 U" p9 j( |# n0 V
$ v2 n+ B- R5 f0 H7 p- };
! E, E' O0 A3 j
& e7 v0 q- G; N$ Z! ?$ p5 f6 o- &sdmmc2 {6 W6 n( S4 D7 P; w
) U* U' T1 K' M8 J m& t- u-boot,dm-spl;, y/ H) L# h. h( b7 V& f
- 3 |4 `( n$ l/ Y
- };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& @* [
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
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
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 |