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

STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理
  p6 F! W  l- u2 zDSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。
* I1 B0 Y# n5 q0 I* e0 q4 ?2 M* R4 b. x
MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。
% y! h2 _. M1 o' J" D# ~
# t. R5 W. E5 ~9 |3 A+ x! r* m edc326cbe2a595fc4b1166c428f390cf.png * [; u7 J: N& s! `6 D
! P6 z1 r5 \' M# W" l) W0 w
FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。
6 h6 j7 w# G" V1 N8 _) `2 C  G5 T( z' x
bb2cebf753fade0b3a712cbdab54f2c3.png
& S6 m4 J5 a; y& g, F7 K; p4 y
5 l- D, s1 Y5 G6 X/ ~  O, M上图为MIPI LCD的接口,接口信号线分为两组,分别是由DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN、DSI_TE、DSI_RST、LCD_PWM组成的LCD接口和由I2C2_SCL、I2C2_SDA、TP_RST、TP_IRQ组成的触摸屏接口,本节介绍LCD的支持。8 r( ?4 k6 h, v2 d' W. W- |
) Z8 x3 A7 f# _/ u( l  m
DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。* ]$ a( \; [/ {6 V4 U" w8 p( x, a- u

6 Y' K6 v  y# |9 v7 ?MIPI LCD接口管脚对应关系:, O+ E% J* B3 q; y& \
$ z7 x' k4 H0 J7 p
69260c05eeb6ed21b9271b6430afe809.png
; j+ l: i- o2 u1 H! X1 \& Q) N  p7 A" h+ w3 S* v! U0 [9 h
989321323dbac9ca83311c4b7d45e11c.png
; v$ W3 E( e2 n1 o
0 @- f$ K8 H% [" F e6cbe903854fd66e44880f300d4a184b.png $ U4 F) x9 T" I( h7 N" O  ]; |$ X
$ P6 M8 H9 c- @# ^9 m- b- }* z. d
43e8dd79ca02794994127213f61ac3db.png & L, U% `* ~, ~. O4 m% |+ F
%2IAQZU(INJWMPJ__5)R@(N.png & @3 s) M) E. t' x  X# I! ~4 w3 H

" k% ^$ s5 r  b. c# j1.PWM设备节点) A! J* T6 |+ _/ _6 X. w

) Q) ?; h1 X5 N! y. s" h2 g( V内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:& t1 _% D1 q9 H  v% o* O
( m  F. z; ^7 H% I
arch/arm/boot/dts/stm32mp151.dtsi
2 [& y$ L" Q! g& [5 r; B0 c+ \8 U9 J0 Z. l" g" b7 d
stm32mp151中timers2定义如下:
% c$ \( V( U6 \9 g0 u: B- t( w& ^/ H# F1 S. N% {
timers2: timer@40000000 {6 \* c: L: a7 F4 M8 `6 J- W
0 `7 w3 c# T5 ?5 v1 q, m
#address-cells = <1>;) \( V! d. \3 H* e8 K

4 H6 T3 ?  @8 S; ?8 [# L5 d5 M#size-cells = <0>;
( }" Y2 k: z9 H1 T2 s
* k: }& h: v2 ?) M! vcompatible = "st,stm32-timers";
" A- \( R& B8 p! A' ~3 u3 ^1 N
" c0 D! h% r  Z. \reg = <0x40000000 0x400>;" w  u: b9 K- s
% h0 r& F2 h5 H6 ]& F/ T& d# d
clocks = <&rcc TIM2_K>;
, G4 j# K! ?+ X* F- {# u# t( l# {8 _& V
clock-names = "int";6 d7 |3 @+ x( ?

( Q4 ]+ Z) l5 A5 e4 B# Tdmas = <&dmamux1 18 0x400 0x80000001>,! |/ Q# I; s( u: R( W/ `

# v5 Z. ]+ S% u4 v5 K8 \<&dmamux1 19 0x400 0x80000001>,
. F+ w4 f9 \, {+ J
2 J2 ]! N9 E1 w9 _# {6 K3 h<&dmamux1 20 0x400 0x80000001>,# q& d  z  _$ F( @: l! x" z6 R( T& Q
9 s6 Q* ^0 N2 B4 j4 s
<&dmamux1 21 0x400 0x80000001>,1 P0 y9 s1 K( D2 w, h) }
$ {) p$ J3 ^$ Y0 x
<&dmamux1 22 0x400 0x80000001>;6 G' q' p$ K' e/ d7 E9 N
7 w' x/ P0 _) c( F
dma-names = "ch1", "ch2", "ch3", "ch4", "up";
7 E* S( q9 r( P4 t6 D; m8 y& I0 |4 J9 H" D% D; V
status = "disabled";" e5 r. [/ `9 k8 t# }

* [! P+ z9 O0 Q( b$ I1 @: Vpwm {/ @2 N0 C0 C6 `) u

; E: b- Y% c* {compatible = "st,stm32-pwm";  l" W5 X7 K( m* Q
8 X$ K5 q5 ]7 O1 C7 t
#pwm-cells = <3>;2 X, b9 K  e) n) Z3 w& L

: P) r: a. t. C# s9 P$ r5 pstatus = "disabled";+ J0 S+ |& ^5 l7 t( J1 }) F

$ _; `/ s3 D2 a2 r};6 q3 A' F7 h/ m' e

2 M; ]7 i$ v- }  m/ L8 }timer@1 {
( U, a- r. N) ^3 Y% @" K1 F
8 {+ r& a! w( U. P6 c3 E: p0 ?compatible = "st,stm32h7-timer-trigger";
. H. }- I' D! L) s6 H5 ]5 d  N( G; v! _" Z2 T' T4 r" X$ Y
reg = <1>;
0 I7 @  m- @( K) z5 ]6 I" c& W, M7 q# D+ n# J1 x4 ]! Y- v
status = "disabled";
* t0 T' A' c3 G2 Y" ]
! I5 t/ ~" T6 _+ I" g' k0 o' c};
6 X: j& ~, z7 N2 ]1 I
) T  A) _4 l0 }' V1 Ccounter {
  l8 W5 |# o0 M1 `+ P" e: L
) o; E' g3 N$ c+ s6 Acompatible = "st,stm32-timer-counter";4 _7 B6 T' a1 V$ e2 x
( K8 O+ [5 K, Y
status = "disabled";5 J: }( v# i; J
5 H0 ^- }% P8 b5 m2 E
};' @" b) t  W$ ~/ b4 k5 d) ~1 m5 n- Q

9 ~% x9 p% W! S5 F0 P};, m4 }9 V: s  p/ o

  h. U) d% X* k( w. `6 t上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。3 d5 p, V# M9 _% l2 s: Q
) q' w7 H; w* S: f: Z
参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:
: @8 r  f/ g, \% k" O( ~: |; e+ T4 ?# S# ?! V# s+ S
&timers2 {! l. |; q5 P# W, ]6 B0 ?
) d3 s6 _0 f" w9 o& C/ P) X/ @
/* spare dmas for other usage */! g2 \% ^" J0 i. m
  q! U7 B! a2 I& x- Y5 a
/delete-property/dmas;
( B4 o" b5 e- N/ O  X
) }; l( ^9 Y! P( m$ Y% e/delete-property/dma-names;
. E3 h  B$ n/ `5 N  [/ N6 J4 |
+ S! E6 S; k) D" Rstatus = "okay";
+ o+ m4 B0 c9 O8 m) i4 t3 P* C# \0 j7 d0 r- N) C
pwm2: pwm {- z7 q; \! D3 M$ [0 Q! y
: A2 i2 H6 Y8 a
pinctrl-0 = <&pwm2_pins_b>;% z! i! d5 d/ L! _8 O: @6 v
/ R  e4 i: Z% C
pinctrl-1 = <&pwm2_sleep_pins_b>;0 G; }4 u3 {. h

4 p: r3 o4 S( O. a7 cpinctrl-names = "default", "sleep";7 v* e$ g+ b0 z- |7 p
7 p; t) j4 u) u/ H
#pwm-cells = <2>;0 V# B8 W5 l, g! ^) ]
6 N6 x" A# h" T/ E. @
status = "okay";" n: v8 x7 c: q. k9 G- ^3 o% R
4 f: r* e6 W7 c" {- v
};3 e, X4 T; g& R. ?8 K

( ]8 g0 i9 Q6 n( y1 Ctimer@2 {
7 S, \) X3 h' e
, |$ A4 t. W) _8 X2 |status = "disabled";8 T4 q  |  b6 O( W

; M) B7 W3 K! E/ ?% G5 h' K};0 W7 Q+ d4 ^4 x0 W" Z  U/ w4 ?

* Y4 H) I1 m- t* q};
/ X! v$ i  [. i- S. ~. p
: ^2 @. F6 m3 W3 x) q. h0 Z+ U: zstm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:
) f) F2 x* Q/ w( h. a! r0 p6 O' w$ i. F9 U* M2 S% _
pwm2_pins_b: pwm2-0 {
# B. c4 j1 d% P5 S8 N! i  X( J( e" V) X
pins {
; G! k3 D! X' B5 c5 n
( F/ {4 T5 }# f0 s, d, ]pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
0 I6 T4 S9 ]8 n1 v6 k. i0 w+ E* w$ j* }
bias-pull-down;& [- {6 ]$ r7 Z& W3 f6 u3 V

% T  t: A" v! ^$ a, a0 Udrive-push-pull;1 r: H( ^9 d) \2 `8 h
( e  P7 K8 x% n" k- Z
slew-rate = <0>;# }8 L; a6 M: P/ ^9 ~  q
( [$ S! Z- U2 V4 c1 y
};6 l* b# h, k$ }! Z: W9 I7 F+ P- J. B+ [

& O! [7 U! \3 m" v- B};
6 U0 C8 D. R: a; G; r7 n, V2 d4 h. b8 [/ P8 r& x( _% G
pwm2_sleep_pins_b: pwm1-sleep-0 {
5 [$ j3 Q% }" E7 v2 F% i( U  e' h$ j- Q
pins {; J+ O) T, d& ?3 }3 `

8 h# S$ _# Z9 o; W8 ]$ Xpinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */& D( D7 X0 q. V
' L7 p8 c; t) ]0 U' z" d
};0 f) @2 B: p2 e- r( L8 T6 }

6 v# B& Z  ]" x1 ~3 P$ T};
/ w& e' m' f0 @2 I; C6 A" D! H- e0 f$ C7 @7 v2 |
2.背光设备节点
8 L  c$ `( J9 o3 N1 p& `! q6 x  m( X& M( K/ y, b0 e. ~
FS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。7 [" p% x/ {8 F+ d2 X  M
- ]) f) [& A2 p! e+ f: L; _
GPIO驱动背光节点内容如下:
' U0 C: N! X6 H0 m7 ^
3 K/ k. H+ c3 l' s* wpanel_backlight: panel-backlight {6 |! s  [. U1 s* T( _
6 V6 _" j7 [. n' e; v' z
compatible = "gpio-backlight";
# h; \' U1 r7 x) ^$ h% p. b! ?; ^! A7 z# p) a$ X/ B
gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
8 a* U% C, `2 d( g3 J% u
  e' M' r/ n$ \+ w* ]8 ]default-on;; x, X" e5 J4 G' L. n: B7 ?& P, R+ w# e
$ n) p8 U# B+ ^$ ~9 ~
status = "okay";
1 P7 N: N$ [8 E6 b& U9 b5 M3 x% H/ Q8 O
5 s. f/ s' f2 [" s. v( V* I4 z};
- _/ A. U& r  ^9 ]- S4 w; u- x# g" }( D4 k6 V4 p- j8 G3 @
PWM驱动背光节点内容如下:5 A+ o4 U* v  }

' L! ~9 X: N; Y: R: @panel_backlight: panel-backlight {
1 J6 |0 I3 t, {( \  I6 [4 H: p9 K0 d: o, \1 _0 i; y; N- \
compatible = "pwm-backlight";! L  x6 a8 t# x; ]# v! F  r

, }  v9 \0 }4 L) Ipwms = <&pwm2 0 5000000>;& J% l; X! n& }. q
3 _5 C! p# ]% ?- i4 {
brightness-levels = <0 4 8 16 32 64 128 255>;
5 F0 n2 Y- |3 j( ?3 e) G* @3 [3 K" d! R% X* ^
default-brightness-level = <6>;2 f- t' D/ j* L( q1 m# Z

4 \0 ]/ t0 R# ?% j# G! w$ }status = "okay";  d: b# m; C) z4 n% K0 N8 y+ ]
) l" j0 D& w$ h! n2 H  ^/ U
};& H0 N9 E" W$ s5 Z  q
, T9 Y4 h$ a  o) _3 u
3.LTDC设备节点
* i4 B# ^( c; b3 E% ^
, Z0 `$ x& s4 F% X# A由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。0 k4 S6 v' q6 P: M" n, w2 F* e
( l0 W( a8 H5 `4 A- K5 G
<dc {
( E5 g' Q# U: b# C9 z
0 z" z  [! e$ f2 @) P8 j& bstatus = "okay";
& \; v3 d# c9 Q! F2 D  E  B. A& f* ^1 z, N7 ^, W" @9 r5 E; ]
port {; L9 y* o1 }! K+ A4 n% J* K
  G8 ~* ?- _8 h7 u; Z6 I
#address-cells = <1>;
) s1 `7 C$ l2 t
1 k  j# }9 D& o* f4 h#size-cells = <0>;+ M, S" p0 D' T) L( |

  F2 r5 v! \7 P! k; ^( K' d$ Ultdc_ep1_out: endpoint@1 {
! d$ N) o/ R# N$ t* Z. }, l+ B5 o: `4 Y/ e* s; Y- c
reg = <1>;$ J* v- p- s7 n4 O, C( u7 M" {
1 `: J8 y0 r6 m/ b  v& D% s
remote-endpoint = <&dsi_in>;; c" U6 k; q+ F1 t
; l3 I% H% d4 ~! K. z: v
};; F9 G) H! Q4 {3 R& ~+ O' y; V: m
/ b) F  }. |9 c" t* [. e
};
4 ]6 Q$ C  O8 T8 k( J8 e9 t+ A( G8 f  I/ B
};
7 X& B/ b5 i$ Y1 u7 |. N) S
! M: g* b9 H5 D$ a4 p4.Panel设备树节点$ A5 t5 E$ }+ [
6 Z  w+ D- h2 J
结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:
0 J3 ]' }, H( A+ A8 D! w& F+ c
% l' l) N& z3 }" l( Rpanel: panel@0 {- \+ u7 Q2 l% Z: P  R7 g$ C

& s/ X! b" Z$ B. Xcompatible = "sitronix,st7701";
- R5 e( W( N& H8 u9 C$ @; `5 x; J8 _9 p- v
reg = <0>;# {# S9 t3 l3 {/ Z* t: u) q

0 C& p& {4 f4 s+ N1 Jreset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;% I" Q( G: U7 r. A8 A

7 k+ R$ b' u3 M  f2 e' wpower-supply = <&v3v3>;
1 O' }: A8 n; S1 ^$ o: A( |/ {
' a4 r( _; i' mstatus = "okay";
& w: Q7 G5 H# Q) @2 K# _# @& P9 e, i8 F) g, B( V. o8 K* f
port {) p' V5 v+ r( g. K" N  D
+ C4 F2 I! H+ F: j. l
panel_in: endpoint {
$ O7 L: o2 q/ T- M1 l( V* }1 ~0 o3 p1 {3 S
remote-endpoint = <&dsi_out>;
2 U  g! N8 B$ D1 N! e8 i5 a2 d- C7 m+ y
# B. i* A% f) h, P8 r};2 d( I! F( j/ v

" P: x; f; N; P5 L+ H2 \( t6 Z! A};
2 Q% r5 Q& b& ]3 o7 Z5 W4 x' j. H. e' D7 p" M
};
/ z" h' ?; D- {# G0 ?
4 e8 q5 b/ M  g& {! P( r" r0 S  {5.DSI设备树节点
9 c6 P/ z2 Q! X+ r9 I8 t
: V& l3 ]2 }+ N- w, {1 A8 ?! J内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:+ L! k% c. l6 \$ J+ q& `

5 p0 h# B# M/ H# J; a. g1 x  [6 march/arm/boot/dts/stm32mp157.dtsi
. R  Z3 W6 M0 B$ ?: ?* P4 F5 e2 A: T0 Q6 R) a3 L" o# m
stm32mp157中dsi定义如下:
7 K2 S, B% t) R# c; U; |4 d
1 p" d2 N6 m& I; {1 ?/ mdsi: dsi@5a000000 {) u; g& h2 E8 ~

4 l) n7 \) q$ m# Rcompatible = "st,stm32-dsi";
  t& J. p: l# Q% }0 C( v; R( W7 P$ B" {! i$ s  S2 J+ {& N: N; ^
reg = <0x5a000000 0x800>;4 Z: S% N( i, }8 }
& Q0 y; B' A. S( u+ T! `5 @
phy-dsi-supply = <®18>;4 G2 e% p+ I  e/ r+ k: y
. f% e- O) A% D8 x  y/ v
clocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;
0 K. V9 E6 S! _$ |) v/ d( u% k4 Z+ B% e
clock-names = "pclk", "ref", "px_clk";0 ]4 [( |5 k! v5 p
$ t- u) u, O' i6 w, `% B! L
resets = <&rcc DSI_R>;  x, ]8 H' Z6 C4 G
  \+ u! V& ^+ Z+ S: a7 Q
reset-names = "apb";
& x+ b, H5 i: O' n2 Y  C2 }' Y. ~" k5 p" |) Z
status = "disabled";
8 G0 b) t* J8 A2 z- Q
5 g! A4 i+ i  \};
  w% I+ [8 g2 l+ q3 G$ D& Y1 i$ Z% A, n7 B4 p/ z
上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:$ n* {6 [1 N) i4 _6 l' t5 R4 d1 ^& \% D
3 S" D- G; w! t) o5 n3 f3 c3 D
&dsi {
0 h+ m5 I5 a# Z/ r7 j0 \7 ^* O+ t9 m+ X) ?
#address-cells = <1>;
2 \9 [' J: ^7 I1 o; y3 n' }$ v  v1 n, n  {
#size-cells = <0>;/ h% V$ W3 g& X2 [4 N) I

% Q. G: D' a* `1 m; E$ x3 p" ~! lstatus = "okay";/ f$ {9 Y, _: h) G
0 h. [5 J4 G  x, R0 T0 M( _
ports {! W* s; D* e& C# K9 U4 H% J

5 S! n) V! E4 v) u#address-cells = <1>;9 ]) n1 u0 b- e( j# T
. R+ U( u  ^% S4 u# u1 E, D
#size-cells = <0>;
* l6 |7 ?9 T% l6 P! l& H& S" x) Y; h$ _, }6 v
port@0 {
8 Y. a0 H# ]9 O; e$ |) J- R: X; |& P! \2 I2 w3 L, h
reg = <0>;
, T# ]4 K( B( W1 x4 H
$ j* H) y0 h/ _, E' ]dsi_in: endpoint {2 e, y/ R$ r  {7 @6 y0 ^* C
3 ^8 b" v* Y; Q% ~' }+ K
remote-endpoint = <<dc_ep1_out>;
5 \7 F+ o. |9 d6 L6 F; U4 L  ^
% y4 s1 L/ @" y2 K3 S9 _. ]. _3 \};+ G, E- I0 P6 A2 X8 g" t

! y7 o1 f+ d9 n+ e5 }( O2 |};- C2 N# J* U  x+ H

; H' Q  X6 Y  l, P' X6 {0 xport@1 {
% r& ?6 c# h- b2 v5 A6 K1 l- ~/ Q/ a4 K$ ?( e  ^: Z' O  f8 u
reg = <1>;
/ E) \) P# [* l) A8 T
4 T6 ], k1 N6 y0 |5 ]! zdsi_out: endpoint {1 O+ N2 j; c. F# v1 k- A' g
6 \6 V. [+ s3 \3 g$ d( E0 V9 l
remote-endpoint = <&dsi_panel_in>;
% w3 m* r0 z6 P6 p/ n% V
9 J6 @9 a5 m2 P8 K) M9 c% |3 o  x% a};
+ U- R  |* c- \" ~6 I( x9 v% D* \! T
};9 Y: d( w) o7 F% |8 n

# M/ e. s: S1 l- Q, f};' }. h+ s4 x2 O3 w' @& i/ f
! M) \/ ]6 I# e; r" ^
panel_dsi: panel-dsi@0 {" u/ S# _  H: |  X
) t$ l4 |0 g" x, Y) n) y" ?( ]3 Q& j( q
compatible = "sitronix,st7701";* a. j. q9 T  e6 t
+ ?! T% k2 ?. V+ B9 @8 L
reg = <0>;
5 d& J* k) E3 a% F; [
- p# E6 I4 o! I: v/ ^reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
, a3 r7 f: X5 p# w5 U8 C$ e
/ T* y$ V0 m$ q. o* }backlight = <&panel_backlight>;
9 Y) F# h$ v! [: k. @/ L# ?' T. q; |
power-supply = <&v3v3>;
2 Q/ i3 A1 `2 p, G0 _8 }# x3 x( T! }2 p0 r+ b
status = "okay";: H" O! V& C& L8 o" e# f

; O% K  i; Z. O3 {port {) @0 p4 S9 W& y0 v9 J: a

/ l/ o5 ^0 u0 L6 P6 h2 ~dsi_panel_in: endpoint {
/ V/ W  X2 L. a* D6 R
& c6 T- U! J! o, t7 o7 I; _remote-endpoint = <&dsi_out>;
  |$ s) n! u# d+ T5 ^: n" M6 y9 Q  `6 a( \4 c
};
! [0 Q1 Z: ?3 G, q. r6 }$ _1 K
5 _( j# W( Z4 F};
7 W* R5 D/ A% U! O: c
4 |' r* K7 }+ o0 E9 G0 J};
/ S0 c! h# @3 M4 g8 |! {- g6 e) D# I1 D
};1 a; Q3 Y: d( C; [9 M5 I

7 I. @; f. j. O! u- i7 I2.实验目的
! x" U( ?. }2 u* o& D& ~% h熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。
9 I& r: A3 S5 O! W8 ~; U) M
! o( ~( [/ F; t% z' w' s( h3.实验平台2 }; w3 o' Y# C
华清远见开发环境,FS-MP1A平台;
1 g* F; J' a6 M- U/ z8 ?; c: s- Q) I4 ^
4.实验步骤
2 X# j8 l6 K) V8 c! n1.导入交叉编译工具链* f8 T3 k& m7 ]
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
% X2 @; o, W% M9 J2 m& t. E8 C0 j. u$ C- z) o
2.添加MIPI-LCD驱动
6 S, t0 g0 A5 h7 V, R8 @6 SFS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动
: k" M" k  ?; x
; L5 n6 r8 ]: D  ]( Y将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。
8 z0 w3 f" e( b: g! s/ ?! R+ m3 j4 i- f6 |
linux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/. W% b) [; y& Y

  y; A5 w) e% z6 I0 E) u3.添加pwm2内容& H  J9 z! s! g4 v8 O7 \
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:! w% w5 r6 k+ |  F4 w0 S

" M2 y" j# P5 D) ]&timers2 {: o4 V8 k: x4 A- s
# s! E8 }6 d* ^$ z  V! ?
/* spare dmas for other usage */
' H; q) t3 i. S# z0 @# k4 l: H5 o% f  ]  A& S' D9 c8 H% Y
/delete-property/dmas;
+ N6 Z* ^7 L7 s, b8 C: [, {
: s3 w, K! {2 N% ?0 ~: R9 d# t' p; U/delete-property/dma-names;5 L) A, t. x4 D8 ^) B

, i" c& y. R+ O5 c9 ostatus = "okay";4 f6 C' H  Y4 U
7 |  @) Y( v* R3 v
pwm2: pwm {
% `% v+ ?2 d: i1 y) [* x; f0 E/ s
1 U: z2 F6 f2 ^4 e2 u% }5 bpinctrl-0 = <&pwm2_pins_b>;
' e) ]8 |7 w; `6 a9 X3 Z/ V' n" o. f: Q. ?4 F# F
pinctrl-1 = <&pwm2_sleep_pins_b>;! `0 M4 `$ s# |
! q, n. A7 C8 M
pinctrl-names = "default", "sleep";
) Q% l5 j8 V0 k! B3 J6 h2 K
, q4 r% v2 g0 G! I#pwm-cells = <2>;1 O$ g) o! o! c# B; Q
% _4 x. @* z/ p1 [
status = "okay";  z; N" Q. S! p/ _

& [) a2 Z( l; x$ y};
! U+ N3 \: z$ K! X% E2 K4 ]/ U" j
' {5 }: ~. V0 ytimer@2 {# ~7 d, X+ T! L0 z' M4 Y( G  V
7 v9 i' p. Z- U1 A
status = "disabled";
  E/ h' t3 }. i$ S  O; }! S: E
1 w8 I. V0 }' |! W0 W& t! Y3 e' t. r};( m9 [, u1 V3 l7 e0 Q! Z/ p5 M5 N

8 o" g0 X* J+ s9 |2 _; }};& G, S6 X5 O5 V( p* \2 O- ]4 t

+ R6 ?& H  I) T* b9 h% |/ t&pinctrl {
! F6 a# G2 _( v; f! ]
( ~) u. V+ n, Hpwm2_pins_b: pwm2-0 {
6 S- D3 S8 M' g/ z: F
% x% h! C% ~% E# u0 A9 bpins {
' u' F; g8 O% J; ?8 E( i3 o
0 h. F3 \" M8 h/ N5 M" r2 upinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
; H* A& i! g4 J  `# P1 o2 x, y) ^, {5 _& b6 b; d$ W
bias-pull-down;: v/ g" F) m+ }* G$ [8 J) n- _
( }" L+ E3 C! e' W" }2 h! l
drive-push-pull;
; l0 N& H. s, P- c+ v2 d
) `# [+ ^3 s6 @) Oslew-rate = <0>;, K: m- K, {) `+ Y. X5 ^# s+ |

  E! ?0 J7 }0 H9 k8 ]0 `/ a* V};
+ U' j! G# ]. X$ W( g% D6 P" M/ j0 p) u" p
};$ J5 H4 b8 |* f; v3 Q

; ?1 ^/ r' r& b( u) I: Bpwm2_sleep_pins_b: pwm1-sleep-0 {; Q6 ?2 C  M/ x& _' u2 ]1 t- l7 r
* `- N( p3 E- }7 C0 s) j
pins {
# l& ^/ G+ u- j( C1 q
6 z  Z+ U6 n1 ]0 t- ?pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */4 ]7 a  k" T/ U! |( \0 F" d

2 c# E7 j' D- Q8 W};; l# v9 B4 l9 {6 w5 w( K

1 Y; [3 x2 g+ a; @};6 d0 U; B/ K0 P2 ^; {. i: `5 R9 S5 C
: y" [  ~1 g; o9 b, K& A4 v
};
. m+ N1 a9 i3 h7 V# M% a& H/ r& d$ ^3 F# l' m4 t4 W
4.添加背光内容
' N! V! x7 C. t7 v修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:
) ~6 }( T+ l" s! {7 ?1 i) n( d2 D# @% u% C7 z1 K
panel_backlight: panel-backlight {0 a8 x: Z/ a8 o& q: m, @

2 @/ g5 T4 z2 j- e: P: F' e# c( ucompatible = "pwm-backlight";+ e& D, ]* v" p% E8 c/ t% t

- P' T% E: B. q* `# Spwms = <&pwm2 0 5000000>;, d6 j9 H! w- g- f7 O9 g8 ~) A

" U! d+ L! e) K9 Vbrightness-levels = <0 4 8 16 32 64 128 255>;
, O. `: D  E4 e( {4 n
- e7 i' \4 k6 ^4 I! u. [default-brightness-level = <6>;
( I: ?  {9 p4 h- c, o8 N; V" T, l- G0 ^" _; u
status = "okay";8 k! f2 O: ], e  q
6 F( m/ z0 O$ Z! [
};3 R' e" x8 t) c8 r0 J5 u5 o

' F3 ?5 s: d3 Q% Q& I5.增加设备树文件
; N( A/ G) [" C: c$ c+ \由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。
+ t' [" Z3 y. B- G0 U5 }
3 m: S4 ~! Y( k/ i在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:
, O! w/ M; m  e# U# R+ Z$ ?3 w, F% q& R& W+ |
#include "stm32mp157a-fsmp1a.dts", D" g! b+ P0 \

1 ?7 g+ J3 i) r! l/ {
+ R& B4 T) Q' l& z2 m$ {
& |0 P2 V* ?( X& Q( a! emodel = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";
4 K' |% P0 [/ A! t; r& o3 u1 o2 V5 Z  j( U; d0 |+ V
compatible = "st,stm32mp157a-dk1", "st,stm32mp157";# G( T4 H8 I. y& W: ^+ K

  p# p: k8 y  V- E5 l};( b" H/ \" l1 D9 D' M* |: ]% ^
4 \# \" \! @& L; u$ F
由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容7 j& i2 z7 R& L' U9 d# U: L/ F

/ H8 H& h7 c- edtb-$(CONFIG_ARCH_STM32) += \0 m" c6 i0 O; Y6 t
/ L9 z$ `0 o2 x6 q/ n3 P
…..
$ G2 b  p  o) E) v: N, C! P
) F4 @) v$ i2 `  |* D0 Istm32mp157a-dk1.dtb \
) `! }1 c0 z9 m4 J+ U: h$ w  Z" y, Y2 u1 J' i
stm32mp157a-fsmp1a.dtb \
' K9 ^& |- J. A6 a0 i% p  ]+ K" Z/ V) P# V; q- J2 a
stm32mp157a-fsmp1a-mipi050.dtb \5 P) L5 p' z2 [- r% ~8 E" X0 c
- f" m) \/ e& y/ ?+ g) k
stm32mp157d-dk1.dtb \
, d  ]2 P  H* c; C; j9 P) Y) @' N( ^! |8 H& `+ q1 l8 u. L
6.添加ltdc内容0 T7 C5 b7 b0 i$ A
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:) b) Z2 `3 A1 _8 z0 V! L$ D
/ Q" B7 I3 N9 P( D0 P$ T5 Y* q
<dc {& Q6 B2 V4 T7 ?1 ^# d
  L8 D) n; l: U
status = "okay";
4 x7 b# z( B5 \* W6 {! s4 A$ Q$ |2 @( Y+ x* |: b2 b, x. |( C
port {
: S0 y2 w5 ?8 k7 L) t" h/ G- l1 \" i4 F: e( k  ~
#address-cells = <1>;
: u9 p. N  d/ R+ W# s) u( O3 d/ \% ?. b7 y2 c
#size-cells = <0>;0 J! x" c$ d0 x' s2 I3 z

* g0 j: M. M" [5 {+ iltdc_ep1_out: endpoint@1 {) m2 f' o  ]7 S2 B/ ^2 }
  U; t: S& R1 D( q7 O8 k
reg = <1>;6 L. G+ q# H& S$ H
3 r5 }7 v- Y6 j6 ~: m
remote-endpoint = <&dsi_in>;  B9 u3 f  m; ?- E  d' N# R  A
0 C4 X: `3 ]& ^# t  v9 s
};
" i' u- Y' s; t6 F/ b  K0 H, w; |: c5 t5 v1 p- c3 L" |# x
};
* _7 L- S1 Y6 ~8 F, K" H4 a; z" V
  @! Z# a0 ~, W$ i2 B3 N! \$ Y+ S};- T+ I3 C1 b0 ^2 l- p
5 d3 E9 c8 C' |2 K1 B1 v  r
7.添加dts内容, C/ N4 M( z. h! b/ B* J' \
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:! \1 Q. D* }1 V. F. p; E. d5 U

! z, n, A5 T  N) Y" d2 j&dsi {
9 J1 R9 U: c# q' [% ~& r
+ l8 y2 B2 [( i2 Z! u* {" ?#address-cells = <1>;
/ G% U" n' E! S6 e: y# ~* u1 l) c7 w5 N
#size-cells = <0>;0 n- P! v+ j/ J% n4 i

, h6 K. V. F' |status = "okay";
) c& Q6 y3 A7 Z$ d$ V
$ V! d/ D0 X! W, p2 ^* uports {
8 }9 N6 T* E% `6 _0 G5 n
0 q# O2 k) C" b* e4 o) ~#address-cells = <1>;
+ r# B) J3 t, N9 d/ V( j9 j/ M
3 b; l. C) Q$ z5 q#size-cells = <0>;; ^, P% p6 m% q2 T; }

6 K; V! t0 x1 f$ c# Y8 P( v+ Hport@0 {. R% ]7 q: j; U! g! s9 q
+ D1 `( j6 y; O6 Q& D. ^
reg = <0>;
1 o* k- c, q7 ]
8 p3 F0 @. s; Mdsi_in: endpoint {8 B. ^; k6 }- I8 |3 `% G' c
5 B" W2 s4 n) w) R. L6 h
remote-endpoint = <<dc_ep1_out>;
6 ~) A, m# {( d& S8 }
# B+ m& `( r" z" n" ]+ R3 d};- u+ p- d3 d- P! |* P
2 L8 @: O% D7 i) ]: g
};1 w/ i( t$ {0 ?# _1 l3 s3 c

' I& L5 d1 Y4 S1 n7 dport@1 {9 u( m  R$ P0 }$ [3 F4 E9 p2 t

- F3 L& S& O3 W5 |. ureg = <1>;2 i4 q$ w7 ~$ T0 x% d4 z$ @
0 g: j& }+ Z) l4 l+ y2 d& ~
dsi_out: endpoint {( H; B2 I$ s% ~) j1 w$ }! L# }
0 V9 |" J& r* A, X  d1 i* C
remote-endpoint = <&dsi_panel_in>;
( x5 [+ p% c5 f+ ^% ?0 w  k' H0 S3 M
};) a1 _5 q8 f7 S& C, \  d2 e+ @
! e. R) P9 Z. p% d
};
  m2 W: _$ H4 @' R# u
( J: e, B6 L) f$ z2 \) W- ^  V; W# g};$ O  w: v: g+ e( J+ F, G' M, S4 a
! T2 o3 M# t& u  }$ K- n: V
panel_dsi: panel-dsi@0 {
9 }5 U) i' S. d. i, d* Z! h) b( f" S) \5 G
compatible = "sitronix,st7701";- v6 \" Z' Q. x/ S, X
5 I6 V1 e8 Z2 z" S2 r
reg = <0>;; u! v/ u  `- x( g
. P' g7 f, M7 b
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;
7 Z( i6 I  R6 n# {  R) d1 b
2 G3 g# f" k0 k% f+ apower-supply = <&v3v3>;/ L( O% a$ p0 ^( c5 c* W9 d
9 r% X! {$ k. j1 b: o
status = "okay";
3 j' B3 e) M' q$ x+ Y) ^8 r+ p* k% A* g7 I
port {& I4 c  f1 z1 s1 @5 h* D; g
/ a0 }' B; Y: r6 K! {4 G  G0 i) o
dsi_panel_in: endpoint {. h, P9 B! k2 W5 V! W2 ^2 j+ J. f2 T
1 K3 j  T! ?; M* n" w9 ?6 S. {7 p
remote-endpoint = <&dsi_out>;
  G% W5 f" |1 r* f
+ w# z/ r9 ]: E/ P};
# w7 Z0 P3 c# q6 i% s  M7 p
2 l' t; [* g& y3 l( N- ^9 |2 {  k};7 U0 y) O+ Y+ z! ~8 t) A' S8 d1 d3 |
5 p" |( e; G  }- Q
};
$ r: p- K" q7 v& W/ _, `$ r0 J$ [$ j. V9 s/ h
};
2 U5 I' P! \- B: c5 x$ b7 G1 H1 G+ u& m1 \$ I( |+ p
8.配置内核
' \4 ~$ t- y) k  L) G+ m2 ?- i4 V配置内核支持st7701,并列出主要选项,如下:
" @) j3 [7 U3 u* }9 d' L( ^
8 i8 A% R5 l# F* R) x& Ylinux@ubuntu make menuconfig% n3 ?$ J8 q/ Z
3 `& _, M6 ?: E( u! j* t6 }( P5 \
Device Drivers --->6 T9 G3 @. ]9 I
5 R; P2 J$ v  h6 d
Graphics support --->6 C7 @. l  z" V2 A$ W

' a& o2 P# X" l4 I/ j( s! M6 t<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->: G1 C6 j" h; l9 i

& z5 p( x+ }# W: ^# t<*> DRM Support for STMicroelectronics SoC Series
- D, _/ I$ g/ V/ M7 J
% G7 T7 V1 j2 B* b0 @; d5 n2 Z<*> STMicroelectronics specific extensions for Synopsys MIPI DSI
. _: J& s2 s, ^2 w6 h$ H; b$ }
5 K8 E- i: ?: e) x$ ?3 r) pDisplay Panels --->3 i# h* Z1 y. g2 X
, v$ k$ [# D' t. c: H# q
<*> Sitronix ST7701 panel driver
- g# S  K6 u. Y& C# }, X
! K! z* ]3 s! U8 q0 d8 vBacklight & LCD device support --->
/ n+ P% s" Q0 X% p- {3 I( Q: L5 T; V5 F% ]. X7 S( a* n' X
<*> Generic PWM based Backlight Driver
) |' @( A  k7 d7 G: ]% S3 P% J* d7 S' Z/ Q
<*> Generic GPIO based Backlight Driver' ~( p/ l3 l' X7 U6 _$ j3 n4 C0 m

: ?4 V/ t. Y3 B% u" w9.增加启动项& m: u  e7 x, w) Q( I9 C7 H
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加7 k, ?$ N  k* A4 X+ @9 S8 u" H
6 P( w$ q& h  u; R4 ?% g
LABEL stm32mp157a-fsmp1a-mipi% W$ l6 F  V+ r8 ?; W" @
KERNEL /uImage
: z7 v/ g* A& w8 h" W$ j  B  f; hFDT /stm32mp157a-fsmp1a-mipi050.dtb3 J; R4 Z; |0 k  S4 C& W3 T
APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,1152000 [& s/ s" P8 L& K! Z0 z
. E3 Y# ~$ q( w
10.编译内核及设备树/ ?6 y6 y5 C/ q- ^* u6 J5 v: \
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040& }5 F' f: i# j$ e( X; {& f; H8 }

7 Q' V& m1 z/ {8 W( r. r- d, [重启测试
; v. E1 E& [4 V6 B7 @9 Z+ e将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。8 f0 ^- P8 w2 g+ X; m! {
————————————————
8 v( V0 ^3 V0 S3 n版权声明:华清远见IT开放实验室/ E7 z) V- ~. d& `" {
" p6 z1 Q, m: V3 a3 z

3 c* U6 [# C9 q# G8 ?7 c$ B" `8 h  U
收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版