Trusted Firmware-A简介
* x, B r0 C! f. Q# l嵌入式高速发展的今天,大量的嵌入式设备使用了Arm为核心的芯片。我们会接触到越来越多的嵌入式设备,一个问题油然而生:数量如此巨大的嵌入式设备的安全性如何?目前针对嵌入式安全的技术和标准可谓千姿百态,除了必要的硬件安全技术,与之配套的安全软件也是必不可少的一部分。今天我们要介绍的是基于Arm 的可信固件Trusted Firmware-A,简称TF-A。它是一个开源软件,运行在一个硬件隔离的安全环境中并提供安全服务。) l* w0 j. t& h% b; R
! t" }1 Y1 w: A8 b( o实验目的) B0 [2 Q, V0 v1 ^- ] |" o+ N
完成TF-A的基本功能实现TF-A引导u-boot启动。. @" s. h% ~; |& w& t0 [ b# R
$ O( z, W$ F$ w6 E: ?, j实验平台
: k2 {% _( F2 f1 ?3 H |5 [' k华清远见开发环境,FS-MP1A平台
% W3 T Q9 C5 j" o" S# J( Z0 P6 `% m( w0 {- Q, G0 O& ?1 H- W
实验步骤
) i- e+ A$ m6 A+ Y, T7 _本实验基于tf-a-stm32mp-2.2版本,然后添加意法半导体提供的补丁文件。在意法半导体官方的tf-a中移植我们自己的tf-a。* A! w1 o$ J/ R1 v% J
& {+ e$ e: C& c% u+ b" \
导入源码4 X2 P# J! i: U
如果之前已经建立了源码目录,并且导入了源码包,即可跳过本小节。
% \5 t ?" C. y3 ^1 C* H o
& l9 w2 a0 F2 D9 }7 z# Z$ ]3 j) a建立源码目录
5 l; F3 y: g S1 N ?( |! o
- Z9 L0 w1 _- T4 q3 M$ Elinux@ubuntu:$ cd ~
3 {7 n( U0 c' L8 G% }
7 F( V! S( ~. y. Y- p+ x6 Klinux@ubuntu:$ mkdir FS-MP1A
' j1 }3 O& _' w% [0 \7 b, F! z, J' z9 j5 d. e# y- Y G, a. V# `
将下的2 O9 }% {6 n- B+ ^7 p
en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz压缩包,导入到ubuntu下的${HOME}/FS-MP1A目录下。
0 s& Q$ s. P# _- U
/ ]# t8 z5 `% A$ b% V1 \4 x
& R. b6 i0 }0 [5 ^* Z% H) m% b \4 q3 u+ x
解压缩源码包# C _0 D$ ]) {- P
: o6 J* ~# l/ l' ]4 k, z) m6 C
linux@ubuntu:$ tar xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz" D9 P i9 _; k) S% G# k8 @. ]
, ?0 x: p: E% F解压完成后得到“
) \1 |7 K3 z( A8 p" Astm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录+ z8 J* R6 r- F) W5 b' d
8 F1 I8 \# J4 O( V
8 }6 s8 f. R' T1 C8 z# n
) R' z: m3 f: M; Q$ H进入tf-a目录下* q; A" y7 @! Q+ V0 _ P, z+ U
1 r$ \9 z! b& x- v0 D0 E9 M; O
linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0" q# }- c0 j9 ~4 O3 ^) m/ S
( x0 ?- f% \* G6 Z/ M
% @9 ~+ M1 s$ d6 L
- {* A# j* l7 n. g8 f% M* B) a该目录下以patch结尾的文件为ST官方提供的补丁文件;
3 f a: w. Y4 T* N% G' }; _tf-a-stm32mp-2.2.r1-r0.tar.gz为标准tf-a源码包。) i5 Q0 H5 q1 v% w2 C
8 H1 l- h& a, o) u9 i解压标准tf-a源码包& v# ?6 F9 f8 c0 `" p
) N6 W0 j9 m( a
linux@ubuntu:$ tar -xvf tf-a-stm32mp-2.2.r1-r0.tar.gz
+ Z/ J, G* w% E5 O/ ~0 j- g$ d1 {& S! t. \! c
解压完成后得到tf-a-stm32mp-2.2.r1目录$ ?+ x( k$ P) n$ W' f& ?
H6 B/ H. t) ~2 K, \3 j3 ^6 n9 i
9 o' B2 y& H+ j
' K J/ Z& u$ c9 F/ L进入tf-a源码目录下:
! c) ^6 T. `# N* {9 [2 [& F
9 @0 \& _- G) m, H+ d5 blinux@ubuntu:$ cd tf-a-stm32mp-2.2.r1
3 p- H; k) @1 \3 {, L4 l1 F) Y$ L4 ]1 m0 v' L% p( X
' K; J5 f# `( y; I+ d/ d3 U1 O3 W+ E5 L# G) D% C6 z" ~
将ST官方补丁文件打到tf-a源码中:. H, [* V2 \1 g2 n3 ^, o
3 [. S K$ r6 d; ~+ Llinux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done/ D! U" }4 C( q
. d0 B! D! q4 s( q0 PTF卡分区( A' U3 j( U" l; F7 s
要对TF卡进行烧录,需要先将TF接入到ubuntu系统中。
k m; t/ ~4 ~5 u8 A8 F
) i5 n0 y& X6 R$ t$ n* o$ O3 k查看TF卡分区+ L; Z( ~- ^1 u' M. K
7 j. p7 i2 E5 Plinux@ubuntu:$ ls /dev/sd*
6 W. q1 T. Z' a. h. c
. z3 D/ N, S" R, H6 [
1 c. E" F+ W, E& h; m1 c+ l$ Y& a/ s P2 N
由上图所示只有“/dev/sdb1”一个分区则需要重新进行分区。
6 o6 n. Y. A8 f
- Y2 F5 ?1 {* c1 i' \首先删除原有分区
& V0 G9 O& v. P* }% r
, u& D! l. ^8 _, |8 T! A& N% v! }) Tlinux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos
. A6 S! z4 ]; G/ \1 |0 Z i. i2 R) _+ D9 D- U; e. n$ T% I7 k5 g5 c
如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。
- ?. j( V- i6 ]" Z; M4 X. i9 x* w
, R6 K2 L7 @1 _! `" j# r" g D7 k; W# T. u1 z
卸载设备
" B1 c! s+ ]& i1 b0 T
+ H. s k* ^/ _7 q7 a* S) l9 Llinux@ubuntu:$ umount /dev/sdb11 N4 k- }3 r& i1 |: @
% b7 `0 k( r& } h
卸载完成后重新执行删除分区命令
+ f: Y$ B1 K ?8 K1 P
/ t3 P3 @8 d) B0 [, I/ e3 Blinux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos. {8 [9 h# j, a' [9 S' a
1 L+ m8 [6 m% x! e对tf进行重新分区
1 q' G! ~( ]% S5 V! L" H \! f4 j' X/ e2 l+ X# U6 f' ?) s. B
linux@ubuntu:$ sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g
) Z3 A3 t2 K/ q" J( ?, a/ x
6 d5 f {( l( L3 ^8 z; @, D$ `. N
# m. F5 V4 v& p5 n' D. S; Z. S
9 G% t8 {. z0 i( g) K @( R: W, K3 M% q注意:最后-p /dev/sdb参数中的/dev/sdb需要按照实际ubuntu中的tf节点为准,否则可能发生不可预料的后果。
$ T& {; q8 ~% ^3 N+ R) f2 C! j9 P, r/ K4 c" _
建立自己的平台配置工具链
# r. s$ r# U# h t8 u1.导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)5 u& }2 X; R) B( v, V
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi# j) A- V2 `) ]( ~" W
8 H% s+ N! y3 z8 j n1 x
验证开发工具是否安装正确,显示版本信息如下图所示。8 u! B6 ^# h* T6 R
; H, Z9 R$ w. h/ t5 B3 `linux@ubuntu:$ $CC --version
8 |# i4 c8 F2 g, w( f3 @# _2 m, `% \% Y3 N5 F2 f+ e
3 v. k4 i1 g0 g F
( u7 y5 A' v" `0 i4 E
2.增加板级相关文件$ t4 k) C1 \; R- C7 t
进入到tf-a源码目录" w( }+ z/ r; {0 A3 F4 }% R, W
! @6 n0 I1 g* H3 z& d5 u4 _2 C
- linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/tf-a-stm32mp-2.2.r1
复制代码
& y* i1 ]+ u; d$ \9 v9 q/ ]3 N/ Z5 i. |9 Y. E. o: y$ K0 F
添加设备树文件- linux@ubuntu:$ cp fdts/stm32mp15xx-dkx.dtsi fdts/stm32mp15xx-fsmp1x.dtsi) A. X6 v s2 I" S3 c
- ) k" ]# M# Y' e5 m5 g
- linux@ubuntu:$ cp fdts/stm32mp157a-dk1.dts fdts/stm32mp157a-fsmp1a.dts
复制代码
# ?9 W% K! s4 ~9 [修改上层目录下的Makefile.sdk编译脚本在TFA_DEVICETREE配置项中添加stm32mp157a-fsmp1a
. q0 s9 }+ s7 Q* p s6 V0 L0 i9 }
- TFA_DEVICETREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
复制代码
2 K! _! f' |( E) u" F. `! R1 d% l: n1 u6 B( X& S R8 C+ f
修改 g8 F2 g$ }; o' r7 i
fdts/stm32mp157a-fsmp1a.dts将
) q$ g5 v4 t1 {( R) L
C% x( v1 J* P- ]; T0 ]#include "stm32mp15xx-dkx.dtsi"
+ z4 B {( B9 U8 M9 e5 J) F* U4 X+ i! i2 T
修改为
7 _6 W& X+ z& C# O% A- L. \; Q% Q3 t* k5 o* O4 W
#include "stm32mp15xx-fsmp1x.dtsi"
# J' ]- \" l' ]- _" V4 o: m9 O* K' R$ C4 Y4 I6 W
3.编译源码* d. f$ P5 p* ~% L1 \( u0 J8 f* M0 a
执行如下指令编译trusted:$ K6 ^" h+ {$ r
! F# ]7 }* w1 [+ H. s! f3 ^1 I
linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
2 o8 Y- S4 R% Y* D! s7 a0 B. ^8 Z9 l I/ X& h+ |
编译成功后,最后显示内容(部分截图)如下:
# ?6 ~0 c) [2 A7 K4 Y \- t5 w3 H4 m9 _$ x
( F% r3 @- P9 o2 n w
- V2 ^! `7 n$ y: \, s编译完成后会在上级build/trusted目录得到如下文件:* n/ K7 w8 v4 `. k
6 S; K, M* _. k: }7 |9 Wlinux@ubuntu:$ ls ../ build/trusted& E& o6 L3 E7 E
{+ m1 g4 L& ]0 T2 [
: f$ n$ [8 V/ ]' D9 v
+ I: O8 u+ u& K6 \" l8 b
linux@ubuntu:$ cd ../ build/trusted
p. n4 ]7 a, Z# _' T7 F9 c+ Z: q/ }) G# ~$ ]
4.固件烧写0 E% N& S6 |1 H' ~: w# v4 t
由于在移植过程中会多次烧写固件并且会导致正常tf-a无法启动,因此推荐使用TF卡启动的方式来验证。( f9 z! y: }* A. M1 \( D& p
0 N$ {5 _0 c$ |3 j7 a; rtf-a需要使用trusted 格式的u-boot镜像启动,具体的编译方法可参考《U-boot移植》章节中的“生成Trusted镜像”小节。
: u+ Q7 K3 H5 ~, X2 ?2 F) |6 L2 Y. u4 c* p; B. m+ F
将TF接入ubuntu系统后,查看TF卡分区
) n. o6 A M# H7 }4 b; ]* L0 U1 ~( K1 C0 S/ V! f
linux@ubuntu:$ ls /dev/sd*
8 I5 ?& k& {! C8 U9 C* ]
- t, b, A* b4 O$ z5 f
& ^/ q" d, @1 j# Y- u4 s8 C6 a6 r3 V0 G D* b
/dev/sdb为TF卡设备。如果该设备下只有/dev/sdb1一个分区则重新分区。
5 f: d2 s! O( u* _: r: m* H& P9 P4 ^1 M/ K8 O: a
执行如下指令烧写u-boot:
1 W8 u+ Q# F6 o: F# @ M$ q; D' e( v5 a6 n
- linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync
4 h0 m2 }% t# f( j4 t - # p! _$ E4 ^# _7 D, X3 D
- linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync& g. _8 G* a" A0 l$ x3 o/ s" e4 o
- % y' X4 H3 s" y7 q
- linux@ubuntu:$ sudo dd if=u-boot-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb3 conv=fdatasync
复制代码 8 m* `! ]- P9 [# w
; k+ Z' m& \- R1 I
其中前两条命令“
% Z2 s1 r$ \- ?5 [) h Ptf-a-stm32mp157a-fsmp1a-trusted.stm32”为本章节编译得到的,第三条命令中的“u-boot-stm32mp157a-fsmp1a-trusted.stm32”则为《U-boot移植》章节中的“生成Trusted镜像”小节得到。
, c+ i; ]. R4 w8 S' M$ e
* u I. c- c# K! A7 n9 R5.启动开发板
) c& A- e: W# [% q7 T% w将拨码开关设置为SD卡启动方式:
$ y1 v5 w4 {3 d [# j% v g
$ ]! X2 k( R- `' Y, }. E: R& K8 C
* q9 X3 ^ I: F' l- V& J0 P: H
2 N- k8 F9 B+ d; x将制作好的TF卡插入开发板,上电后会出现如下错误提示:
* [; n& O+ u, W
! ^; h* G% E" l8 q) J0 [
! P- U7 N+ [0 F( v
( J/ t4 @, i; L! }. J8 d
这个错误产生的原因是电源初始化错误,需重新调整电源相关配置: N+ R8 ?0 q i5 }
1 ]% w1 C* x, p0 ~/ I
调整设备树电源配置
: P( S6 S7 Q$ Z& }/ I由于官方参考板DK1采用电源管理芯片做电源管理,而FS-MP1A采用分离电路作为电源管理,本例需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容; m) t% G1 o, c1 ?5 X& v+ g0 V" e" M
3 P% ^0 d, h# \% o) A: K1 ]' `2 c* [
1.去掉原有电源管理内容3 w. g' E! t5 a+ Q
DK1参考板电源管理芯片挂在I2C4上,而FS-MP1A并未使用I2C4总线,所以直接将I2C4相关内容完全删除即可。
) V$ R T) l) ]" N! F1 {6 W8 G7 i- [
修改4 o0 s. p6 m5 _& n" \9 \
fdts/stm32mp15xx-fsmp1x.dtsi文件
5 C/ s. _# |4 y- Q: G# T
* k6 K9 W {/ X* U, |; ]; z+ {1 j将文件中i2c4节点相关内容整体删除,删除内容如下:/ ~0 x8 N2 z* b$ ^6 |4 m' {. m
1 d; n7 x* g# S8 b- &i2c4 {
( Q' p5 Q$ q2 ?7 b* F - D% L5 E& c* |( A
- pinctrl-names = "default", "sleep";3 _) ^$ q# H& I1 ], ]1 ^
- 5 N8 E# ?6 ^. \+ ^8 X& j: j/ X/ M
- pinctrl-0 = <&i2c4_pins_a>;
' J3 s* y8 U0 i+ L$ M6 e
+ s! T+ ~; I& M, i* s- pinctrl-1 = <&i2c4_pins_sleep_a>;
* W0 P! u5 A: ~% w* U: h; F' C. j3 E
$ c$ g; z8 G# s" O* k- i2c-scl-rising-time-ns = <185>;
1 ~# U: g$ f3 E/ R& ?3 y# g9 P
# j* H+ { z% c( ]- i2c-scl-falling-time-ns = <20>;
" w0 T) ~8 O, j! |4 u0 y - % _0 @+ \3 M1 G; w0 O
- clock-frequency = <400000>;
4 A1 ~/ @9 L6 A, i2 }: G
0 L( Y' D9 M) m5 P& Y- status = " okay";
( e$ o/ p" d* B) \! Z _ - 1 U6 O6 y y- y6 i9 g8 X: @3 g* h
- secure-status = "okay";
/ D7 a" B) d( V5 f8 J- k - 7 v6 s9 @$ \# N- r7 a
- /*内容太长此处省略*/* n7 j$ q& ^ o0 U% C9 s7 u
6 v* R/ R2 J" B$ c% z- watchdog {$ d5 d6 s7 r9 U7 V8 D
; g7 U% Y7 s' a& }! y- compatible = "st,stpmic1-wdt";9 ^3 H9 K4 A1 q
- 8 ^, L9 Q# ~; V6 E9 @& O
- status = "disabled";
; a& L' N1 H1 w2 T% y$ O
6 F: V, [) U" I: L- C$ i% @- };8 x5 L7 L7 _2 A0 E; {
; T( q3 l: x: |. Y m1 t; ~2 o9 j: f- };( S& S/ U3 m# k! J
) `9 X* s1 ]+ j, e1 E- };
复制代码
+ @- P+ A! O- u8 z7 y! A3 _6 v L" F8 U% I
修改
8 O: q* t9 A3 w( [2 N/ nfdts/stm32mp15xx-fsmp1x.dtsi文件,删除如下内容: A* D/ s# {- }# r: ]
. n: s/ u- S1 f# X- &cpu0{; a& k' s( k1 H. x' e3 H
* {) K0 \0 y. G z: C! v- cpu-supply = <&vddcore>;
, K' [' R; n2 s# z5 l% @" P0 m - . k; V3 C1 P6 A9 X
- };5 R4 n! X' v" f2 a, F
3 G8 ]* A) Q2 y/ ^! L' w- &cpu1{1 z) x5 z+ @" [/ P" V$ B0 A
) n8 k+ m6 `4 p- cpu-supply = <&vddcore>;
6 d" F" ` j: J+ w* s: l; _
/ O z+ @1 g2 ?7 Z5 I+ s% K4 |- };
复制代码
9 Y% y, p9 @2 T& d/ q
( A8 V% l7 \7 l( u$ ^) G6 G2.添加固定电源配置
; z9 ~$ E" Y0 b. r! D% ~修改fdts/:文件/ E# C3 S2 c$ R( v+ J# E! f. {! C0 Y
4 x' T9 `/ J) f5 I
固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):
+ b4 p) V2 I6 w. X+ R; C
0 R% [0 Q9 o3 v" p% y/ g' @# G- vin: vin {
+ W& [5 w1 f* C3 {0 J
2 d" p9 C0 ]/ ^# _% r- compatible = "regulator-fixed";
( c; y6 r' m* [' E& a
3 u7 I7 n V5 B8 W5 _* C- regulator-name = "vin";; b( |0 {1 Q5 D3 U. Q$ X
. U5 b" }; I6 H5 g- regulator-min-microvolt = <5000000>;% J9 n& _" p3 _# o; W. g
5 {! ^" K3 v# T/ B5 ^- regulator-max-microvolt = <5000000>;
# ~1 q& u K* Y, ]
' Y* C! b$ q1 l- p( E- regulator-always-on;0 r. x& E& m4 [5 l
- y" x" Q6 o6 m f% B8 ^, r- };9 ]5 S% o0 E3 Q2 W( w" G% ~3 \/ W
- 2 m: w( K1 W, P, d
- v3v3: regulator-3p3v {
. I! A% c8 z& u# V. _ - 6 |! C% h' \$ ?1 C! f! T: c
- compatible = "regulator-fixed";
2 e3 w0 Y# i! X' D! q$ R, v
+ b$ {! q* w/ B5 I+ w* X* {- regulator-name = "v3v3";
% V* G4 n# h8 S1 D8 w3 | - - k/ Q6 a( [+ Y% m
- regulator-min-microvolt = <3300000>;
( T0 \3 H4 N- r6 m4 W - 7 H6 c d+ I1 P1 l: Z9 y" {3 V
- regulator-max-microvolt = <3300000>;
- m4 R! d1 A* \) g& { - 4 y0 v# L8 X1 i( C9 v `' _
- regulator-always-on;
h3 [! G$ ~0 R6 S+ `
; c- ^5 D* w; T4 u G. h- regulator-boot-on;
E, c* n- m7 {; }0 w4 U - , R. D$ w) J# u. U0 j/ d
- };% p/ c( X8 ], H& t+ j2 W5 N5 T
- / f$ ]. K5 m4 K8 B9 ]
- v1v8_audio: regulator-v1v8-audio {
l( ~. @: B1 d7 s8 J
3 f8 Y! Z- @' Q+ J! ^( E/ V- compatible = "regulator-fixed";
* i; J+ X% z! m% f1 ]% r' p - " P) R* R0 q$ l
- regulator-name = "v1v8_audio";
0 h; z7 b$ U" ]/ j- U1 X - 9 ?& d- W8 A/ Z o
- regulator-min-microvolt = <1800000>;
: |# B) ]7 r) s' d3 b5 u! s - ) f3 R& O* a& |4 v8 J
- regulator-max-microvolt = <1800000>;4 y. U! `. T7 `+ P# A
- . P- D, ?* Q$ f5 [; H# B
- regulator-always-on;5 B( T5 H1 S4 l% }; ~9 Z
- . P: ~. T Y' h9 z9 b+ U
- regulator-boot-on;
) I% s: A1 c. S% x5 s2 g& R) s - % d x9 j' d+ z- T3 Z
- };
) f( r! |7 X; s+ c - " r0 y& f) i) G+ r
- v3v3_hdmi: regulator-v3v3-hdmi {
; N; ?; L5 o8 | - ( N0 \) J7 b" M+ d5 j
- compatible = "regulator-fixed";
6 K4 I( h. R, _% R& b9 {9 ^ z% X - 4 k7 \" E1 k% S. _% Q" R+ I% ]: C
- regulator-name = "v3v3_hdmi";
5 Y" R a8 j3 Q4 v/ ?2 D, x d! Z" ? - 6 |& A. Q; h" r5 `) y+ j: t
- regulator-min-microvolt = <3300000>;
0 t6 _+ n; e3 r# E: b
& i$ _7 b. M* [9 D" T- regulator-max-microvolt = <3300000>;% G$ u7 ^6 d! B- `
3 T- K: d9 [; h. I7 w9 w+ y+ l- regulator-always-on;+ f3 t; V6 h/ s. [/ F
- / P5 ~' o& p9 n8 ^
- regulator-boot-on;
O' h9 E% M+ C- i - , i. e9 [- M6 ^ r+ M
- };& j" i2 a7 n b% P2 ~& E) R
; v5 T3 R, P0 a+ Z: J P- X- v1v2_hdmi: regulator-v1v2-hdmi {
2 L- x8 S4 l7 c
0 t; \% U4 d2 J _0 m- compatible = "regulator-fixed";" o4 P9 ~- o8 j5 N2 _+ _
+ y2 u. ]( J. L: n) S! S- regulator-name = "v1v2_hdmi";
/ `6 z0 g1 a0 Z8 {
' q) @( M6 F, }6 @- regulator-min-microvolt = <1200000>;4 z1 \6 x6 h4 J1 K( E0 a
6 s# Y, C8 [7 O" G# n# h- regulator-max-microvolt = <1200000>;
* O5 O M! i* _; s - - h3 @8 ]/ L: D/ M6 e8 W/ q: F# T
- regulator-always-on;
8 D/ L+ U1 i+ z, `/ _( s8 h
) A# g: E7 L# z j6 C- regulator-boot-on;
, c3 B# o0 H, h7 P - . I" a! u8 l6 Y" q+ j( P
- };
. X0 `6 z- a0 F3 {
& W- A- q2 h' Y- vdd: regulator-vdd {/ _2 u9 f g4 q4 u1 X, Y, {
- ' |2 t: K i K9 S
- compatible = "regulator-fixed";
( r/ ^5 E8 P, ]% Q- `- z2 `
n1 V) I/ U8 l5 o+ @$ ?: U- regulator-name = "vdd";1 P4 r# w$ ~8 j" Z1 |1 Q# V1 Z
6 M6 m4 y1 b3 U0 [9 |9 R' _) Z3 N- o- regulator-min-microvolt = <3300000>;
' E, D9 Y$ R' o$ [* `- j( \ - : s5 E8 p3 G. O; _0 r8 `' t4 Q+ u t
- regulator-max-microvolt = <3300000>;
, a, y' \& V+ W) o% |
; H4 d, _% _9 t- [/ I- s9 D- regulator-always-on;
! B4 s4 t% Q0 }2 L( A9 o1 C - ' u+ L u( ?$ W6 D7 i
- regulator-boot-on;2 H- V2 ?! o. _) k; P y* {
- 4 V, P6 |3 V& Y( G$ z
- };8 i0 d( Y, n7 K. j
: C9 {( q2 A5 g- a! E; p6 l- vdd_usb: regulator-vdd-usb {8 v& A6 c" e1 v/ u8 ?
( v, N5 D6 ?0 i! K- compatible = "regulator-fixed";' v9 Y: \) l2 h6 Z, _% ~# g
7 R9 g5 p# k: j/ w" [9 L9 r- regulator-name = "vdd_usb";& Q" ?0 T4 ?' \5 \8 R
" ~! z0 ]( M8 M4 Q$ z* g- regulator-min-microvolt = <3300000>;6 m1 ~1 x+ O% f( T) x7 p& N
8 t0 J* K, @9 L8 u- @# H- regulator-max-microvolt = <3300000>;
7 C7 @. G0 ?3 i
% l7 a2 A+ I# M4 H- regulator-always-on;2 h9 a1 ~* [1 v+ e
8 p" _3 `# D% g0 P6 V/ q* g' m7 Z; \- regulator-boot-on;
5 `; j5 V6 M: Q# h9 ] - " Z4 I$ R Z& g. _8 h/ H4 Q
- };
8 d5 K) `$ t H3 c! ?0 g' k
0 _! r2 ~ G3 }' D2 N/ _& G- };
复制代码 + i$ O, d: a$ m/ h* a( V
. t; S7 M; G7 w7 c& H3.重新编译源码
5 x( U& l% g- N5 y! U& |. ylinux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all5 |) ]7 ~5 R, \
" x( v1 ~ i% R$ T
4.烧写后启动
& N8 h( f8 F- B$ w: n2 f% Z, U重新烧写后启动现象如下:! w7 {# Y! O4 S4 |) {" u2 z
' _- Y$ `& [4 z
8 \3 u0 {( a# B& v. ]
, y5 E2 q+ g3 m* R* V8 {( n可以看到现在已经可以启动到u-boot了
* H0 Q6 B6 T" p4 @! ?1 w; L4 v, s9 U7 @ ~# L
eMMC移植+ R- ]) ?) S* M9 y: [0 g6 L6 r
参考原理图可知eMMC使用的是SDMMC2总线,当前所使用的设备树文件中没有SDMMC2的支持,所以需要增加相关内容才能正常驱动eMMC。8 W S2 K; ~) H6 C
. p$ I$ k, l/ l( y) n, f1 b
7 Y+ c( {3 m8 l! w8 M5 v. q+ W4 _* R, V! J
由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:
9 f# O0 S( S6 h# a
( @" a8 q B K; o7 J8 q
1 p ]2 w" Z" V* |2 F5 `$ J7 D& R1.管脚定义
* h7 C+ L2 w! L( ~# p& w& L在u-boot中STM32MP1默认管脚定义在文件
9 [9 n4 L' p2 b. M: Garch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:% V7 `: r8 A: ]' n$ m
z" K r/ b' K: i1 a
查看后确认有SDMMC2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:. o2 [ P9 v/ ?" H& J5 H% [
+ E, O1 l9 n9 j# U% ^3 _
- sdmmc2_b4_pins_a: sdmmc2-b4-0 {
! Z1 l. G% J& v2 c% q% i7 r
1 a7 k* _6 D- H2 F, e! z- pins1 {
( {8 D3 V0 q0 \8 R- H4 ~: m
6 h4 ]5 l2 @9 w( g$ f; |. u- pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */: Y$ R& \, H3 {) t- L
- ' l/ k% p3 q" F* k7 e
- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
; L+ H% t) a G: V
. z) x8 @" A) o @) z( k Y9 l- <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */, m* ? A& P j3 n6 ~
( |" T- \9 L+ X# N3 b( r3 a9 |- <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
% J' g% L- i" n e" t& N5 q4 T
' j' C: V( t$ K& |- <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */$ n2 v- ]6 C- I) I' R
W( L3 \7 M( v( I0 L6 I- slew-rate = <1>;
4 S7 L$ F# T) Y - ! E# H) o( z6 w7 ?
- drive-push-pull;
' ^+ t. q/ H2 ~- k- W' o - : g5 i+ U/ c" F( h, u6 I' ?
- bias-pull-up;
. W2 ?, e+ m+ i% \, n
G9 d" i- T( [- D/ p& l- };1 C( T, W8 w! n- n5 o+ k
4 L$ \" U: i; w. x7 l- `7 N- pins2 {. F/ _, n# J* l* h L1 v5 i
- 6 e" J) m; N+ A0 r" S5 c0 H1 u }- m
- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
1 n( E: R* O5 q) C9 D
- `6 \/ `: {, T7 }6 c2 O" ]- slew-rate = <2>;" f5 r, Q3 u1 G
% R+ n1 ?7 r: u: {6 U$ }- drive-push-pull;
# H, M! J0 P) b9 d/ d: K5 n8 Y1 i - 5 f! L6 m! a9 [$ O/ ^2 i* \
- bias-pull-up;" M: X- I& \, S- J* n4 x* F0 t
- / r+ E. a& H- e
- };1 T8 @$ A# a$ p+ l. k
+ p; f; }" ~; r; f- };
复制代码
/ m1 g0 H7 Q2 H; \6 w# H2.增加SDMMC2节点信息
6 \; m5 A* Y/ B0 W& D; I- {修改6 k$ S: I& `$ H8 F
fdts/stm32mp15xx-fsmp1x.dtsi增加SDMMC2的信息
. c6 ~% R' ]7 G" }/ I+ t' d+ m# A" i+ G, g, k5 |8 j
在原有sdmmc1节点下增加sdmmc2的内容,添加内容可参考9 h: ~+ n: j" g) a+ Q5 o) y& u
arch/arm/dts/stm32mp15xx-edx.dtsi中sdmmc2的写法,内容如下:) e5 S# \, L Y# X/ B
j) B' W5 S/ B& E$ t9 U# M0 R
- &sdmmc2 {
9 |: w. U2 |+ ]
* V" K0 u9 H) }/ a- pinctrl-names = "default";7 P" y, ~3 @. _" y Y0 L
, m& V1 Y9 B9 ]8 q( v# L' p- pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
! L2 O" N0 y8 o4 S ]% g% G - ( r5 h4 S: @# _" r6 H" b/ E
- non-removable;" `! {# |# a: c5 ?
- " x% @8 Y* K4 ^9 l5 o3 R
- st,neg-edge;* n7 J. p7 }4 X$ G5 U5 N1 M( r
- ( _7 O* m8 W. C( r4 m* v; A: X
- bus-width = <8>;, _1 R: z% s. _
+ B H- j! g/ D! X& w. c9 H& C- vmmc-supply = <&v3v3>;! i$ {! u$ `+ N
- : V8 R1 _5 T. _
- vqmmc-supply = <&v3v3>; i/ j b7 W4 J
- , ?& W# q9 J4 f0 V# K
- status = "okay";
, n, ~" _- E' L6 L1 o) }5 C7 ` - 0 E6 Z1 P- q8 u3 e
- };
复制代码
0 `* p2 ~0 t9 E$ l" {————————————————
8 Z8 \- t/ K$ N# S/ }6 y版权声明:华清远见IT开放实验室& S# T# p/ k$ ^+ z z' u( r
* w& w. U o; Z- n) c- D
2 d) W% i0 H& y |