请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理
  `& |$ ^% t  s" s, j5 dDSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。
7 W# V" X) X+ T, A4 j; l- t2 t' u3 k. Q0 V
MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。
) R5 V! q1 j/ V& w
8 h/ c+ s* r% k1 j, i$ `& b; M edc326cbe2a595fc4b1166c428f390cf.png " e/ U0 V" ]3 V9 u
5 i7 \2 i$ c, Z3 U
FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。) }  M) K1 f1 P/ `4 l
. O: H1 s6 F  U- J) R. f
bb2cebf753fade0b3a712cbdab54f2c3.png * Q0 n' u7 ~" u" P

9 o! Q8 D1 z/ ^0 p上图为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的支持。$ E2 _  j; [; e: p
) e4 C$ c4 g/ `8 Z- I
DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。
! ]( b. P5 J4 b' X- I' @# q6 z7 `0 v3 z) ~, K3 y1 O1 J- i
MIPI LCD接口管脚对应关系:4 A: g+ R; H  E8 b! T
9 Z" t. ]7 Y) I# x
69260c05eeb6ed21b9271b6430afe809.png
5 ]! \' N! L6 m$ h8 Z. G& k  v5 N8 H2 q
989321323dbac9ca83311c4b7d45e11c.png
: {1 j- b: r, b# i$ e$ i( C4 e( [. E; k
e6cbe903854fd66e44880f300d4a184b.png
  P0 i! m  x9 k5 L8 B1 Z( V/ {5 h* _& ~
43e8dd79ca02794994127213f61ac3db.png + i- x' o# k0 y. Q3 Y/ G( j
%2IAQZU(INJWMPJ__5)R@(N.png & D  S/ t& b. z; N5 N

# [; d/ ]  }& {6 Q! }- T) H1.PWM设备节点
0 X( D- T6 ~+ d
& E: k# t! G6 B2 ^1 @2 T9 }9 b内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:' k( ^+ P' H4 p
7 T* k5 D9 D, x# R' U+ p  R
arch/arm/boot/dts/stm32mp151.dtsi/ q! Q; k" S2 K/ ?3 @

" h5 O" o6 B! ]1 }stm32mp151中timers2定义如下:' `& c" b2 ?) m# R7 L3 }

! h1 o7 x* Q- Btimers2: timer@40000000 {! a, e; i2 _( ~, I" B* c
2 ^  z, r/ }& Y& c$ U$ S( u0 |) M* q
#address-cells = <1>;
5 U0 q! p9 _0 {* E6 A9 \9 Q$ x: F) G+ ~
#size-cells = <0>;4 f/ U$ c8 F/ s* t1 m

* J8 Y( m6 j0 j; [5 W/ @5 |5 F1 fcompatible = "st,stm32-timers";. Z0 h, M8 ~+ I' x

' x! K4 v0 t9 f/ jreg = <0x40000000 0x400>;: U* `) h  O+ w* D* Q

4 Y1 c1 p1 ^% c) w. m& }3 dclocks = <&rcc TIM2_K>;% r, a6 }4 @; n$ S; k$ z* b  z& U' G
, s: B$ m& l8 f/ F8 j% K5 M' y5 {. u4 {
clock-names = "int";
- K& ^8 T7 M: r3 c8 r. Q3 f5 _$ c' b. j( O2 m- v/ x" f. r% q
dmas = <&dmamux1 18 0x400 0x80000001>,
- Y/ J: h; R5 K1 L' e4 N4 R
3 w) c+ U, P$ @0 T. _5 c2 V<&dmamux1 19 0x400 0x80000001>,* i- ?( Q/ z$ P/ s' B
& c+ N# S% ~! i4 I! N/ K
<&dmamux1 20 0x400 0x80000001>,
  \, c/ b9 k. V6 o/ N7 D4 x& b5 w/ p9 X+ R7 a4 Y
<&dmamux1 21 0x400 0x80000001>,
, D* n/ ]5 @1 I9 a6 Q" q3 A6 u: w3 I/ f% N( W; S- h2 t) y9 s
<&dmamux1 22 0x400 0x80000001>;0 U# u. _' Z5 E8 \5 z
* \# \9 C% w- |( r' P9 D
dma-names = "ch1", "ch2", "ch3", "ch4", "up";' s* G  e+ W! \; Y" S
0 `2 {: E0 @: o5 V) R9 w
status = "disabled";
# Q+ b9 Y! \% z) @$ w8 e1 H
+ i+ D8 `9 W+ C+ _$ m) g* D: Ypwm {' H8 P* `7 Z. I1 r# \9 u5 m" A9 @
" Z: k4 a- q5 M0 I
compatible = "st,stm32-pwm";: `. h, M1 s3 R; f& i6 }

! e! P0 q+ y% F5 L8 J#pwm-cells = <3>;
, s( Y5 t$ Z+ E0 o
& S. m; [& q0 a/ lstatus = "disabled";
/ y) |9 Y, `) C0 j/ y" Y1 B) h6 m+ s4 h; n  b
};5 _. |0 f3 b* Z+ W) [+ L
3 |" r, f% B0 V: n  v
timer@1 {
5 h* G% a  u( ~7 w1 x2 D
# M" k" x$ R7 X) z& W0 a0 k2 l- bcompatible = "st,stm32h7-timer-trigger";; I9 E9 k" m# `; ]5 G6 k5 H
$ U: K) m2 A, y, Q' y0 Y
reg = <1>;
0 {& o, U  E3 w( J/ m
( c& Q5 J7 v0 }8 `  W, z$ k9 nstatus = "disabled";
& ?4 W6 r) G- n; Y; }( B' ~7 `! C! f' ~+ Q: E; T3 O
};
: G! |4 h- d% P* q% m2 r) Y0 B$ ^+ y) A  y! k! }2 m& W  s1 i
counter {
; R7 \! f2 g1 x  N
# N# h, J4 q0 U. T# j: Q: K/ qcompatible = "st,stm32-timer-counter";
& {& n4 u9 H4 t# J  b% m" _, Z5 b) u, }4 L
status = "disabled";& h7 j3 f6 H' y. o
# g1 [7 j8 D+ v' h+ s( T! e) b
};
* w, e+ `5 H: a% D3 C6 c8 H: D: ]* C
};
, h" r/ d4 v: j2 m1 \
; Q( J- k7 `5 \& v9 Q: |上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。5 K4 \: ]8 y8 s

% I' ]" r9 Z+ Z% c: S; \参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:
" l0 i5 r# x: U! N; H
, B7 T3 v0 \. K; Y( z2 V- ?&timers2 {
- k8 ^+ e% a. H5 ]3 B* j/ P0 B9 E5 o0 {! Q0 W  j
/* spare dmas for other usage */6 x. P! v; [3 _2 ?) N* W# T) S$ H
8 @- c# {+ Q( R9 V* ]  f0 P) x
/delete-property/dmas;9 f7 u+ {) N2 s/ b% r( V
$ v. u0 F$ B: E- |! Y" r7 l
/delete-property/dma-names;
/ J) q$ n3 L" G( m& X: }1 l0 n5 w& O' p% B7 L# L5 J  @
status = "okay";2 N! }8 }" C5 J7 `  a) V, Y6 S' `$ r1 I
$ K; N+ ]$ d0 @9 _8 J5 b: R
pwm2: pwm {
4 ]) S1 p& ?6 W/ w7 ]& I0 T% F/ @$ A
pinctrl-0 = <&pwm2_pins_b>;
( E$ @) ~' o" {! |' l2 U2 ?3 P2 p: k! R
pinctrl-1 = <&pwm2_sleep_pins_b>;
* j# f7 y1 |6 T- R) W. P! d. M, T1 |
pinctrl-names = "default", "sleep";
# i( \$ M3 x+ |  |
( m4 G- |0 t+ F! |$ ^6 h/ i  o#pwm-cells = <2>;
* I: Q5 a. }- h: M2 P  {. X$ v' x8 E: ^, w
status = "okay";
; N$ d$ s, _' D+ W6 w* V+ ~  z5 E0 F, h# M8 |
};
: y2 S. ]! O9 q9 U& E) k# H# a; B/ ?  _0 I
timer@2 {/ r! J9 G3 A3 m- M$ F
, u2 B) a, d% ]  d4 U
status = "disabled";
$ A" ]9 `. X6 d2 f, F, \4 Z8 l0 B0 R
};
" z/ z8 ?) l2 ~. ?+ O
/ V/ |& C& g( b9 a};/ [; I- c# e; O1 ]
* f3 T. q( l- {2 H
stm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:
8 l; ]7 ^. R' l: s% F5 ^% P; L/ F. ~0 i
pwm2_pins_b: pwm2-0 {$ j' K/ o0 M* t0 |+ T' K' z. M; s

- c# y* _: _0 ^' V2 s1 Ppins {! A* S+ y, r& {# y; u
$ ^5 Z1 [+ V" o! S; \  u
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */0 r, S( A( p1 ^* {

; j( @, {; \3 }9 `1 t; N# jbias-pull-down;8 y% M5 f2 \9 i; M

( j* |$ ^) \( X. b3 q' u- ddrive-push-pull;- t' m/ ~- f$ {* {$ f

2 I/ r- ^" T4 B1 v8 |! ]+ Islew-rate = <0>;
5 i6 i) [# I) \; H; v6 j% a; C* W2 f& G8 M( z
};) ~; ^+ R& l7 R) d7 E- M

6 o( J  u& F  w# N};
9 f, y7 F6 c  @5 T
4 ^9 v# P6 M& e- b1 o9 \pwm2_sleep_pins_b: pwm1-sleep-0 {! R5 u* O. C6 @5 p6 h& E, ~

( l  y, A& Q1 `* k, \$ Opins {2 J5 [8 ]3 k9 m6 n7 B% X% {: g
4 Y  O9 L- M4 N# S- Q
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
4 w' h( z5 X; j5 V' `8 i+ @& l" w0 t0 {" A/ x3 ]0 N  f. |# @
};6 D+ J% O: }7 z3 d9 w4 k+ g

5 U7 w: I+ V3 V( p. ~};. N. u' K3 g2 V1 h0 q; N( j  a

: l# W. O" {1 p! R/ E6 @3 G2.背光设备节点
% K9 Q) @5 [3 D! M; H* ^4 i3 e9 ~$ H. |- c8 X( k
FS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。
6 I2 ~7 [8 b" M1 j  z% f7 J  `# c5 e( t
GPIO驱动背光节点内容如下:: w! p# p- r' ]- N5 X9 f# V
) o: o% D* l" C/ C8 p. A; u& d4 f
panel_backlight: panel-backlight {9 ]0 o4 {0 {9 V' @# w

7 B/ d6 ]  h7 K8 c7 P' _compatible = "gpio-backlight";
. w8 G' t' ?: H/ b. F: h/ M+ c
8 o* J( M' p+ y4 y$ x4 Igpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
( n' K- T& m, E4 A" ]" t
! L# w6 C+ ?* o& ddefault-on;8 c1 I% T0 O7 K% P6 c: V

) G4 x9 E0 y) V1 }. k) Z. |( qstatus = "okay";
  A, N2 y9 v7 Q$ X. @, S; B4 l3 k8 s6 }- s
};
& V& p3 O) u, V7 K: ^: b2 k$ j( {
PWM驱动背光节点内容如下:
4 M( i$ Y: t' C4 ?1 q; P7 U: n1 R0 F4 [, @9 i# `, M+ d
panel_backlight: panel-backlight {
6 n* b! q  `" r9 X0 d$ U/ A0 X
1 r. F% `2 X6 X& l4 |9 u5 N4 b9 gcompatible = "pwm-backlight";
7 P: L" |  |. m6 E+ @% J0 L" O$ S% P
pwms = <&pwm2 0 5000000>;" {% ^+ f( c, b3 s
2 V9 d" h, W1 o: B. h
brightness-levels = <0 4 8 16 32 64 128 255>;: A  Y6 D9 O' L% H6 S+ Q! \

" g1 M9 l9 Z" N  G/ Y& M1 R+ M3 }default-brightness-level = <6>;( g: n, m4 i. e+ }; \7 V; w
% O% g; }+ _& M1 L8 B4 s  g/ u9 X
status = "okay";
4 o6 C. s! W! ~) U5 d/ E* _
, }" h8 M: H# c  _9 i% r};  K4 }# s+ h, @
0 x5 u# C" ^" n! h" c2 m0 A
3.LTDC设备节点
* Z* p  w; t/ X6 W! \, a  q
1 `* d' D/ [( W  p! ]由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。* F3 G: Z- b/ x* [

" u1 c$ i; l7 f6 R& t$ i/ A; _7 J<dc {7 B( p5 f/ h7 o) I! i4 B- G! ~

( S2 Z0 t- F: y4 ?% m8 dstatus = "okay";
* t% F/ P+ M$ Q, @9 X7 s
% @( ^; y# z5 f$ }% }port {
( ^/ F( L6 l: M$ o+ ~% p0 q8 R9 J0 k/ u
#address-cells = <1>;* [" c& m4 G' I: c" ~( x

. D# V' y: T: `0 c+ M5 T) ^$ O#size-cells = <0>;, e$ j& p7 `/ U& P
; |  N6 A, M/ B, `2 f+ |
ltdc_ep1_out: endpoint@1 {) y6 C. @1 k& Y9 C1 M3 r# l

$ N: E4 f! o# J, _* j/ W4 qreg = <1>;2 J; v" C0 L0 }- S' E5 h% e

% ?$ V, o$ k( n4 R* @2 Zremote-endpoint = <&dsi_in>;) j$ ?  i0 w4 ?! P8 i5 V& t
; v9 c8 k& n* i0 `) c
};+ [3 `0 l" A. T

8 j' u! C) n5 T5 A. ~  K( G3 I5 X9 b};
1 R% z" r" g0 E( o6 ~
8 A: ~5 P; n9 F3 J) k9 |0 u& {/ ^};/ _, W! B! e) p9 i1 g' ]$ f" K

" D: O' r" j! A4.Panel设备树节点
4 @. G; H/ R' c: I, Y+ v
- h) Q# C, P; j& b/ A/ S结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:: F. p2 v, C$ W) l
2 z: @& ?+ l' C$ J5 n: {
panel: panel@0 {. U! O( m0 L3 W9 ]) w  M

% `+ C" z) K: E/ n8 T9 X2 Acompatible = "sitronix,st7701";
; w7 T& _$ @  ^! l& e$ w
4 g, w' [1 m9 T, R+ S# t$ Lreg = <0>;" P4 b1 d5 `3 j
. C6 `/ M" [. N+ T5 G, m0 Y. q
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;; o2 _: p# e  l  j9 `
, a0 {. L0 \1 N0 e: ~
power-supply = <&v3v3>;
5 n$ s& c  s6 G8 t8 M
9 u; _6 y, p- x1 U2 ?5 ystatus = "okay";% C0 f+ H, v* \. R5 |

8 |/ {% _/ O/ x4 g& Uport {
' `9 ]- j& N/ @+ P5 W1 {% G& w: C! k, Y0 g7 P: J- e; f; t
panel_in: endpoint {  Z9 e! K: o9 I. G8 @0 i4 c  t# u

/ d$ D7 Z. b' a7 w5 i1 n3 P, Lremote-endpoint = <&dsi_out>;
2 ~4 J1 Y! I0 c. h- W. L, L
& ~0 _3 Q# z. [7 }# Z* R! b};
0 Q7 d2 m0 c$ o8 y4 B0 P4 T
% a' X" q6 w1 K  l, V5 k% T};
1 A) r. B* g4 V& [; h, _
) O* s9 h8 H& R2 ]};' f! P; w7 o0 m$ v8 c% w! D7 r3 O
+ N/ Z8 b6 p: F3 q
5.DSI设备树节点1 A9 d4 j$ Z: A4 S9 ]$ D0 F) d

& ^! Q0 y$ j/ z1 i- \0 {4 E) m内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:$ P; K% W" x1 |/ q

9 P4 K  y! ~6 c8 z) Iarch/arm/boot/dts/stm32mp157.dtsi
9 g- O" ]3 s, V& B; I$ s: Q, X. D- r. i1 O% E
stm32mp157中dsi定义如下:
5 ?' ?9 Z. P% G* [. P: F% d
. p  }0 ~: \3 ?) y8 Adsi: dsi@5a000000 {
* A3 o4 s. t% K" B# Y
# A2 {* J( T+ c: Q) K3 Qcompatible = "st,stm32-dsi";" l2 O# ~1 L; d8 S6 ?
6 G/ d  j& l3 o0 t8 z
reg = <0x5a000000 0x800>;) [4 K! r7 N# w* H. ^1 i# G( i
1 z$ j' C7 V9 X  X
phy-dsi-supply = <®18>;
. _/ B" Z1 E0 N' \( M( X  [
. ~5 v3 L* A* m' w' V/ P+ r1 T0 H" Z/ Rclocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;- x. G% K" z' M, w, k8 T6 F
- Z/ _; H8 [  K
clock-names = "pclk", "ref", "px_clk";
$ z9 M1 L& |- _$ o" v
8 d6 ^2 A8 S& X% l% S1 tresets = <&rcc DSI_R>;
1 @: U1 R1 s' O
3 l3 d' p3 {: b* f( Oreset-names = "apb";
( l  z5 `8 n6 g
5 k6 Q& _* D5 M2 sstatus = "disabled";5 A. D5 H" l& [1 w- Q0 q

2 e, ~! ~- `. W};6 j8 I! O) U/ q3 G1 u# c% E

5 S, E! U' u2 E  Z" A# ^上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:
8 N$ o" y9 j7 D* c: W9 O  S9 M% {' q1 Q
&dsi {8 \- u! S! f8 W" @) c( }& z0 F0 d  d

9 Y9 H$ R( G0 D4 E#address-cells = <1>;" Y3 |$ Q, C6 n/ W# N; W0 c
2 g4 _  W# G' `0 w2 s. {3 @
#size-cells = <0>;4 K  C6 F! g) I% @3 {
8 R1 B  Q! _5 R' K/ a
status = "okay";
; H" [- F0 f/ e0 W- `; q
$ j7 d2 p$ L! l! s# Dports {0 N/ ?, o0 J$ }2 d
; U1 C8 g0 v& q3 B& s- n( `" m
#address-cells = <1>;8 U1 v) e: g  Q' d. W" e* Q1 }  z

* V! l+ \  p, [# d' T  l#size-cells = <0>;1 }' z5 N  J5 Z6 V; U6 I

- e9 l! c, e- X! m* G1 K) Cport@0 {
% t9 j7 E( z% ~4 R( [7 n" c- d8 Z) h4 v" t# m; Y' b
reg = <0>;/ R) G  R9 b1 I; S

: \. _* K1 {% }  S5 ^dsi_in: endpoint {
5 ~0 _) P0 W' t8 E4 Z
. x& r) k) F6 v; i& rremote-endpoint = <<dc_ep1_out>;
- ~6 g6 P; T4 X4 K3 Z
  \/ P* p/ C# i; a, I0 Q};
7 Q% x/ e0 ]- n3 x0 l% {" l7 z4 y4 Q4 x; O9 d$ h8 p0 ]% F
};
& M! w5 R! ^- U* P/ D/ E$ Q( _# @8 ~( r  j  G- X: s4 H
port@1 {  Q  e- ~8 K0 z9 v, U4 h2 i
0 e  S8 p9 D7 C/ ?
reg = <1>;9 D# r- X/ f2 l6 `: t& l
+ y  {5 Z+ T8 h$ m; f1 |
dsi_out: endpoint {* P- Z2 s  U: T. i% D  R" B
. _. s+ D1 s4 x, v4 f
remote-endpoint = <&dsi_panel_in>;
) G7 O% s; F8 K$ \. J
& q. F: B0 z* j) r5 `8 a; x5 y3 g};2 z6 s; [: x, R+ f7 H
+ E& |& Z5 n; C* w9 r
};0 O  B3 U1 V3 N% [

6 A8 r9 o5 |3 f# Q! M  w' j};
7 P) ~- j% G$ ~* `" }4 ^) ?$ X2 [/ c, p0 g  r; r9 ^
panel_dsi: panel-dsi@0 {
' R  H" n# P2 s5 D7 u1 z. V
( g* F2 S" ?) a% b6 H4 Jcompatible = "sitronix,st7701";2 m. ]3 f! e: n. u! t% `  {' c0 _8 F( k
0 q4 z% Z- g# Y- Y6 d
reg = <0>;$ }, h. s' r; P
1 Y+ h  J& `, U) ^! w/ X5 f, x
reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
; Y) [, R# o! a* ~  p
. U1 p/ R  e, W9 `3 fbacklight = <&panel_backlight>;8 P7 C, e  U1 I. P5 m

- n) a% T+ P6 L" Upower-supply = <&v3v3>;
6 g" P  A) \7 ~0 I7 `( t1 j
4 Z# Z  X5 k  h8 Astatus = "okay";
3 l! d  S" b% q9 ?
$ c4 g  `$ G! c6 E6 `1 }port {8 m- Q8 h4 V! J- |

6 }7 d1 E" i8 o3 _6 c+ T4 Tdsi_panel_in: endpoint {' S7 C2 g, h' t7 w  I

: i5 a+ _. D# q$ w/ Iremote-endpoint = <&dsi_out>;
+ o. y/ g8 R" p" s: w# ]- |6 {+ f4 T& C- d
};( ?" M0 ]/ R0 \% N; u2 l* ?
% I. |( R% j* l& v/ a
};  I- _7 ]+ ~" \: x+ N3 D2 I

; `% w! y  t4 r" F' e; y" a5 m6 ^+ o( s};
$ R. f' M: ]; i! e! _+ j& k
: {* U" w; U  ~  ]  \$ O, F4 E};0 {' Y( h6 c9 D" y/ W  X6 f

4 i/ J) `& U. W- O$ y2.实验目的6 o2 K5 ]  W+ r. K
熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。
, F/ M# e3 b/ }1 ]* w6 `$ K; o; n+ F- x: U7 |. b+ p2 c- E
3.实验平台" r3 W# y* a6 }7 P  n: B
华清远见开发环境,FS-MP1A平台;
  D0 @0 B# R$ |" Z, _5 W) `) V" |/ |% `. m8 Y
4.实验步骤, p- T0 y! Y) q) y6 x8 ]& Q# r
1.导入交叉编译工具链
) C' G4 Q! ]# N, V" z" Plinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
" n3 R! c* r: g+ E; |/ ^7 U
- Q0 ^/ l: L7 j+ S& V2.添加MIPI-LCD驱动, }) f6 E7 h$ W7 j. v$ ?* v0 y  o
FS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动
" y/ c) ~) o1 J$ f/ X
1 U$ s8 V- K- `将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。& U6 O7 F1 v* T/ q& N
8 b' @) q$ c8 ?+ ~0 V
linux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/
- G" X5 z6 c% k4 M8 T: B8 j1 P4 C) @# I
4 l0 }; P: o! ]/ T2 A3.添加pwm2内容
, n3 p/ j! A/ W/ |; e  H修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:! ?8 a* I" P2 H6 ]* s
( S! F% Y5 Z  `; U& x
&timers2 {, H/ p8 q9 u- @4 e" B

) X* V* F" _/ A, Q- j- q% r/* spare dmas for other usage */8 e8 B! h6 n7 Q0 d0 z: P4 |% y

2 i, f2 I4 n6 i, }' p7 K% k+ c/delete-property/dmas;( `+ e8 r4 l9 l- J+ ?/ I. _* U5 u
4 h( @3 ?% s  U+ r
/delete-property/dma-names;
5 M0 S! E7 s3 k. Q; o; j+ f3 E6 c. e6 V) b  B- M5 }# M
status = "okay";' P' p& C' i/ i8 i, o6 A* H+ M
$ g% h* i$ g% ]" @( W
pwm2: pwm {- D3 D3 b3 n0 O. ^) S4 Z" _0 R
( P/ h- Y4 H/ q8 z5 ?$ e. \* n# @0 H, f
pinctrl-0 = <&pwm2_pins_b>;" l2 ?' ^" y) k- R8 e  E- ]
% W, }8 M6 @- o5 M2 K/ n4 R
pinctrl-1 = <&pwm2_sleep_pins_b>;& d# O. z. H3 z: E

& @& k, [9 L( E1 j" _5 o& `pinctrl-names = "default", "sleep";8 I6 x# e& I, {8 G
; j; L% O5 H9 S: h, |' f
#pwm-cells = <2>;. r# T8 C7 v1 H

1 w7 X3 A% Q" Ustatus = "okay";8 R0 H1 {3 T9 q6 X, m
. t1 l6 U* q0 b' I- g; K
};6 |. w+ g  P% d/ a
7 [% U/ @# m9 w; \* o# z0 ^
timer@2 {
! p9 b6 N6 |* C9 G
; y" J/ o  z. M" n* A4 q7 Lstatus = "disabled";
: U& |; J0 u$ @3 p0 T, H6 I; p$ C: b" C
};
* d4 @( S9 u# L4 w" d
" \% I- L) [: f! q$ d" U};
; G! J+ o1 L, z* o3 ^  n
* S* |" V8 _& r2 Z' @2 I9 o* H&pinctrl {
. f9 [* x3 z6 k0 m2 v% Y4 o1 ]: U% z8 A" V8 I6 }. k
pwm2_pins_b: pwm2-0 {/ ~7 o0 A+ Y6 L' X9 ^7 M
! l( Z% |7 [" ^
pins {
3 H4 }3 \5 l1 w! Q1 x4 U( S) o1 _7 D2 b; I
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
# I  ~+ f+ V) [" g( l: I  [+ {$ m  l2 [
bias-pull-down;
* c2 C. J  T- U, t3 b! h/ C6 f( R% N' I
drive-push-pull;
6 Y3 V" z1 i/ U  n5 f  u! X6 g6 E" o! y, u+ P! d
slew-rate = <0>;1 ]; g# P: S, I- ^- n

9 W+ {# Z$ ?7 ^6 A* w4 ^( I};7 d  B' A! u, m; |& `- v# f  \9 t7 e

& `0 Z# Y2 B' F: }* ]};
0 A# |+ @8 M/ }" P4 {* ]  p0 `3 Q+ x7 ?+ {3 U$ `- H, U$ Z
pwm2_sleep_pins_b: pwm1-sleep-0 {
& r& n7 v, ]* U- k# w3 \+ ]/ d3 G: m, ~$ C! [
pins {: C3 U- `* I3 p

% _, n9 B% n& z; U" C% i& Lpinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
6 Q  L& E' `. i) o0 L+ [; i6 e8 D4 V: L9 j! l
};
' s/ U2 z$ ?6 E7 O5 k, o4 x1 t1 y
};
' N0 b. }/ r& a3 B& L2 X, g% h/ r' K+ z1 _. g2 _, H8 W1 f! H# M& E9 j: x
};' `1 U; q9 ]$ ?' E( h& u
  J& E6 s$ q/ _3 |: F/ a+ A. j
4.添加背光内容: r( ^- P$ @. C! Q
修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:0 b9 b1 d, Y$ n3 G/ a6 T

& m7 S. j2 P( t' g" n& Jpanel_backlight: panel-backlight {
: X4 y2 k. e2 @* n8 c9 t+ N9 `
0 W( y6 n* J; x& ?# B) n2 h7 ycompatible = "pwm-backlight";) K5 A+ Y/ z# e8 `* s
4 }) `0 O4 I0 \0 B. G" n
pwms = <&pwm2 0 5000000>;9 z5 [8 X4 }  c' F  T' o' N0 H& C( l

" {1 O  F' X- G) Zbrightness-levels = <0 4 8 16 32 64 128 255>;3 e) Y0 G* q8 l+ v- v0 u+ F

) U( R( H7 P3 Z" _, Qdefault-brightness-level = <6>;
' e4 }  g/ \+ f. D( N- k$ P6 f) ~+ X" e
status = "okay";* g! j. C+ X! {8 _1 C# f1 \' M5 E+ L

$ j) e5 Q) `6 F" X% a) O' ]};' g. K2 y% p7 D) X3 N

& r- m& L2 Y' T- }5 I5.增加设备树文件- p; R9 e; M4 @% D5 u6 p5 a
由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。- t: o$ a. D5 g
: P# }* W1 b* a* b0 E
在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:
3 G$ k7 ~& [/ x/ K+ X3 I! q% ~6 k4 g( O% E! h
#include "stm32mp157a-fsmp1a.dts"6 M- y$ z% a# [
- H" ]" e0 g' K! `6 b- ]2 b
/ {! _  K9 Y7 `$ D4 T* H5 `# ?7 R/ L2 I
" {/ e" y+ U3 p1 v
model = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";6 L; C. U8 X& \

/ o7 A% N* \6 v& n: x' c3 Ecompatible = "st,stm32mp157a-dk1", "st,stm32mp157";- K6 \5 }) ~3 \% k( b6 c
! S/ _- F# s. N$ Q7 j
};
  q' D# K2 H$ X* r) y4 c8 b+ Y4 m9 ?' u) C) G0 Y
由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容
9 b; [: t- m/ _/ Y: s$ E9 P8 e2 a8 @; G* I
dtb-$(CONFIG_ARCH_STM32) += \8 R, z# k* A4 k! u  i7 O
1 q& v& f! j# G- b  a; e
…..* k- @3 Z  \$ w

5 L  Y- V2 J' M. `* E+ z  V* qstm32mp157a-dk1.dtb \
7 ^$ O, a, P5 `4 q/ k) l$ {  k. R' P  v: [
stm32mp157a-fsmp1a.dtb \  W/ q% B& z; U2 x  i$ q0 v+ D8 B0 F2 x

8 K5 a1 i* B# a5 {# b/ Vstm32mp157a-fsmp1a-mipi050.dtb \
1 ~$ G* j& t. p+ s0 N0 C* L/ u" h
stm32mp157d-dk1.dtb \
5 E/ E, S  q4 W1 K0 H1 X( V7 d: x! i( ]' z" ?
6.添加ltdc内容! n* C' x% Z( c9 H) G7 x; M1 k1 y
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:
1 O( T- }! y* T' V$ C6 ~5 m; e9 L
<dc {
8 Q0 M" g0 k  @9 V( h) Z8 J0 c
, ], |& g2 ?) v7 ~' A% Wstatus = "okay";
7 N# z5 J; O, n, G8 a& F' ]6 r9 V  e& e! Y: N2 \
port {% g. `! q. T+ X+ W* G  p

5 _! ~' q% y6 q+ m- D' R#address-cells = <1>;
' ?- ~/ v3 w2 A5 A! ^% ]' e; N* a$ z+ F' A( O# n. y1 W
#size-cells = <0>;
, p1 ?3 z* V* m; L. W8 c1 A3 r& ]1 D( h' h: \$ |+ S
ltdc_ep1_out: endpoint@1 {3 Z7 r! p/ L8 `$ {) k* j
; B3 W* L1 }6 X* W. |/ Q
reg = <1>;
! c' u& R7 C& i/ Q' x' W" X1 I  R* q
remote-endpoint = <&dsi_in>;
# o, y9 w) p2 F) Z0 Z0 p/ r
( u3 [' A+ p! ?7 G: m+ L( B; }; o};
) d$ n, ?: m$ \6 f  m0 e  I) f: z. M- c7 H- V" O
};
$ [# z, _! b7 Z' h4 @4 P0 n9 [; F- O3 q0 T8 j% N
};
: }; ?$ [" {3 p0 M1 R2 A8 M* u+ }8 _8 E
7.添加dts内容
4 `9 n: ^4 S* P' a2 `5 {! n+ t& Z9 b6 o! T修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:% _* \- A0 L0 f9 q- s. ]5 h% u3 ^' C# L
; a7 q, r. {% @
&dsi {5 ~' n, E  u/ h2 b1 s& r4 ~

' ^" Y% D3 t/ y8 t  {7 I$ a#address-cells = <1>;8 F, @) `# ~* C" e
  x4 [$ N+ L" \+ p( J! m2 K
#size-cells = <0>;
" R( }+ b& v+ n+ W; G
7 v0 o6 J# q4 y- f. l5 }status = "okay";
+ S: l/ H# h# f0 F0 r0 D$ e  R5 x! |4 j4 }6 R$ `% ?- F
ports {
" |0 w6 s: s- o# H% J* I$ }" y
8 a# v/ w1 ]0 D#address-cells = <1>;4 j* V+ v; d( Q
/ c  P$ f. S9 U# j8 P  \
#size-cells = <0>;& X7 x! Z% [: d. z& N  ~9 z+ i
3 y  K  r7 M; }& L. d6 G
port@0 {
: [& c; \( m0 y, B" e/ K/ Q
+ f& u: D! E- i, Q" P0 B% O# rreg = <0>;# r9 j0 c) m. @7 m2 {6 I1 o
1 u6 \. \- R6 j- \0 o0 Z2 H
dsi_in: endpoint {8 j  ?& p- G3 E: |/ ^

) b2 v# j4 d/ y& y% Bremote-endpoint = <<dc_ep1_out>;
7 j  [( }0 Q7 e1 G# r
. }1 a5 W0 ^1 [) R6 G% p6 h& O9 ^. F};
6 r. K* O' m( h' d
/ ^' j- g9 Y8 h- [' s};
  }9 j/ ~0 x; G8 }' Y5 c/ l, _3 O+ D
$ `7 g6 f( Y8 ^. w6 N4 L9 r9 n- nport@1 {% H# ~0 ^$ e) u6 Z1 `# N) g
7 ~% |7 I% R& I  u3 l' a
reg = <1>;, B& Z7 O5 H' G0 m% |/ F# T  e) p

- R/ W6 `) ]0 @9 adsi_out: endpoint {/ }$ I. f2 h( t8 E

" w" T$ z" G+ s* |" Uremote-endpoint = <&dsi_panel_in>;
+ H  m& j! X4 h9 ^6 k/ X& C5 v& g/ T7 O: {# l- u
};
0 @$ H0 N& V7 D! Y- `) @; v
7 J# H  P+ R. h4 A" g  T" O};
" a# X, M+ q9 K9 {. m, c* p/ \( z) S2 M7 H
};
5 _( Z5 c! p' L4 ^2 p# Y3 j. f. |
$ K( B" w1 {8 n& {9 t5 ^: x4 jpanel_dsi: panel-dsi@0 {7 ?* d8 \7 N1 n6 m3 G! G

& C. E9 M+ e8 n8 S7 i7 l0 a; Ycompatible = "sitronix,st7701";* z' @$ b3 G: v6 I9 }+ {. z/ I

* z7 \8 ]( u3 q4 v& ^2 Kreg = <0>;
; [- B* N5 N/ K& e7 p* b& v4 B# K4 x2 Y$ U6 Z* ~- D& Q1 ~: ?
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;
7 d7 F1 A! X! D, A; {: q+ y: j7 o; f0 X, H& R+ Q8 \; A/ ^1 ^8 w
power-supply = <&v3v3>;
; v5 y1 o) W8 T" H6 ?/ l/ H; J
status = "okay";
# ^9 A! c$ k9 z: J7 q: q  o2 Y% e4 |# Q1 R
port {
/ q" w) H9 C8 _  f; C1 L( P
5 [! d- M8 ?( m8 P- Hdsi_panel_in: endpoint {% j; L# J3 B+ ^, P
! x- N$ K+ }2 T
remote-endpoint = <&dsi_out>;
( G+ H0 P4 G- ~7 E! U4 P) z) a$ \
1 k% D2 U0 d  c" `# T};% e- ]" i2 y* _- j. K' j

( a& V* A/ V! _+ J};9 @) V5 F: V6 M2 [/ z

) y' l* D7 b  F9 S( o7 }};
. L/ d1 t4 ^1 K! w, f; q9 E3 f; z8 _9 v" a3 Z3 x2 Q& [
};
; S/ ^' f4 W+ V) Y% k
# ^, x4 y" q+ ^% M/ L5 m$ J( E/ R8.配置内核: {) `# Q" U7 p5 g
配置内核支持st7701,并列出主要选项,如下:5 b  l8 _& J& @, f% s; n
6 S4 C8 F" I# e& [( H! o) l
linux@ubuntu make menuconfig
6 ]5 X% y4 q5 m$ ]4 }
* D- m9 F/ `% P9 rDevice Drivers --->; b. ^" w; z  Z' q. [2 [

0 V* j% s( t7 A$ vGraphics support --->
: G6 ~4 Q& ~2 m( {: R% f, K% g
# Y. ]0 ~+ H+ t* N% a<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
! U9 H! z( Z# c* Q
, j. P+ R7 i' t<*> DRM Support for STMicroelectronics SoC Series
8 i$ `8 X- B) v, H$ s6 I: f0 q$ V' j4 \4 k
<*> STMicroelectronics specific extensions for Synopsys MIPI DSI
/ p6 e1 b$ t* i/ I& U% n4 A5 [; U1 n' ^: q. F
Display Panels --->
# Q2 l- [& Q1 @$ R! y3 k; G: z" X4 U
<*> Sitronix ST7701 panel driver) o9 b) E- E$ \5 V6 b* A& {4 r! l1 \
7 ]% A4 x6 z3 ~$ ~+ ]1 a5 n( x
Backlight & LCD device support --->4 a; [; Z. ]: z/ M$ r0 g; i

1 ?4 x! p1 ?8 S<*> Generic PWM based Backlight Driver
% T& n( H  P. D, _9 d: W( R" j+ @9 \$ n1 {* X
<*> Generic GPIO based Backlight Driver
4 G2 z0 I% c- q  g" T. r
1 a! S0 ?: j* s9.增加启动项
1 D& _! o% N% n2 `/ U在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加" B' ~6 a5 V" b& ^

2 P; {7 W2 [+ Y7 G# k+ Z" H+ qLABEL stm32mp157a-fsmp1a-mipi) k* o, O, D1 e& w. y. }
KERNEL /uImage/ w* s% R9 F6 P1 ]3 E
FDT /stm32mp157a-fsmp1a-mipi050.dtb& c$ L8 b; P( R9 `* k8 W
APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200; H* P6 D  _. V0 p; K! p. O
7 y$ n; V' Q& S
10.编译内核及设备树* C( E4 U# G* ^. E- [- b. F: A
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
/ X( ?: }4 Q7 ^: [: k; Q' w, J2 |; W: \4 [0 L
重启测试0 {% b2 @- B3 f4 f
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。% a3 F- M: i3 h; }4 @; c
————————————————
; P0 m! Y) q- P: ?$ M+ @* H, _版权声明:华清远见IT开放实验室
8 G3 {( g  G) A1 l# m; _( p: K. z; K: `& n
% |& C2 ?$ R6 F( j: J1 e! C
收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版