1.1实验原理+ d# k0 [: ~: P- x
STM32MP157A系列SoC中默认没有HDMI相关控制器,FS-MP1A使用SiI9022芯片将RGB信号转化为HDMI信号。STM32MP157A集成LTDC(LCD-TFT Display Controller),提供一个24bit RGB并行接口用于连接到各种LCD和TFT面板。. m4 ?7 }% S, r) E4 a8 b
$ q0 |) C' c: m8 `4 S* ], x% k
' y* i# s& L& |& x! D
8 h6 J9 p" S* h. R7 y1 l
SiI9022芯片通过I2C5总线与SoC进行交互,通过SoC的LCD_PCLK、LCD_VSYNC、LCD_HSYNC、LCD_DEN与RGB信号线来进行图像信号的传输,通过I2S2总线进行音频数据的传输。" ] O: z7 Z4 |/ ~& E$ ?
9 B. y5 {; n' k* s n. Y
# a2 i6 @2 s, F
9 v( n5 A8 k+ y1 u: H7 A
查看原理图确认I2C5、中断、复位管脚对应关系:, }2 Z4 O- M3 R4 W7 B" j
4 a2 g. p- _1 y7 D! {* z
2 g" L; J! T/ p7 Z( v e3 r
" Q; R# ?3 o: Z& i
. ^, J0 w4 M! L, B- zLCD接口管脚对应关系:
# Q/ c3 E+ b) W( H+ n# N' ?8 j
0 R% g g; x- A5 {( V4 |' }
* A+ s0 m/ L1 r. A: f! g) P4 r
8 ?6 d* D( C I5 G" N5 a# f. `$ e
* y5 i( A4 @- a4 Q$ D
; I1 C% y) h3 m7 V
% h, J; }2 L1 g* L) R6 W3 q9 {$ D7 D! ^5 f" [6 N
1.I2C5设备树节点; @' `+ A$ N4 {+ c! M
. I0 U! b3 a+ h
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:/ b) }; X8 P4 _
7 Z2 E0 v% B$ Darch/arm/boot/dts/stm32mp151.dtsi
: @3 W8 _! k$ I5 D& X0 }# X6 z! x2 A, O
stm32mp151中i2c5定义如下:
+ R5 @+ q; `( N0 J5 _8 m2 a- Z+ e U0 x
- i2c5: i2c@40015000 {! L" \3 l) [4 J
- . @7 j" \+ `) V$ v* n; X
- compatible = "st,stm32mp15-i2c";+ ]0 l# j9 H0 B
: y8 x5 q6 L7 E! j, x8 ~1 P' Y- reg = <0x40015000 0x400>;
# N( A% l7 c' w% b" c - & h- ~) \8 f) n4 l$ s* M
- interrupt-names = "event", "error";
+ J |+ i; r4 w0 m/ \6 X - / a( [7 Q( {9 B# o. e0 V" N
- interrupts-extended = <&exti 25 IRQ_TYPE_LEVEL_HIGH>,, v: ]& d: }) x: Y
- * A \( K; ]% r0 y6 x: G3 p* O
- <&intc GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;4 L: q" l1 b' K1 O1 s* s `' [. p- ~: c
H a) K& F7 b& q3 j N- clocks = <&rcc I2C5_K>;
' J0 }" g, w8 _- }$ R" e5 o9 N; b+ O - 2 `/ v- G& R! W8 w- I, l1 z8 {! ^
- resets = <&rcc I2C5_R>;
6 u) G$ Z, k$ I4 H - . T2 u9 ]% k7 r1 \( U9 J! [
- #address-cells = <1>;
8 m' [1 \! M. ^7 Z, ^2 a
4 ?1 R% O1 O" J- #size-cells = <0>;
" M( J& E2 {: [8 U
4 {7 o1 |. R& f" i; m! v3 d- dmas = <&dmamux1 115 0x400 0x80000001>,
( p: t3 n& C) V7 B/ }- s
$ z; d& N2 W* y2 g' D- <&dmamux1 116 0x400 0x80000001>;
/ P0 O/ S& J2 T: l
0 Y! {9 j9 A. Y7 {- dma-names = "rx", "tx";4 R- a% _8 t6 M4 y
- / O# U& M, [9 r" m, a" L8 [ O8 U
- power-domains = <&pd_core>;
s8 E3 q! b2 |# ^; N - ! g, G# g5 I$ W/ T0 K
- st,syscfg-fmp = <&syscfg 0x4 0x10>;
9 z }8 K9 K5 r" r; S4 K - 0 A0 }5 @# H+ X/ a! l. j
- wakeup-source;
6 ]! ]9 l, w) B8 y. f
, P+ c0 w z* \! y$ N: J% v- status = "disabled";; `$ U- M! _* ]. t/ Q" _6 {% d
- ; D/ u9 S) C! t
- };
复制代码 - G( U' N5 b: H2 J+ z% S, |' ?
2 x) z1 K! P6 d/ t; c上述代码只对i2c5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。; t9 D5 i5 x, _* \, i& K3 a( r. I! R* N
) E$ `0 b! ~& N/ r# f1 L; v, E2 O参考stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,修改i2c5内容如下:
! W% ~1 \4 c9 J5 `. c0 g* d5 N1 G% R( ~. V8 N9 Q5 x/ \3 F
- &i2c5 {
, U" K; Y, {+ n8 h( w# ? - ' e) F. O; |7 s) l& N5 i
- pinctrl-names = "default", "sleep";
1 ], c N0 Z; x/ d( e9 A* P
0 g+ l4 Z: B7 p3 M; ]& s; `) h- f- pinctrl-0 = <&i2c5_pins_a>;. `% N$ s6 |# B. m4 O1 R# }3 A4 C" n
: t1 C+ N# ^4 ^% u9 L. m- pinctrl-1 = <&i2c5_pins_sleep_a>;
$ o$ i3 y, n5 ^3 `$ m - % U3 i# ], d. j) g C8 O! T
- i2c-scl-rising-time-ns = <100>;
) [3 v8 r' w1 Y% b% \ - 1 @. K' j1 |( c! P2 d# s
- i2c-scl-falling-time-ns = <7>;
+ Y' |7 M& k1 R7 e" Y - 6 O1 `/ P/ _ k: i0 o; D& F
- clock-frequency = <100000>;
( Z( _7 r4 o) ] w) W/ U9 ^( L - # Y: j8 V& u. h- w b) ^! y
- /* spare dmas for other usage */5 p7 a3 _/ a6 H
' q- ?+ W5 w( s# L$ {' h- /delete-property/dmas;
) Y# ^/ [- ~% E, g$ ?/ H
$ D- y* l+ H, w- /delete-property/dma-names;& M" W" S4 B; W2 u# L
1 p" t' w& K- \' L& @% ?; P, p/ Z I+ O- status = "okay";
M* u7 {1 B6 ~0 a4 b4 k - % ?3 _; `( p8 Y
- };
复制代码
! a9 F1 q b5 B! N& N8 d, W由于stm32mp15-pinctrl.dtsi中对于i2c5_pins_a和i2c5_pins_sleep_a的定义与板子实际使用管脚一致,所以无需修改,内容如下:
: _# P: x! [! f# s. T6 U' ~. S1 R
' S% j4 T( s0 I: S, v, M- i2c5_pins_a: i2c5-0 {
) X7 m. z) g5 \5 G$ U. C6 h3 @
4 i; w, ]: u5 ]; @- pins {
, b1 z8 _& N' _, s- t - 4 R! I: u% p0 `& Q; c
- pinmux = <STM32_PINMUX('A', 11, AF4)>, /* I2C5_SCL */2 f/ Y. }. a( F" x+ L
- ; i' r5 N2 _2 B" z K) w
- <STM32_PINMUX('A', 12, AF4)>; /* I2C5_SDA */ l/ l/ \* k+ X* e: S+ n4 f- [
. s$ A' B/ O2 F+ q* E3 v) X- bias-disable;
6 ^' q- g8 w1 m7 d! s
6 Y! f/ ^+ o: u" S& Q7 ~- drive-open-drain;! e* t. n. T( c) c1 ]3 [3 s
- * O2 E' g# N: L$ @2 K5 U
- slew-rate = <0>;, [" F% U5 g* t! Q
- & A$ p: \. b* c0 B3 N
- };% p$ J/ t$ z( T( K5 @
4 A' S2 }! m' B' D) K( k/ o- };
' }8 I$ u* S0 G) F; @! G2 O. H" N - ! ~! t1 Z; B1 T" X& ~+ Q: F
- i2c5_pins_sleep_a: i2c5-1 {$ g6 W4 F$ [' {' x) ~ R
- $ v; h) b3 B. }7 F
- pins {! Z) U( A/ J, t& N
2 N" |1 n1 A- n# I3 Q# z- pinmux = <STM32_PINMUX('A', 11, ANALOG)>, /* I2C5_SCL */
( L: A# D" |' O* t- o- l - 2 `/ j* v; B6 j
- <STM32_PINMUX('A', 12, ANALOG)>; /* I2C5_SDA */3 A5 D" a* z* J- r8 ?1 Y- p0 O2 S% f
- % ^8 _ h. a. b1 W) u! d1 c
- };
# f# W2 L( P" G8 G4 _ - 8 F9 ^3 J. X! e8 D
- };+ Q# c/ d& W# {. L- K5 v
复制代码 7 W0 K+ ^* Y; k& O, g2 T& [
2.I2S2设备树节点
& z8 w( s4 |; K. _# Q; h& C5 L( O/ w& M( L/ ], u9 q
3.LTDC设备树节点$ _" ]2 N" s# ~/ x
SiI9022实现HDMI输出需要RGB信号作为数据源,LTDC为STM32MP157的LCD显示控制器,可以输出24bit的并行数据,HDMI显示首先需要驱动LTDC。
3 f6 }4 X: q' c. ?
2 B( I+ y2 y4 z% i) c6 q2 A9 r内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
! J; _( C! L c/ t I4 m* \; s7 b/ u. i5 T- V3 i% t
arch/arm/boot/dts/stm32mp151.dtsi) D9 b2 g5 o' ~2 `" W
* W+ u- F* a7 O3 sstm32mp151中ltdc定义如下: n5 e9 V% [: w& S' N) l
) @' J& G# {) }% X- ltdc: display-controller@5a001000 {
- P" X7 @6 Z: U5 E9 q* ^
# X3 S& o* N, t0 q7 x& {- compatible = "st,stm32-ltdc";
6 _7 G9 A# W5 D: T& `3 p! _
- F/ I5 Y( P7 K( H1 m5 }" z* p+ T- reg = <0x5a001000 0x400>;% ], m0 y4 q t* o/ E1 J" I* y# t0 D7 `
; b y/ F6 b- {% W- interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
+ v. G. i: U3 V; P - / U/ Q; w3 W8 h' X+ V3 [7 h- I
- <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
5 z3 C9 r; O4 g9 L# k$ i* [ - 4 p' o+ W8 @; X' z6 I& g# S
- clocks = <&rcc LTDC_PX>;* f3 X+ n" }. Z, e t' e2 C5 @
, q& i6 e, j# w6 u6 i1 l- clock-names = "lcd";
* T+ u L/ d w- w& {" a2 n+ l3 ?
" T2 t. y8 B0 J* z- resets = <&rcc LTDC_R>;
2 b+ L$ W( W6 c' h1 {( F) N9 j+ m - 1 o' U$ @. e1 T, f; a- T- t" Z
- status = "disabled";( z- F. v+ o/ d* i6 K' ~
- : X3 Y) p4 F- Z7 n6 W( M
- };
复制代码
6 m3 D) |/ n' _1 u6 e上述代码只对ltdc做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。
$ O- f1 Q- x( y9 a3 K4 d- Q- G7 j6 g2 I1 P+ r
参考stm32mp15xx-dkx.dtsi对于ltdc设备节点的描述,需增加内容如下:
0 s2 w8 q) E1 Z( i& N6 `7 E% y* y. N
/ M1 X8 C' |2 n4 f8 c0 z- <dc {
, D3 Q, j& T( ]: z$ {
: [) E6 i: T; S! V6 r/ O- pinctrl-names = "default", "sleep";5 Z" h8 `- _. e% _
3 U! ^ m0 B. e# R V; D% m- pinctrl-0 = <<dc_pins_b>;
- i2 D* N% r$ _& _& Q& U
: P: q5 z3 T Z4 d" h; V" i- pinctrl-1 = <<dc_pins_sleep_b>;6 c+ j- c: J7 w- P$ P
& x# Z( b/ e0 p' P- status = "okay";2 b/ Q1 z; `1 z3 F& r( o
) a- ~7 d6 ]& B; a- port {/ f2 b7 o9 R$ i* P( s. @
- 3 R# A# k* T" Y: J6 R- \
- #address-cells = <1>;9 ]6 W! O T* U. k y4 X6 N9 z
- 6 N2 ^ x; k! {' ]
- #size-cells = <0>;
/ X3 J# j9 E# x5 v- F% [, Q
( I. Y+ n% \- P s- ltdc_ep0_out: endpoint@0 {
! [9 _. l" i8 Q- W H& ^
8 R- @2 l6 X7 q0 h9 c0 d6 d- reg = <0>;! r; M( H5 L9 o6 h
0 h% V8 f! t) Q* m3 Y$ w3 e- /*图像输出通道,需对接显示设备*/
2 y4 Y3 r/ A5 Y% _. P6 |; f( x
4 X9 w# d4 a l& k6 F: l) ?- remote-endpoint = <&sii9022_in>;1 G+ U: Y* C: {! E( _! B
- 5 Y, @, O- @- k% P
- };
& i( c: m1 r) x - ) J0 j8 S1 g' ^) g/ p/ }: l
- };
6 V6 Q$ x7 h4 S. V" z0 U! ~+ N8 E - - o/ k4 m5 Q4 N. W n
- };/ \* f9 R7 Y- U0 T) b* ~# n
复制代码
% J7 q# \7 @; S7 W" a" h3 j由于stm32mp15-pinctrl.dtsi中对于ltdc_pins_b和ltdc_pins_b的定于与板子实际使用管脚一致,所以无需修改,内容如下:8 r* F% P! s# g) p
6 } G3 G: K) c3 C' F( |% m! q- ltdc_pins_b: ltdc-b-0 {
1 k2 Q# j* L6 `# p ~) l - / h9 s6 Y2 n' Z0 M+ b5 H
- pins {# p7 F8 I6 {3 `1 x2 e4 {
- ' B% l' h; Q* R2 y) ?5 [
- pinmux = <STM32_PINMUX('I', 14, AF14)>, /* LCD_CLK */
8 f8 f1 \) b' }- a! |$ } - 9 _. C8 [- _9 ]9 X9 u7 u
- <STM32_PINMUX('I', 12, AF14)>, /* LCD_HSYNC */
2 U5 ~! V+ E2 B( v( C
; O; @! Y, |$ L( A- <STM32_PINMUX('I', 13, AF14)>, /* LCD_VSYNC */1 y( t; E, H% e" D! I
- " ]3 B& _" \' q% z9 G8 L2 T5 D
- <STM32_PINMUX('K', 7, AF14)>, /* LCD_DE */2 ^- j# X& I5 b9 N+ |% s
- 6 c1 ?$ k2 X5 a1 C0 q& [3 v
- <STM32_PINMUX('I', 15, AF14)>, /* LCD_R0 */0 i& u6 K9 Q6 m
- 9 K* K1 M& x3 _' Y
- <STM32_PINMUX('J', 0, AF14)>, /* LCD_R1 */
% P; Q, x0 @* \: b2 D$ D) ~ - 9 {: j& G- m2 w' E3 C1 x; L
- <STM32_PINMUX('J', 1, AF14)>, /* LCD_R2 */
4 e v+ \# L- J4 O! S - 1 D! s$ J/ @2 u, B5 |
- <STM32_PINMUX('J', 2, AF14)>, /* LCD_R3 */
+ Y0 |4 M. F q
+ v" { ~2 m7 H) ~/ f9 r- <STM32_PINMUX('J', 3, AF14)>, /* LCD_R4 */: f4 K/ r2 W" c
9 J n+ J. d" O% b. {- <STM32_PINMUX('J', 4, AF14)>, /* LCD_R5 */
& @, v( t' B; O: z* i& C$ B - " C' b# n, x Y, U
- <STM32_PINMUX('J', 5, AF14)>, /* LCD_R6 */
* O% f% Q/ ] V - $ N2 N+ G( K3 r- u z/ O
- <STM32_PINMUX('J', 6, AF14)>, /* LCD_R7 */' c- Z% f: ?( L: t8 |
- 0 J, K. V! U# }, }5 L8 W" v6 i% Z1 R
- <STM32_PINMUX('J', 7, AF14)>, /* LCD_G0 */0 l9 D* h* S% K
- + Z Y4 V' ^( y% [2 Y" ^- X% b* {
- <STM32_PINMUX('J', 8, AF14)>, /* LCD_G1 */
- {: t5 |: p. q: _ - 3 O( |+ p& \6 D9 h$ ^
- <STM32_PINMUX('J', 9, AF14)>, /* LCD_G2 */
; ^6 l* u: I% u. ~4 o( _& t* N
* y. [: R) f: P+ D- <STM32_PINMUX('J', 10, AF14)>, /* LCD_G3 */; b$ s" V4 Y$ R! [
" s$ Z8 q; Z+ [- n3 k ]8 M0 i- <STM32_PINMUX('J', 11, AF14)>, /* LCD_G4 */
3 w1 i+ l% F$ x0 Y0 i+ T; u# g) \
6 h3 k* U/ F; ?- <STM32_PINMUX('K', 0, AF14)>, /* LCD_G5 */* F4 c; l% i7 @; d! u* r- W
- 2 |( r7 O4 b& \% U
- <STM32_PINMUX('K', 1, AF14)>, /* LCD_G6 */' k5 \5 b& A- W1 ~4 b4 a" L
- 7 b6 n+ Q# ?( ~+ W
- <STM32_PINMUX('K', 2, AF14)>, /* LCD_G7 */
% u" a& n3 @) t ?# @ - / U4 Q2 z$ I. F! s* U. b* @* B
- <STM32_PINMUX('J', 12, AF14)>, /* LCD_B0 */; z2 _, n" L6 C, G' h# R
- , A4 k$ [5 h' D+ C3 _. K4 b9 z# ~
- <STM32_PINMUX('J', 13, AF14)>, /* LCD_B1 */9 f- s4 i4 G$ U, }$ h R1 x
- 0 q( f* s O" b9 Y
- <STM32_PINMUX('J', 14, AF14)>, /* LCD_B2 */! Q1 X2 H" n4 h
- * Q+ f7 \+ {6 P5 f/ I. ~# d
- <STM32_PINMUX('J', 15, AF14)>, /* LCD_B3 */
/ m/ d4 x5 P* P: F
; e; g9 v" q9 Z- <STM32_PINMUX('K', 3, AF14)>, /* LCD_B4 */
5 R) h) i9 _! E2 V! R' f - / p# y+ H g8 s7 U
- <STM32_PINMUX('K', 4, AF14)>, /* LCD_B5 */8 ]4 _. F8 i4 L3 Q
- + W# U: r" P; g: e+ j
- <STM32_PINMUX('K', 5, AF14)>, /* LCD_B6 */$ f8 D5 P6 A- E' E, a
& G/ z- z8 ]9 E) f( k# B- <STM32_PINMUX('K', 6, AF14)>; /* LCD_B7 */
% h) F+ r) I4 ^" u* j; n - ! D; s! {" I9 G0 {
- bias-disable;' T5 }$ ]3 n1 |$ `0 L) G& D
- / e# T5 ~% _7 P. ]
- drive-push-pull;, }7 p \3 Q2 s4 E0 ?: _
- 1 x3 s( f2 n' i9 \5 n! A- ?) @) V9 m
- slew-rate = <1>;; O% x& A- f" C: B' J+ p
9 T0 I! B( u* [) c. i2 A( v) v2 b- };
, Z$ ~) y3 r2 O9 ~' U4 e
3 g& e( X& E/ B4 @0 Z) \3 E% h! O$ i1 K- };
% m/ ]4 H2 e5 ^7 a
7 B# j& l0 O3 a8 ~% \8 R; o8 l, K- ltdc_pins_sleep_b: ltdc-b-1 {* r, \$ P. V% I- E2 {+ q
0 S {) J. e/ R L8 z' m- pins {: {0 W5 i: \: Z' z4 `5 T
# |) _2 U/ g) M d5 K( ^- pinmux = <STM32_PINMUX('I', 14, ANALOG)>, /* LCD_CLK */
# |5 \6 N* ]; {* X9 d
( z- }0 T& `/ ~% X6 P5 M2 ?+ P9 r/ }- <STM32_PINMUX('I', 12, ANALOG)>, /* LCD_HSYNC */
) e. S4 Q2 K0 i0 }/ a' X
; {: `+ `; M- A) y& {- <STM32_PINMUX('I', 13, ANALOG)>, /* LCD_VSYNC */, F6 K- \+ p9 @$ ?0 I+ c; A. R
- 3 u( l% y3 O& [5 g. d7 W9 b
- <STM32_PINMUX('K', 7, ANALOG)>, /* LCD_DE */! S; K2 }# }) ?3 Q. \1 D, ^
- # p x, m" ]* Y1 N ]- i' P6 Q" c$ t
- <STM32_PINMUX('I', 15, ANALOG)>, /* LCD_R0 */1 W9 n+ b8 O" U+ w
' o% n7 X- {8 e; Q- <STM32_PINMUX('J', 0, ANALOG)>, /* LCD_R1 */
5 P: h. Y' A7 |' K4 r
/ H! E' A- ~: d( j" `7 L: I- <STM32_PINMUX('J', 1, ANALOG)>, /* LCD_R2 */
, n4 D" H" ~9 T9 J9 H& c - + {9 C' w! L- ]2 x7 c
- <STM32_PINMUX('J', 2, ANALOG)>, /* LCD_R3 */
/ P2 X% i. l* k2 x+ b - . T) n* @7 h0 f2 U
- <STM32_PINMUX('J', 3, ANALOG)>, /* LCD_R4 */; l: i4 c* X; j( W& h- `
% T4 a2 g! Y2 Q* a9 v0 J' `- <STM32_PINMUX('J', 4, ANALOG)>, /* LCD_R5 */: f2 ~, [ T) w7 u3 n+ C- l
- % z" K! ]0 L4 d, k
- <STM32_PINMUX('J', 5, ANALOG)>, /* LCD_R6 */9 d+ {' d4 D. l0 H2 q$ J1 y+ A
: G- r4 q9 S; F- <STM32_PINMUX('J', 6, ANALOG)>, /* LCD_R7 */" c4 A7 V/ h: c; n7 h" @
2 @( \" [' d5 U/ {- <STM32_PINMUX('J', 7, ANALOG)>, /* LCD_G0 */
* T4 @# T9 Y/ ^) j' _
6 Q |) V1 U3 Q- <STM32_PINMUX('J', 8, ANALOG)>, /* LCD_G1 */
9 E) Q5 ?7 Y1 C& I4 R
, U- O0 `# n, u* B! y) N- <STM32_PINMUX('J', 9, ANALOG)>, /* LCD_G2 */# ~; f+ P; G! q4 j% W/ V4 y; |
- + O$ i2 }2 S% w1 m3 t5 v, [ A
- <STM32_PINMUX('J', 10, ANALOG)>, /* LCD_G3 */( X& d! G3 a, y6 K+ K6 C9 |
9 w" _4 q* Q& k+ D- <STM32_PINMUX('J', 11, ANALOG)>, /* LCD_G4 */
) }" ~5 Y$ Y) n( y2 p2 d3 | - # |. k. g$ ?, C' X' O# g
- <STM32_PINMUX('K', 0, ANALOG)>, /* LCD_G5 */1 W9 y* V( N; u# _7 x. ^
" a- K6 A. M! J0 A3 S! D- <STM32_PINMUX('K', 1, ANALOG)>, /* LCD_G6 */
" `% c9 y9 j1 C
, O' R# d* ?, I# H) T- <STM32_PINMUX('K', 2, ANALOG)>, /* LCD_G7 */2 ?8 L2 z3 y2 V
8 u# w+ P- h0 e5 }- <STM32_PINMUX('J', 12, ANALOG)>, /* LCD_B0 */
6 ]' z% i3 b& @) ? - w# }/ `+ d2 }. i8 |! N/ Z
- <STM32_PINMUX('J', 13, ANALOG)>, /* LCD_B1 */* z: K0 C: i! O/ L$ w$ I* S: _$ F
1 M1 P: E- i% _5 j9 J- <STM32_PINMUX('J', 14, ANALOG)>, /* LCD_B2 */" k/ g H3 l, ]
' {) v; S* B# o' P( r7 ~- <STM32_PINMUX('J', 15, ANALOG)>, /* LCD_B3 */- |/ F+ @1 L' ~* ?7 c
7 k- @+ B+ h! Z, p( \& |- <STM32_PINMUX('K', 3, ANALOG)>, /* LCD_B4 */$ ~" \3 n" r& [
4 L9 d6 g* X; X( l! S- <STM32_PINMUX('K', 4, ANALOG)>, /* LCD_B5 */
2 j |) o, Q6 s0 n2 K6 C# X5 \3 V
/ p }, K0 ^' ? K7 Y- <STM32_PINMUX('K', 5, ANALOG)>, /* LCD_B6 */
f8 I0 w$ x- {
% a' r. u; R; e. A- <STM32_PINMUX('K', 6, ANALOG)>; /* LCD_B7 */7 G2 d/ r7 |& X, v1 G& p' a' N
1 o1 D1 m* C8 y* x- };$ Q: g7 Z( ?: O/ A. X" [% V
- ^4 j) i/ D+ ]; @1 L# W- U- };+ S( o1 ]1 a6 P; ?
复制代码
: A8 @- ]2 o2 j' _3.SiI9022设备树节点9 Q& v+ b' z! e: F3 \
由于SiI9002只是I2C5总线上的一个外设,所以STM32MP157A的通用设备树文件中并没有相关的定义,结合arm,hdlcd.txt和stm32mp15xx-dkx.dtsi对于HDMI的描述,增加SiI9002的支持,需在I2C5节点下添加相关信息,添加内容为:
1 ?, p& h. Z9 Q& N; w8 }' Q- c/ w) d
! L, z2 u& o! o- hdmi-transmitter@39 {- F# z7 l9 ^" F( b/ O
- 1 X2 _0 n$ V7 Y* L
- compatible = "sil,sii9022";3 J$ n6 P+ _3 m6 [$ Y. ?3 _# V
* Q5 o& P* F' d) @- reg = <0x39>;
. V6 U5 p$ y8 l5 ~( ? - % A! E7 a# h6 R' @
- iovcc-supply = <&v3v3_hdmi>;; t8 @0 F$ b3 d# R; n$ q6 [4 C
0 ^6 U* M3 M; q& E% n8 k- cvcc12-supply = <&v1v2_hdmi>;) q$ L3 j5 L$ g" q
- , u/ u8 i. k# Z0 w& A
- reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
7 X8 v4 b P) M9 _) T - - R) X: l; Q# f a. U
- interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
$ |% {( _5 D) A/ T7 z: q" I - 2 u9 J: f' i) _8 n
- interrupt-parent = <&gpiog>;
2 V# q# B" t( n) ~" Z9 f. ?
, V% @) V* c- Q9 _+ k8 Y: s- #sound-dai-cells = <0>;" Z- f9 N7 i0 C; @8 m1 M9 ]9 `9 L0 T
- 3 z! b/ ~5 S1 n
- status = "okay";: g5 b! b- [& S8 ^( }
2 E: X" v- F+ ]/ `- ports {. _) D4 ]# m- Q. b: x. {/ q
4 T+ L4 I7 L+ q8 U- #address-cells = <1>;, F9 S9 x" S2 ]- q) X8 h1 ~. d
- ) y6 {' G" B% x. h n: ?
- #size-cells = <0>;! X M" K8 r5 C. |3 W' ~; ]
) j( d* Z1 e E- port@0 {
# \0 ^' y: X( |$ N# c1 L2 W - 0 M2 y* T g% Z: n* L2 [4 l+ g. p
- reg = <0>;
' X, C& M8 J( V6 j5 J
0 K. B) _* t1 \' O8 X; [* Y- sii9022_in: endpoint {' T F4 u+ `1 Y1 q
- ( f. p" m9 n( R$ ^4 Z8 M9 O
- /*视频输入端口,与LTDC输出端口对接*/
! n3 y! c. y) ~ - # m9 [5 K3 \1 a3 f, U
- remote-endpoint = <<dc_ep0_out>;
& Q' }! ~' s- n" D/ e4 W - & h, P, w7 [1 }( w+ V; y/ w4 ^
- };
0 H6 t M9 z) H0 H
2 A, t' ~+ o% m$ e2 }4 @- };
9 A+ z; z5 q, P$ D; C' O - * l$ b' s6 O' I5 w" J- r8 r# G9 W% A
- port@3 {; g- E# N% A# K# x* ~- a1 B2 S7 d) V+ k
- , {2 C4 p" |# h5 Z2 e
- reg = <3>;
5 P5 d8 p8 D/ I- P - E3 J/ F, t8 N1 r) T4 @1 r$ o! }, I
- sii9022_tx_endpoint: endpoint {
. a \! f% N/ }$ [! b* n9 Y - 2 |2 O7 Q% [' R2 R1 e0 K
- /*音频输入端口,与声卡输出端口对接*/2 ^( Y) @. a. t! A3 |' s
8 v3 i" ?2 D# C& }* f- remote-endpoint = <&i2s2_endpoint>;3 ]1 ^: t' r. Z: x
- 8 n! z8 i7 ^; J& i2 |( {
- };& H; Z* L/ I" {, Q" J5 Q5 M# |. e
! p$ ]/ r. ?# t- };
& S! ^, z% I; I8 X) y3 [) k2 H
& G4 E6 G/ h5 [. U- k) x: ?" E- };
: L$ Z7 D7 s. }; }; e P9 r. q1 Z - 7 k5 e1 s7 A* A5 Z2 M
- };
复制代码
' e' P- B& S( K6 M/ k4.电源节点添加3 A0 S- e1 _( i
由于内核中很多驱动会根据电源的方位调整设备的工作方式,所以在设备树中需要传递相关电源电压参数,如sii9022驱动中需要两个电源分别是iovcc和cvcc12,但是在设备树中并没有这两个电源的定义,官方参考板DK1使用的是MPU作为电源管理,而FS-MP1A使用的分离元器件的形式,所以stm32mp15xx-dkx.dtsi中对于电源的定义就不实用了。参考内核中相关文档添加固定电源节点的形式添加iovcc和cvcc12即可,根据sii9022的需求,iovcc和cvcc12电压分别为3.3v和1.2v。2 s- ~6 A) }* s/ x! k- j
2 I# X! n0 |. M4 s S- Z4 t1 y需在设备树根节点下添加,内容如下:
& i9 d" s+ H, }1 {0 w0 J7 f& S' `! _, E+ |
- v3v3_hdmi: regulator-v3v3-hdmi {) T8 @* @ X- V3 i+ O& x3 P
d! [, h8 P' c. P1 d0 Z7 P- compatible = "regulator-fixed";
' D/ X1 Z8 C% g8 a# \3 } - . y- w% v+ F3 @5 o) N
- regulator-name = "v3v3_hdmi ";
2 A% U4 T4 \5 Y G1 X/ f - * y! | I& M9 u- p4 W
- regulator-min-microvolt = <3300000>;
+ u& t o/ V6 Y: W - ; B R& L0 p+ {# ]" F8 C. T
- regulator-max-microvolt = <3300000>;
, U5 H4 G7 [$ h* q/ I
7 E" z- D6 ~, }& Z4 F7 z# W' J- regulator-always-on;: Y5 t7 X! Y5 {
Y2 X) ~0 i; _% h) i3 U- D- regulator-boot-on;
; |' d9 q- d8 x$ x6 t! _ - ' D4 ^# ^9 A" `; |/ k
- };7 w( L# g( `7 F, c q0 L
( m( J0 q: v! i9 D4 V- v1v2_hdmi: regulator-v1v2-hdmi {& {8 t* ^' W8 I& e
& w% ^; Q2 N: }- compatible = "regulator-fixed";
- Z0 i' Y* A6 k5 d' h6 o - 2 M$ Y* D5 [, D9 r; w% l
- regulator-name = "v1v2_hdmi";
! Y, k1 f' g. j6 C
% `) @9 ]' t) `- regulator-min-microvolt = <1200000>;
* {" C i& r- k A: F* [
( K- M+ m; w% u% B6 b/ G% T- regulator-max-microvolt = <1200000>;
: G0 p7 A: n" v) V& h7 | - 9 D4 a6 Y# X9 C& c
- regulator-always-on;1 E2 N, D4 k5 B
- # T$ l2 c) `& M0 p3 J- a- M
- regulator-boot-on;. t/ E2 h8 @9 k2 T7 x$ ]
* h, c( p/ C/ f$ I6 M- };
复制代码 ( O5 Q7 ?3 T1 ` b
1.2实验目的
: P* f9 ]; J: o3 ], [熟悉基于Linux操作系统下的HDMI设备驱动移植配置过程。
5 e9 U, O% s) h4 M9 M6 y
) S: E* @* v1 v* ~5 o1.3实验平台/ K+ L- o- F( J2 t+ }! g
华清远见开发环境,FS-MP1A平台;8 `1 [. _0 `$ u7 P @1 U; ?4 c
+ o% @! }6 b( \$ {# |& Z
1.4实验步骤 T8 v) A9 H- ]/ u3 W0 R
1.导入交叉编译工具链9 [: U% N G3 t3 J5 F
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi. n# U/ W' B1 ^) x3 Y) a
! K2 W! X3 l" }6 N2.添加i2c5及sii9022内容. P/ @/ v* e z3 c( R
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:7 }/ v9 Z3 R: h4 ?: a/ j" H
" V5 y4 U/ s8 j7 O3 Q- &i2c5 {
7 ^. l- t, V3 \. O6 L3 Y* X
# q+ M# V2 u9 i, ~' r4 B5 f6 Q- pinctrl-names = "default", "sleep";! R3 r2 P, `/ h+ M1 K4 V% |
- : ?1 b4 ~; W; q* g
- pinctrl-0 = <&i2c5_pins_a>;$ B0 x7 @; A0 F# e
- 1 N0 b4 w) T* t5 [! X
- pinctrl-1 = <&i2c5_pins_sleep_a>;
7 D- Y8 @- [2 x8 J3 I7 e9 n$ Y
1 f1 r7 A8 |5 A2 b. I8 M7 \ A2 ?- i2c-scl-rising-time-ns = <100>;2 Q) e) `: A3 Z# H3 t0 Y
2 Z# t% T/ q/ h: o; S: V1 d6 w- i2c-scl-falling-time-ns = <7>;
: ^) i1 c" ]2 s. F
% q+ r" N' u0 q' N) C- clock-frequency = <100000>;
# ?8 Z' A z4 R* _+ @/ j" ^5 f
+ q& f4 P7 u) q. R. v2 } i1 i; v- /* spare dmas for other usage */
# b; m3 }8 b( X, K& R, R
8 p% W1 V7 ]3 p4 s- /delete-property/dmas;
1 M6 q- ^- {! ?1 _ - + Q& ~. b" b6 P3 [
- /delete-property/dma-names;
1 `) \( R9 | v! p" s - 4 \* d; F- Z7 k2 t( ?8 n j& Q
- status = "okay";
O0 T( f9 p$ n* N - 9 C4 V6 |) u' a' M
- hdmi-transmitter@39 { V3 \2 X! D- V4 g9 H# C0 ?8 V
1 b0 f C3 P4 V# A- compatible = "sil,sii9022";
+ M' Q2 S+ R0 \" L( }; l) m- {+ n
5 a+ T% Q/ W/ w# U8 p- reg = <0x39>;
+ r8 r( z# n" K d$ {6 E
5 _( e+ Q2 z6 S5 \7 S- iovcc-supply = <&v3v3_hdmi>;$ P, ~4 W1 i, @4 I+ Q8 H
+ e' S; c$ B8 T: N8 I9 I7 x* {- cvcc12-supply = <&v1v2_hdmi>;
' |2 A4 \; v6 F" w
. u! F! ^" s9 E* J- reset-gpios = <&gpioa 13 GPIO_ACTIVE_LOW>;" y: v/ V" I6 n6 u1 j) @; _- U
- $ k# D$ ?- [! A/ B6 d
- interrupts = <14 IRQ_TYPE_EDGE_FALLING>;
8 |& d! f* n. V$ Z6 f& _' |3 Z8 u - 5 ~! P5 c9 ?" G3 R; v
- interrupt-parent = <&gpioa>;
, `1 T- H4 _, L - % \3 Y" R) ?- M
- #sound-dai-cells = <0>;
. W+ P/ f$ [/ H6 E9 K; S9 P
E0 X+ f6 O6 {& g. m" U" D# X- status = "okay";
7 \( {) K1 P3 }; c0 S M6 ~ - % Q: L9 p4 N; B( z3 r
- ports {$ A$ l3 h% B' |7 M
- $ J- x7 i2 q2 R+ i$ L
- #address-cells = <1>;
. U3 {: i( M4 M( x6 V3 d - 9 A3 t9 s1 _! B M
- #size-cells = <0>;; B2 ^9 y* P% h' N3 w
: V0 C% n/ ?" z m) y; I- port@0 {6 k+ O& ?) w. J' \
- & d) h: e" n7 h5 K
- reg = <0>;
5 R) l0 [% i! }( w6 l - * _) l( o* ?, P
- sii9022_in: endpoint {% L/ w K @" f7 s2 r1 S/ ]
- 5 @& c# G( s' ~/ Q: c, G' q
- remote-endpoint = <<dc_ep0_out>;) b0 G. t( b' G" ^
o5 W) C; C) F- };# Z V V0 ?( B. H8 k Q* M
" O2 s+ [" p$ }# C5 x% W( k- };
( g& N, @9 y+ W* h* W" E
4 N- C1 N2 x% y4 x- };
, r+ J3 X* B- |7 n1 m
3 P1 P6 ^2 T* U' l& V6 d- };) o6 i6 t e9 j; ?# M. C2 F I
- _; l: {7 g! h
- };
复制代码
0 d* O$ c7 l; ~# |6 ^7 j1 q3.添加ltdc内容4 Z$ ?2 W7 ~6 Y# X7 W5 ~8 J
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:% I7 }: i# B; I1 v4 o
8 `9 r8 x5 M0 I: w- <dc {9 @" S% R/ C4 w; N* Q4 _- ~
- 6 c4 g9 F7 U& I7 s; K3 v7 s
- pinctrl-names = "default", "sleep";3 K! Q2 q' A4 v, Z/ T
- 7 C9 E. @) C3 [
- pinctrl-0 = <<dc_pins_b>;# E$ F( ]1 ?+ X9 V
. k( b- i# N' X) x8 N( X0 S: M- pinctrl-1 = <<dc_pins_sleep_b>;. l- v# P+ Q) V5 v, [
/ B% D7 [0 H' z- t% U# B+ d8 X- status = "okay";) z" q/ L6 t- @9 d( X
, y3 l+ U* V' E* l. W7 D) P- port {5 N m% g+ q5 q0 ]7 {( M2 d% z
- ) I- N( c' j+ T( K2 _
- #address-cells = <1>;
9 H4 T; g! y9 G: f& V& H; u% l6 K - 8 B) _! _) s/ Q, I1 y
- #size-cells = <0>;
( u; \# R" ^' I4 i& w - $ Q: p& B( Z; E- E" b% I l( c
- ltdc_ep0_out: endpoint@0 {
/ g1 S# f' s! P - / z3 l! _& u9 }8 F
- reg = <0>;, D8 E0 o* j( W. N9 M
- 4 }/ k5 N6 r& ?
- remote-endpoint = <&sii9022_in>;2 i) |1 X( C( T, J
- ' L; T2 ]5 @/ i& a4 E' h
- };
- w& ?$ x; T2 i/ Q$ E5 w
4 ^0 i, d" q' p8 F0 P) z- ^- };
! J2 U) n) p9 ]1 J: y
9 H6 c4 O; r# v! t- };
复制代码 7 v- D( g( u: Z1 y* L c* z
4.添加电源内容" s/ Z/ g! s' o3 D9 ?/ a& r8 {, s! \ X
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点末尾添加如下内容:/ i9 X4 J7 n1 }- q1 Y! S6 [
0 T8 s1 i% I( ?7 l5 {- v3v3_hdmi: regulator-v3v3-hdmi {
* b5 L) ~. X$ h+ k - 2 S& }6 M/ j7 X3 [
- compatible = "regulator-fixed";
1 R8 ?5 l, y& m( X+ @
4 y: k. u' ], c7 j. {1 P- regulator-name = "v3v3_hdmi ";
# F2 `! c7 i# I1 n' N6 y$ d4 o: v
0 m) Z2 _2 O1 ]5 |) w- regulator-min-microvolt = <3300000>;
' C* C' d, `6 l) ^
+ ~ y8 E/ T- I- i# h9 A6 H9 b- regulator-max-microvolt = <3300000>;! L4 m# p& J$ p7 b8 m
( u$ \! p- |2 a1 k7 S- _$ G- j- regulator-always-on;
, n7 Z5 }1 ?4 e; [ - ! D* H N' ]. ^' U/ _
- regulator-boot-on;
4 a. E1 Z& i2 H4 U% Q+ D1 T% G - $ i6 t1 r8 t$ h, u
- };
& x5 y. P# R' r( K+ S# ]
1 r2 g1 Z3 j) V3 O" P9 W9 B- v1v2_hdmi: regulator-v1v2-hdmi {' U, F. E+ E7 v, m' p
$ h) s1 O. o4 ~ w- compatible = "regulator-fixed";9 S4 \) d) S. T
- ]5 P8 r& ]0 d$ x: t+ a
- regulator-name = "v1v2_hdmi";
8 \( ?; `0 x8 {# {8 D - t5 a6 a* k: W9 }
- regulator-min-microvolt = <1200000>;
q0 @- i+ F5 U! e6 |2 s8 V9 A - # T4 z& }* N; v$ M) H+ M
- regulator-max-microvolt = <1200000>;
7 ~6 W9 S6 M+ ]9 h: ?& W: P+ o
6 `& F: l) a- W/ o5 ?- regulator-always-on;
3 q* y3 ]4 x, h, j3 Z
" D( h7 G% q2 H1 F/ o- regulator-boot-on;
) t; S, q! G. w* d/ N$ e4 z - / ~( s- b3 O' R
- };
复制代码
2 P( W2 b8 j8 x7 S5.配置内核
( n& e6 X2 y0 u# d由于内核源码默认配置以及支持sii902x,本节列出主要选项,如下:
2 K! o! R6 z5 B8 L" |8 c. u) d& D5 V3 R: A3 z: o* S8 B' B
linux@ubuntu make menuconfig
: O c7 e3 w9 \8 D) B- \3 ^. G/ V7 [- {- k& u- L0 e
Device Drivers --->
) d2 b N" o$ Z# @# y- @9 S4 I6 ], _: M1 L$ j& C
Graphics support --->
& Z% v* M H, n- M+ E5 G; s) e; @4 V
: r+ z+ [2 m; f+ M- z<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->) z0 g+ a5 U% U3 v6 g
) J* T* }+ q, n3 [- u7 W6 Z) H
<*> DRM Support for STMicroelectronics SoC Series
2 X' m, D q/ q F
# H3 ?! y- p8 xDisplay Interface Bridges --->
- t; v' e) \5 o+ ^: t8 U& S# E8 u7 [$ Q6 L( u
<*> Silicon Image sii902x RGB/HDMI bridge9 u. b7 P3 u! o& r+ c' q
* M0 N j2 i) v7 @
6.编译内核及设备树:
" l) u4 q0 _1 n5 glinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000400 U) ^+ W' f1 o
3 n1 M- p( _. m4 j7.重启测试; D t, `( ~! A
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。
( L7 [8 H' x$ Z0 J3 n& ]
1 T3 ]- [8 Q% }- b7 X
- D8 W% \5 E! D
3 D+ w) t0 o4 }( ]————————————————
/ o- Z* G. \2 m/ N1 O版权声明:华清远见IT开放实验室# W, `" }' A) C8 @$ O7 A' ^* g g6 H) u
7 r6 I+ E. [4 p5 g+ G& S( C& I+ C% o+ R V
|