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

STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 15:28
1.实验原理/ q4 o* G! @. w' @
FS-MP1A使用的是CS42L51音频芯片,SoC通过I2C和SAI与其进行数据交互,原理图如下:5 R2 ?" U, ~, L: S1 \
! Y8 n6 c2 H, r
79b118f387331bb663bdbf2536788b3b.jpg ; T! o- s7 m* a8 R3 e
6 l) C! p4 F0 `6 d8 K3 |$ ~; o  u
SAI2管脚对应关系:
/ x& z- v* b- M7 ^. d5 v9 U& c+ y
1 W! d) D: w& _5 f# X 61ce5603d0204ebbe5ffb0117659c234.png 9 ]9 T& B: r. W0 [7 U$ I7 _9 b
& u. g. ~/ N. F2 h
00b77ddabbdb06add4eba544f9daf83b.png
+ e" W( {2 @% o- h
' u4 j2 w: I" O' c3 B$ N c07ad1d1df4d6c7fee2f62fc1ecc8ce6.png   B' x4 Q$ V/ d9 N0 ?

; B5 s8 @' a8 U4 U" ?: ?1 pI2C5管脚对应关系:
1 |2 i5 q5 z7 e1 q$ u4 S! O6 `) I! n. F' B8 i
ce25e0398cccd3fd988ef8e9300a5104.png 6 p8 B& w3 ]% ]5 `+ g
; Y( c$ B2 T6 r8 Z" }) i
芯片复位管脚对应关系:' B( q8 S5 ^  w/ \" i0 D
$ k- W  ~- H8 ^
23b9384095f188bd5100ee28aa6c1925.png
6 C/ C  r' l& \" E- F) c' q6 _ ' \3 p; [2 Y; y8 z$ d
) U: d- O& L/ b
1.SAI2设备树节点6 v  W# j+ K9 i6 Q* ^0 y  u8 b  D' Y3 U
. r. ^) h3 b" y& f$ p
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:( H9 x# |7 ?; f. |7 i5 x5 x7 t

! e3 J; V: f0 y7 q! Fsai2: sai@4400b000 {4 l" ~) E. T/ H1 p3 w; _, j# C9 x

# M3 I8 w& m0 s9 E8 T+ g. Z3 F% P. wcompatible = "st,stm32h7-sai";* u" d" |$ g+ X! `: T
% N; `+ P' @7 y6 r- U: [& C
#address-cells = <1>;
9 E$ G8 J+ M6 {8 N" b
: h- m0 _2 O* X; ~3 b$ S#size-cells = <1>;, v2 y/ \! I0 e/ h2 k1 \
5 M% M' Y' e" H2 ]' k! C+ M1 w
ranges = <0 0x4400b000 0x400>;! W+ f; |! n! @; a( A, J
3 o" x& F, ~, {; l- l2 V# V
reg = <0x4400b000 0x4>, <0x4400b3f0 0x10>;
7 a8 a  D. w% z1 v
% Q+ L8 `  t5 C/ Winterrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
7 G3 ^8 h  S5 V2 B# w
" a; ]8 \# r7 E  A; [- u' O( M. tresets = <&rcc SAI2_R>;& V0 ]% i- J# u# x3 N4 A: @. {/ ^: Y$ M
) o# c' ?  \8 o$ n+ Q: D# V# Y
status = "disabled";
8 }: V; C: r- |; n& K# P
' ], j3 q2 ]4 m: B8 J+ @+ Psai2a: audio-controller@4400b004 {. d: u$ `* \3 N; ~$ T; K' Y, `/ d4 Q

  R% |- r, r$ U+ b% [! ]. c+ P# L#sound-dai-cells = <0>;
8 I8 R- m, l% _& ~  L4 e8 v
, l) u) ^7 }" Qcompatible = "st,stm32-sai-sub-a";7 m' ?3 l0 d6 I

5 ^# ?# T% L7 {9 w! S$ x3 a& kreg = <0x4 0x1c>;/ R5 u  w) q! i# v# @

# ?, t7 v, T  K: `$ u5 R# vclocks = <&rcc SAI2_K>;; X5 p, R6 y0 h( ~- t1 B
$ v% z0 @8 ?9 T7 z) ?. |
clock-names = "sai_ck";
1 i6 b& _+ T& ~, }" ]( F# H: Q- b- m* X+ b
dmas = <&dmamux1 89 0x400 0x01>;
- D* u/ E8 R& f. K% U. V& c9 v# R1 q: {( q6 N
status = "disabled";, P6 z" [! S4 t% ~0 Q
. f; N: k+ J2 h$ W' C5 j1 S% A
};: A# |7 [% I. A( }4 ]3 S. u

# A& |: @0 S; w' F8 Hsai2b: audio-controller@4400b024 {+ X, H) e+ t7 g( A% g

, K/ g) V# _% o! |# u" @#sound-dai-cells = <0>;9 P" Y% _5 W/ t: w* U
% s- X9 X+ v: L7 \4 R
compatible = "st,stm32-sai-sub-b";
. A" ~3 d$ Q. k
/ Y# o9 g# E8 kreg = <0x24 0x1c>;" ~. G1 T( [+ P; h2 }
/ Y: {* o) g& S8 l  O! Q
clocks = <&rcc SAI2_K>;  j) r$ K  B0 |4 p, f
; J8 J  A9 P% v) U$ G6 j! u: ^% F) S
clock-names = "sai_ck";
. B! `# m9 k- O7 z( s- U! V% A2 n5 M8 U) s; H2 m0 u2 V' j
dmas = <&dmamux1 90 0x400 0x01>;' O$ b0 F. e, a9 V

+ c2 Y/ o4 o7 Z3 t% q  e6 Z$ _; y3 Qstatus = "disabled";
8 T$ ]2 {8 u9 N) @. E' y0 z
0 p1 P% J2 B) E7 I/ y0 z- N' q};1 @8 r. e7 {% v5 J* `. i; C
& g  I' O8 i: e
};
. D5 o  R/ J  t$ q" x6 t; d( x; }1 |2 g  Z  O9 M
上述代码只对SAI2做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。  O; s4 s$ d9 y. y* A! i% U
2 G# i- J' Q. e1 e% [: ]
参考stm32mp15xx-dkx.dtsi对于SAI2设备节点的描述,增加SAI2内容如下:
4 f) P# i& z; Q% T/ O
- s# @" A" p' `- ^# q5 J* C- u2 B% \' f&sai2 {
) J. |! x7 z8 h+ Y* T& B
' z* ]' y8 x& T% `" Gclocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
% T; B, _# E) v9 T& {& H* K2 _" A: x# K. R0 A
clock-names = "pclk", "x8k", "x11k";
: b. U! ?- E) G: c3 m7 D
! e: w+ t8 U! ypinctrl-names = "default", "sleep";1 d( _- [3 T/ R0 G
- J, k" h$ p. n$ X8 B9 W& C' S+ s7 _- R5 d
pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;0 a. Y3 J. r) h+ T8 ]

- l7 Z$ a) X6 w5 ~pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;& L1 K3 a' `1 Q

. Z4 e( Z, W0 q2 l$ Ustatus = "okay";
9 {' d+ t. u$ f9 y: x% o( L3 M/ u3 S8 Y' B
sai2a: audio-controller@4400b004 {9 }" s8 ]. e- ^

6 a8 B3 P, W- p  W  |9 X#clock-cells = <0>;
' b# |" Z" k5 O0 G2 ?& {- `2 X( l7 B& Q$ @5 q& m. z
dma-names = "tx";
1 ~4 O6 Z8 m$ X% j8 n4 Z  d8 y1 P
/ k9 d/ Y& P8 c6 t* `clocks = <&rcc SAI2_K>;
8 `( w" {4 W2 Z6 N/ ~9 D$ q/ ?! C
8 I! l2 L2 ?9 r. u# W  \+ K( ~clock-names = "sai_ck";2 h: s/ V$ H! p3 {# W% k  C
) f  ~& X& E" f& h
status = "okay";4 N2 ?3 i6 }: F- T

- |2 Z. T0 A" j/ F$ X9 ]sai2a_port: port {: W8 b2 D2 {8 O4 D+ P9 P8 y* o

9 B+ f: T5 @: D5 h$ R) t0 psai2a_endpoint: endpoint {6 a+ z, T5 H1 V( a
8 T/ _/ K! u. h
remote-endpoint = <&cs42l51_tx_endpoint>;
: a$ g; z/ }% I6 r; B* U% W& y" z/ b8 ?
format = "i2s";
, m' l& E  n/ l# K# e7 [5 N* v, H3 ?0 W0 _" L2 N
mclk-fs = <256>;& C' r5 [4 Z& M4 T3 r

; q% y' r& }! A# M; jdai-tdm-slot-num = <2>;* y" x. I+ `. B2 l. R

3 o4 W" j, f+ y! m& c7 s* sdai-tdm-slot-width = <32>;
3 }8 S0 ?5 M9 d  _( Y) @/ b) M' r- G
};$ l% U# }5 f3 e) V3 K. v3 c

5 Z8 k8 `9 b; A};) q* j" u/ U+ f$ h# w- M2 W

5 L. G3 K: y0 p1 \3 L1 H- n};
. P: D$ N" J8 \7 q+ E: f
( \& }8 v- m7 b1 gsai2b: audio-controller@4400b024 {
; X# b3 l( I" B! l/ U& t- o( W
1 P" g9 }/ q* D6 i( G0 s  U4 mdma-names = "rx";: T' V: n: [( \' _4 r3 C
9 y1 F# f" s2 Z2 R; _
st,sync = <&sai2a 2>;
4 `6 A0 ~. V$ D! |5 S. W: t9 R
4 X% @) ~! E5 h6 iclocks = <&rcc SAI2_K>, <&sai2a>;% d. w  }) S9 G  X- O: y
+ m; D, {9 X5 J
clock-names = "sai_ck", "MCLK";0 J& g% w: P: I* n) x

  n9 K( z/ m' \3 U9 Rstatus = "okay";; w) X7 ]9 }! w- r/ X

; L4 `8 i- n% c$ [1 q: J* ^sai2b_port: port {
" l; d3 m+ f* A$ ?. G4 u5 T" Q/ ~8 o& S2 X$ L
sai2b_endpoint: endpoint {! k+ [$ E3 T0 w

9 R; p. j$ M/ }4 A. A) r8 wremote-endpoint = <&cs42l51_rx_endpoint>;
# t; A3 m$ d) q, F7 l; U8 l6 m% i' a
format = "i2s";! \. d, L& v% f

) l4 D$ G2 O0 F. ^& c: Z3 amclk-fs = <256>;
& `# P1 \0 K- G$ t; b
& |& D3 ]) Q/ w% e% S7 V7 I- ?dai-tdm-slot-num = <2>;
* @( e! j5 @, L7 h9 D/ q- v4 Y3 ~# y, c8 P* z4 y- |
dai-tdm-slot-width = <32>;: ]. l# `$ ^" j* Z9 Q5 d
  z$ a3 x$ x2 z# M
};) h& Y7 T  e* a% `9 x

& B' l* z5 ~$ j' i/ B5 X};
7 \  d" J9 V" Z, V  m  x6 }( p9 I! i* r) _+ |
};# Y  @: r! H& A; k3 {5 ?) v
2 |( n% V# a& _, G
};& [# p/ K6 j% h% s. Q. F  M* x) b

. h# h" _/ ?& X* l, ]- C8 c" [由于stm32mp15-pinctrl.dtsi中对于SAI2管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改。
: n& r) {8 ~* U- S& Z# T" X
+ l( M, Q: K, M& a& N2.CS42L51设备树节点7 J- M/ F1 J4 T- l& |% Z, p0 l
由于前文中已经增加过I2C5的节点信息,本节就不再重复,在原有I2C5节点添加CS42L51内容即可。
* G. L% k# M; a! R" Y! e7 f5 i$ r" a' n; e

+ }" Y7 L! C7 a9 T9 @+ y参考stm32mp15xx-dkx.dtsi对于codec芯片设备节点的描述,增加内容如下:' @1 x1 k. d- ~9 n3 l
! j) X, T) x2 A0 k4 n
cs42l51: cs42l51@4a {
3 v1 @, _/ n: [+ }. t, V& o) K, ^4 }2 C0 ~7 Q# c" ^
compatible = "cirrus,cs42l51";8 e3 {7 x$ O+ j- I+ ~( M
7 K5 L, @! ?+ A8 p7 [* b
reg = <0x4a>;
/ r7 K- g- C+ }% X2 a' ?2 ^( \
$ ^9 k6 F: Q, P6 t9 i: }; S#sound-dai-cells = <0>;
  W" f5 e) G, ?/ S% K  D2 \4 {7 M9 o
VL-supply = <&v3v3>;
+ X* ]( j9 n! q% ^: n( X
; R! E( Z+ j6 Z; S5 x) \4 JVD-supply = <&v1v8_audio>;. D/ u9 U0 [/ u
+ p  u3 M; p& Y6 E# I/ j. q
VA-supply = <&v1v8_audio>;- P4 X; _" ]6 `

$ A7 A6 A6 g4 k' N9 m1 g9 N1 NVAHP-supply = <&v1v8_audio>;
* A+ O2 r& Z! v  z
. m- T7 r0 t  x9 h# ?( Freset-gpios = <&gpioc 0 GPIO_ACTIVE_LOW>;5 _6 `2 P2 {+ M, C

9 W" i3 t* \+ f  tclocks = <&sai2a>;
4 }1 ^; m9 h9 x2 |
9 I( e7 E, V$ ]7 a, ^clock-names = "MCLK";. r! F7 R' w( A- y$ v
% l; P6 s. Y0 y3 @, ^
status = "okay";' Z) p$ X* ], o9 L- f' I0 c

) P5 q) T% K- {+ Y0 ]cs42l51_port: port {
" L% _' e( }9 ]$ z/ K. v/ S: o9 ^+ H8 _( [8 b
#address-cells = <1>;
( T9 w; \  r- X) n/ B
+ |. `4 {; D& j% W5 ~- Z) M3 @#size-cells = <0>;8 R4 Q1 d! ^  h6 Q# Z" g4 X
) _7 B1 [/ T/ I* m% ?9 C$ f
cs42l51_tx_endpoint: endpoint@0 {6 L" \- B) L: r! F2 _/ R/ {- N! y

3 X8 P) P7 k  I$ h8 mreg = <0>;
) z6 A+ i4 W4 J$ W0 z( T1 J
3 O/ {. L9 J0 c) Y1 e. ^remote-endpoint = <&sai2a_endpoint>;
4 I& T& J" I; g+ q7 p% f" W* h, e2 J  d9 `3 g( c/ s4 A
frame-master;$ r8 c0 e# c$ T4 ~9 X

8 Z3 L3 S: f% B9 G9 v% ]1 Ubitclock-master;; k2 W8 n2 \  ^, H0 P) l
6 F4 k) E) B: j8 O7 |5 C. s
};' [3 T) k5 R; b) p' v: {7 V& n
4 l) ]0 ^/ {3 _* F+ O. _
cs42l51_rx_endpoint: endpoint@1 {' `# {9 w/ G# W7 h1 ]1 p
% l$ v8 D8 z0 h
reg = <1>;' x3 @% p8 ^! p! Z
) E* H# W9 {+ l6 q" t+ R
remote-endpoint = <&sai2b_endpoint>;) d9 p7 t$ J& p5 T& `) n1 ~
6 C! q1 A, H  J! m+ {
frame-master;/ C1 o8 q% }7 Q* {5 @% j+ d0 U( P

8 b" z$ {1 V! Qbitclock-master;
9 o3 H. x2 `" w  g
+ F. X* G+ X. L5 R' u& d};0 a) Q+ {5 W# e  F/ n( M1 e4 Y, B

7 T8 Q& w+ J8 S7 k3 N};
' G0 S$ m9 ]2 _6 }3 V# N: B2 d- f0 c6 ~/ |5 M- ]- V+ r) J
};) ~2 y9 R7 r+ `6 p: ?0 t9 x" d, K
& z6 Z# l' j( ^
3.1.8V电源设备节点
6 t# }! H* H- w# q  B前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v1v8_audio节点,内容如下:4 w  l) o9 L7 K  G
6 R' [# a+ c. P& s, g1 n
v1v8_audio: regulator-v1v8_audio {
2 V# Q. F0 @9 M0 X! {& ]- @! h' p+ C3 C0 r3 c5 E( n& e  u
compatible = "regulator-fixed";7 n1 r$ w- u. A
( Z* z: `& K1 A) s/ t: ]0 ]
regulator-name = "v1v8_audio";
) k. ~! f, ?4 P9 p6 `( J/ `! P+ O0 G5 w" t' l& _7 I; H
regulator-min-microvolt = <1800000>;
0 v8 O& |5 N8 J! x4 j
# G7 B  e4 X4 P( mregulator-max-microvolt = <1800000>;
  x7 p' A: V6 k) W1 F& G5 Q  p- g( ]6 r# N( |4 K
regulator-always-on;
1 _2 r+ r0 D) A  C+ \/ b8 p
- J1 C4 H" x, c) E* F4 |6 A6 n+ Bregulator-boot-on;
) _; F% }: v) ?: u0 g  Q" x1 `5 A# G" z( F
};
' r& S5 w4 W- Q
5 g, ~9 v4 ~$ O0 d5 m1 z& K' L' c4.SOC声卡驱动节点" G  j& X2 O7 B" Z" e
内核中包含audio-graph-card驱动,驱动将声卡各个部分关联起来,驱动正常工作需添加对应设备树节点。
) o% G7 w4 Q9 L) @/ A: h5 i& P
5 w+ i% Z, a8 ?: w在根节点写下添加sound节点:
+ ^& s* A$ U$ u  q; l( v( g+ n6 H3 D  j3 u
sound {
0 n$ ^8 p7 R  `  v2 w- z' j) W  a9 Q
compatible = "audio-graph-card";' D& Z3 W7 N9 v# `( c' g
, h( Z* I6 F3 d  L
label = "STM32MP1-FSMP1A";
8 Y9 d1 H" i! p) R9 h+ I% L) K; x, B$ s2 x$ G0 X
routing =0 u3 n$ J) P) t
" V" n5 V8 y" I
"layback" , "MCLK",* f# g# R) \6 H
! b; x. P* U8 n* M4 v
"Capture" , "MCLK",
- M7 v$ M( Y8 @$ i. O, M; V/ r
. d/ E. R) m: n% _+ J$ U9 q"MICL" , "Mic Bias";. `9 W8 e$ |# b6 i; h
, U" Q; g; O- [, |% ?! _5 ~
dais = <&sai2a_port &sai2b_port>;$ E4 h. e9 ^/ B4 W8 K: `4 P
3 ?) G+ b( l7 q. V+ O# X, I1 _
status = "okay";+ c0 p/ p! X$ L& q
4 t; B; S) Z) w5 s) r% N
};
) [5 V, m2 \7 Y! \
5 _: k5 Q8 o9 O6 @! T- C9 Y( J1 y2.实验平台- ~" l% v" p9 F2 E) m  C6 O8 n) M
华清远见开发环境,FS-MP1A平台;% u* @, s1 P( ^

- E& @- ]$ z1 q1 s3.实验目的
5 ^$ w/ @6 h) u2 b! I' n! d熟悉基于Linux操作系统下的音频设备驱动移植配置过程。
3 p  x5 s7 \& b! ?7 d) A5 Y+ W; e& i* B3 Q" s! Y' g0 M* _
4.实验步骤
" K/ i! F/ M2 [  l' U; N
1.导入交叉编译工具链4 n4 C) Q3 v7 ]  ]
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
# F  l& M, V/ d0 s4 t3 `  s. w4 `2 B
2.添加SAI2节点
! c+ F3 L- y% L) F) A$ o; v/ g% }修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:4 F/ k& v: E% O2 e0 E

! y9 U/ a2 W/ t0 r5 f0 r&sai2 {
5 u- _2 d9 w9 [+ Y- c3 R: @; W$ e! S5 U: @! X3 @' N
clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;% x4 m  D9 S# p; B

% F) ^$ {/ E' _; rclock-names = "pclk", "x8k", "x11k";
% R; }2 P8 u' ]. J; h; r* \
9 U# Z1 g, C. r& [- u6 H, j$ [pinctrl-names = "default", "sleep";
# Y+ J5 z1 j: i) t* I2 @7 Q+ q
/ F6 ^$ M0 T( \$ Y8 Bpinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;" G+ S0 e8 j1 w2 {' D
3 l' t( E2 L* j7 c3 L/ T( J% W+ b
pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
9 d& \2 h. }; \2 w) t3 `6 f9 B
. T! a: c0 @5 Hstatus = "okay";
/ A0 O  A3 h7 w8 o
+ R+ H7 A1 P- D& o, j# X7 Bsai2a: audio-controller@4400b004 {
( t+ v" ]* a/ [# r% \3 C: o8 _4 m  w/ W( f# |- l$ b, k- T
#clock-cells = <0>;$ b; r; {$ L; l7 W& I9 g
% m; ~* R+ ?2 }/ H6 u3 A
dma-names = "tx";
* n2 t& j* a- h& M" _1 N
/ I9 }. ~' S8 bclocks = <&rcc SAI2_K>;4 `' E( H+ J2 H  g6 j. Z0 \9 L. ~
+ a. l, i6 m# C* A/ g
clock-names = "sai_ck";; Z" O! f5 `! \9 e) j( K. c

* f2 T, ]7 N( A1 `0 v- _5 Wstatus = "okay";
6 |$ c5 F, q1 N  c% x5 K6 M, f6 m2 ~' I2 W$ h8 l* j$ q9 Q
sai2a_port: port {5 l( D+ Y, t% U6 f/ i

! L' c: Z& X; t' W0 ssai2a_endpoint: endpoint {) u  D% M7 a' m: V8 V" h! Q# I

6 R" q/ E8 \: e' iremote-endpoint = <&cs42l51_tx_endpoint>;
, H3 o$ l6 L4 H( q7 V' T
; V& d) I' @( i# ~1 _format = "i2s";
6 q, S0 I* J; O
/ j+ R% a6 q& O; Q! H" u; N/ Ymclk-fs = <256>;
" o! F+ t2 E* C$ j
5 H1 Q3 q5 \! _9 B0 c2 g  V3 A6 Pdai-tdm-slot-num = <2>;2 V) X  Y: {- A3 I; W5 Z
" x) t/ I# N- V5 N0 w7 P# j. H
dai-tdm-slot-width = <32>;7 s* p( _; s# x% h- c2 r1 B

/ s: g8 F1 A  }9 C};: g1 C  m: W$ n+ N

' K5 t6 `9 n: e' f) Y8 O};
7 j3 l9 c' U$ Q6 Z6 L% V1 l- w2 _( B& ~* n  ~1 X
};
& `, v# A/ X! A3 S# N1 e8 U/ x# x6 S, r& p0 C$ U
sai2b: audio-controller@4400b024 {
* \5 H5 c8 x+ V5 Z8 V3 H& P" @/ w  V! V
: q# ?* U2 n0 G% k9 H/ M; A- {  y. G4 Kdma-names = "rx";
/ p. _& a* o/ q: e( T5 p
2 D' D$ _0 K% ^( L+ est,sync = <&sai2a 2>;
  B2 Q8 F- e6 D& m) t: n
8 J& {# d! N7 Y0 Q2 rclocks = <&rcc SAI2_K>, <&sai2a>;
' |$ f- q) Z" D  M6 n' U, _/ {* s( g2 X( z
clock-names = "sai_ck", "MCLK";* ]+ J. @/ }1 L0 O5 B

1 n  [' d, a7 u( R- ]status = "okay";1 @5 E0 F; p) s1 n2 f1 m, A
0 r; F4 x5 h( V8 O5 E5 |+ Q
sai2b_port: port {
2 l+ {2 W/ I# D  Y1 i7 O+ k; `
0 O0 h' k9 T, Lsai2b_endpoint: endpoint {; L  D, d6 M$ N; `( H7 m* E, U  d
2 @  u+ B" m7 }
remote-endpoint = <&cs42l51_rx_endpoint>;/ r9 q" x1 w% \$ U7 W9 _! i2 \
$ q0 C, c% U8 c
format = "i2s";
' z3 S' B! T0 y* ?8 h8 W9 L  j/ b* F) N( {! U
mclk-fs = <256>;
+ Q  t$ L  h( @1 L" P6 F5 R$ s. |3 U1 H$ U; ~. V/ [
dai-tdm-slot-num = <2>;
/ l: u9 u7 s  W! I0 V* d" H: k: T. a' ]3 U7 F8 C3 F, C
dai-tdm-slot-width = <32>;
9 C- t* W$ D* y5 u8 Y4 ]
; W3 \; X/ B4 l};
  P: @) g7 I" f4 O' Q( I$ D  C1 x$ C( ]
};
9 U* ^' W. F6 R* C) F. c+ V1 T
  V: l4 M" m4 z" @; ]1 f. `2 X};
. B) k& o& `+ I, l  z, O9 N8 `7 R, m: A$ P; o
};
5 B# X4 V  Q* k" y2 {
: H3 {9 v/ x2 p/ F0 U, B3.添加CS42L51节点
% R" [9 n0 F& t修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加如下内容:
) {$ x6 D1 K' Y# T4 ?# R2 J7 V  W# ?, W# i: Y
cs42l51: cs42l51@4a {! j9 P0 w$ M! ?" a7 P" ]

. B0 e& Q- P6 Ucompatible = "cirrus,cs42l51";$ h7 M* |3 E% f4 P/ w9 y9 Y

" o+ \7 [9 X0 n0 @" Qreg = <0x4a>;
! v& A( E: W& S, j; Y. M/ K. X
" @# _3 I  L, P; y/ T7 Z#sound-dai-cells = <0>;
2 K7 k0 v- C( v( A9 E# ~
! N- Z& Q% P7 OVL-supply = <&v3v3>;( ?3 }, l4 u/ D7 {6 v) e" |
& ^4 D9 X! P! Z: X
VD-supply = <&v1v8_audio>;$ W  l" X2 k3 c8 o/ u1 r* Q

# ]- T( y% V/ X, Y1 j3 _1 \$ nVA-supply = <&v1v8_audio>;
) Q4 b! o+ Y- ?4 L' y! H1 S5 x
4 G3 E: d7 D1 d) U/ |VAHP-supply = <&v1v8_audio>;0 A% c& J$ ]% I& W+ r: M# k
9 n+ u* i! ?1 A9 c2 F/ p
reset-gpios = <&gpioc 0 GPIO_ACTIVE_LOW>;9 N' C" G! `9 s6 I2 r$ g
' h. w5 ~% P- Y! Z$ T
clocks = <&sai2a>;/ @4 j3 p& U$ P$ n5 _4 O

+ N: S8 v6 s/ |7 O4 k: Z( hclock-names = "MCLK";
; k* c8 \' P" [% ~3 w! x/ }& v) `  M" N1 h; h! o/ J' A4 ~
status = "okay";
% b6 K6 Y& I# b- T0 _* U& u) M9 B; N" m% z# R9 w
cs42l51_port: port {
  v) V' i, {% F, p5 ?5 ]+ D# s% Q- U: Z, Y  D' \1 J* y+ W$ K
#address-cells = <1>;
, ^5 D7 G; h0 u" u& [$ ^
5 |  x  K* |, }1 C5 d* Z6 b5 D# B! M#size-cells = <0>;
% \0 e! I+ g) S- Q
* d- X4 W6 X/ M3 Q/ g$ I( |( l! _cs42l51_tx_endpoint: endpoint@0 {
7 p+ j! a& H6 j( V7 C% A  K7 d5 K$ @. \
reg = <0>;5 s/ m1 M- R+ B; r7 q& h
8 U8 {+ i; `6 J0 {
remote-endpoint = <&sai2a_endpoint>;( g% [% S# ?2 y, c

6 U! l/ y3 P6 h( t' cframe-master;9 J& [' a& l0 c; h) y2 g( k

$ m/ _% E! P$ q" C1 H  I6 }bitclock-master;/ s$ b& ^4 U' \' j- o
2 I& s& w+ ~- U
};
8 p" ~/ H. O( F* H& U6 Y+ ]& H  r; g
cs42l51_rx_endpoint: endpoint@1 {% g- j, u8 Z+ y* Q
4 z" b! v4 \& B' l: C5 ]1 z! l
reg = <1>;8 A) a/ K7 p0 h: y- Z

* l0 H0 ?) H# u9 K0 M$ bremote-endpoint = <&sai2b_endpoint>;
3 X3 V7 m: c" A. i% }+ J% p3 G9 T: J) i! P( L8 d, `
frame-master;4 l7 D/ _0 }# u+ x

+ g) w) L- @5 k# i7 v& ubitclock-master;
. \9 w9 R' z" H7 ]3 G  f# s- ]3 Z; Z% G. I
};
. M5 Q( B/ J2 R# q. F6 G% D
/ A6 C) S" M4 G! a1 \( k};
4 ?; R7 G+ O. }9 r" n  Q+ c
( J+ B' ?+ I/ s, D6 T! o3 x};
5 v- V) m+ f3 D$ j
3 U: w) ?2 n+ Z  m& W4.添加v1v8_audio电源节点
8 Q2 j- S$ i7 q& z% o修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点中添加如下内容:$ D, J9 Z9 K. X, t9 _  ~$ ]) ~7 o* {

% u8 i; C+ i* k, z* {+ `& F: t3 Yv1v8_audio: regulator-v1v8_audio {
3 A$ W- y& B. t* ?- c
  z! [1 M1 {+ v) m& dcompatible = "regulator-fixed";1 D  p( \$ I( k% V% s+ z
+ z( i* ~/ F( a6 V
regulator-name = "v1v8_audio";1 ~" R  l. M2 M! j

, N6 Q8 l" l" O* [# {: xregulator-min-microvolt = <1800000>;
) T( R& }9 s- t1 ~+ a; f. m' Y* n: Z/ Q+ |/ p6 G
regulator-max-microvolt = <1800000>;
3 p& w1 }6 _- b1 q& z7 M' s  j1 s. O2 s) V+ {
regulator-always-on;, a: F: R4 Z- S3 p- _
7 b0 j3 v$ o# S3 h
regulator-boot-on;
3 O: |! R1 l5 h& O
5 ^0 A8 i8 g: P' T% d1 x# }7 ^};
2 _& X6 T: D( e' g/ v' W# M
- R+ _6 T- M& w1 s2 N2 Q3 f5.添加Sound节点0 P: ]. S/ J! O
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点中添加如下内容:8 |' O# e6 }2 |, n( Y) \
: ]; i9 {2 d2 {5 j6 ^* N; D, U7 T
sound {6 I1 j- X; |3 P8 v- }6 r* U5 m0 N
( I8 I" C% L$ B8 A9 l7 ^* e
compatible = "audio-graph-card";# v( G& U: t- L% S

( P* \) W2 {  t' }label = "STM32MP1-FSMP1A";
- W0 C! ^* U# C+ K8 Z9 a
5 Y6 g* k& p" U/ Prouting =- G, n  L$ ~% O) U

* @! C- B8 w1 b; k9 T8 a"layback" , "MCLK",
( e+ G  u" }, \3 c( t! a6 P2 J$ C! f0 |7 l8 v) X
"Capture" , "MCLK",
2 V9 Z' Q6 q2 q$ w2 Z/ H( J3 C
" G9 O" O2 d4 c"MICL" , "Mic Bias";
) R& D9 ^' ^3 T: B4 c/ B
: b6 p# i5 u( u$ |1 J4 y- A4 Udais = <&sai2a_port &sai2b_port>;7 }, t7 z% L7 r3 q! V1 U/ c

+ s" }7 S1 s4 A% Istatus = "okay";
5 K& k* x- ^3 T0 R! [' {- w6 S( n: F! T0 G- V- ^* Z7 h0 b3 r
};0 |: V& o( a. W+ V: q  g
$ K/ o8 ?/ H! l5 G
6.配置内核9 j  a7 z7 g. r
由于内核源码默认配置以及支持CS42L51,本节列出主要选项,如下:: [5 _3 K3 f. d) f* I5 {6 K
' a5 M0 _1 n# y6 u
linux@ubuntu make menuconfig+ S1 P# m2 a% ^% V/ m
; W8 w5 S& H: _- z2 `0 e$ [
Device Drivers ---># W9 d1 M/ s# d# Z8 M7 p4 u' c+ b

! O) i( X, v; E. L$ a, J. X<*> Sound card support --->3 t1 X* `8 z/ X# F/ D" A/ E

$ Y8 N/ d2 y: V! E. ?; [3 j1 `; X; n<*> Advanced Linux Sound Architecture --->" b' e! i- t5 G4 Z
+ ?8 o' a; c* @3 q# |3 m+ W( j
<*> ALSA for SoC audio support --->$ l6 n, [7 N3 D. n6 i* k
1 W9 S9 n3 K. Y' U
STMicroelectronics STM32 SOC audio support --->
# T  j$ T* R) f, ~! l3 G8 {& }5 ^$ E5 `& E3 |
<*> STM32 SAI interface (Serial Audio Interface) support; z! n+ U. \. _3 X

0 b! f1 M1 D* l; b: C# b8 ~, ECODEC drivers --->; `6 R5 l: i3 s+ R" h0 j6 a5 y
% H2 b. f  e1 U3 M3 x
<*> Cirrus Logic CS42L51 CODEC (I2C)
: s9 F1 v% I1 ]/ J# H* n& d& Z  i9 q$ P
<*> ASoC Audio Graph sound card support
, z9 g/ I* `2 n  j0 J5 K
# K% I" r0 A. K' q: n7 q% i- ]7.编译内核及设备树
) t: S7 N' Z4 `# N0 d' B+ vlinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
7 v! ]1 h9 b! E4 j/ T$ [* V5 r) |6 E3 k1 o
8.重启测试
1 k" I, u; I  F将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,启动后启动信息中出现如下内容:
! R  ~% i8 e! L. n8 K# O0 v' d$ V
4111bf32942002a48bfbecd83b829e6c.jpg
1 Y2 z+ }* s, d( ^! ?
6 H! b! h( L8 ^) S) a! t" _插上耳机,终端输入录音命令:8 E# Q8 o6 j* y0 p% b/ Z
3 _5 |2 R) [6 d! K1 M6 V
root@fsmp1a:# arecord -D record_codec -f S16_LE -d 10 test.wav0 I: D  h/ x* ^0 j( f. H

8 N& t! c5 I& Y) w) |3 L; W& E! f% L终端输入播放命令:9 p  l8 s, I2 ?; B% h

* I) [' a+ K# Kroot@fsmp1a:# aplay test.wav
0 ^9 V  Q0 {4 m! ]3 H/ r: E& o6 C. s
————————————————& Y+ p. ?( G, u' o
版权声明:华清远见IT开放实验室  }% J, F, ~( @4 {2 m# |; a
. s- y" ~6 G3 \; |

5 y& T: u) H1 J4 [8 Y
赞 收藏 评论0 发布时间:2022-9-30 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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