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

STM32MP157 Linux系统移植开发篇19:Linux内核Wi-Fi驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-29 18:12
1.实验原理6 R& O# N! g: h7 Y! g* i! Z. m0 c
FS-MP1A开发板蓝牙采用AP6236,WIFI蓝牙二合一芯片。WiFi部分通过SDIO接口与SoC进行数据交互。
  c7 |" c  y7 |) \7 h0 N6 A, J
  K" A- y0 f1 N/ h% d ebc558764a13a00117bd9f68846646fc.jpg
( x! `5 ]- y! Z1 D' Q* [
, p6 x/ D! P+ |; \- @" \0 I- I在FS-MP1A开发板上sdmmc1用于连接sdcard,sdmmc2用于连接eMMC,sdmmc3则用于连接我们这里所用到的AP6236的WiFi接口。, i/ B4 p1 A9 i& H6 a' k

  m) F5 K8 A2 {0 Q3 `2 n8 Xsdmmc3的设备树配置可参考stm32mp157c-dk2.dts中的相关配置,需要重新调整sdmmc3所使用的管脚,AP_CK32KO管脚配置和BT_WIFI_RST管脚配置。9 s7 E* C% o# b6 d  @3 l0 [' m. }
5 D9 C# _  H7 U/ Y9 B; q
aacdfd07200a62395e5657c04157bd23.png , E! `  E# x0 `  ^" h! L" s

9 R/ |. B% I( \/ ]1 d7 } 666df8e939d91707d50f9f58564ffaa7.png . W  v9 v7 y9 Z. C. H7 X
/ L% N5 ^! ^# a- ^5 R1 ?: N
a9a3030edeed32869351b08fc44dc482.png , J+ G% z+ \% L+ \) `: c9 ^
+ W! w$ c# x9 R1 j4 u9 O! C
f9ecacf805e59a7912aa448ee6700453.png " t  f& w) G) T/ ]. k; o

* O9 `1 v: ^! S6 Z; c查看原理图得出AP6236数据管脚与STM32MP157A的管脚对应关系如下:
3 E' D- i6 K7 P& {. Z ( l/ t+ N9 y3 l7 v7 o9 ?5 r

8 e8 ^8 N1 k  C$ b2 n0 U3 B; }1.WiFi设备树节点
& ^4 Y" R0 u+ t' @
+ w, q8 H& L( f/ w* v" g内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
: M7 U& u! ]# `- [4 ^" c: n/ ^4 {3 B- E  e; Q; L; Q
arch/arm/boot/dts/stm32mp151.dtsi
' Q& f  }( x+ F  ~  k" T# L4 C  c$ Q$ N, k; L8 l4 k3 y
stm32mp151中sdmmc3定义如下:
  @. ]6 }5 \9 y0 W$ v. U7 `' `9 a  @, R! D$ Q0 Z
sdmmc3: sdmmc@48004000 {
$ ~  G( {, b$ S& X/ c* s$ K
# {  L& b7 D+ h; m! hcompatible = "arm,pl18x", "arm,primecell";
9 I2 ]9 S2 f8 V) K6 F& m
3 d3 O3 h% F$ h& E% p( X6 Parm,primecell-periphid = <0x00253180>;6 n& B& `5 X# {0 p
2 l$ k/ F# T5 d9 m* K$ ]
reg = <0x48004000 0x400>, <0x48005000 0x400>;( J, o0 F7 c# ]/ @* W9 e- [

" M. A' F+ M0 I5 l9 winterrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
. ^) X9 y' o5 w2 r
1 V$ i5 \0 M. P7 cinterrupt-names = "cmd_irq";; K. J# U0 q- K" E8 i* _

* t% Q6 M) O* {clocks = <&rcc SDMMC3_K>;
2 G- `  J4 ?: L$ n% c" x6 T, d" h2 J+ U6 j2 ~' z' w
clock-names = "apb_pclk";& }! ~  c- @9 Z7 o

* b+ l1 b2 k" j1 E6 `# _" K5 u0 Presets = <&rcc SDMMC3_R>;
! M* [2 X* F: C* k1 r5 D# ?* |7 p
cap-sd-highspeed;" t- _. \# D8 a: s9 s8 I8 n
3 H: K$ d+ ^) g
cap-mmc-highspeed;
- M* v4 R6 }! r% _
! E% D  g0 a; q1 Y0 W% @max-frequency = <120000000>;
- \/ C( X, e' T+ J
# E, B& G, ?  V% Z  q- Sstatus = "disabled";
3 G4 L5 o+ l8 T$ N+ k6 s% b! A6 d' D2 Z
};7 d& f; ~( c! k+ l1 o* l
; W1 f- k9 w  ?. s/ j) Q4 H3 ~; I
上述代码只对sdmmc3做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。4 H0 }( a, M: G, p$ c) o

; r4 v! u# Y9 O参考文档或stm32mp157c-dk2.dts对于sdmmc2设备节点的描述,增加sdmmc3内容如下:; u# o( f+ o, `( H% R! O. D

  y/ N- H9 m$ ?8 g&sdmmc3 {
! H5 d3 e9 G! c9 K% i* E
; I. N& |* R# J7 s5 l( \+ Tarm,primecell-periphid = <0x10153180>;# t; i, Z& G6 c/ g, m

+ m' ?6 d1 A( @7 |1 h. Npinctrl-names = "default", "opendrain", "sleep";* @9 S6 v9 A1 m+ v

: B& P6 T3 d! T! dpinctrl-0 = <&sdmmc3_b4_wifi_pins_a>;
" f- ]: ]' L: c  o* I
* X7 n6 T8 a) K' ^, b% b6 Fpinctrl-1 = <&sdmmc3_b4_od_wifi_pins_a>;
( S2 T5 J; x! k; u+ j) t4 T* w( z  S6 w
pinctrl-2 = <&sdmmc3_b4_sleep_wifi_pins_a>;( i5 ?# Q3 o& J" s
4 g7 q- H: I3 Y* r/ ?
non-removable;% \$ Y# f' G! \9 d- o

7 C  L3 Z- h) W. i$ ?9 [- Vst,neg-edge;
7 h: B6 n5 Q$ K" l/ x( D- r2 Y0 i; t0 c* H  V7 V
bus-width = <4>;0 i% a5 `1 c; C3 m, u% ~& E. e5 g

# ]( |) C6 L; z$ ~vmmc-supply = <&v3v3>;
; u+ A* b$ F4 h& H) j% s
* g  K" t; M( n  d+ v/ hmmc-pwrseq = <&wifi_pwrseq>;
, H8 \; N* c/ [* b0 e8 E0 u7 ]9 s' A
#address-cells = <1>;: P6 v5 s" i' `" B* b: l3 w" d
6 N3 B1 g: y9 \# U# T8 ?" G
#size-cells = <0>;+ }7 ~' a# U/ p* Y8 E7 x

6 H6 K+ h. w  [keep-power-in-suspend;  X, S- j0 z; c3 g. i

! |8 n" D1 q" m! D+ nstatus = "okay";
; A4 Z0 r% ?* a4 c
7 s+ m1 L  O6 |3 Ubrcmf: bcrmf@1 {
$ d! h3 p: j. v; s1 ^* i. D: }
& ~2 H. p5 W7 I# [4 V( F3 r& f6 K. Yreg = <1>;) I" B! a7 k% C0 B- X, ~
3 a6 \- p- |; y& I" v
compatible = "brcm,bcm4329-fmac";
1 Y$ k5 n$ P8 [( e! v2 ]; C( u! L7 |! e) U. c  W
};: h: j! {7 H/ y3 Z! N) H# p
6 _3 B/ o! \- Z7 V3 I$ G8 M
};! \  V1 j0 e( a: l+ N( r- K
2 ?4 c" z1 B* b0 ^
这里用到了一个mmc-pwrseq管脚用于控制AP6236的电源,可以stm32mp157c-dk2.dts对于wifi_pwrseq设备节点的描述,增加wifi_pwrseq内容如下:
( H5 U0 O% L6 m. _$ V0 ?* q) [" x0 s; W# E
wifi_pwrseq: wifi-pwrseq {7 H# _# b+ Y) B& P* v! m$ b0 }
4 Y, }* g0 Y( V
compatible = "mmc-pwrseq-simple";
" K3 s4 b0 m6 m+ r2 V
/ ~8 B) P% d! t! V8 d! [4 B; treset-gpios = <&gpiod 4 GPIO_ACTIVE_LOW>;
0 I$ }) _6 j9 W- ]7 i7 ~  r
$ f5 Y. m5 Y6 _: B1 f};2 P& g. q7 D( q7 l% d" s

2 O0 T% @* ~. k. ~% N. |( Jstm32mp15-pinctrl.dtsi对于sdmmc3的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:
5 V1 X; L* j; O/ `7 b4 d, z
( X1 z0 E5 T6 w2 c3 c' s: I4 ~sdmmc3_b4_wifi_pins_a: sdmmc3-b4-wifi-0 {6 n; [; k' q, c% \0 U' p3 Q

7 [  I: y0 M6 o: w6 V# Ypins1 {
$ B6 X% s8 n& C9 e1 w. k) s/ Y. [/ c, o* Y/ @6 U) B
pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */
; k1 Q/ r, k2 b- d
( n* n* r# [$ g3 `/ ^<STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */
0 M) i# o5 w9 Z6 B2 O
5 |4 ?* p# O" R/ O<STM32_PINMUX('D', 5, AF10)>, /* SDMMC3_D2 */
- g- D- F. A6 ~
  j9 ~* D. c1 y, E& R+ N" {<STM32_PINMUX('D', 7, AF10)>, /* SDMMC3_D3 */
. I' [2 \! S  {% s
3 A' _2 {- S* x. b7 R; b<STM32_PINMUX('D', 0, AF10)>; /* SDMMC3_CMD */
" d9 y- x' W3 t4 _5 J6 q3 V% o9 R4 K, M, a" W" m: U0 W
slew-rate = <1>;
5 @0 k2 ]% r2 U( Z+ ~
! n! m8 W! L* J* u9 Y* ?drive-push-pull;
# e: b% `/ k" j1 f2 t  C* D# K5 w/ b8 b* Q' D
bias-pull-up;
( o5 k6 X: d6 X" t! X; U/ \! l
1 o1 h3 C6 d4 r8 U7 W};. T+ `3 `7 g- H+ Y# [

1 h' a2 R! J$ I6 h" G. [8 zpins2 {
8 S0 i1 d2 U% }4 I8 S5 H( L% |6 v& X& C) ~+ s; D
pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */
8 R6 M+ I& S- V7 U  W: b
& V9 Z8 J& `/ u8 J  {% h# x8 [slew-rate = <2>;
% g: t9 v2 D5 b+ P) U. ~
$ }! z( `+ G1 |9 X3 r& bdrive-push-pull;
7 P8 G1 X2 z' n9 G4 X2 F
: O3 Y+ D6 x- r2 _& ebias-pull-up;
! w( f; U, a) N! i  h' z- g
+ g, S% Z( m  L# V};& K* U  g" f1 i! b1 ~" O- P; @

+ I" J; O7 }5 X  |% P};3 o7 a6 H8 _4 e' U% L) o! Q

9 }; Z* R) X. ?; Gsdmmc3_b4_od_wifi_pins_a: sdmmc3-b4-od-wifi-0 {
- P/ w; j1 R, T, q- _& w% G
1 A% R2 Y8 x: @6 P! qpins1 {
: H7 k( ~: }! n+ C  g
5 Q1 z  w" ?  R. u* [7 f$ v; H+ u# \pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */) D# g8 v" X' x6 f% ~
0 A! m6 @, y) n& l2 l. _" S
<STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */
9 U  J; z. J- [7 u- t' ?& k6 x/ G- d/ F% V
<STM32_PINMUX('D', 5, AF10)>, /* SDMMC3_D2 */
9 w: P1 o/ U0 [* U! s" l$ O6 m( |- v; z, I2 P( v# J, F
<STM32_PINMUX('D', 7, AF10)>; /* SDMMC3_D3 */
& g' d  k4 D) q7 b
6 c. I% {: B1 ^% G& g) bslew-rate = <1>;
$ y* l+ u7 W( N& i' R# H/ }( U4 W+ @* L* F/ o
drive-push-pull;
. ~/ x' h* f3 C; s; T  P  |8 s3 z* k
bias-pull-up;
- C2 o8 S4 U$ A
6 p+ n0 @, g) u  A8 U};
8 P- X: @+ P, T4 s3 j9 h% D( ?0 J
5 q' }) w! i# Cpins2 {
+ ]4 }6 g$ v: a: l4 v* L% G; R  x$ s3 K1 C+ o% i1 w
pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */
& I6 b1 Z6 p; f% K+ P8 U; w5 |9 p& {; x1 U8 U
slew-rate = <2>;+ j6 g* H9 V$ S5 ~$ A
% v, X( R0 ]) E9 x6 r6 L6 a
drive-push-pull;  ^$ Z* H) ^, h/ v) S+ \
3 p; F! Z1 p% V* Z$ M
bias-pull-up;
! [( C$ O/ b7 d0 c
, k4 j/ w( n# q& I};
4 {. R# c; C  m4 @5 S; X
: A, l5 {4 h3 A7 mpins3 {1 a9 v' h; q' b3 e

. t+ H2 Q5 i! j7 f) ppinmux = <STM32_PINMUX('D', 0, AF10)>; /* SDMMC2_CMD */# B, h. [% f, e% T* D8 g) F4 l3 F

5 Y! k3 c8 q0 d! a  jslew-rate = <1>;& D/ l' E( L+ d: P

9 o4 u. Z1 {9 L7 e8 Edrive-open-drain;- h8 u8 v, |' z& P$ u
5 R/ `. t8 @$ S& ~/ g$ {
bias-pull-up;4 c" S- w) m5 \; C% [1 t! B
) q! S- n9 d2 B7 l6 P$ d: B: r0 p  x/ e
};) e: q; A2 Z% m# H( a3 T7 N4 t9 P

" K8 r: M9 R& H  `, F$ V};
5 m4 f7 n5 {) F, e7 |3 X3 Z/ l  t
sdmmc3_b4_sleep_wifi_pins_a: sdmmc3-b4-sleep-wifi-0 {
7 n4 }5 A) h& {0 I# m8 d4 P4 I0 v/ k, D0 F
pins {
, s1 ^$ L+ R, n. ?/ k+ a; k+ G0 F% t. U( y. g# G$ E- N
pinmux = <STM32_PINMUX('F', 0, ANALOG)>, /* SDMMC3_D0 */
' Q! `: e+ ~1 J5 u
: i5 i& z0 b# q7 o; H$ P% d/ T5 @% t3 ]<STM32_PINMUX('F', 4, ANALOG)>, /* SDMMC3_D1 */
  W) X/ {& u, j# H' I+ p" n
( @3 Y. l' e8 C! X' G  v<STM32_PINMUX('D', 5, ANALOG)>, /* SDMMC3_D2 */
6 U1 l8 S$ I2 E* ^- n: ?# r. q
7 \2 S* n6 v8 ]! r; I! @& P9 W<STM32_PINMUX('D', 7, ANALOG)>, /* SDMMC3_D3 */
* j- H6 V( h6 w6 j9 ]( {- O/ [5 e, f7 @7 n  V, ^& }
<STM32_PINMUX('G', 15, ANALOG)>, /* SDMMC3_CK */9 p6 i7 {& w9 O+ G& i& j
  s/ L( b: Z& F/ u# z, c* X
<STM32_PINMUX('D', 0, ANALOG)>; /* SDMMC3_CMD */
! h2 [2 G+ y0 S9 M, u
9 _2 \# W' W& ?};0 x. [# L# V. B% ^; G% Z

; O; }3 f; x6 Z& f4 K};
! Y8 i( ^3 `% V. b0 s& m
" ~( E/ e2 H$ C& JRTC节点
, r/ A$ n/ Y- ^; _# Z& m8 XAP6236需要使用一个外部输入的32.768KHz的时钟源,因此我们需要使能RTC的外部32.768KHz功能+ ?0 m# O* J& ?6 z2 r# y

4 P9 J+ x1 y* L. F6 O& i/ P* A* a
4 q7 @8 m/ n: {- M4 V: [内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:( G4 @1 Q6 r8 Y6 i
2 E) ?2 n: U3 S! O
arch/arm/boot/dts/stm32mp151.dtsi
( |8 O1 w7 I  U) v" U" _3 H6 u+ Q3 r, A" B2 _) ?# q; T
stm32mp151中rtc定义如下:/ p" v7 H- u) o2 f0 l9 D5 u
% d; ]1 q4 w, L5 u& R) c) k
rtc: rtc@5c004000 {7 x; P7 ?) }( i# t9 S+ x
' @- q& `0 B3 d
compatible = "st,stm32mp1-rtc";
4 Z$ C  f' i  g% v+ V! ]( R. S" x# }/ u1 l+ ^
reg = <0x5c004000 0x400>;
; O, H4 U" q; L9 Z0 g+ x
/ ]7 J3 u( {5 Fclocks = <&scmi0_clk CK_SCMI0_RTCAPB>,
1 x7 p( H4 A' u$ S0 H0 ^& K3 V/ `9 |2 d* l, ^8 g  z! m
<&scmi0_clk CK_SCMI0_RTC>;
: i5 W& W: }% ~0 V4 l' Q1 V7 ~* c( p) |; y0 P
clock-names = "pclk", "rtc_ck";
% l6 B! ]& {6 ]9 T2 K+ f! ?; ?
interrupts-extended = <&exti 19 IRQ_TYPE_LEVEL_HIGH>;
- P8 k% Z3 l+ Q8 t& o
8 g# f- H7 Z. k" C. d6 lstatus = "disabled";
/ P  m: H" Q3 d. }7 ~% J
9 o5 @0 I! o2 r+ I# e. `};
; @/ }( A! d( q6 p% R3 R- V( P0 ]0 K1 `2 a& X! P
上述代码只对rtc做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。8 b; O1 J# A" J/ m
/ J8 f/ v4 }% \" T3 y
参考stm32mp157c-dk2.dts对于rtc设备节点的描述,需增加内容如下:4 A" i; d6 i& I9 _7 \+ C

! x9 I; F: l4 h, ^4 D6 R8 g4 u& Vrtc {  L8 X$ V: ?! v# b* I

$ k3 [; ?' }2 }% Lst,lsco = <RTC_OUT2_RMP>;; n. n; ~8 \4 r: z) M
4 h& G$ X  u% ]: |& X
pinctrl-0 = <&rtc_out2_rmp_pins_a>;: p: l3 d. I$ @% |, A3 ^1 q
9 I5 _4 q7 |/ s  j9 F! e
pinctrl-names = "default";  p6 H  n9 g8 h0 T/ Z2 [2 O

0 e4 W0 X$ b6 n2 g9 Bstatus = "okay";8 b1 Q7 I; N7 V
9 K" c5 U. t8 s$ t( f4 c/ s
};
4 `1 V' D6 J5 A2 C) d7 P
" w0 r, G( f3 |2.实验目的
& y  T5 D4 F0 l! z- V  i( f8 L熟悉基于Linux操作系统下的WiFi设备驱动移植配置过程。
- ^* `0 j4 _4 ^  R) A& E5 l, Z+ x% E, l$ L  I* N0 r3 i. |% M
3.实验平台

( C# `0 ~6 {$ U) u& D华清远见开发环境,FS-MP1A平台;, z! U, `1 I4 l& \
3 r7 t, N6 B( d& H( i* _1 g7 y; r1 ?
4.实验步骤) t9 H# T) E# e4 o8 M; r
1.导入交叉编译工具链- x, B8 s- B! n% @* `+ w
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi, ], E  v4 ?1 O

  l+ A8 q2 u, ]4 E7 d% r& w由于WiFi部分与蓝牙部分共用1路RTC时钟,有些操作与蓝牙要修改的内容相同,因此如果之前已经做过了蓝牙的移植,则这些部分不需要再重复修改。
& ?' j  [% a9 Q, t. t+ W- q9 Y! Q
, `. K3 [* t. a' l  B1.增加设备树文件( c4 `; `. \7 w0 F
修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:6 M3 C# F0 q: N  ]4 [( l

. _. {7 l6 V+ ^, a! G: j0 s&sdmmc3 {9 a% ^* a3 W/ o/ d5 f! P
) _: ~& T7 f- ^
arm,primecell-periphid = <0x10153180>;: \$ f' {( C8 n4 O/ r; H

7 l0 F: c# i2 g  Ypinctrl-names = "default", "opendrain", "sleep";5 \1 M1 v2 [) o4 s6 ^

6 R/ f4 B6 k7 q1 H& Hpinctrl-0 = <&sdmmc3_b4_wifi_pins_a>;
5 B* e3 p" [) ~0 m# n: J; F* w# K4 j$ Z' `
pinctrl-1 = <&sdmmc3_b4_od_wifi_pins_a>;' F3 ^9 W& }( i  _  \5 I
. J: [* H6 o! c. L- @( h
pinctrl-2 = <&sdmmc3_b4_sleep_wifi_pins_a>;9 m5 F1 P2 B4 U+ d
: g2 Y) ^1 @9 k, J
non-removable;# o! n8 X% t# H! U* L

7 o$ z- d3 Q& _st,neg-edge;5 d* m/ m! d. J
3 b8 e6 C% b: }5 R8 [% O$ D
bus-width = <4>;# T: g) J! p) I8 _6 L8 [1 a

2 J* V- J( x) H2 z. J2 z5 n- `vmmc-supply = <&v3v3>;
& U/ l3 [5 u& C0 k& T& ?
3 w! D0 d( K# K+ ommc-pwrseq = <&wifi_pwrseq>;2 X# ^; |$ y2 |$ M# k0 A9 m
8 N, N) j) a6 k
#address-cells = <1>;- }0 U8 a2 R& q. n  {, L* e5 E
' i9 r4 k2 T5 s8 Q
#size-cells = <0>;
, s2 f! |0 T. @8 }% e  g+ F  k5 g9 v, F) c
keep-power-in-suspend;
0 n! z5 p- j  p  h1 n. U; x0 l! H2 y" M3 W/ k3 H0 J
status = "okay";- k( _7 y( X6 h. j- i

/ S# H- _$ H  Zbrcmf: bcrmf@1 {
( S, v; _0 A% J1 h! K, M- @5 h+ d3 O% k( ~6 ^" V
reg = <1>;
7 Y# c: i& f: D( E6 _& |* ^1 P  u3 r) K# T
compatible = "brcm,bcm4329-fmac";
/ t7 M- E1 v( C. L! z: C# _8 G8 \5 X4 [6 g
};
- k$ S2 q) c7 g+ r$ V; z# }9 f! G$ n# S' h& y9 }! n+ E' r
};
. x- y3 x, ~8 c) A) ?: y) F$ d) G! a( h: B( A
添加pwrseq管脚配置( M) P( q+ Y3 j6 C
修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点末尾下添加如下内容:
0 G% E& z  @& o! |$ E0 r' K, i$ `: F: Y% U) B- E3 |% F, z# B8 r
wifi_pwrseq: wifi-pwrseq {6 o. x$ B4 b2 j$ z7 ?
& x/ T. l4 @8 _5 s
compatible = "mmc-pwrseq-simple";, f( |0 H6 e& \0 T
! R3 P% T7 [$ U. Z1 Z; c
reset-gpios = <&gpiod 4 GPIO_ACTIVE_LOW>;) E! l, v) [; m. S

+ \( V7 ]6 Y  `9 F5 X. ^: c3 L};
1 u# k/ F+ T) z" H- ~  o6 `+ X; Y) W, v9 S
添加功能管脚配置  Y' p( V9 D! V: m
要添加管脚配置需要有pinctrl节点,如果之前已经做了MIPI LCD移植或者RGB LCD则在arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件下找到pinctrl节点添加如下配置,如果之前没有做MIPI LCD移植或者RGB LCD那么需要新建一个pinctrl节点,然后添加如下配置。
$ \2 N6 ^. W6 X: U* v6 _" W% Z  Q) E  M3 y2 A
&pinctrl {
% T$ d3 j6 Y+ \' |- D6 V. ?
7 F+ g, c1 J( v3 c( k8 S  W. t" v5 T... ...( v; M2 r8 J; K% R

2 B8 U6 `* ?0 l+ v  zsdmmc3_b4_wifi_pins_a: sdmmc3-b4-wifi-0 {" ^2 `" \$ m) B2 T: L

+ o1 @3 R9 E! B: Hpins1 {
" j. `. Y# }  C6 @# q" Y
1 O, ^/ E* B0 d8 z% @pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */
3 K: h1 q9 R( q8 J, C9 _7 A4 }4 b: f6 F3 i5 _% ]4 g0 B
<STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */
& H( [$ g' D; k& s& K8 [- n
3 ^; r; S% u  I5 F<STM32_PINMUX('D', 5, AF10)>, /* SDMMC3_D2 */2 U" S' l" E1 O# ^) B
% s" Q2 D! f: R3 m. m
<STM32_PINMUX('D', 7, AF10)>, /* SDMMC3_D3 */7 h* u- o1 l( A" E/ m' x2 Z
) g6 q: R2 E6 V, ?6 m/ [
<STM32_PINMUX('D', 0, AF10)>; /* SDMMC3_CMD */
5 W8 u6 M5 z. v- {) g( P3 z
: e) q# }9 G; Oslew-rate = <1>;
' l  E9 w. o9 f
! C. B5 E! H3 u9 @  Gdrive-push-pull;
! F0 r- l: b/ O! z9 F6 O4 ]  h+ V  X: G/ ]8 q1 V0 R" i
bias-pull-up;
/ k% P9 K) R  B8 x6 c0 v
$ y* z( y. c6 E: k1 z: S};
+ f% S8 r: @# x" B- M0 u" ?9 W& K7 s$ u7 D  z/ m$ M* W0 k2 e4 A
pins2 {
- s8 t4 g. O3 V: k: U; a# _( f6 F5 ^" M! @+ Q3 ^2 O% @. K
pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */
( j5 E$ o; s' q( l  Q
" a4 x) h( `% F+ Pslew-rate = <2>;- T5 F9 C4 h) B! l- s  k
0 _3 @# n2 o; n
drive-push-pull;
" s5 x$ o! ^8 |2 r9 q5 C. j6 f- `4 N1 T" n" e7 A  g
bias-pull-up;; H4 C/ q  r9 @. v4 `: L

: v, I8 a- K& h: H};7 T1 Y0 S5 h3 l. l; Q( I
, F0 `; P9 U5 D( ^6 D0 s* D
};" G9 `2 c, r/ y" Q
: i  J- S; S) _( Y  x
sdmmc3_b4_od_wifi_pins_a: sdmmc3-b4-od-wifi-0 {
# T% C0 \( B: ]) e& ~# d* s2 [2 Z0 y
pins1 {9 ?1 I0 E  [& Y; Z- B( W% R/ j( P

1 S" H( ~0 q& k7 N. L% _pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */
0 @5 R' @4 i5 U! F' }4 F/ X9 X  r6 v7 {
<STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */$ L# c" E/ {5 v, `

/ L2 M5 B2 T# E# |4 z1 e/ b% U<STM32_PINMUX('D', 5, AF10)>, /* SDMMC3_D2 */
& T, J7 s* E6 H) x* e% K1 p
0 z) q3 l5 ~0 G, o2 N" z<STM32_PINMUX('D', 7, AF10)>; /* SDMMC3_D3 */* x1 z% j' F0 X7 S& n2 Y1 h
' N4 Z  \$ J6 l( w
slew-rate = <1>;' v- q, Q8 u* t4 z0 {
/ [5 C4 g$ n4 |+ _  n( S& j7 w4 G  p
drive-push-pull;4 _) X+ h$ T7 ?
; i8 \( K0 g# [
bias-pull-up;3 T9 E6 ]* X6 c9 f' `" q

, H% p( Q& `" U};; I5 Q- I/ i* H+ n; x" x
; ]; _- C  |+ s& d4 W
pins2 {2 v- O' I" p  ~* H

! z; m7 b" o$ D  [4 gpinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */" h. n4 O' |- m& ?( V  ^$ M
6 Q' |8 B  X/ B; m( A7 l, s
slew-rate = <2>;
1 g1 T/ Q) J- v. f+ n
  {* v6 J% R4 ]% x9 Q5 ydrive-push-pull;
: [# r1 P% p$ G2 b- |) i
/ ^* b% A- J2 g9 i6 m9 Hbias-pull-up;
/ a. \# q5 r* K- O4 v/ K$ i' K: ]4 D- }0 V, D7 X
};
7 v7 W% i7 s3 N+ M  |7 Y5 f$ o# \/ P. K& c% X9 I
pins3 {
5 K1 r0 l/ y0 M$ [; y" S9 `" `, d
pinmux = <STM32_PINMUX('D', 0, AF10)>; /* SDMMC2_CMD */3 T" ?6 F( m+ O+ o/ G/ o1 h
! \% n8 d. I( g6 [2 q
slew-rate = <1>;* x6 d) b8 m2 W

  E& e! a. y; z6 D3 a$ {0 adrive-open-drain;/ ~. H% x0 a& V& x, a7 c4 T- a

! |, T# q! N+ Ebias-pull-up;
+ n5 a& Q" r$ O: W; n0 O% ^: e$ B1 h; y
0 O4 g+ M. f! _* o3 u};
; L: m1 s* D7 }
+ A4 g- H* _0 D+ M) X' p};# m4 M5 Q5 o! @$ U2 _: r' d

* L( N5 \/ y2 `' z  ^sdmmc3_b4_sleep_wifi_pins_a: sdmmc3-b4-sleep-wifi-0 {
9 O( @0 u7 Z4 W/ v# O3 I* l. |2 \; t9 {
pins {
2 f( s+ s. F8 I( x- J4 c7 A! I( P2 I6 }1 o/ w
pinmux = <STM32_PINMUX('F', 0, ANALOG)>, /* SDMMC3_D0 */) B! u1 Y8 Y' K" L  Z
% T& ]+ K9 y$ _6 [$ B" z& J
<STM32_PINMUX('F', 4, ANALOG)>, /* SDMMC3_D1 */
- e5 @# f; o& L2 ~- ]' k  ?$ J0 h
<STM32_PINMUX('D', 5, ANALOG)>, /* SDMMC3_D2 */
8 s; d: W" ^; }, O' e% r" B' b& k( d& F( j
<STM32_PINMUX('D', 7, ANALOG)>, /* SDMMC3_D3 */
# m; F% u( U  L: a/ u' \. R+ C9 [. e, ^: j! @' G
<STM32_PINMUX('G', 15, ANALOG)>, /* SDMMC3_CK */. j$ H+ o9 j2 p' j7 O3 x6 y6 g
9 i( V% H" k$ p% Q0 Q' v4 Y) c  m& Z
<STM32_PINMUX('D', 0, ANALOG)>; /* SDMMC3_CMD */
6 e* p+ Z/ ^4 |* K5 n0 E3 e" Q8 k
4 Q# c* c9 e7 I& U' n# D+ ]1 h+ O1 H};
* G3 V! f5 U  y+ q
. V( m4 i/ X8 T6 A};
+ B6 _9 e+ I* B+ O3 V; H  o6 n7 e& |& P$ M
... ..., `; ^5 r) O' r

% i2 S$ \1 T* @" k* ]};
7 c5 x% r/ |4 Y) W$ f" L9 v" N' v
) e1 e+ m/ n) v6 x1 H: U开启32.768KHz时钟
7 `1 K! I- J0 b" S. d如果之前已经做过了蓝牙的移植,则这部分不需要再重复修改。
' ]% F1 c; D) q3 y
6 I2 \' {& ^6 ?# L修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件中的rtc节点添加如下内容:
3 O3 v8 z* R: e. `+ R" K# Q
+ S% Q; a: g3 T9 e3 ]6 I( ?$ }rtc {
/ K2 Z( b. A8 h0 J! _' Q
/ B% a) `% e& Z. _; ast,lsco = <RTC_OUT2_RMP>;
+ S. H0 {$ j" ?' V0 ~7 Q2 f9 a9 M
pinctrl-0 = <&rtc_out2_rmp_pins_a>;; {* C* D2 B8 T$ |7 a  p8 J) l
0 t: n8 ~% s+ M9 B: H' q
pinctrl-names = "default";1 e+ K0 J& q1 p5 o( X, l1 s+ Y
, M* [$ E  }( w! P. c
status = "okay";8 B9 g2 v6 h$ j5 Z1 b) ]
. Q! X: p# t9 Q
};9 ~1 [6 L& q; O9 {9 e1 j3 J

; x4 H, |# \' J; J/ W5 z其中红色字体部分为要添加的内容。9 j* _! s3 I0 D, X. P# g2 z+ Q
0 J( V: A/ R. a$ W, G; `7 e# b, a
添加rtc相关头文件。如果之前已经做过了蓝牙的移植,则这部分不需要再重复修改。
( Q% _1 G5 J* \7 a: ^/ D! K0 r+ }8 Q
#include <dt-bindings/rtc/rtc-stm32.h>
, Y' L# C. ?7 f/ W- N) K# C1 D) Q  N" {9 Y
修改启动选项8 n. a2 M3 w3 j/ O* m4 t
在系统中加入了sdmmc3的配置选项,导致系统中eMMC的设备号发生了改变,系统在启动过程中找不到原来的eMMC设备会导致启动失败。我们可以通过修改ubuntu主机中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件配置来解决这个问题。, O  \- }: K0 ^- i2 ?1 C' m7 k

! L! b5 R# Y; o4 t# Generic Distro Configuration file generated by OpenEmbedded0 p( R8 I8 k8 z, X& P9 L8 O5 q8 H8 U. g

; L! ^" {+ ]* L% V$ K' X& ^menu title Select the boot mode( f6 l* ~8 u. {8 G+ Y" _5 R

, v6 B/ o5 Y1 I* d" hMENU BACKGROUND /splash.bmp: v0 |: o. r( r& f3 f: G

+ K4 Y& {7 V* m; RTIMEOUT 201 N. l3 {0 y9 E! E
! |, y- u& a6 f6 H- z4 s0 `) w
DEFAULT stm32mp157a-fsmp1a-emmc
& B7 P8 \6 {/ ^6 J+ _- ^- V$ d) T9 D: ^6 H5 r! g7 C; }
LABEL stm32mp157a-fsmp1a-emmc
7 \; ?8 q7 j" ^: F/ u# P* r; ^  A
$ L# F! F4 U. |1 {" \" tKERNEL /uImage) \$ D5 n$ V0 |2 l

7 Q- X4 Q9 E7 C: @FDT /stm32mp157a-fsmp1a.dtb! l5 c% H/ c6 g& \

3 n8 }9 o* n! p! d. IAPPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,115200  P2 V  Z. g) g$ b; y0 c( O
4 k8 s3 c7 k# b9 X4 m
LABEL stm32mp157a-fsmp1a-mipi050-emmc
3 X9 I- r) I( q$ S) r; E+ O
! X' Z0 d- s# }, S4 u& pKERNEL /uImage, u' M! d4 n( X( I; a4 ~

! e7 t5 U: ~5 O, O" MFDT /stm32mp157a-fsmp1a-mipi050.dtb) J  j2 f7 }  E  g$ `* F
! O1 I4 |5 T) k( z# U
APPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,115200+ S6 e" L* _+ B0 O5 r: W0 D
& s; T* I3 L0 Q# Z
LABEL stm32mp157a-fsmp1a-rgb070-emmc3 a( l3 ^5 h6 `) ^
4 D% r5 n# O1 f4 \% ~8 A, ]
KERNEL /uImage, `! a5 p  I: ]: Z+ {2 a

; g7 w7 k7 c( }( ~6 p3 pFDT /stm32mp157a-fsmp1a-rgb070.dtb
6 b: g& M8 E; K: h& h. q' E
, ^0 \- r6 w( ^6 \" JAPPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,115200
, z- ?3 g' W! [/ O
& m" ]- v- ^# K3 z0 N配置内核; {# {. v1 M) [; e3 O+ Q/ ], P
由于内核源码默认配置以及支持AP62xx,本节列出主要选项,如下:3 A. f7 l- H0 J* l" S+ M3 }  e
4 N0 d# X1 L* l0 {
linux@ubuntu make menuconfig
4 Y3 _! C$ g+ K" @: C2 T
6 i4 B4 ~# ^+ }& YDevice Drivers --->
/ F. ^% B9 o0 k
0 D5 w  }: D6 r3 E) M6 |# w<*> Broadcom specific AMBA --->
) Z# t. d- D1 }8 j. f4 g Support for BCMA in a SoC6 E' z# T, F# I: S$ h: D( h! C* m
ChipCommon-attached serial flash support
" w0 W3 ?( `6 O) _, q# T7 i% ] BCMA Broadcom GBIT MAC COMMON core driver5 H# z, C3 u9 c2 e3 x
BCMA GPIO driver4 r6 N* c3 n$ n/ ?0 H. _

4 C0 D7 ]" ^, R0 o编译内核及设备树
9 `2 I- m! L/ N6 J- Rlinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000406 D) ^( q4 b/ s1 o

7 [) f9 |$ u' Q" W" J重启测试
1 w, K. m; o/ {& W& @将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后查看/lib/firmware/brcm目录下是否包含brcmfmac43430-sdio.bin和brcmfmac43430-sdio.st,stm32mp157a-dk1.txt两个固件,如果没有发现这两个文件可从【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\04-移植相关文件\02-Linux内核移植\AP6236固件】下拷贝到/lib/firmware/brcm目录下。$ V/ |1 M$ l. X! \, k: n

: X+ D1 ?& ]# L. }1 b; E. A5 h使用wpa_passphrase工具生成WiFi的配置文件。运行该命令之后需要输入wifi的连接密码。5 M' D* m* s4 X: W

8 m) R7 y& ]1 ]3 ~. E- E# F% O1 _root@fsmp1a:# wpa_passphrase "你的WiFi SSID" > wifi.conf
% q, m; z4 ^2 e8 [- o8 L
) f# F* R& O: C. l连接WiFi2 M9 M& x) D' @3 Z  P) Y
# h6 `5 Y0 v3 q9 A4 }3 ~$ ]" c6 B! a
root@fsmp1a:# wpa_supplicant -B -c wifi.conf -i wlan0' p9 o( w1 ^) f2 ^- i$ Y

, P; g8 I1 r; _; j0 I配置WiFi网络6 I/ X. D( }2 x- F+ L: f# t+ n- _
2 w" Z; x( ^8 Z- n8 y$ W
root@fsmp1a:# udhcpc -i wlan0
+ {$ B7 `, f( u* _8 N$ e# c7 x" _) L' Y7 S
root@fsmp1a:# echo "nameserver 114.114.114.114" > /etc/resolv.conf
, b! l  b8 S9 Z) d* l- M
+ i8 f/ ]2 V$ k6 @0 ^root@fsmp1a:# echo "nameserver 8.8.8.8" >> /etc/resolv.conf
, P( P2 ]: u) D) z, V0 _
3 T7 D! k2 N/ @. S; N3 H' O6 X' Q ff1a0cb708798441487fbe0d62490d6d.jpg
8 A' B( _% U  u  i& l' p$ m
9 u9 I& D  m+ f6 M4 q+ H  M7 R# z
0 U+ _& U/ U0 n, x" v/ n* m# |" D————————————————; u! k% @; s/ i, g( D2 T
版权声明:华清远见IT开放实验室
& k  m( a7 U! K+ o
) P$ S* N# J/ |$ J- x3 K8 `* w, Y" g; q2 }3 P6 K
赞 收藏 评论0 发布时间:2022-9-29 18:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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