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

STM32MP157 Linux系统移植开发篇9:Linux内核eMMC驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:55
1.实验原理
" L5 O: D7 v1 ^) x4 C. k: I) |  Y
' O8 U' K$ [$ K参考原理图可知eMMC使用的是sdmmc2总线,当前所使用的设备树文件中没有sdmmc2的支持,所以需要增加相关内容才能正常驱动eMMC。2 ~! h! k0 X6 C" |
! e3 q8 G8 I+ i2 j8 n- x
4f511c126996719720dc334d7edd11fb.jpg ' |2 T; o2 D2 z8 W+ I( i

! V5 s) z! C+ _7 _由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:
! ^% q* w( j0 y GKW6~ANDY6CI~{ORV)E5T`I.png 9 s  z8 Z$ m9 p3 K
* }7 b+ Z9 N* g3 i* f* h
1.eMMC设备树节点0 r9 o; M4 r- I
" c% @% s4 y4 [0 o) I& x! Y6 o
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:+ m( c5 y1 V5 F+ W5 T8 F

" a+ G; F- n! u2 j
  1. arch/arm/boot/dts/stm32mp151.dtsi0 t* u+ B5 w7 }: a  _
  2. & J5 A2 F* g( N% U" B
  3. stm32mp151中sdmmc2定义如下:5 P- l" `4 `) ?" y  l
  4. ( l4 R& N; {% Y3 D
  5. sdmmc2: sdmmc@58007000 {
    ' S  }4 _- ^! G; e# @" d, q0 `

  6. 2 w7 {- V5 j+ D8 i
  7. compatible = "arm,pl18x", "arm,primecell";  N' m* {+ h2 X; P/ O
  8. 3 v/ ]# s( n" i+ \* f; Y/ Y
  9. arm,primecell-periphid = <0x00253180>;
    : i7 \1 f, z' T$ C  G' M
  10. ( N$ J6 h- D4 |8 N; q& B8 p
  11. reg = <0x58007000 0x1000>, <0x58008000 0x1000>;4 M) }' j6 T! C9 u5 M
  12. 1 B! a0 ]$ U# T8 `6 u3 \& Y" B9 s$ i
  13. interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
    ' O4 l  L3 u6 G2 E7 x
  14. - {, O  A# J/ k( E: J8 X
  15. interrupt-names = "cmd_irq";
    8 H8 q+ I9 q" F! c3 n$ {/ ^) Y% e
  16. / y1 Q; T# I" u4 j& D* Z8 M' N
  17. clocks = <&rcc SDMMC2_K>;
    % d9 @: g4 K% U: i% D, B$ Y: U+ h
  18. 3 I0 u# V3 Q0 r! F% g
  19. clock-names = "apb_pclk";# e$ H# {  A2 @$ L7 g) p1 ?6 {$ M

  20. * r  y' ^5 Z% c
  21. resets = <&rcc SDMMC2_R>;! Z3 ^; ~* D9 Q0 e8 w1 r
  22. $ m3 Y- {5 u* Y# w2 g% g: @
  23. cap-sd-highspeed;
    8 a! ]2 `! C2 f7 n: g
  24. 8 ]: F* g! W/ H
  25. cap-mmc-highspeed;
    % S0 u/ Y8 X7 H$ `! M. k- T, m$ d

  26.   M* v' D( L1 w' j' ~& L
  27. max-frequency = <120000000>;$ ?3 Z5 L8 U9 Q5 K4 p) X: ~

  28. # }' H/ V7 M* D
  29. status = "disabled";* M, G  R' E0 J6 M
  30. 4 R8 r: c% f, r& t
  31. };
复制代码

6 w8 H# L2 M. p上述代码只对sdmmc2做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。
& F6 [: V6 c; B  _
: C7 B  e- w! \0 r) @/ S$ V) ueMMC有8根数据线,且eMMC无需热插拔等功能,结合硬件信息添加sdmmc2节点信息,也可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-edx.dtsi关于sdmmc2的描述符合我们的要求,内容如下:
& s# N. f% E- H+ N% ^4 i1 |7 e5 L4 z7 E* t0 a) j5 `) W
  1. &sdmmc2 {0 l" Y- t: K, m+ X  Y! J
  2. 5 H9 f9 F4 b  |( M& ~& V  X
  3. pinctrl-names = "default", "opendrain", "sleep";
    4 S( ?/ j8 A; O7 Q7 ]) @& R4 g

  4. 2 C9 ^4 P3 d$ {  e4 ]- s) E5 |' r
  5. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;+ D5 l3 x0 p& |+ {
  6. ! I2 O' Q7 t8 }6 }( I6 {
  7. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;
    # F1 S2 s' x) ?, z! m5 M2 X3 K- k

  8. 2 n& w1 E7 i( f  @; Y0 y* O3 p* r2 V
  9. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;7 B; I# l; o7 M3 _& \8 Z

  10. 0 i) O- x7 k, @  r* R8 S% @8 g5 d6 Z
  11. non-removable;: v) _) ^# \# n! i$ l) w

  12. + O* y+ i! P' r
  13. no-sd;2 O4 {/ y$ M) K+ m6 [1 c' z
  14. 8 i, M6 o/ h8 |2 }+ y  ^& `+ I
  15. no-sdio;8 O! r+ X8 M3 i  s3 X2 j+ E
  16. + f6 ]6 c: N1 \+ I" I, R3 ~7 l
  17. st,neg-edge;
    2 U0 Q' K8 Q: Z# g* N) _% E+ F
  18. ) N4 m6 p6 W" |# {1 ?
  19. bus-width = <8>;  v1 H+ ^+ m4 B

  20. 4 y- I8 y7 k) i3 n. D% \5 n! E4 |
  21. vmmc-supply = <&v3v3>;
    8 L2 f% o& t' G: Q1 y! `& V1 b: @& x

  22. 2 W8 b9 j5 u5 @7 i! u" c5 Q) b" N) o
  23. vqmmc-supply = <&vdd>;
    5 ]' w2 J) E/ u& s* d: _, L+ R
  24. ; i' b9 K5 P  A: H  g
  25. mmc-ddr-3_3v;& E9 i/ t% C( p/ E

  26. , c7 w; s& j3 @! v4 H
  27. status = "okay";. i& e/ j+ C- {. i) g3 v$ N2 }6 A
  28. " W8 ]8 s" Z/ ^# h( v" A- ]% s$ X
  29. };
复制代码
" W- V+ `* o) t0 Q
2.管脚定义* [4 v7 Q# k0 M7 e, Y* ]3 J  t3 A

* {& ?# s: u% p在内核中STM32MP1默认管脚定义在文件arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:
; r  x6 f/ a& W4 v( }& v  q+ f9 e$ ^
查看后确认有sdmmc2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:
5 Q5 y6 Y; _2 j" Q; m& {; y2 f8 M1 c9 ]6 f
  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 {' |. n2 Z6 Y+ g# c
  2. $ Q4 `! q1 B) R* H. K! ~3 o0 J* h
  3. pins1 {
    ! d& K2 [' L0 I
  4. % _5 f; T7 w' W( u( _
  5. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    0 Z# O/ D0 x$ |; @# v+ s2 J

  6. 3 R4 f6 B3 D( [# U1 b$ y4 T
  7. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
    , d$ S' p. t# d' q! @( H
  8. 6 ^0 N9 @( ]; E" y- E  h
  9. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */  _5 F( }/ V9 ?: [2 ?3 A
  10. ' U1 V; A- l7 N
  11. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */5 u, @! ]! Z& T
  12.   ]+ E( Y' N& F1 x/ P
  13. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
    * n$ N/ y7 G) \
  14.   p1 \  m$ T" i6 v8 O  O
  15. slew-rate = <1>;
    7 z# L0 ^( Q; ?* ]+ i8 y. n% W9 Q
  16. 5 G# S5 V) z! {) _0 ]- u6 c
  17. drive-push-pull;
    " I* m) v. H& y( l* N; h- `' R

  18. & U' y) R; e# V) {3 Q( B
  19. bias-pull-up;2 `; R5 {4 G, c9 b3 C/ @* C( A
  20. - O+ @; Q# N- S8 U, C) D- F
  21. };
    " k0 d0 R8 }& Z( f

  22. - S4 k& u, h) v1 x; P) J) l
  23. pins2 {
    & Z; m7 V& v9 H; A% o

  24. * L5 h! ^  B1 c  W5 q
  25. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK *// W& {9 P2 G! {3 A- e) V

  26. 3 @1 h, M4 R3 A9 L
  27. slew-rate = <2>;
    , s$ S# B  J& F6 k- t" R

  28. 8 B/ T  @# g( `& b6 `; q
  29. drive-push-pull;
    2 s' m1 X* @6 W- P: T& L( A

  30. " H: W$ p7 ]! s/ @
  31. bias-pull-up;) f4 y! j) m- P9 O$ x# l
  32. 1 W' I7 P& z; [, w; J: t3 M
  33. };! G; D' S( x6 _1 `& Z  W  |6 }# n

  34. $ ]  `( c: ~( z# K% |
  35. };
    % Y8 M1 w) y6 o  u% t
  36. 5 x: _6 X5 d- d; m
  37. sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {
    * p5 }! m, W; B, B1 t

  38. + `9 y& L$ L& E8 Z
  39. pins1 {
    3 x7 I" }6 {% }6 J) ~. f; ^5 N
  40. 4 B( ^/ f* D& o, ~
  41. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */) z1 \) M* \. c3 q
  42. - }9 i* D# m' u
  43. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */7 Z8 n+ P5 U9 w/ V4 c

  44. 0 Q9 B4 X5 ?$ x5 N# h
  45. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */$ l8 E, A9 Q2 z- C7 x: _* _
  46. ( }6 |2 i4 F  [/ k* Q; H& {
  47. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
      S8 i" \$ g: f+ I6 x1 d

  48. 8 `6 ~/ p9 p4 Z0 C2 `5 u
  49. slew-rate = <1>;$ u+ @! d, w# U5 X& A; m
  50. ; z/ V3 E4 H3 E( c: L
  51. drive-push-pull;
    3 M! M1 A9 d/ n( O( |2 P  B) [
  52. + |9 q, w7 d+ B: D2 ~9 ?1 y; V
  53. bias-pull-up;! w, L! \0 N! \8 \! Q8 w) l

  54. 5 v5 c5 Q4 ]* q# `5 d
  55. };( ]( @- t  j8 x

  56. 2 Q9 c6 S- w3 Q9 i9 f
  57. pins2 {
    8 Y$ R) y( E  A9 t5 P! I) ?8 a# j3 |0 |

  58. * o3 P( |; L3 {) w6 s
  59. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */, @  ~: Q2 L- W! ^" T" |
  60. 0 h9 J: g/ V8 T7 n$ I! ]% }, `
  61. slew-rate = <2>;
    " J; p/ x6 G! S- c
  62. 5 [4 c  j) `  _$ `4 ?
  63. drive-push-pull;( j. P/ M5 b9 ]+ G

  64. # v4 b1 h6 ^% E. u% [4 b* {
  65. bias-pull-up;" b4 z# [" d) ^* _/ ^$ a1 w
  66. : \  N  t, c, G6 {8 o
  67. };
    1 c! X5 U( s) b: V# A6 V

  68. & K8 C, n) e; r
  69. pins3 {
    7 E; E4 S2 A" S5 O! L7 E2 d

  70. * A- Q- }! e+ U- v
  71. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */4 R. u; h% s+ h- K& R

  72. " n6 w2 {0 x2 n
  73. slew-rate = <1>;
    % l: ]6 l6 P+ |2 }& R/ ^2 b" D
  74. % S* J1 U9 m) `% L. h
  75. drive-open-drain;3 C+ [0 p% C: h+ m3 u& I

  76. + o" [' X# v) k: m) X  f& U- C
  77. bias-pull-up;' ]$ G2 l" I- K( I& C8 e
  78. $ F( D' y6 P) A% G
  79. };
      z- N4 i3 A$ w' Z4 ~- E0 ?2 r* Y1 o+ B

  80. ' t/ a% W( B6 p3 j
  81. };1 ~- W; K" ~; t2 W9 D/ K
  82. , R7 D9 b& i/ l
  83. sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {  Y6 k8 |. U) i6 `3 ?

  84. 9 W& f' R7 m: T( V3 B
  85. pins {
    ; O& x' y) R  T& j# O6 b" ^

  86. . l6 |! z- U  Z# p- y# y
  87. pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */
    ' i/ G& V0 l/ y* w9 r; E

  88. : r. n+ {# k# f- ?. f# [* M) x. s  t) v
  89. <STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */
    4 M- q6 E% }2 ~& m0 {' \  P8 X

  90. 4 H3 z1 N) G; ~! O
  91. <STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */
    0 F0 |, C. W: c

  92. ! y6 @; t, T4 J: r" B. X9 p
  93. <STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */9 \; i; t0 d2 z3 ^# H$ x+ M

  94. , S1 L. N! V3 d/ I) H
  95. <STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */6 ?# Z% R5 `2 ~
  96. $ t2 \2 Y4 ~. t; x
  97. <STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */
    ' E& u" ^1 `, e- j0 B

  98. 7 |. k( L9 W* g" l
  99. };  }; V/ p' u( e* [

  100. 5 m: ?4 N2 e5 t3 a# K
  101. };
    3 F/ O. w' a% ^' b  l- s' E
  102. , C5 I- U/ ], T& F
  103. sdmmc2_b4_pins_b: sdmmc2-b4-1 {% Y7 ]3 o8 t& I& k# [
  104. : w4 i) I7 }: o: y+ N; W3 v' s' `- B
  105. pins1 {
    # x" M1 [' C; _* |: ~

  106. 1 q6 u/ b! D6 q- z$ s) ~+ i
  107. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
    * p/ Z" R1 e% A3 ]6 @3 J$ w
  108. 4 z: E! a1 D( @8 o, E" B$ R
  109. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */& Z! m+ Z. X$ y$ i+ |% Y
  110. 3 K) U- i! }- b- L& E* M$ ^
  111. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */6 J; U6 f' Q; ^: R2 Q

  112. 8 m0 ]# u* m  U7 D- Q* b, R
  113. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
    ( j, M* x/ r) e4 b; T
  114. 0 N2 a' r% f1 a/ Y6 \
  115. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */1 N* V  R' p  g4 k; w
  116. 1 E$ ^9 D5 Z* @5 W
  117. slew-rate = <1>;, S/ w7 ~) Q- C
  118. - M; ?% i/ t3 L8 k1 ^
  119. drive-push-pull;# `+ `, S8 Y5 C, S* r/ C# o/ x

  120.   y% I) z! S3 P+ N
  121. bias-disable;
    ! J% M/ b1 b4 x. y2 ~
  122. 7 O- G; F0 ]4 m' n6 v
  123. };
    % i) Z0 {9 v, v) M2 X5 J; W% j' G9 v

  124. / W' m0 v/ [: i8 K- p
  125. pins2 {
    $ h3 v8 O  ^- r! `

  126. 2 S6 Z' X# `/ K( q8 Z6 C0 p) v
  127. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
    7 ~, _% u/ x7 |( {; ?+ [7 }

  128. 5 i$ M# Q+ ?3 `, G
  129. slew-rate = <2>;. t: a* Y' u$ r8 s5 g# Q6 e
  130. 3 ^0 h, s. s0 \/ \# B6 h( B
  131. drive-push-pull;
    0 `8 v1 c6 V& \" X# C- W

  132. , A" J4 d" n- L
  133. bias-disable;! I4 P2 [5 g  Y) B

  134. ( s) G/ M; v( A1 p. ?: {2 c( o
  135. };7 M! h- V, N" A

  136. / s) \* S  Q" q/ s2 T# x. h
  137. };# ~* \; s1 v! G3 U% o0 U
  138. * {$ }# B1 E* D/ w- ^8 [( o. j
  139. sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {
    9 z: e4 c# _; b/ t
  140. 6 t( e4 ~) ~9 q( `: d4 @
  141. pins1 {
    8 e+ }& |/ u- q8 n% w
  142. . B: V# Y, W- L  F* m8 ~/ X" R
  143. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */  a3 ^* F; p! i; m

  144. ( t+ E" Y, }% J8 o
  145. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */9 g3 R9 d7 ^% b4 [) O" _

  146. - I4 F% C* A) T7 w, a# D( p: N4 _4 K, o
  147. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */3 W9 R( r, E! B0 O& R

  148. : Z7 K2 T- g( o- `& H& i
  149. <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
    " |% d: A; V5 o2 ^2 m) `
  150. ' M# L7 ~; B' ?3 [6 b0 b5 I
  151. slew-rate = <1>;
    ) M. ^0 a# u* d, V
  152. & O2 ]+ W7 W( N) F7 o. k5 O* I
  153. drive-push-pull;
    ' `( C# Y! M1 a) O( `
  154. ) G& L- k1 i( Q. p; @
  155. bias-disable;2 o$ L  v4 F1 L

  156. 6 Z) T4 g2 B7 ]& q
  157. };
    - W, G7 W8 v2 N0 T. U, X

  158. 8 P  N9 M7 {; v
  159. pins2 {7 H' D0 F2 u# P5 X7 G$ L5 o( b
  160. . f# V* f; A% n1 b9 `# l' _% O' B/ [$ I
  161. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
    + v8 Q. @/ J0 o# P# {6 y

  162. 6 S8 `6 q  I0 w) s/ P% e8 u) A
  163. slew-rate = <2>;
    # f- W2 Z1 F" f( K4 }, \

  164. . |$ l& ^, ~2 a( u9 j; M' O
  165. drive-push-pull;
    9 A& ~& w7 Q9 Z
  166. 0 {- N/ q" x- ?! U& @. F1 e
  167. bias-disable;! [/ f- b/ r3 \; K6 t

  168.   y3 E& A! y0 D: j! N+ y9 t* a  a
  169. };
    9 o7 O5 b0 T1 Q: @  J3 w0 ^) v
  170. + D4 L2 G! W+ d5 }2 P' M
  171. pins3 {2 m/ ]$ k$ D, [5 g" j- L

  172. $ x* g: Y9 l5 a. Q
  173. pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */5 N! t0 d3 P( `  b) }. g

  174. & j. V& w, E, Z! c
  175. slew-rate = <1>;4 R  t8 g5 V" n, m7 N# R! q' u$ J
  176. ' k) f, J0 X' Q% X9 _/ N
  177. drive-open-drain;. z! n" E  P/ g/ i
  178. & Z1 e: R1 c/ T/ Y, m1 s4 e
  179. bias-disable;
    % n4 }. |* N$ u

  180. ( t, e/ ~6 c+ y5 a4 e2 Q, G3 Y. L% M
  181. };) S8 ?: v' C5 A. m) l( o. d9 e

  182. * v# a8 e% B- W( q- v
  183. };
    , z) Z  I* r: c: [$ d. V0 |$ u  U2 w
  184. , v- N) e$ e9 ]2 i% X
  185. sdmmc2_d47_pins_a: sdmmc2-d47-0 {
    0 g: T: c' a, g" X( V6 Z

  186. , D0 c  ^- C) t2 X3 Y- ~3 T
  187. pins {/ b! d; G/ X$ c+ d

  188. ( C* e8 w& H1 d6 |
  189. pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */
    # E4 a& T: U8 L' p7 H7 \) F

  190. : r+ L. P  C5 ?9 P+ p
  191. <STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */
    $ U2 [1 E6 J. F( W; c( \+ ]8 B
  192. # P1 }: M" x$ z' j: j- y
  193. <STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */
      t" R' C$ A7 N$ V, P

  194. 9 l  t! v$ R3 t
  195. <STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */) B5 @: L3 Q7 c" O2 J
  196. % C+ o% g% G' }, d+ ]: l
  197. slew-rate = <1>;
    & K7 l9 H# h) {! y7 \( j) j
  198. ' U4 s5 v+ b6 O4 J( V$ M
  199. drive-push-pull;  z7 }5 ^6 x4 |2 y& o

  200. # v& l2 j5 |) M/ c: M+ _6 m
  201. bias-pull-up;
    ) s! Z( p) E+ v

  202. / y% Y4 c7 W, u8 w
  203. };
    $ Y' c0 {3 [/ T8 ^7 s
  204. % E" g: }* C6 u" k& [
  205. };
    # o+ y4 I% r. O% A- |9 d' P% B
  206. ! p6 ^: D% `3 y
  207. sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {
    : z) U2 ~+ i" L' h4 n

  208. 4 }" Z  G: `3 W- b6 S; u
  209. pins {
    ' ]7 D5 S: ?! T. }8 }0 o# {

  210. . r% g: q" f: B* k( P
  211. pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */+ V' }1 G" T  z; E- z& d
  212. ( A- V5 x9 w3 M# V$ g
  213. <STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */0 J: p2 ~4 n; J/ v) j
  214. ' N  e& ]4 |1 y5 x" i% Q: R# u
  215. <STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */' l5 I: X8 T6 h
  216. 9 ?% h& ]/ W: e$ O9 l
  217. <STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */4 A, n6 Y: Q( Z- u7 m* `
  218. % R4 B* N8 O3 y9 X1 k! o1 z
  219. };" Q+ W* N" x& W* f0 S# Q
  220. 8 l" M& F- a/ j6 V" \
  221. };
复制代码
4 N' R. [% ]" {5 C3 Y
2.实验目的, F7 _% T+ ?2 N" U$ R+ o
* k0 ?% T( y; v% k
熟悉基于Linux操作系统下的块设备驱动移植配置过程。
$ q) V9 g2 k% e( t' r, k
8 `5 i. ]# d: M# V: ?2 F& D3.实验平台0 r% |; d+ n$ p: R' Q

6 M* K/ `( z. K. G1 WFS-MP1A平台;& b6 O1 _. V. B
3 ]) t6 w+ b) ]5 c
4.实验步骤
5 Y' S: |9 G* M, M! v1 b0 o5 [: @8 f8 W
1.导入交叉编译工具链
* R/ m6 a6 h: ~( a% ?" b9 Y% {3 ]9 x/ ?. F; E6 i. [
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
! V/ A+ b. C8 b' U0 M8 _) ]: U' i" D
2.添加eMMC设备树配置& A6 L  f2 j% }0 }* O

! a1 a! v. K. F+ [9 e, d修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件- J; h; P1 G3 {, z' a9 {: d
- k: o! {; \" k3 M; O
在原有sdmmc1节点下添加如下内容:
' @( X% r7 v2 z% {, ?# R& Z4 Y7 A1 t& w
  1. &sdmmc2 {
    " `( C6 t+ G7 c1 ?4 @2 m
  2. 8 q  A3 a- \4 J# Y4 ~$ Q1 N8 J) r
  3. pinctrl-names = "default", "opendrain", "sleep";8 q7 r0 S* @9 L% o' O
  4. ! u: _+ W6 V6 \1 j
  5. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
    5 E) F+ b( g  ~/ k$ T1 b- B' k* l0 a
  6. ' u5 s) B: r& d& G8 f, W, D- [
  7. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;! ^0 ?3 F- \; P% |

  8. 0 s& K4 O$ o# M* e3 U- Z$ o
  9. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;
    2 a) C$ Y# ?+ q: O
  10. : i" H$ w- m# O/ ~4 a: M; j& G5 |
  11. non-removable;! H  \+ f9 g( {

  12. 3 [/ X" V  o5 m
  13. no-sd;
    3 \1 s* @) t, q; ~+ ~

  14. ) j8 }+ V! B8 P$ t3 @' V! M9 f+ `' n
  15. no-sdio;, n  e& A. n/ j/ S/ C" e0 R
  16. 2 v% ^1 T! E( W" X2 U' O( c9 u% Q
  17. st,neg-edge;
    " X4 s8 `  o7 S: q: C2 E& q

  18. 5 C; w9 J$ B) K- e0 z) D
  19. bus-width = <8>;
    + p' T9 k0 b; C

  20. - D) g4 U& A1 w9 Y* E6 h
  21. vmmc-supply = <&v3v3>;
    9 {, c/ Q* @' G/ k  O$ D
  22. 2 u0 [9 Q5 g* @. o2 h9 E
  23. vqmmc-supply = <&vdd>;
    " w$ N8 A0 o) i8 L. M

  24. 3 U: G( f+ J0 Q
  25. mmc-ddr-3_3v;
    % ?; x. H% Y4 f1 I) H% N8 A+ X* f

  26. - `1 H6 t- z" Q/ \: H; ^( e
  27. status = "okay";
    6 y1 c0 Y% w- A, I/ k& k( T
  28. * ~# B5 V, p+ F
  29. };
    : U5 L2 V# X6 ?8 k( i6 N
复制代码

& f& R2 m; h9 U  A0 X3.配置内核
6 |% m6 i% ^4 [( J0 `- g6 @5 Q) I7 \
" K9 q$ E& |9 g# K7 G9 l由于内核源码默认配置已经支持eMMC,本节列出主要选项,如下, W+ i( g" f2 [% L3 `. }

8 b! }1 P( ~6 `$ h& @4 e) X0 `linux@ubuntu make menuconfig
5 i3 G/ P# U* m
: c* M& B8 l3 w( H' c9 ODevice Drivers --->( w+ e  y. W" X4 k

& I" e! I# X. _' @<*> MMC/SD/SDIO card support --->
; _0 E8 f0 L% b* Q# f- u6 y STMicroelectronics STM32 SDMMC Controller
" V2 ?+ C4 z& a+ v! m
  ^, |1 P% Y; d# ]6 X4.编译内核级设备树:
, V9 j; @* }+ T" [5 X5 d2 f/ _$ [; F' ~' X0 f, w3 \. M
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040; c1 _) k8 P8 Z0 B: ~3 S
$ C  n2 Z$ S6 r; l9 I
5.重启测试9 w6 X6 i( e( p7 _' B
8 H! M# m" i9 a- H; O* G4 F1 i
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:
1 z9 Q- n6 O/ {  i9 V3 N$ ?: i3 d$ Q' U8 }$ z, a$ V
f5a98c74cf1c3e488107fc9ab5244afb.png
% s! m* _. e& q9 C+ B/ K7 ]! @, \" U
& r6 T: m2 a! M" d/ I由于eMMC中有出厂预
* `( k# z% x- E# A" g' l- Z$ F
" h& O4 S1 F# W$ |; o装的FS-MP1A系统,所以可以正常完成文件系统挂载进入系统:
9 y5 I3 o  m. f5 r7 i) c& ?' m
* W0 f3 v" m7 a! N 0fb51a7f44c5f3b6884ca657a1bd9022.png
7 W) D' C* j7 T: Q0 |————————————————$ N+ h$ T  P, [7 h2 [1 _% Q
版权声明:华清远见IT开放实验室2 ^% t! T0 O( C! @$ `

$ Z  W$ a3 U7 {7 ^9 D  d. B$ t$ N1 V4 P2 Z- ]
赞 收藏 评论0 发布时间:2022-9-30 18:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

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