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

STM32MP157系列教程连载-Linux系统移植篇5:STM32MP1微处理器之Trusted Firmware-A简介

[复制链接]
STMCU小助手 发布时间:2022-9-20 22:27
第 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
  1. linux@ubuntu:$ cd ~
    : Y0 P2 ?  J# @; }; Y1 x& }
  2. 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/ ` 20201123180600610.png
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
  1. 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 20201123180631338.png , 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 ]
  1. 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
20201123180710278.png : 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
  1. 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, \ 20201123180745460.png
( 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
  1. linux@ubuntu:$ cd tf-a-stm32mp-2.2.r1
复制代码
0 U( U/ [" O" {6 u0 M
20201123180820285.png
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
  1. 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
  1. linux@ubuntu:$ ls /dev/sd*
复制代码
9 z" V4 [3 l, p5 z
20201123180908890.png
& 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
  1. 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
20201123180944790.png " 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
  1. linux@ubuntu:$ umount /dev/sdb1
复制代码
卸载完成后重新执行删除分区命令5 Q6 E, b- Q; E( l$ `
3 m) U# @( a, f
  1. 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
  1. 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 20201123181134368.png & 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
  1. 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
  1. linux@ubuntu:$ $CC --version
复制代码
* {9 r1 _3 n" Q- w, Y9 ^2 \
20201123181225592.png $ 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
  1. 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
  1. linux@ubuntu:$ cp fdts/stm32mp15xx-dkx.dtsi  fdts/stm32mp15xx-fsmp1x.dtsi5 V6 a# @7 M$ \. b9 F: D
  2. 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
  1. 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将
  1. #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
  1. #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  ]
  1. 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 ^ 20201123181420705.png 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
  1. linux@ubuntu:nbsp; ls  ../ build/trusted
复制代码

# {, U% B9 f4 |: o5 { 20201123181456546.png
3 ?' V% e$ l4 |1 A7 o' O. }4 E0 m7 E9 g0 E+ R8 i* @( J
  1. 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
  1. linux@ubuntu:$ ls /dev/sd*
复制代码
/ W3 z" }! Q0 @9 f
2020112318155683.png ! @, 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
  1. linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync& t& Y2 b: T0 c) E
  2. linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync
    ! Q; T* Y" a( e
  3. 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
20201123181625901.png 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
20201123181648220.png
! ~) 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
  1. &i2c4 {
    & n0 [( F, g+ s/ z  {) W- e& R
  2.         pinctrl-names = "default", "sleep";  I0 c9 s" r  s2 b
  3.         pinctrl-0 = <&i2c4_pins_a>;
    6 q& M: M, @4 e7 L4 I* E! R
  4.         pinctrl-1 = <&i2c4_pins_sleep_a>;
    * j* R" w1 ]0 K3 A- i9 x7 z
  5.         i2c-scl-rising-time-ns = <185>;
    " M% j# \0 K* v6 V! U) }
  6.         i2c-scl-falling-time-ns = <20>;  }2 |* ^' L$ E' f) e! l( g
  7.         clock-frequency = <400000>;
    2 t9 ~' _2 ?9 c( Z1 f6 |
  8.         status = " okay";" }% `& ^+ w5 d% P4 e
  9. secure-status = "okay";
    ! Z' w/ A# U: G6 g' W# j  X! A) J
  10.         /*内容太长此处省略*/
    9 k1 p$ I! M4 Z
  11.                 watchdog {0 t- M! P$ S4 j
  12.                         compatible = "st,stpmic1-wdt";6 V7 s/ Z' ]. _' ^
  13.                         status = "disabled";
    , M1 S: U6 R& B+ D
  14.                 };- ]$ z2 F# L6 L4 _' P0 }9 b
  15.         };& g, S+ v6 a- w0 O5 j  S$ I4 t
  16. };
复制代码
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
  1. &cpu0{$ g9 r' I2 S! C' B/ i) k
  2.         cpu-supply = <&vddcore>;
    1 W) P6 y7 q5 m/ |
  3. };. x1 y7 b! ^% r; @$ k
  4. ) K4 o4 k/ m7 ~/ b& G3 F5 g
  5. &cpu1{
    5 i! P* ]( _* c/ g# |1 o2 u
  6.         cpu-supply = <&vddcore>;# a3 H6 p) h; C( @
  7. };
复制代码

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
  1. vin: vin {
    8 D& a$ Q: d3 ^3 N; L
  2.         compatible = "regulator-fixed";
    : l8 N* N5 ?9 Q
  3.         regulator-name = "vin";& w- ~0 L# ?8 ~) s- R& Z
  4.         regulator-min-microvolt = <5000000>;- U4 f/ O+ q5 X; `# c
  5.         regulator-max-microvolt = <5000000>;
    # `/ }! ?' p. g
  6.         regulator-always-on;
    ! R" s) @: o& p5 T) _% |, p
  7. };
    8 a' V5 i) D7 t* A- R# w( h  Q
  8. v3v3: regulator-3p3v {, ]' B  i  f( b* S
  9.         compatible = "regulator-fixed";
    8 O  X) x7 c0 S6 A
  10.         regulator-name = "v3v3";
    6 o" w" M1 H/ i) N6 Y
  11.         regulator-min-microvolt = <3300000>;
    - j7 s# X# R! Z5 d. a' ]
  12.         regulator-max-microvolt = <3300000>;; u; D* A5 O/ {* p
  13.         regulator-always-on;
    0 ^. [% r# g7 Z( @+ ^
  14.         regulator-boot-on;. {# G: a. Y) K  F" I
  15. };& W! }' o0 ^/ h
  16. v1v8_audio: regulator-v1v8-audio {
    ) v- ~) L% Q; A  r8 u
  17.         compatible = "regulator-fixed";
    + W4 w" i9 }4 P8 J' k8 q
  18.         regulator-name = "v1v8_audio";/ I7 P. q3 ~- g
  19.         regulator-min-microvolt = <1800000>;* D5 N* F7 {: I2 {3 U' {% z/ T
  20.         regulator-max-microvolt = <1800000>;
    * Z6 B3 g7 {$ Y( U0 p) r
  21.         regulator-always-on;, G( I  c, Y0 i
  22.         regulator-boot-on;. c$ F! P1 |( w9 u2 f
  23. };, D7 h+ j; A; z2 _, ]$ c8 n
  24. v3v3_hdmi: regulator-v3v3-hdmi {
    ( e8 B3 f: C6 R7 H
  25.            compatible = "regulator-fixed";( @& \) z% s" S4 i1 k4 \6 W( _
  26.            regulator-name = "v3v3_hdmi";1 Y  H, Z  @( P) N# n2 ?3 M  [3 z( Q
  27.            regulator-min-microvolt = <3300000>;7 E1 K8 P" Y8 N7 w$ t4 `
  28.            regulator-max-microvolt = <3300000>;9 M. F, C) t3 M( l: J$ G+ K' F
  29.            regulator-always-on;) J! m' e- g) p% i
  30.         regulator-boot-on;
    ' h/ y1 V5 O6 O. L7 {; E
  31. };
    ' |# g6 S$ E! O% O
  32. v1v2_hdmi: regulator-v1v2-hdmi {- f# {$ P/ M. d
  33.         compatible = "regulator-fixed";' t) C9 s6 e1 T+ t( }
  34.         regulator-name = "v1v2_hdmi";
    ; l# i& |8 d) a
  35.         regulator-min-microvolt = <1200000>;2 b9 y0 x$ o) D* T* N
  36.         regulator-max-microvolt = <1200000>;
    ' N+ Z, `# m6 O: m! u) R
  37.         regulator-always-on;4 [: g9 c# [9 p7 Z/ s
  38.         regulator-boot-on;; l% y2 t$ U( z
  39. };
    3 b6 _: D9 P( n: }
  40. vdd: regulator-vdd {  J, h+ `. Y4 s( [7 n2 J
  41.         compatible = "regulator-fixed";
    * {9 D# G6 \* D$ P9 v
  42.         regulator-name = "vdd";* a' e$ [. Z* h/ m& h6 x/ g
  43.         regulator-min-microvolt = <3300000>;( z2 _8 U9 a8 e
  44.         regulator-max-microvolt = <3300000>;
    8 K/ U! h+ _9 e" D3 `& z
  45.         regulator-always-on;0 u' B$ M$ P/ W$ W& T* d) z# Q
  46.         regulator-boot-on;. |2 `9 J) C2 k" a# r
  47. };
    2 A$ e6 @9 r0 T" L, J
  48. vdd_usb: regulator-vdd-usb {
    % O, j# c5 S) A: f4 |
  49.         compatible = "regulator-fixed";4 J4 E) ?% u. a! d+ h- b% G; |. L$ |
  50.         regulator-name = "vdd_usb";
    ) O* D# |' P, D1 X0 R9 L7 A( ]8 F
  51.         regulator-min-microvolt = <3300000>;
    . Y0 h! j" r) n- m
  52.         regulator-max-microvolt = <3300000>;
    0 u3 F/ z, T/ O1 g
  53.         regulator-always-on;
    % [2 k0 W* d9 v  |( g! m
  54.         regulator-boot-on;. a4 z  T+ k* ?6 a8 u! y! H
  55. };0 ]: p' A, B) R; y. V" t" H4 T% _' S/ V
  56. };
复制代码

* 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. @
  1. 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" [ 2020112318192079.png
+ 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
20201123182027989.png / 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 20201123182041750.png
: 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
  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 { 1 d$ a+ ?$ o; ~# n+ u7 K1 x
  2.     pins1 {
    0 a# V/ J( X. M; A6 Z# R8 q
  3.         pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */ + J+ R, }- ^# \' w$ S2 g
  4.              <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    1 V5 |1 e3 j, U
  5.              <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */ 7 m7 O4 t; X& @& N8 v
  6.              <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */ ) l; j" r9 k; Y" R* ~1 U
  7.              <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */ 0 }& L1 i+ x& Q
  8.         slew-rate = <1>;1 Y6 A" V* ^( J' r
  9.         drive-push-pull;
    . D& f' j. p2 I! T6 G
  10.         bias-pull-up;
    - Y, u; c7 e& b& T, N& L3 f
  11.     };
    5 P2 \6 }7 A  @% |
  12.     pins2 {* e* e% q* ^; K' s8 c  a
  13.         pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */& z: X& W8 J- ]
  14.         slew-rate = <2>;6 @# l+ \5 W7 s$ ]' z8 x+ H- |
  15.         drive-push-pull;9 y/ t  w3 f0 y7 U& v
  16.         bias-pull-up;: l# k5 l. s3 n0 C  o
  17.     };
    ! O( E% ?" c; \& h( C7 A7 u
  18. };
复制代码

" 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
  1. &sdmmc2 {
    . Z6 R2 x/ K2 L
  2.     pinctrl-names = "default";# U5 e" _( _) Z- e# h
  3.     pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;, r  s3 x0 B; S( [1 G) A, u- s
  4.     non-removable;5 o, f+ F/ b0 h* u# Y% C
  5.     st,neg-edge;
    : f% c- o$ S/ @- f
  6.     bus-width = <8>;
    % B  ^" F2 I9 G0 j2 s
  7.     vmmc-supply = <&v3v3>;) u% G& {& y, C9 Z
  8.     vqmmc-supply = <&v3v3>;9 B+ K; n; [0 l: R/ R+ i
  9.     status = "okay";
    3 N) o4 Z6 b/ h1 _
  10. };
复制代码
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
赞 收藏 评论0 发布时间:2022-9-20 22:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

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