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

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理
; V0 n4 W2 f4 U6 m, \: BDSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。
/ ~9 x" I3 M. `* M" M- Q+ O+ [; `, ^' H% S/ M8 [) H$ K5 ~
MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。
- ~, J6 M; E0 N) N- ?
2 O* f8 @0 F+ \/ e, V# a edc326cbe2a595fc4b1166c428f390cf.png
& ?! `0 E1 S7 I0 J) P$ u2 U' g+ \( q* ~8 \) A  N
FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。
+ l& {: D" S) ^. @
8 y& @6 \$ m: S, [7 S+ S" Q* ?! O bb2cebf753fade0b3a712cbdab54f2c3.png
! q+ ?' j# v3 Z5 }$ P; T0 Y1 ^1 P3 i* H" T& Z: ~* b
上图为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的支持。/ z! f7 _/ [4 m
+ \1 w) Y! i( s, a3 S+ e5 H* `
DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。
# ]2 g& \, f1 m( _7 [2 y. T" i6 q/ e! f7 U& a. i0 `* n
MIPI LCD接口管脚对应关系:2 I& L8 i+ v% U" U

' R" `1 I* R' m7 S: v 69260c05eeb6ed21b9271b6430afe809.png
: O8 f- E2 O3 F2 f" a+ J: L) [: U; c7 K7 n# f2 k
989321323dbac9ca83311c4b7d45e11c.png 1 K! x# m7 ^. ^+ U2 D/ L5 K

/ A% @7 T+ @: y/ x0 H& ? e6cbe903854fd66e44880f300d4a184b.png ' E- M# @8 g- X: u8 E2 x
/ B; Z# w! ~4 ~% |7 i2 @
43e8dd79ca02794994127213f61ac3db.png
! ^8 B0 W* j# g* P0 v %2IAQZU(INJWMPJ__5)R@(N.png 2 M( Q, b1 U. ?- O" w
$ x. D; T' y3 E$ r% @
1.PWM设备节点6 k" B+ `* C* J( y* g& c

' x; c* z" I3 u0 [/ a+ b内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
( z# k4 m3 S' X8 c
8 t* K; `$ H) q% l5 Yarch/arm/boot/dts/stm32mp151.dtsi
6 S1 |0 D2 r, @, u8 s: j7 \8 [6 Y; |0 I6 x+ ^( c3 u
stm32mp151中timers2定义如下:
! X* t7 N! I( N; S+ H+ f% e! _4 g
$ G6 ~# G& o* Z9 [timers2: timer@40000000 {
1 G3 C3 J" d- `: G7 D% K% ]& }+ [
- b" P9 j, a# k7 U#address-cells = <1>;
8 k3 r: f: B4 T- p2 O5 E# d5 ]: [6 u: _
#size-cells = <0>;2 Z* e" v2 Y/ T

: P% ^" d9 f' P7 Jcompatible = "st,stm32-timers";! `( G  u6 g# k8 @
' K' L: ]2 M! M$ {1 E
reg = <0x40000000 0x400>;
" h- L! m  c) U5 R) b  w0 [5 q" L
# e1 h3 x. A0 R( Q/ Y( ~0 ~clocks = <&rcc TIM2_K>;
) I$ s$ M9 o0 g* d$ r. F3 }$ t$ c$ m: d5 |7 u9 Z3 j
clock-names = "int";1 N+ J2 c8 i# O$ Y! X4 U% Z2 c
  H) B  W' J/ ~$ \5 A7 ^
dmas = <&dmamux1 18 0x400 0x80000001>,
3 x; ~$ D0 V& S3 n( W. s7 Z
( V1 g( k* @; L8 Y) Y2 j3 l/ i<&dmamux1 19 0x400 0x80000001>,+ b; r6 `+ L3 l$ v( z3 s8 O
0 a6 q. W- C2 x0 K
<&dmamux1 20 0x400 0x80000001>,
  r3 {% N# ?  A# c& M/ d- s, x# s& H  _
<&dmamux1 21 0x400 0x80000001>,
. I) x1 n) S; m
, {1 m4 i% M; N- o<&dmamux1 22 0x400 0x80000001>;
  E; ~- A" U" |) x' @/ @2 M) V% O0 f) w5 u
, Y& [! L4 _2 n, B6 N. `2 a# }* Ldma-names = "ch1", "ch2", "ch3", "ch4", "up";
; z) B. }0 w# U/ B( U# v
" R  W2 u: m4 ~% N: D4 ^# \status = "disabled";
7 _8 I* F0 d7 G' w% w
8 d( _# Y. P' y' b2 jpwm {
" A8 R  p5 L1 h3 ~. k5 }
/ J1 I) g% Y1 L; A/ g) r3 Ccompatible = "st,stm32-pwm";* D# t# q$ S. z4 s* g; G

+ t4 {' C5 F+ G. n9 k% w  U0 [! o#pwm-cells = <3>;
' S5 q" x+ t0 a6 y) Z+ _
% [( C$ I. N4 @status = "disabled";2 Q$ v, g3 T- q0 j

6 H5 r4 }3 J" d# ]};3 f  Y$ F& V" F( t

1 H7 G, k$ I# B9 j2 d5 mtimer@1 {* L8 h( B, Z# C% Z6 D9 K

+ }  H5 J: {, m  K, ]  D# l( }/ Scompatible = "st,stm32h7-timer-trigger";7 N& |, u7 P2 d* Z$ h

( T; V) b9 |$ ?# D: `reg = <1>;; W/ a; v! p, G) z: v( a
  h' j, @: \. l) R" ?; }
status = "disabled";
5 a0 M6 X+ e6 a4 g
$ I: x$ t& h/ [' U8 |" c3 [. ]};4 I- q; d- u& P$ |  R

% @9 e9 h* s+ W" f0 Kcounter {
# y+ @4 |4 e$ ^3 J5 P9 z" m: G# v% A" A9 s
compatible = "st,stm32-timer-counter";
$ O* ]; W- Z# w7 G3 k# Q  Q
9 Z! P# f0 m3 O2 Ustatus = "disabled";; B" e, O; d& p1 x5 {
. `8 I. {: m: @% r- r$ a. P
};9 Z4 g1 X: Z' `; @- E2 c
1 z3 J: X, \* n$ K2 @. l6 `
};# r: X# J2 n; Q: ~6 b0 L
* F, [+ B  m% T+ z. v
上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。0 R0 ]( E+ w# F% V# B
7 T9 P& u9 q% m: R0 \4 p" r8 I
参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:
6 d9 V  q% w0 D+ q6 j5 O0 x
9 ^8 ]) O- O- j# R5 c6 c2 K( j&timers2 {" I; w1 ^& A. u8 i( u& U3 d

; |  y9 n/ m, L& w4 {' x0 Z/* spare dmas for other usage */, U" C" `: m2 w" \5 H/ t1 u  F0 K

& y* s  @8 y* y' v( W2 c/delete-property/dmas;
) D$ r& F) y& }0 ?" b5 N+ S; }8 s
+ g4 `4 h) G" c6 j# G3 u/delete-property/dma-names;+ q; e4 g+ V5 x+ f2 n

  k, j" K/ M- F/ ]5 I8 B% M* fstatus = "okay";
: H0 X* N( Q- y
0 Q5 o9 l  ]& n: w; \3 T9 a, ?pwm2: pwm {
5 d* f3 f4 [& C" \9 u" J: y( c+ z; h; y6 @2 `+ Y: ]+ @
pinctrl-0 = <&pwm2_pins_b>;9 k6 D; v# C$ B) {( q" ?: ]

( K! T! D1 g1 b: _3 C2 {. zpinctrl-1 = <&pwm2_sleep_pins_b>;
8 N% J  s  E0 ?, t
; w5 E$ o/ F8 @( l. _pinctrl-names = "default", "sleep";
/ S  L! O0 @/ e( k8 s
6 n& V9 Y5 k' v- @& Y#pwm-cells = <2>;7 D# C' z* E3 h; c

2 V7 ^' @' X) w: F+ o/ Kstatus = "okay";2 l, Q( J/ S  [1 O2 h6 |+ U$ ~

" Z, o; p- z" T, K5 r, j3 V% x) y2 f4 W};
3 p0 ^3 J: ^; T. U* J; u) X- u! b' y( }
timer@2 {
' B; Q; G2 ~, C( y7 s2 W  S( p7 N- L6 H
status = "disabled";
* `: A- J4 y& f% i$ s( M
. x* c3 `5 V0 Y  d: O- J9 y# J& D% X};# Q* G% J# u( _
( A; ^, v$ x$ L, H8 s4 q
};4 C: N$ k8 _9 H' c/ r
# O& O  d. D4 X8 Y; ?2 C! B
stm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:
& c+ q1 j6 W' w4 F6 h7 Q9 n+ A- F9 @6 y+ w7 x
pwm2_pins_b: pwm2-0 {
/ s* a0 V# u) o2 q; o  Z* F- q, x* C2 y: x* o
pins {
+ w" {# Y- s# n/ E2 b  ~1 g  k5 _; _2 p; r
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
6 B2 O) }& ]: J8 W2 m3 c- I+ M7 ]  n+ }. r9 G  a% {
bias-pull-down;) e' b7 y/ T( l3 |

% @6 m  K! z0 [; J, G6 `6 y; E/ B  ~drive-push-pull;* q9 q3 E. o4 y: ?5 j0 F4 G

1 O$ }+ |! a# B% a# M/ q  Nslew-rate = <0>;  y8 `$ Y% `  \" [9 y7 k

- o6 Y7 j7 w8 [7 Y8 f};
. I7 {1 }; T+ q$ ?' U. V( Z
1 q  z$ I9 B$ w3 r* v};
$ Z1 k# R2 T. E! x
7 A2 B1 h/ H6 W) ~8 Mpwm2_sleep_pins_b: pwm1-sleep-0 {
" C4 i0 h$ G5 `9 k+ z1 ]9 M2 D, ?. u6 G" Z6 b/ F: M3 G) n
pins {0 G0 i* \. I: w) l

3 ~9 |( w* S+ a9 f# Fpinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
4 [) g$ A3 u9 |2 m9 h( @$ @, J, D0 Z7 x
- s* k+ j, B( \2 g};9 v1 E0 z) f( f8 T  D- b5 c( n
- [' t! U( {& E" j, Z% I
};
( Q4 L: [( r8 z/ S; l: ~9 s1 ]5 o" W9 w; x
2.背光设备节点
( U' r5 g6 a2 W8 ^# j; H
3 N/ t% L/ n8 m  mFS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。
% R  `1 \  F- Q/ G4 V9 P" x8 F. W/ C6 m' N) v  b
GPIO驱动背光节点内容如下:
, V5 o1 p) s- K7 b4 p- C% t0 J- i5 U! `! W
panel_backlight: panel-backlight {% A4 k+ t7 O7 ]1 n% c! P2 e& Z

% h0 F) b# q) K# S3 |6 i" k) Z- icompatible = "gpio-backlight";
- L% P/ D, {) t" H$ \' ?1 U$ R* s: G" [2 o% A
gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
  `7 y% n' p/ I7 H2 F7 ?# S  v* p/ O
default-on;$ u, r, w7 j4 L
6 k8 l2 _6 o+ v; w: c4 l0 q! }
status = "okay";! O9 Y3 l; B, [: L; J+ |

% i. l6 y9 ?* D};- {. {4 K- L8 d
& D% ]5 J) ?2 ^% k$ z
PWM驱动背光节点内容如下:, p0 S9 J7 t) e6 P' n5 U9 w  s) b
8 T" d' _3 \" p0 f/ s
panel_backlight: panel-backlight {
: B/ }0 A  {0 j. k0 e9 s4 x9 E! F" O8 u* H; w; t0 Q+ R/ g1 T
compatible = "pwm-backlight";
9 W, T- ?) a) o6 Y4 `0 R# i
% s4 B, X( P; r8 Dpwms = <&pwm2 0 5000000>;9 ^" w0 O$ V0 \* q# j( w4 f/ N

7 x  m2 }$ T$ H. Ubrightness-levels = <0 4 8 16 32 64 128 255>;% ]/ x6 y/ Z0 M6 S* L( O
. j. P& R* L; @; L; F
default-brightness-level = <6>;! g7 z$ c; O* ~- `
6 @: T4 k. C( t* g
status = "okay";2 i+ h* x! I8 d$ r4 k3 j

; _, d- p( L$ v0 u; v6 M  [7 Z};+ y( H2 S( @2 Y# n1 K) b7 V: f
: H: h" P; B! G
3.LTDC设备节点7 W! I' ]' ?6 W3 E0 `
, @, x# y; B  y) s  d3 t
由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。0 \: M" V3 i* g6 I, \
. g% z% c9 i3 ]( @% l7 g
<dc {
* O1 |$ P( h4 t. `, v( r& X: O/ u  ?& r
, V3 D- ^! I/ U- W, e' K1 Kstatus = "okay";
! y! N( ^6 `( J* k% s0 z6 f5 t3 K
; r- N8 q& C. v! y7 p" P' hport {
. x, v" j$ x# ]  L( `* H: m( ]$ U* n9 K) o* J7 t4 G
#address-cells = <1>;
# _1 e- ?7 b* _+ a) l, A4 M" ?
* {6 @, r. p3 b# o& t1 u#size-cells = <0>;1 F2 M- X- _9 q- a
9 S0 ?0 D+ n, g) q" S9 f- n* d3 o
ltdc_ep1_out: endpoint@1 {$ y: S2 S9 z; q4 g) q7 Q, x
7 N% J! W# ]! N* Z$ M8 K
reg = <1>;# u- K/ ]3 s% t. j% C) Z0 F
) T2 [7 @- Y. _$ w0 N8 @5 l
remote-endpoint = <&dsi_in>;" h# n2 t$ ~& a( \

  @9 s% W" Q0 u. w3 W8 V};
( V0 x- T  ~; b- g; ]7 s. i3 {/ o, ~4 M' l
};
5 E; a" d7 V9 Y
" A# f, K2 d" ^! R};& N# ~( \8 }, F

' X1 U& X8 \  ?6 Q2 t/ a! [4.Panel设备树节点* H# {9 X5 u% Q/ D- E7 h7 y

# ^* m! q: @: G1 O) ~/ {结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:! [: Z4 l, N9 O3 w/ w# W; K

# O3 E2 C% |# L- z& Z! q. ypanel: panel@0 {% b) z2 J1 M, q8 [' L. r- Q
. _; U5 j3 M0 Z7 k# x1 ]7 H3 V
compatible = "sitronix,st7701";7 H5 B+ u4 F; F( ?- v
6 {5 N: K. g# D
reg = <0>;
8 Z- R, ^7 u" a/ C- c& [7 T( P" [0 {% Q: ~& E- w$ G3 ]3 ?4 ]
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;5 a) K0 O3 O- i: k7 Z

6 P0 I6 p, C/ i' `( a3 vpower-supply = <&v3v3>;
4 X( @# m0 t+ Z4 z$ S. e/ s$ p: X; F
status = "okay";
, S: A3 q+ ^" @: o
. J6 x' n0 \5 Yport {( D/ N+ e. w/ `" d" u9 Y

/ k) p4 l; ^" z7 m, m4 F5 Qpanel_in: endpoint {
+ g% j; Y) [3 _# S/ Z$ N. C- P( P$ ?6 y: x- h0 c
remote-endpoint = <&dsi_out>;
  E  F! X! A. |6 X  t
6 V/ c$ h4 ~9 P, V8 B};
5 o3 ^8 i; {, ^8 Y7 }% G4 Z; ^8 E" U5 T/ D# w" J
};
7 U- ~$ Y1 ]  N( p, @" o1 d  v6 l
- [4 t# v2 b3 s3 C. F' O! t# T};. \- q( [. {( ?- U/ Y( \$ x* P

1 V# K+ C- X4 o  {% S7 ~1 U8 J' {5.DSI设备树节点. {3 Y9 u) j" F  a1 [

1 b: f' |3 d: e7 t) x内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:3 x, U- Y  K/ K% Y1 j) [

% F% J1 z! W  x: R/ }  q4 carch/arm/boot/dts/stm32mp157.dtsi0 r% g* k) @* F, A. u% F3 o' ?2 o2 h
4 W" C9 ~  X* B7 b% `* l
stm32mp157中dsi定义如下:% M2 ^- V: b8 Q9 p& B7 o+ [
2 Q9 o- ~; @6 i% C
dsi: dsi@5a000000 {9 B' `: Q5 d6 C' F( j: b, Z

  g" B, W8 @! ]6 g* I# ~. q% Acompatible = "st,stm32-dsi";
- R+ ~1 M7 L( A( B
, ]  b5 e& j& _7 v3 Zreg = <0x5a000000 0x800>;
1 i" ^8 {/ N$ Z( P# \$ [) u2 m# p! M5 r' R
phy-dsi-supply = <®18>;2 [- R# R) }& S! |# U2 `

* ^, _! Q" }* Q8 Oclocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;4 F6 c. h6 P1 j. R5 ?7 a% L

9 l' Q; G4 \( n$ ^7 mclock-names = "pclk", "ref", "px_clk";) x" |7 Y: b9 U8 T' [% w- N4 G

- N0 O! L3 G0 Z/ |resets = <&rcc DSI_R>;
0 H; i, Q& s/ r) x+ H1 z4 R3 `  n) g4 [/ o5 ^
reset-names = "apb";
6 y( ^+ d" c9 e% j& @1 U' n) P) g/ ~% g, R0 p
status = "disabled";
$ e0 U  o4 g& \. u5 h; q
# T- e/ z, J, |* m( H};. q$ p( m% Y5 G. }. i

4 z- U, `7 r9 C0 c上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:
0 L. b' \$ Y$ f
# G- b  @: K; Q# ]1 v+ M% l: q&dsi {% ]2 p; C2 ^1 l& }# m. f  @, B
, j, C$ I- f9 m$ e2 p
#address-cells = <1>;1 c. p- s7 C! V2 @

( ?8 Y, f) w. V8 _" \2 F#size-cells = <0>;
5 l  _3 E5 G! B/ V
  E: z! U: e! A% o4 d: Sstatus = "okay";
+ q! P& K7 N  _/ ]/ v
" c$ o5 f. D# G: Y6 Aports {5 |- ~, Y+ Z9 j

2 l: G5 }1 l4 h) H5 ^+ d* X#address-cells = <1>;
& R. r# D7 G+ D  S# R# \3 E4 o7 u7 C# j7 m' z# \. h/ s) {
#size-cells = <0>;* t" d) p7 `0 Z3 @# p  L% B7 s
1 q1 U( |& D7 Q' X) d
port@0 {( @8 C5 k, C6 s8 |: m3 f; t

2 K$ x5 x" c( N0 Greg = <0>;) l3 r$ b& m# {! ?. D6 H

9 N6 K" f9 J( ~8 [" k: w; ~: t( Sdsi_in: endpoint {4 u6 K; q5 B4 J9 R; J, e
% a. H) B" U8 k* }
remote-endpoint = <<dc_ep1_out>;, [. s- y4 y- n/ |$ k5 `* s
) I3 D* w' Y8 e* o+ k9 V7 e
};
& I& \7 P  f( }# V; }& V& v  t) r
};
3 w% _. z6 l9 k4 ^  U$ J9 F4 {
# E! M$ U4 S- p! t; rport@1 {
) C5 \5 |$ @$ u
- a- h* u7 V( treg = <1>;/ P+ p; u3 T. C6 v$ }+ a$ F
2 V4 B9 `& m2 C; @& F" b" L0 t- a% g
dsi_out: endpoint {
7 f/ z* v7 t$ e$ l. }
8 Y9 F+ @  J- W' `' }remote-endpoint = <&dsi_panel_in>;
6 M5 @4 }& {: ?; L/ V9 C  t
+ n/ k3 P8 E0 T8 W};
& M, q" R$ m; N4 y0 P
, v0 X) l% ~  A3 b+ [( ~% p};+ G9 Q& t$ G$ f9 u# J+ P) @: f

3 _9 v: p5 V- S! Z/ i. s6 J0 Q};% j" n' J" {; V

4 O* y- \2 J6 s: `8 Hpanel_dsi: panel-dsi@0 {
+ u6 ~# [5 v  Q' {
4 D' [- C3 p1 d/ F% `& Ycompatible = "sitronix,st7701";
7 u+ D- N6 _" m3 g* k+ O
# q( c  y" C& n: rreg = <0>;
+ x: g7 ]+ o( V) d# B0 B1 r
: M* Y/ J. L4 p) breset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
) g2 d$ F" F6 w% N0 S" e: e) k4 V; s* R2 n5 d4 V. @
backlight = <&panel_backlight>;
6 a9 `$ c& g) x" I: i4 p& B* e' G3 s: N  }
power-supply = <&v3v3>;
( u1 N! |; r! j: O7 ~& ~8 n$ J, M, M' g2 ]$ N& A- H
status = "okay";
1 P+ D. f4 H9 n" F: b2 r
% _' G, P8 y% }) i0 p) N, Lport {; ]7 h' w! I1 [- N: p! m5 R

. J) o& h8 A/ Q9 Wdsi_panel_in: endpoint {
# K# L; k: f2 m9 n+ E6 Y: w% B9 {8 f# S$ j; T6 e) P
remote-endpoint = <&dsi_out>;
2 O' Z* S' u( H: O, k. m( i  u7 U! o- {. |6 f
};
5 ^% O5 I/ J2 x$ W0 d: P2 r. ^9 F! z! a, E
};# h$ a2 ?  k% _! y, f" b

% h2 x/ D# P3 h) y2 X};8 l+ k+ Q  a& Y. Y
+ z. m" I2 _! s& k
};! V- z' M4 _8 G  i- }) {3 i7 M
" A. O; o/ r( u: _$ Y! [: P
2.实验目的' o& M2 }. c( v5 a* P
熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。( P' j' b- q. e! d- M+ b2 W

! n' B- F9 P( T# z# s+ F" `8 ~3.实验平台
% W7 B% X+ i9 j  A3 a华清远见开发环境,FS-MP1A平台;8 Z2 s' @* F: d0 `- f. A- `( M

5 x' [- t4 {) i% {# l  f3 E! d( s4.实验步骤# I. p+ g' {4 G7 a; H7 `
1.导入交叉编译工具链
$ X- x( F  }2 o  G( ~linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi+ J8 ?* l$ R. c3 O2 \
- A+ p' N. I: @- Y4 M  u
2.添加MIPI-LCD驱动
0 I- J4 v- T1 JFS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动" ?: M* y8 M7 |8 P* v
- d$ b6 n+ \% N1 a: g" n
将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。; Q# Z2 @& K1 Z: P

# ]; u! S; d+ Jlinux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/1 m! Z0 n. m) i  T
" l2 M& m7 j- y) U5 V9 @
3.添加pwm2内容& R$ `" d6 S! L* @4 B' P
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:
4 k: D. N7 y! c/ T; }' H$ p; q% a# e1 E* O  T
&timers2 {
( _# E  F9 g1 e9 ~/ m3 {+ {7 H4 P$ g  {: s' Y. m" e
/* spare dmas for other usage */" s) K9 d& |/ {1 P( }

5 n" g5 U5 p0 f3 r6 `' A& n/ t8 W/delete-property/dmas;4 m$ f' H, Y9 _# o

& Z, }6 Y2 |( _* ^+ u) X/delete-property/dma-names;, g' O/ v( R$ _
  {# v( @3 x# e+ [
status = "okay";2 T' z0 w* `6 B# U( G
: L/ e* D' n+ ~: K
pwm2: pwm {
3 W5 N* u, A8 Z) m9 W; i; d& w3 j
  C6 J# t3 ?2 f& |( gpinctrl-0 = <&pwm2_pins_b>;
6 G2 e& s5 U9 l8 N: e( Y' e- t& }6 d8 I
pinctrl-1 = <&pwm2_sleep_pins_b>;4 w% i. V: Q2 r4 o1 j4 T
" ]. k  N8 q; C, F# b- N5 p
pinctrl-names = "default", "sleep";
" U" ?1 I. w4 @8 u! x2 J% |
4 p! `6 ~/ Q! y; {' V& Z, g#pwm-cells = <2>;0 [3 d. i; Y  R; L
' R- f8 c: I2 k! W7 b
status = "okay";
0 M3 P" A( u* j# C+ Z9 B: G* w: j& o# q/ C- L4 S
};% e: E1 \% u7 h" L9 }2 u

+ T% Z3 ]$ b% Q# Gtimer@2 {) f" Y. ]( u7 M8 z. o
1 N. ?& F/ p* B* `5 d* s
status = "disabled";4 \4 b* h/ `0 Q! x, {

, {  \3 Y. j  R9 O};& H8 A& S9 C* \$ ^$ h& \

6 o$ Q6 I3 y! o) }( J2 h! C& ?};
* D% [  d0 L, n8 Z
! A) l" m# z9 n: R&pinctrl {& K7 m5 y6 i' c+ Z( O* K

8 G8 z0 a1 q9 Y: D3 H; y- bpwm2_pins_b: pwm2-0 {
: [5 I5 p4 J4 Y3 X( D7 ]0 l0 J1 R; T5 k. \1 F  P" u  S6 y" m' x1 u% _
pins {
; o0 |9 `: f. U8 ]" G, r* m% G8 \/ V
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */7 ?# K  K5 j5 h! z' Q0 d7 i
/ V5 N" u" v. R; |9 I$ I! v
bias-pull-down;+ ~. T, n7 j4 K7 F
5 s6 @5 [  R, k2 O/ Z3 ]
drive-push-pull;
: j! g. r+ A# c  k" k! p. w) F
5 ?- N  s! }7 G+ m3 L* islew-rate = <0>;
( j% G# j) t8 |4 k4 X. d" c0 G3 E* k! c
};- _9 G8 o5 ?; W8 z2 y

" k4 o- y+ g2 A};
: R4 E9 c* `2 S% U( f& w6 u# D( h7 m
+ z0 N% X; y- d+ tpwm2_sleep_pins_b: pwm1-sleep-0 {
2 d! N# I: E' _
1 Q: t  O9 M0 x' M! {5 Cpins {, @# C$ i) T, T7 p" B4 `& Y
8 m9 E0 _- z" [+ k9 R
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */* h: a; a  g; ]! f
3 N6 s, U$ W2 e- w
};
0 G) G" C7 f# C; }) x: E- X3 S
: |( \; g- R% {3 K" r4 k8 _1 \};
# S+ A1 i1 T; c7 P8 Z" B& v8 F/ ?- x; N# w0 |
};
' Y3 ?* l  _3 r; |( {4 m
: K" I! R3 T' Z. e4.添加背光内容
& H& `" h0 D  N修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:+ d5 [9 V# u2 S+ u
9 z& z( W0 [2 T! s& P7 [9 G
panel_backlight: panel-backlight {
/ b$ |, z* w6 C# {/ u2 h0 U; a2 n% m
compatible = "pwm-backlight";9 X* ?! E: @$ I

4 ]  M. k9 }. c+ npwms = <&pwm2 0 5000000>;( n: X5 }3 r9 n  l: P+ z. p
7 {$ i3 E. Q9 V% L0 L, r: b% i" k* f
brightness-levels = <0 4 8 16 32 64 128 255>;: w2 e0 w4 ~4 ]3 r0 S/ `, n
* K/ I; D+ A+ S2 k# m
default-brightness-level = <6>;
2 m3 J0 X" N1 x" M% A' I. d; c1 ]/ m, k; x. P$ m- W
status = "okay";
$ c* W* ^4 ~& x* }, P* L! z) q
# h9 g/ |: T( t) ?9 O};
4 V6 m- b  g& _+ f; l7 |$ B+ ^  ^( K9 O  z5 d) m6 y2 F6 S
5.增加设备树文件3 F1 J7 @7 T, _- \* \
由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。
3 b5 F" p* @+ V
! e9 `1 C. {( N8 g1 l% P! `0 b% Z在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:$ e- e% B# V5 Q: A  o6 z' l
* x" G1 }1 `; L" C% {0 o$ E0 f
#include "stm32mp157a-fsmp1a.dts"
0 s0 S; k% o" s$ ~2 w
( M/ I' d' @7 i, r' s' P/ {
: Q5 |5 F/ F" T: M- p) s- g3 f; P4 F' K
model = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";
) u9 v! x6 u3 G: j" y& N$ ?
! v* B* \7 f# P6 e0 y! Q3 dcompatible = "st,stm32mp157a-dk1", "st,stm32mp157";
' Z9 W9 |8 b: d; I# D& @0 E; L, m* b* B' U+ v! E7 f4 v
};/ q- j6 b/ y  B0 E" T+ T1 ^6 z

2 i- Y9 E- ^: ^/ w4 D由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容1 d; B- t8 |3 A

, m( D/ A( d' h9 m! m. X: _9 bdtb-$(CONFIG_ARCH_STM32) += \/ I5 F# v$ ?; ]% o( ]3 r4 S( B

9 E1 t& T$ _# o; e…..7 r( j8 Q7 ^7 q$ K
4 g3 v' h; j/ S, W- \% d
stm32mp157a-dk1.dtb \4 f9 g5 U- A0 Q7 y9 v# y0 G: w
* a! ?* }/ a: ^% C$ c, k5 B
stm32mp157a-fsmp1a.dtb \$ L7 k) ^  v0 T
, X: t: b" _. Z- f7 A6 v
stm32mp157a-fsmp1a-mipi050.dtb \
2 X/ ]7 I7 X* W8 j  ^) I0 x
' d* e' w( a2 _  O' J) cstm32mp157d-dk1.dtb \
# q% V( t: W5 F& i4 l% w) f
! J) l1 g3 b) `" N7 x6.添加ltdc内容- {3 \* n1 o# e  ?+ M
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:$ y8 _; e' L6 a( E0 ~- `: ~% [

- N( B+ _. V/ g) L7 [& G1 ^  R* V% f<dc {
% a. j) ?8 B+ ?; }# w$ X, ?+ Q  N0 }' L" D2 q1 G$ G9 B) j
status = "okay";0 c0 p' ?/ B/ M1 M) u

9 t! s, y# x9 |' n" x' kport {# O9 D; k4 c  ~1 L7 p

( S! s/ b: I  Y0 k5 V- c4 \#address-cells = <1>;: \$ S) i8 V! |- M/ b9 h

7 J- E: X! z$ ?6 K3 ?+ g6 e+ K#size-cells = <0>;2 ]2 H- B! g) y. l( F) R
( U4 w: f$ ^" ?9 W% e1 R) T
ltdc_ep1_out: endpoint@1 {/ P7 a& a( v; N4 C. m0 {

% D$ e% D/ U% V2 d( Yreg = <1>;
. v2 [. p, g+ E% c% a* w7 q+ E0 r
remote-endpoint = <&dsi_in>;+ N  X8 |5 O: x1 T; k0 x
- f7 }9 h7 S7 d
};! l3 k! f( x' i0 _5 R$ _

4 ?0 s: a6 B9 ^; \7 I5 A};
- K: J0 w# A3 y7 L! X
9 |; g- s' f8 K};
0 }. B0 g/ Q6 c' f( Q" Y1 z8 V, L3 z6 K* ]
7.添加dts内容
+ X2 v1 O# ?. V& g修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:
' Q6 J( Z; @0 \& t
( }. B1 y$ a6 B&dsi {
; \. b" X* m$ w6 k  G7 F  c$ N+ H" W- X0 e
#address-cells = <1>;
* d) N: y: r4 ^, [; t+ }1 v( A- N
4 O: a9 i& c, O. A( J* M#size-cells = <0>;3 V& f- ?- w/ Z2 Y2 t  j) Z
. q8 s% ^# @; s1 C' w4 N" o
status = "okay";& \: r* j. @- [: }; `

% r* h* @& ]' Q2 T& iports {+ }9 N/ R- s* O: b

  L: I( V" p* K, `, |#address-cells = <1>;% N/ Q( \: V# U7 {# E: A: p$ ^9 H1 X/ y

/ x2 l$ _- ?# _7 @+ z# s% t#size-cells = <0>;" X) K; }4 m! n5 l# m: @
0 f. ]' `, K$ s; O/ `4 E
port@0 {9 c8 k: A2 n5 ]$ I
2 O/ ]7 ]' m. L; S4 u
reg = <0>;" y- R% L* _9 J: ~

1 u2 t1 h; }8 f. j1 sdsi_in: endpoint {
+ T, u) z5 Y$ O0 b
) j, j( U+ N- a  s9 e% @9 m+ kremote-endpoint = <<dc_ep1_out>;# r+ Z1 @, \# T5 Z) x1 w
4 U9 |1 I2 B* r9 T" W7 T
};5 F2 |4 W  {( S% q  v2 ?5 o
9 V/ G! [, P# F
};6 Q9 ]# D8 }: d+ B' r

& k9 c: x0 y  z2 F. k5 l- J5 Z; Cport@1 {
) B0 F* }4 G2 y+ X! k+ q* N% x& t# I. q
reg = <1>;
% O" p" \8 }% s  J, |9 e8 N9 U( G$ T7 K( k- A7 n
dsi_out: endpoint {2 d: G8 B9 n9 a3 J
. ^0 [( {3 Q7 b4 l, v% b
remote-endpoint = <&dsi_panel_in>;
/ E  L$ {8 w0 E$ k+ `) h0 o3 r; Q6 ?+ `: }$ T0 H% R: m" ]
};; `" u# k6 N+ N/ |" v$ X6 v5 _
: o  I# S5 M; V. S) |
};
! o3 t4 P6 i/ n' |: n
8 B8 `' L# B+ G* {5 m3 R};
7 P- O+ x# x2 Z# n1 U
/ h2 \: X4 v# Y; k) kpanel_dsi: panel-dsi@0 {
( q& i6 q  }0 V9 o( A( _
, _7 O: h& R. t% icompatible = "sitronix,st7701";
  F& l1 Y8 v" j8 l$ s* z6 c5 W
. |% ]4 |) N( V" G# vreg = <0>;& [; e- e& P4 u+ U) T( ]" [, h3 C  R, f
5 H: z$ Q4 f! x3 ?% x. _3 Z
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;% b; T, k; t/ K
' E0 P) d! y2 ], F
power-supply = <&v3v3>;+ |; M0 @0 k* U: F# E6 t
# j( M; t) I6 I; t$ U3 f- S
status = "okay";  u$ L9 F6 i! Z8 e. ~$ ^+ w! O
' V+ w9 r+ v  u, z, @& s: k6 @4 R
port {" s  Q1 q1 b+ y+ W/ [1 j8 d( L* M
4 o2 p/ O  J$ B4 O2 d& E
dsi_panel_in: endpoint {
/ n/ m3 Y, r+ j' \  z
4 s, _% t7 I  @6 e3 h* j& Q! Y+ Eremote-endpoint = <&dsi_out>;% g0 i* P( w4 t/ \4 k2 c

' P6 l, |) ^5 b( Q};
& O5 u5 Z6 L3 `7 e0 y  E) A
1 l6 x6 p; [  p) F2 R};
( x8 L+ b# o. r- \" }  _" Q& S; n
};4 P6 l3 f% I0 x6 n  o) J
" o& C+ _' x. T5 N
};& s$ h! B- U( A: {
8 s, {9 E( e, r, }, Y: {& u
8.配置内核: @, R, {' |3 N1 x5 N
配置内核支持st7701,并列出主要选项,如下:9 T7 i8 N$ V6 I3 t

; J& u9 K) k3 e; R1 nlinux@ubuntu make menuconfig$ f7 N8 n8 o7 k1 X

4 y, U. c2 V* u& I/ `( CDevice Drivers --->8 O0 C2 u/ U9 f% a) w: G+ r

  N1 S4 d+ l* L7 SGraphics support --->+ B3 e8 m. L% Z+ F

) J* ^/ l/ ~) L. j, u2 ?<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
1 M& V+ i  s: Q7 o) M! h
  b1 |$ R7 X) f4 `: D  O9 P  _<*> DRM Support for STMicroelectronics SoC Series
2 y/ C8 F7 v# E3 U% T: V
3 e# I$ \: u8 }, n% n% O+ [+ p" O, D<*> STMicroelectronics specific extensions for Synopsys MIPI DSI1 P* A+ a. b2 I
& Q! n& t. [8 ~) X& M
Display Panels --->
! y0 F1 |6 v+ F! u& C# k8 A1 E# q/ }) i4 m/ l, x4 {  N- |4 G
<*> Sitronix ST7701 panel driver+ h) f& H- a$ J/ `- g* O2 u
. x' S1 V3 h4 A  |$ {( _  P
Backlight & LCD device support --->
& e# s- S" B5 ^6 V  X* E! w% s# O( ?4 ~" s+ K* s% A
<*> Generic PWM based Backlight Driver; s/ H' d7 ]$ o$ m% u1 p7 A5 w
0 f; {$ K& g7 j
<*> Generic GPIO based Backlight Driver0 G2 }% F1 K' ]3 }2 [* X. P

' H8 X! K3 B+ q& g+ z9.增加启动项% S8 K/ f4 ~# E; O6 w) ~( Y
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加; Q  s- x2 ^1 B% p

+ C2 g8 D; p+ `* h0 lLABEL stm32mp157a-fsmp1a-mipi9 ]0 E. [7 @- W* n
KERNEL /uImage! T% _% B7 C  c
FDT /stm32mp157a-fsmp1a-mipi050.dtb
& V3 a  @1 @$ Q- QAPPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200( q9 I0 g7 _' _, b3 ]4 ?- p( G8 X; M
( |2 A) [' I7 \0 k% K& ~3 n
10.编译内核及设备树
: p$ W" W; k1 Wlinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
& D0 i* ~& G3 K0 f" J# }% o
+ t9 X; L& B- z5 C5 z, Z) I2 ]重启测试
/ M# u2 B1 J0 T/ Z7 K: g  k: s5 _# S将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。3 H9 x2 d. h* k' D2 T  F
————————————————
; o- A" [0 b- M5 T9 a版权声明:华清远见IT开放实验室
+ F* o8 a  u# u/ O+ k, O# r4 Z; v" {* P
4 q2 `, M; e, j
收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答

所属标签

相似分享

官网相关资源

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