第 1 章 Trusted Firmware-A移植
1 ?+ \- H0 \4 `
0 F; w; M7 t* M! z, d! a7 q7 o8 E1.1 Trusted Firmware-A简介
4 I( {* h* r% y5 P" W* {" S$ N; ]+ s' M/ o% |( v: x' x
嵌入式高速发展的今天,大量的嵌入式设备使用了Arm为核心的芯片。我们会接触到越来越多的嵌入式设备,一个问题油然而生:数量如此巨大的嵌入式设备的安全性如何?目前针对嵌入式安全的技术和标准可谓千姿百态,除了必要的硬件安全技术,与之配套的安全软件也是必不可少的一部分。今天我们要介绍的是基于Arm 的可信固件Trusted Firmware-A,简称TF-A。它是一个开源软件,运行在一个硬件隔离的安全环境中并提供安全服务。7 v% G' u8 R2 \
* o1 V+ l& W# G9 p
1.2 实验目的- t# O1 P% a- _2 l
完成TF-A的基本功能实现TF-A引导u-boot启动。
$ |+ x8 ~* ~2 I; X/ u
: C, H* o( S% K7 D! B" q& e1.3 实验平台. d: t6 b$ l# I6 G1 w4 L
华清远见开发环境,FS-MP1A平台
: O: H. ^! V* _9 x+ }9 ]
$ w1 U9 k4 z+ x# P1.4 实验步骤
2 h7 B, q( `$ y' ^本实验基于tf-a-stm32mp-2.2版本,然后添加意法半导体提供的补丁文件。在意法半导体官方的tf-a中移植我们自己的tf-a。
: D) f. e% H3 D4 w$ ?$ t' T6 K# [$ N. J8 }8 |3 Z
1.4.1 导入源码/ W, p0 ~- b& E( `2 f
如果之前已经建立了源码目录,并且导入了源码包,即可跳过本小节。, E) S( L8 I$ C- T6 ?
. _6 i% w3 e3 ^ g$ J建立源码目录
6 m) M* v, N3 O9 d7 k& h
" u$ N1 E- s. O ] C1 D/ H- linux@ubuntu:$ cd ~
: Y0 P2 ? J# @; }; Y1 x& } - linux@ubuntu:$ mkdir FS-MP1A
复制代码 w( N# p& U; Z8 |8 z( [4 s- J
将下的en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz压缩包,导入到ubuntu下的${HOME}/FS-MP1A目录下。
, I! K" y5 E( t4 D+ t* j/ `
1 L% Y9 A0 Z1 z1 i9 @& s
+ I. m# N. B2 K/ l% l$ ~4 v' m/ M& F6 P解压缩源码包
5 P2 W; i1 x5 {7 m% q' p6 }" H) d2 O9 V p3 D
- linux@ubuntu:$ tar xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz
复制代码 8 e: }; o/ h- |* J M, r
解压完成后得到“stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录. A m4 E+ {' _% z1 X% d
; H1 M" w: Q" {& o! s/ U' T
, J) z5 q" t1 g) [+ l; ?; |
8 [6 z" n- e" A. U H! ~
进入tf-a目录下
+ d) o3 E+ R& f. ]. i4 V: O9 S- J7 _1 V) R0 ]
- 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
" \- I8 X1 f% R2 Y; z
复制代码 0 x# l6 h: c, C& i r
: A6 y2 ~6 ~2 K5 j
% [- t. c5 z9 q5 O( @
该目录下以patch结尾的文件为ST官方提供的补丁文件;tf-a-stm32mp-2.2.r1-r0.tar.gz为标准tf-a源码包。
$ n9 y% }& Z) w2 m" u# }7 u解压标准tf-a源码包# q3 y" W- S8 Q* S
! v$ ^0 e: i1 p/ R/ e0 R! n- linux@ubuntu:$ tar -xvf tf-a-stm32mp-2.2.r1-r0.tar.gz
复制代码
: |! Z$ B R. m9 l: w解压完成后得到tf-a-stm32mp-2.2.r1目录! q. b, p+ @" _; h# f
% ?) Y: A! j- z0 X# Z4 _& D, \
( H5 s, n$ `! G3 e9 o) z2 A$ ~
& \$ `; W. V' R% R! {5 [! M进入tf-a源码目录下:
6 p) C* N! l! I* y# r' }
2 |, D& k5 p& O( k- linux@ubuntu:$ cd tf-a-stm32mp-2.2.r1
复制代码 0 U( U/ [" O" {6 u0 M
2 x4 v# W" I7 d. R8 U2 W, H
d9 y( P9 I" D4 f% o% ^$ p将ST官方补丁文件打到tf-a源码中:
! S2 U! k5 x) @/ f0 S
6 C& e: N0 R7 D2 y& A& [3 z- linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
复制代码
3 m. A) A* e& Z; m
& {. X5 q# A$ {7 B7 \* c+ r1.4.2 TF卡分区
; [, O# U' r) e2 H要对TF卡进行烧录,需要先将TF接入到ubuntu系统中。
+ X( I' h$ T4 U$ g! F1 @查看TF卡分区2 v1 v9 K! t% P$ F+ X
$ Y P6 P% q q- linux@ubuntu:$ ls /dev/sd*
复制代码 9 z" V4 [3 l, p5 z
& r7 [; C" i8 T8 G% G+ z% s) b! d
由上图所示只有“/dev/sdb1”一个分区则需要重新进行分区。) _% F7 b* f1 B: p6 }
首先删除原有分区
; i8 P. @% ^6 I( X7 K. d( V% O
+ S0 q) t: ? _9 D- linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos
复制代码
r0 Y Q" b, J如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。+ c- h' n. l8 q* F) |# x8 Q4 [) }2 \
3 l8 M8 ?! k# G
" Y4 b6 j( n/ E/ X# a
$ A S& F% K8 Z卸载设备5 h7 I6 a! d& t5 O6 J# E
! y: Y' F6 U" p$ B7 s3 f( r- t6 r
- linux@ubuntu:$ umount /dev/sdb1
复制代码 卸载完成后重新执行删除分区命令5 Q6 E, b- Q; E( l$ `
3 m) U# @( a, f
- linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos
复制代码
" X9 D/ w+ G% c8 U对tf进行重新分区
8 Y# g* Q" N" z) @5 c! n' ^9 y8 p8 ?# J8 A$ ~$ D
- 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
复制代码
- H9 }) v2 R. C7 B: f* g0 W3 L
& Z4 m2 K0 d+ b, C
; ]& _# E# B( m; y" g& f) o5 f! D注意:最后-p /dev/sdb参数中的/dev/sdb需要按照实际ubuntu中的tf节点为准,否则可能发生不可预料的后果。( y3 Z4 {% ~7 h e, N/ o1 J; z
* w7 Q7 h i( W {* a
1.4.3 建立自己的平台
0 [! c3 \( U8 V1 d7 u* [! @
' v3 t" D% y) y! k1) 配置工具链
4 D, k6 w7 G* y8 Y3 f4 J导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
' `# Q$ | i( z9 `
" ~+ M) u0 q8 @/ J- linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码 " [8 w% v+ X4 N: T# Y4 j
验证开发工具是否安装正确,显示版本信息如下图所示。
6 e" \3 A3 \( S( m" m7 t5 E
$ h: d9 f- P$ Y- W% H! i- linux@ubuntu:$ $CC --version
复制代码 * {9 r1 _3 n" Q- w, Y9 ^2 \
$ U) |& q1 W9 E* t
5 ]+ g7 }1 y2 @2 t, m2 c4 h, h
2) 增加板级相关文件. t! D; N' @8 k j
进入到tf-a源码目录$ ~, T8 Q! O- E/ {8 O
/ b; a, I/ @: f, L2 ?# G
- 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
复制代码 - k* ]! r2 ^+ N4 s
添加设备树文件. n0 w, R8 H, \+ O8 I
5 s' x) p( t: y- linux@ubuntu:$ cp fdts/stm32mp15xx-dkx.dtsi fdts/stm32mp15xx-fsmp1x.dtsi5 V6 a# @7 M$ \. b9 F: D
- linux@ubuntu:$ cp fdts/stm32mp157a-dk1.dts fdts/stm32mp157a-fsmp1a.dts
复制代码
! E: S. H. |! R6 c" p; ^9 v" @修改上层目录下的Makefile.sdk编译脚本在TFA_DEVICETREE配置项中添加stm32mp157a-fsmp1a
. b* D, y) ]8 w% A/ E
; s+ ~: ~1 |" n! q' @9 X- TFA_DEVICETREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
复制代码 $ A2 G; G, I' }0 B' B
修改fdts/stm32mp157a-fsmp1a.dts将- #include "stm32mp15xx-dkx.dtsi"
复制代码
) Z$ |# V$ ~* O a修改为
( s" Y; B* _0 _. E2 G2 @( w' j
. W0 B A- a# C7 |# Q& q- |# O/ b5 X- #include "stm32mp15xx-fsmp1x.dtsi"
复制代码 6 W. A! e1 m9 g# d) d& z
3) 编译源码: D3 s7 _! a8 y- [" [+ M: e; X
执行如下指令编译trusted:
8 n0 p# O8 a- m2 r. R# p$ i
7 B0 B. Q0 ?2 J- k2 `3 k ]- linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
复制代码
U" Z. D% e; P6 V7 k编译成功后,最后显示内容(部分截图)如下:
& ]1 k, i$ a$ x3 e2 x$ G5 M! E& ~' h
7 O# C- l O ]4 I6 ^
5 l; h& d+ H! l& @0 l
3 g0 [; a `. t2 c
编译完成后会在上级build/trusted目录得到如下文件:9 a% w3 g, O5 o- h3 E. |5 B
" _6 c+ Q! q4 k3 N
- linux@ubuntu:nbsp; ls ../ build/trusted
复制代码
# {, U% B9 f4 |: o5 {
3 ?' V% e$ l4 |1 A7 o' O. }4 E0 m7 E9 g0 E+ R8 i* @( J
- linux@ubuntu:nbsp; cd ../ build/trusted
复制代码
- F* R! Q) i( G) ]$ i4) 固件烧写
; C8 W4 ~ w3 _由于在移植过程中会多次烧写固件并且会导致正常tf-a无法启动,因此推荐使用TF卡启动的方式来验证。
$ b& ?5 D; _/ k! @" Xtf-a需要使用trusted 格式的u-boot镜像启动,具体的编译方法可参考《U-boot移植》章节中的“生成Trusted镜像”小节。
i9 m% v( y/ s( ]将TF接入ubuntu系统后,查看TF卡分区
' E1 x) \9 W8 E: w$ Z
8 Q) u0 q/ I2 E7 ^4 s4 g4 X3 c, X! A- linux@ubuntu:$ ls /dev/sd*
复制代码 / W3 z" }! Q0 @9 f
! @, r, J. H5 s- n! |: S' a
2 f( G5 c0 K* i3 Q. o: S
/dev/sdb为TF卡设备。如果该设备下只有/dev/sdb1一个分区则重新分区。
; X; L7 e0 U/ _* V- l" ^执行如下指令烧写u-boot:
# [# |9 b) M: U: i" t2 {2 m( `7 [3 Y7 P/ f
- linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync& t& Y2 b: T0 c) E
- linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync
! Q; T* Y" a( e - linux@ubuntu:$ sudo dd if=u-boot-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb3 conv=fdatasync
复制代码
5 m) k3 \& O+ H, ^其中前两条命令“tf-a-stm32mp157a-fsmp1a-trusted.stm32”为本章节编译得到的,第三条命令中的“u-boot-stm32mp157a-fsmp1a-trusted.stm32”则为《U-boot移植》章节中的“生成Trusted镜像”小节得到。' W! v( _" [, \" q: o9 x& L
5) 启动开发板5 ]2 F2 [6 f. l/ F
将拨码开关设置为SD卡启动方式:
3 W0 ^" B4 E9 y6 C9 f, N+ H; d! l/ b9 B x5 {/ T
6 [3 [: s( E! N X3 y: q
) ^# v" n; Y0 m
将制作好的TF卡插入开发板,上电后会出现如下错误提示:
4 \, I! h) a: j! \9 Y' ?2 X. U. T) n6 l
! ~) H; C% N6 W4 w# u) h3 h0 h! x7 W8 f8 }! |* T$ y
这个错误产生的原因是电源初始化错误,需重新调整电源相关配置。4 g d* Y, }0 O+ ?4 L$ e; \
6 G i' P3 g: K+ c, h/ _1.4.4 调整设备树电源配置, u% R4 @. Y Y
由于官方参考板DK1采用电源管理芯片做电源管理,而FS-MP1A采用分离电路作为电源管理,本例需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容$ R3 x% E/ F. j+ y
: N- s! p( E$ i0 p
1) 去掉原有电源管理内容
& X& @9 _7 `$ g: Y" M. l( l2 yDK1参考板电源管理芯片挂在I2C4上,而FS-MP1A并未使用I2C4总线,所以直接将I2C4相关内容完全删除即可。
( J4 C" c6 J8 s5 H: a$ B修改fdts/stm32mp15xx-fsmp1x.dtsi文件; ^& d8 D+ y- z6 }
将文件中i2c4节点相关内容整体删除,删除内容如下:
: i8 T, N; J' v+ V
- @# s! M+ w( [, L; O: f7 z: x- &i2c4 {
& n0 [( F, g+ s/ z {) W- e& R - pinctrl-names = "default", "sleep"; I0 c9 s" r s2 b
- pinctrl-0 = <&i2c4_pins_a>;
6 q& M: M, @4 e7 L4 I* E! R - pinctrl-1 = <&i2c4_pins_sleep_a>;
* j* R" w1 ]0 K3 A- i9 x7 z - i2c-scl-rising-time-ns = <185>;
" M% j# \0 K* v6 V! U) } - i2c-scl-falling-time-ns = <20>; }2 |* ^' L$ E' f) e! l( g
- clock-frequency = <400000>;
2 t9 ~' _2 ?9 c( Z1 f6 | - status = " okay";" }% `& ^+ w5 d% P4 e
- secure-status = "okay";
! Z' w/ A# U: G6 g' W# j X! A) J - /*内容太长此处省略*/
9 k1 p$ I! M4 Z - watchdog {0 t- M! P$ S4 j
- compatible = "st,stpmic1-wdt";6 V7 s/ Z' ]. _' ^
- status = "disabled";
, M1 S: U6 R& B+ D - };- ]$ z2 F# L6 L4 _' P0 }9 b
- };& g, S+ v6 a- w0 O5 j S$ I4 t
- };
复制代码 8 v5 _3 Z3 @* \( V: ~
修改fdts/stm32mp15xx-fsmp1x.dtsi文件,删除如下内容:4 b: u% X- L% b+ s
! z4 N& S/ k6 u- e: j* l& d
- &cpu0{$ g9 r' I2 S! C' B/ i) k
- cpu-supply = <&vddcore>;
1 W) P6 y7 q5 m/ | - };. x1 y7 b! ^% r; @$ k
- ) K4 o4 k/ m7 ~/ b& G3 F5 g
- &cpu1{
5 i! P* ]( _* c/ g# |1 o2 u - cpu-supply = <&vddcore>;# a3 H6 p) h; C( @
- };
复制代码
9 y8 k7 P! K- |* \+ {0 C3 q, w @, |2) 添加固定电源配置$ K# ^! |4 _. v" J5 z- X
4 Z4 M3 y+ e% K) m; P; ?
修改fdts/:文件
# A. j# X1 c" F固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):2 O g3 A+ J2 ]
/ V$ s7 P! Y7 T: V- vin: vin {
8 D& a$ Q: d3 ^3 N; L - compatible = "regulator-fixed";
: l8 N* N5 ?9 Q - regulator-name = "vin";& w- ~0 L# ?8 ~) s- R& Z
- regulator-min-microvolt = <5000000>;- U4 f/ O+ q5 X; `# c
- regulator-max-microvolt = <5000000>;
# `/ }! ?' p. g - regulator-always-on;
! R" s) @: o& p5 T) _% |, p - };
8 a' V5 i) D7 t* A- R# w( h Q - v3v3: regulator-3p3v {, ]' B i f( b* S
- compatible = "regulator-fixed";
8 O X) x7 c0 S6 A - regulator-name = "v3v3";
6 o" w" M1 H/ i) N6 Y - regulator-min-microvolt = <3300000>;
- j7 s# X# R! Z5 d. a' ] - regulator-max-microvolt = <3300000>;; u; D* A5 O/ {* p
- regulator-always-on;
0 ^. [% r# g7 Z( @+ ^ - regulator-boot-on;. {# G: a. Y) K F" I
- };& W! }' o0 ^/ h
- v1v8_audio: regulator-v1v8-audio {
) v- ~) L% Q; A r8 u - compatible = "regulator-fixed";
+ W4 w" i9 }4 P8 J' k8 q - regulator-name = "v1v8_audio";/ I7 P. q3 ~- g
- regulator-min-microvolt = <1800000>;* D5 N* F7 {: I2 {3 U' {% z/ T
- regulator-max-microvolt = <1800000>;
* Z6 B3 g7 {$ Y( U0 p) r - regulator-always-on;, G( I c, Y0 i
- regulator-boot-on;. c$ F! P1 |( w9 u2 f
- };, D7 h+ j; A; z2 _, ]$ c8 n
- v3v3_hdmi: regulator-v3v3-hdmi {
( e8 B3 f: C6 R7 H - compatible = "regulator-fixed";( @& \) z% s" S4 i1 k4 \6 W( _
- regulator-name = "v3v3_hdmi";1 Y H, Z @( P) N# n2 ?3 M [3 z( Q
- regulator-min-microvolt = <3300000>;7 E1 K8 P" Y8 N7 w$ t4 `
- regulator-max-microvolt = <3300000>;9 M. F, C) t3 M( l: J$ G+ K' F
- regulator-always-on;) J! m' e- g) p% i
- regulator-boot-on;
' h/ y1 V5 O6 O. L7 {; E - };
' |# g6 S$ E! O% O - v1v2_hdmi: regulator-v1v2-hdmi {- f# {$ P/ M. d
- compatible = "regulator-fixed";' t) C9 s6 e1 T+ t( }
- regulator-name = "v1v2_hdmi";
; l# i& |8 d) a - regulator-min-microvolt = <1200000>;2 b9 y0 x$ o) D* T* N
- regulator-max-microvolt = <1200000>;
' N+ Z, `# m6 O: m! u) R - regulator-always-on;4 [: g9 c# [9 p7 Z/ s
- regulator-boot-on;; l% y2 t$ U( z
- };
3 b6 _: D9 P( n: } - vdd: regulator-vdd { J, h+ `. Y4 s( [7 n2 J
- compatible = "regulator-fixed";
* {9 D# G6 \* D$ P9 v - regulator-name = "vdd";* a' e$ [. Z* h/ m& h6 x/ g
- regulator-min-microvolt = <3300000>;( z2 _8 U9 a8 e
- regulator-max-microvolt = <3300000>;
8 K/ U! h+ _9 e" D3 `& z - regulator-always-on;0 u' B$ M$ P/ W$ W& T* d) z# Q
- regulator-boot-on;. |2 `9 J) C2 k" a# r
- };
2 A$ e6 @9 r0 T" L, J - vdd_usb: regulator-vdd-usb {
% O, j# c5 S) A: f4 | - compatible = "regulator-fixed";4 J4 E) ?% u. a! d+ h- b% G; |. L$ |
- regulator-name = "vdd_usb";
) O* D# |' P, D1 X0 R9 L7 A( ]8 F - regulator-min-microvolt = <3300000>;
. Y0 h! j" r) n- m - regulator-max-microvolt = <3300000>;
0 u3 F/ z, T/ O1 g - regulator-always-on;
% [2 k0 W* d9 v |( g! m - regulator-boot-on;. a4 z T+ k* ?6 a8 u! y! H
- };0 ]: p' A, B) R; y. V" t" H4 T% _' S/ V
- };
复制代码
* X' p4 F& H) Z( u) F# o6 K3) 重新编译源码; h# U7 v( |8 o* P( Z5 H" q) w
! Z" q' R7 B0 G1 {3 N% ?8 }3 j. @- linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
复制代码 6 w6 u6 S' s& F* q! K- u1 o! v
4) 烧写后启动
9 E4 x& g. L5 X# |$ v9 J重新烧写后启动现象如下:+ [5 o5 z' j- z" a0 p" C
% m2 M5 m' g) n" [
+ h' f1 o; T4 z- m! X2 V, C7 [+ M& s( `' r. T$ m' c' p) X, V6 r6 u
可以看到现在已经可以启动到u-boot了。
) t- n8 n4 o. m) a }1 h0 N5 ]% J4 x3 C! b% ?8 }
1.4.5 eMMC移植
& D0 I8 C- j; }6 {; [$ p& J7 D! i参考原理图可知eMMC使用的是SDMMC2总线,当前所使用的设备树文件中没有SDMMC2的支持,所以需要增加相关内容才能正常驱动eMMC。# c" `+ ]4 x3 Q
0 c) C. Q8 e2 o, M r
/ i) j1 |, f q l
- T. a" f0 y( T2 o; S3 S) c3 n2 @
由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:+ o0 V* I* Z* }9 N7 p
. e1 ~# p- q7 Q+ s' N: i
: M/ V+ y& d1 T u1 V; s9 ]& c* O2 U3 H& Q2 V y# I4 [# L3 r
管脚定义 ], k5 f0 l, W" x, _# ~) V
在u-boot中STM32MP1默认管脚定义在文件arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:0 G; Q; u- N4 M; D# V+ P2 J/ \
查看后确认有SDMMC2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:# u; T8 H6 \6 `1 z, Q( F! Y( w4 P2 v
- sdmmc2_b4_pins_a: sdmmc2-b4-0 { 1 d$ a+ ?$ o; ~# n+ u7 K1 x
- pins1 {
0 a# V/ J( X. M; A6 Z# R8 q - pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */ + J+ R, }- ^# \' w$ S2 g
- <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
1 V5 |1 e3 j, U - <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */ 7 m7 O4 t; X& @& N8 v
- <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */ ) l; j" r9 k; Y" R* ~1 U
- <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */ 0 }& L1 i+ x& Q
- slew-rate = <1>;1 Y6 A" V* ^( J' r
- drive-push-pull;
. D& f' j. p2 I! T6 G - bias-pull-up;
- Y, u; c7 e& b& T, N& L3 f - };
5 P2 \6 }7 A @% | - pins2 {* e* e% q* ^; K' s8 c a
- pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */& z: X& W8 J- ]
- slew-rate = <2>;6 @# l+ \5 W7 s$ ]' z8 x+ H- |
- drive-push-pull;9 y/ t w3 f0 y7 U& v
- bias-pull-up;: l# k5 l. s3 n0 C o
- };
! O( E% ?" c; \& h( C7 A7 u - };
复制代码
" i1 y) v8 W4 A1 Q: n增加SDMMC2节点信息% d' }5 j( z6 S; Z+ Q: W( l+ J' v
修改 fdts/stm32mp15xx-fsmp1x.dtsi增加SDMMC2的信息, m4 ]$ L, o+ F$ l3 Y
在原有sdmmc1节点下增加sdmmc2的内容,添加内容可参考arch/arm/dts/stm32mp15xx-edx.dtsi中sdmmc2的写法,内容如下:
- \8 S7 p; L$ T( d l- &sdmmc2 {
. Z6 R2 x/ K2 L - pinctrl-names = "default";# U5 e" _( _) Z- e# h
- pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;, r s3 x0 B; S( [1 G) A, u- s
- non-removable;5 o, f+ F/ b0 h* u# Y% C
- st,neg-edge;
: f% c- o$ S/ @- f - bus-width = <8>;
% B ^" F2 I9 G0 j2 s - vmmc-supply = <&v3v3>;) u% G& {& y, C9 Z
- vqmmc-supply = <&v3v3>;9 B+ K; n; [0 l: R/ R+ i
- status = "okay";
3 N) o4 Z6 b/ h1 _ - };
复制代码 1 ]3 m# a! L3 m; m# i( G+ e
测试
- y' d! z, l% f- ?$ \重新编译烧写后可以通过ums或者scp的方式更新eMMC中的u-boot即可。具体可参考《通过linux更新eMMC中的u-boot》章节。% m; J; V7 j4 l
————————————————
7 C' W( T, Z) f& `$ D版权声明:左月先生* V" W, @# F. h d* F2 r
5 Z6 q6 ]/ t9 t4 \! ]. ]2 h! L# P& b
8 U/ x0 k' Q/ k$ b7 H
|