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

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理0 J  l9 h( |, x# D, J
DSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。
, p2 L' U  }# T1 N) y3 I
$ [& K* h3 c) P1 gMIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。8 M' o) H8 s' C: ~

) C6 q+ B. h0 o8 u1 s% }" u edc326cbe2a595fc4b1166c428f390cf.png
" L3 @' a1 K0 M, q. w, Q& n  e- t
FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。
9 _0 N- ~7 v) C: Y& t- E
- Y1 \; a; B8 @% X9 R+ ^ bb2cebf753fade0b3a712cbdab54f2c3.png
7 N8 T2 M9 k8 e* ~; _' r; n, h  ]% U5 I( ~
上图为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的支持。! R9 f0 R' ]" g; x* `# w9 Z9 U2 B
3 ]2 B6 ~1 ?1 I& _
DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。! ^8 l9 k9 W8 F; j

( h7 R( I+ h0 v6 ZMIPI LCD接口管脚对应关系:5 v  B% v! Q0 V
! x) M0 D) e7 B% [  P' v
69260c05eeb6ed21b9271b6430afe809.png
5 ?1 g3 C% k1 Q8 D3 ?* z$ P0 K
6 Y. s& h9 z) n9 j2 n& A) d& d6 d4 u 989321323dbac9ca83311c4b7d45e11c.png ! `8 o& x% z: v1 A) c
. F; ?$ J& ~* d* o2 _8 t
e6cbe903854fd66e44880f300d4a184b.png
' \8 N) Z5 F% `/ h) K  R+ [8 u, R5 s( [: P
43e8dd79ca02794994127213f61ac3db.png & X: \. p$ o+ X( c# B
%2IAQZU(INJWMPJ__5)R@(N.png
, e: m, n7 S- a8 z7 O% v0 _. s* O3 M) a7 _6 v
1.PWM设备节点; c( O. h3 v/ v) x/ b+ P  g
1 e" o$ f; r9 ]
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
& H: Z# O4 X/ r+ [1 x1 Q: C) P4 ^/ F8 g. {& B1 c% I
arch/arm/boot/dts/stm32mp151.dtsi+ [0 j8 R9 p9 S$ g6 n0 J% t

" h% y- Z+ ]: y( Q  qstm32mp151中timers2定义如下:
( S% A, ?, n: f. ~
9 m- N" z- r8 w/ F/ d* C* [& j& \; Jtimers2: timer@40000000 {
+ R) k; \$ K6 R) ^  R
+ {  |4 b$ ]9 p, }7 R6 y! ^9 L7 s' p#address-cells = <1>;8 [! i& l) ?2 _$ q9 i$ k, E0 |

" _& @: k& H8 R1 U. _9 z( Q#size-cells = <0>;/ q: W7 [: ]& L/ ?) X
; h9 r' H1 A7 }, |
compatible = "st,stm32-timers";/ d2 [% y( L# H& v
: ?0 v$ o/ Q2 Z# `
reg = <0x40000000 0x400>;+ T" p# m5 @+ V9 V4 M; N- B1 ~

5 }! x9 \  q- ~  h, yclocks = <&rcc TIM2_K>;4 W% ^$ x2 z/ L: x& ]/ `$ `9 k
$ k# H6 i" [, S$ N5 G' b5 i* L
clock-names = "int";
/ O4 h1 y1 ^9 F6 J9 A
. S! h) t, u) ?1 zdmas = <&dmamux1 18 0x400 0x80000001>,
: F5 s7 y. u/ v( U9 \8 v* t4 r7 H( z$ W3 Z! l8 r4 p
<&dmamux1 19 0x400 0x80000001>,1 ?9 F& d5 S/ {, s- K% ?( f/ N

  [8 [5 c* M4 Z, F$ G, g& h<&dmamux1 20 0x400 0x80000001>,
- W- i, v0 [( R: p) m$ K+ J* Y+ J7 B7 H1 i
<&dmamux1 21 0x400 0x80000001>,( m2 M7 E3 d$ F

6 z9 T% p' v% s: O<&dmamux1 22 0x400 0x80000001>;# k. Q) F: N7 Q5 r
- d& ~* d- [/ Z! O7 A& ?
dma-names = "ch1", "ch2", "ch3", "ch4", "up";4 o. l* F: N6 R( X3 E* |
2 n2 X5 D6 B: |+ @; {+ o! O, G3 Q. }
status = "disabled";
% D( T# \; u( [% F9 S# {! d* a! p5 ~2 |" |. k8 q& [
pwm {% L- ~* k( ~* e/ X8 j8 i# A

1 Q8 p, \, J4 D* Z, F& N8 icompatible = "st,stm32-pwm";
3 I& H6 i2 K+ ]7 j" _
( F  c+ `2 K; _#pwm-cells = <3>;
% D( J; K. H2 [9 W7 E/ u- x* N* q+ z/ F# ]
status = "disabled";- _. g& \3 ?1 i$ I+ L  \
7 U. g' Y! N+ L  I5 G
};
' T* ^4 u$ d, U$ u8 w2 _. }+ f$ z/ [2 }3 ~8 g4 ]. I; x6 C/ C0 k
timer@1 {
/ y2 l# ?9 B- X: Q" y2 j3 a1 C# I
0 j+ I. C  T% H7 h+ ~5 ?+ acompatible = "st,stm32h7-timer-trigger";; x1 I6 m7 }& k. d- |
8 W0 [; D. i6 g% b3 R3 Z
reg = <1>;
9 d' ^; @+ X$ L9 V" K( V0 r0 k" |! @' Y
status = "disabled";
6 U$ a/ J, P/ R' K
" q. h0 Z' Q5 k};
3 R1 e$ x9 ]7 j  \& i! z5 A3 ^1 j' d) X( A! P: I
counter {
* ]  p8 K! X( f5 ], j, e
5 o7 o% J: m5 m* d7 gcompatible = "st,stm32-timer-counter";
$ k, M, e$ y2 f' t3 r6 i' m: W- x2 z/ _2 @$ X/ J
status = "disabled";! m" v; \( O; F5 M* x! E- G$ N
" S$ }2 A! f0 ~( N5 R
};) o2 `" L# C6 ]" L) s% j
* [; G7 E% i- N0 ]4 H# }
};
6 [# g* ^: P' v) `3 H0 {
0 S% M& n7 G/ W3 I4 J, G9 L% d上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。- {# }" P8 q% m' Q$ O$ k
) V4 q$ `+ Z9 t0 y( `( K  T
参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:
5 _' Y& ]" Z# `9 d
% r, l- {* e% m$ W&timers2 {) z7 `7 v0 L: L; t2 E( \

0 ?/ G% [) |* P1 b* x/ c, o+ Y3 g/* spare dmas for other usage */
+ X; M& B$ n1 X2 H: y: }$ A4 r
/delete-property/dmas;
. z7 X# B% r' u9 y
  B9 B) r( Z9 d0 e1 Y/ }/delete-property/dma-names;
, w0 c, y4 y' A& D( P2 ~
  r6 j* a& Q- }% L7 g' Tstatus = "okay";
- x2 I( G5 g: u3 c& J+ i
# L9 N% `* p3 N1 B0 O, k) G( ^- Xpwm2: pwm {* `5 F: A1 u- E- e; K" N# X5 |
* I0 ^* y2 E' U2 `$ o
pinctrl-0 = <&pwm2_pins_b>;$ Y8 @' a/ P& ^9 l. z' M- Q

" X: v! @$ O! t9 D2 |* apinctrl-1 = <&pwm2_sleep_pins_b>;: i# c4 I; z9 x) {

1 t5 c7 ~- {9 ~/ w! xpinctrl-names = "default", "sleep";
3 ^6 B$ s( l! M: d
+ ^' m. ?2 D+ m0 H4 [9 M" ]* E5 W#pwm-cells = <2>;
' @! @; R/ R7 |
" u% G5 @; E; w$ H/ ~: ]status = "okay";9 L" ]4 T" P+ w1 m, Q  h! _% @

' R$ v' W6 R1 |( X3 Q};( i, V* K) w0 V, m( q9 r" _

, p. P5 R0 T0 _9 B2 c; g1 }, P- Ftimer@2 {
3 f6 l9 L! [6 P' d+ r
$ @. b7 w5 z; k1 R0 u- s3 Gstatus = "disabled";; h! j( |6 n3 u, w- s0 {$ X

8 }& g: U4 a# b; i) M( y};
2 ?8 {" N+ q1 C" p! f. S0 V( n2 S* W* k* t$ E' m6 B
};2 k8 D: O8 Z4 V/ n2 g& Y

2 b% L6 l4 h3 b* b: A: ]% ~stm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:& Z. A% e# _1 @3 n' _2 c
: U/ Q1 V1 Z3 P# M' H- A
pwm2_pins_b: pwm2-0 {
" F. H: H/ A6 q& I, y0 V7 ~5 s9 o9 ^) ^0 p# N! P1 h4 q4 K2 H# c
pins {( w+ A. z$ b5 E1 S! T; }
4 m1 T0 J; ]1 Z$ e8 K2 t+ p+ R9 \+ x$ K
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */% J6 x- f1 {8 [* S0 m- W

$ {7 D! L, Z: l) c$ ^bias-pull-down;
, a( |, ~+ {0 i' q7 w! O* y1 Z+ i4 N" u. s, @6 i/ S
drive-push-pull;+ p+ Z' M1 Z7 w& F4 _
' H& ~' t! m# Z6 {# T, ?
slew-rate = <0>;" W6 V4 I3 V/ A# V4 a* @3 ?

7 z- o) q6 ^, w9 n3 W};- Z7 C2 J& {( a  S; I

% V' j/ i2 J4 g) _; y. e};
* M" O) a) d# _& g3 p  f' D6 y* s& W+ @/ [7 Z8 W5 {: F
pwm2_sleep_pins_b: pwm1-sleep-0 {
/ d# b8 O2 v& A# ^$ d. u$ ]: C8 o. [( C8 q
pins {  W! O. ]) W+ F6 m$ w" d
  d+ K$ y! ]& o% m0 C! s0 t
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */; }0 I7 m9 t; H. P+ |4 j( z8 Q
  }7 k7 T/ D# @0 W, O$ B/ O
};
1 A+ N$ g: z$ p$ ]% r; g" U; P  v; X$ @3 S0 S
};
& F) h4 C6 Y' |, Y. ?
" l! w4 @% _' |" i9 e- B) r/ y2.背光设备节点1 \" C% W( {1 C. F9 r

; e# z- x; n  Z4 E  p  l% H% a% hFS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。
# p2 |: o$ |: [3 \" @7 v' _6 R( U0 G; H% N9 `$ ?- v' _! Y  t8 U
GPIO驱动背光节点内容如下:3 X! W8 ^( A  i6 E- R' n! }3 M

  l1 Q, m# c9 ~. ]; Spanel_backlight: panel-backlight {
. H; y7 U2 u- e9 L% z6 P% `+ \. f# q* _* n
compatible = "gpio-backlight";$ g5 N$ L" \5 l- g. G
/ V( y# C/ H0 v/ D. Q
gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
6 }/ T8 A& ~! \0 \! z, A  R. B$ t
default-on;
, ~+ @. k; i' S* ~' j- O1 A5 I( A  C- }$ ~/ Y' f
status = "okay";
4 y1 A. y1 t; s
0 b% x, \# ~7 |. P  E4 v, y# k2 M};* Z: b1 m) i& t; i
6 L& n, `, W! _! b) y! w/ \* {
PWM驱动背光节点内容如下:8 ^0 w5 g. n9 S0 ^% G0 y

' b6 y- }+ k  n4 r% @  |panel_backlight: panel-backlight {
& }7 ]& S1 z, z  h9 |0 D( q: G& T
8 j& v, Q' K! K* fcompatible = "pwm-backlight";5 g# ^9 U. O) w
& @4 I' g# ]8 }) N# j6 _4 \
pwms = <&pwm2 0 5000000>;
4 h, Y, U  C( f4 P+ }% O4 |) y! ?2 P, N  g
brightness-levels = <0 4 8 16 32 64 128 255>;
& r7 `7 B+ E. m$ E" b" {# m$ q5 \4 W) |0 C* |
default-brightness-level = <6>;8 V) F, w. ^, P+ ^, u: G9 h

: R8 X3 @5 L; \5 z/ Gstatus = "okay";
; x: I6 {1 |) w9 S+ L, X" _" _6 \
};
8 J1 l& e' A6 \$ ~: O, c
7 ?0 k* M7 R* `; U4 a) S( [3.LTDC设备节点- P/ r) e" l4 n7 T! h5 d

4 s& j: p6 x" ~0 E2 E8 d4 U由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。
0 m, N( {( b% B9 J
2 t- t% X  X6 u<dc {
0 @& Y" r( g6 h6 f9 S- Y; a3 K9 N' }0 R' k- B
status = "okay";
( d& {. [% O% Z
) i% B! X& Y3 P4 [port {1 Q. T) z! {0 N- r9 {9 l

6 y: C8 [! _4 g* |, B0 B#address-cells = <1>;
  ]; p/ d9 t5 I! D/ }
# G. u4 P5 d  `  o8 k8 [$ f#size-cells = <0>;
0 L* i8 o( P; i  U4 A5 g. Z6 e( R4 D: |# q3 R
ltdc_ep1_out: endpoint@1 {
- e8 \* |" J9 U9 W" ?
+ B! H, n* C- J$ Y9 F% s3 \reg = <1>;
# T- g* z. R1 Q. g% S1 y, _/ n% h" t; V
remote-endpoint = <&dsi_in>;- y9 p2 m$ _' G6 Y; T7 q1 z1 @! z$ a

7 Q9 C9 p; Q5 c0 ?};
( Z& r& t! E! [0 K! l) M# d. G9 R1 ^& e
};, P/ B7 o9 i0 D; L* [- _
3 L) I9 C+ L" i& {
};
, q6 I1 W1 S* C- \; f0 s
; d! Y& R# X/ `5 w# F' U4.Panel设备树节点
; D- I7 O. l/ F- n$ ]0 o
" _7 ~% h0 B% U结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:
  m2 V4 X2 A& f0 t8 A/ s
+ X# X2 B. \* _. S" j# bpanel: panel@0 {0 ?1 k& b9 V8 ?; F6 B* |

! t$ \9 m8 s; e. k# w/ E: b! Ocompatible = "sitronix,st7701";$ U. \! |- s2 x( F, B; U
" |  |2 o" N" l6 l0 |% B
reg = <0>;  t/ i/ M5 N" N3 J& p! D/ Z6 i
/ |& q( ~8 O* L+ T; R* S7 r
reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;
3 f3 i1 X* _4 U8 ]
# ]! d, u8 L' X( tpower-supply = <&v3v3>;+ v$ \" H! ~5 `. S

1 K7 ]( k9 y5 Y4 o& }$ [status = "okay";; A4 E# G: \) H& J- U7 A% X1 G, t

7 Z( N: I( Y! I( [) Aport {
/ A; L  T7 _  E/ Z3 ?" m, @! U+ L, u/ B
panel_in: endpoint {5 k( Q; O( V* i, O* w

" _) s3 c! r7 D# N8 x3 ]remote-endpoint = <&dsi_out>;
7 t' P; S* w! ^% t, C( j
5 w7 {0 r: D: @- ]/ v! n5 A3 I: V};3 ?, K9 k- l: o; [+ U

) e5 y$ u7 o9 [5 F6 d( e7 A9 _7 P1 Y};( _9 L/ i2 ]% S5 N, I  V

7 [0 c, z1 x& u8 F' K' }};
6 _' W- ~. L8 L, W( P
5 a7 T, h: f" R$ _$ C0 f5.DSI设备树节点& T6 y, H* x* x& Y! ?
; G0 ]9 h1 p7 J" v. R/ O3 I1 g8 N
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
% r1 a6 a1 {; K* |" l: e4 P# E' b4 c
arch/arm/boot/dts/stm32mp157.dtsi
8 U+ Z, f* y3 d4 `. k" @+ W- E& U# W$ Z  @% d# C# P
stm32mp157中dsi定义如下:
- f0 e, x0 w; N) \# v
8 }9 M( T6 c+ w. kdsi: dsi@5a000000 {; y  Q% O$ L8 J1 I/ R' p1 A

- g, h6 j/ N" Q/ r5 D0 ncompatible = "st,stm32-dsi";
3 T  ~9 T3 e  _$ O! `3 ~- v! q, `0 p
reg = <0x5a000000 0x800>;
1 t5 C$ f$ l/ O2 w' J9 v) ~. [) F: b( `
phy-dsi-supply = <®18>;+ N$ N4 D& s5 E& A2 b

/ H- c6 R6 {) }# Vclocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;& [) q2 m, W; @" f# n3 h0 p) A
+ Q- ~) l- ^9 C
clock-names = "pclk", "ref", "px_clk";
4 h; p) D0 y4 e, V( f7 B
( a* B- |3 @4 K0 ~, }  g9 n1 cresets = <&rcc DSI_R>;
! H8 g9 q" g. N; Q# n; E) N/ d2 x8 b
reset-names = "apb";, I9 s) h' S" l# S0 \+ E0 g" b% `3 y

* _" U0 H8 h4 ^* a" H7 h3 Y9 Hstatus = "disabled";$ r* C8 t7 ^- {0 _5 |* Q

! N+ f7 B8 p( }& c};3 x8 \1 z( ?" _2 H  ?. L

! |" r0 H. C' ]5 l' G7 r上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:
1 e- _' f  M1 l& B  ^) r! q0 C) l! L' Z' {  ]
&dsi {# F( o( ~9 X* `, I

" T5 d9 m0 G8 X6 _5 y' v5 \. n* L#address-cells = <1>;
4 S1 m9 F; O# _4 `  \: q) W3 z  [3 {* ?$ P
#size-cells = <0>;2 {7 y* M$ R  r0 j4 [

# ?5 y- o% i& J! Z9 ?( C3 f# ~7 o& Ostatus = "okay";* }; m' k% A6 l' N* @4 f

- c8 ?6 w/ _9 y+ `4 p7 qports {
, B$ |" K' g$ D& j! s2 F: J  w6 f$ i8 q6 `' {7 b
#address-cells = <1>;& b5 O: D: q) _5 U- ?+ w% n

( T6 ^% Y- s- x0 K. w: k& {" L4 u3 [#size-cells = <0>;/ v) f* s/ ^% y0 z: Y" r0 E4 ~

$ k$ d$ @  j8 j* o$ J4 V( U0 Pport@0 {
5 ^( B2 X$ ?. H- W9 ~9 m  z" [( K; y! g; G3 x8 V7 G) X
reg = <0>;" e1 U  d7 C* M" J! F! F
  w; m# i  N. [7 r4 w) ^
dsi_in: endpoint {3 ]% X7 I* ?0 E; L  b$ A
9 B  ~2 h$ Q& n4 t, I
remote-endpoint = <<dc_ep1_out>;
3 l7 O% {3 E0 B; |/ ]. b1 R5 B$ }, i
};1 u5 l- B. a! P& I

# _: i# ~8 {1 s7 {1 e, n: Y};
+ C  ~; I2 {  F% k" V/ C  _" J/ X3 V
port@1 {
9 U4 w/ |1 I, q* f7 Z5 l7 v/ m  o9 q& ~  @0 ?% K+ c
reg = <1>;2 e' [5 d/ W& B0 p$ [

! V. s- O: U% }1 @2 O$ m$ Y- idsi_out: endpoint {
. \' m% m# V$ ?4 y; l0 g. o" i4 ], D0 f/ g7 r& C$ j! B3 O
remote-endpoint = <&dsi_panel_in>;( s  D7 g& v! h( M: ?" n

# P& S( R" N1 I2 {# F};9 @9 z( f8 x" N3 I0 w& [: d5 u
3 ^/ X* j6 g% [7 l- I4 ?, ?
};
% q% i: v, v& z  S! Z
* Y7 g$ f# a# `' S1 d; |, U};7 |0 B- M9 x( O# e! y% N& ^
% l$ {5 w: M- f9 D
panel_dsi: panel-dsi@0 {
4 K; I! U: c6 \2 u7 u$ K
, ]+ h# L/ _& e7 Bcompatible = "sitronix,st7701";
* a* G' C* J# T9 p* n; F- C# m  d5 S6 [( M# Y
reg = <0>;
4 l* _( Q' j& }! J4 h; B( R0 e. r# [4 L
reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;) A# k1 J5 s0 q$ ~, C

  x9 }8 P$ s( G6 Cbacklight = <&panel_backlight>;% n/ M( T$ \; p  \
; Z  R  G7 Q! L: }
power-supply = <&v3v3>;
1 y* W+ ]" f. B: B! K8 P
2 p  S6 Z) {; Fstatus = "okay";, T4 k0 l! N( D4 ~; u' W# r
/ ~$ u9 S, q5 O- ]
port {
' m; h- E4 _2 w3 ~! i9 W
5 v! |. r4 n2 P# ]7 xdsi_panel_in: endpoint {
- n, N7 @) R' l4 L! J7 z3 @7 Q
" F, R+ s/ r7 Premote-endpoint = <&dsi_out>;3 v! X& O. K) G7 G$ t
) u  i; G5 ]0 i8 E# e$ U: v0 Z
};! c' g3 R& V- X" [
8 \7 k) Y2 m0 u/ u' p4 W
};0 y9 o3 l, `- l
. L3 v1 s; g4 x# S' J5 P
};, L  N6 R( {# [2 y7 h

# k, p: \0 a6 C( L0 U};
( l8 `& J6 G9 C! A5 J  m1 d8 f7 A$ t, L, s) Z
2.实验目的
, y/ A8 ]7 x4 t+ I/ X4 J4 e" _熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。7 x; L+ c' d/ a- n2 B

0 y0 z6 w7 g& G# X0 ^$ U3.实验平台
6 i# Q: ?. w  I/ f' s! A) }华清远见开发环境,FS-MP1A平台;! R9 h8 B! K" F* ^
* v6 G/ Q( V5 w* j2 d
4.实验步骤
4 z, |# q0 u" i/ ]2 V# ]1.导入交叉编译工具链9 m4 M0 X! a& f. _* w
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
+ [; `% q# l$ E
/ M, c. L- v2 q4 ^) m1 s) P2.添加MIPI-LCD驱动
' o9 g; o2 k* a0 {& y) BFS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动2 t- }) I- |/ H8 b

4 Q* ]" H( Y- {! Q0 h! W# N将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。  d- Y1 ?7 V9 ^( J$ V3 n7 U' D

: z: G% n3 Q6 h6 l1 g# O7 E1 jlinux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/7 ]. N& z# D. u

4 W$ a3 d3 j) T# V3.添加pwm2内容
+ ~6 O+ I# a$ \3 z5 o修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:% F$ O) i! B+ R
3 `0 t8 L) o. @& G/ ~. u- |
&timers2 {
& y$ p& q8 u: X4 W' E" m8 X; v
6 S6 Q1 ?+ ~( [& e% W/* spare dmas for other usage */
* n( u, F) C. L( x( P: |7 F" K
/ j, Y# y6 ~* p# |' X/delete-property/dmas;1 W% M: e5 w. ^& V2 [+ V- R% R$ M

4 t2 V6 X& Z1 u2 u& }/delete-property/dma-names;5 B9 M0 {2 u, }8 y! `) k
% ?8 z' k6 z, W8 j1 A. g+ J
status = "okay";8 c% ~9 T5 Q3 u7 M) @) O

: S0 G* P; K9 |: A$ m' x  xpwm2: pwm {
+ E$ ?9 k; M. B0 k% D$ x! t+ x) V& c  c. M' ^* J6 v& j, M
pinctrl-0 = <&pwm2_pins_b>;; A) s- @2 u) T+ E& D% f
2 {$ q% ^( d  }* {, Z
pinctrl-1 = <&pwm2_sleep_pins_b>;
7 o) S# n* f' {* W& @' {$ A6 Y3 _, }
pinctrl-names = "default", "sleep";
8 U; p0 y: Y3 ?, X$ O6 W% c  E# A- y1 D
#pwm-cells = <2>;
3 |$ \) R; `4 f5 L  A% L! \& J$ a* y2 f% K: H' j
status = "okay";. ]  K+ ~7 _, r- \/ O! i3 ~* s

' [( W) b0 ?: Y7 B};" F9 |3 P! V7 C! W
7 D. v5 ~8 B6 D: Q! M, _
timer@2 {% r! l/ I2 s9 I+ }

8 T, i& {" a+ ?3 r; l! v4 A, n+ l  \status = "disabled";
9 B7 X; [9 Z3 Q0 f2 f
+ z( q& ?* B9 H5 P+ _/ Z, V};  `* G2 T) x+ V) M5 L& H
/ [7 J7 M( D3 f/ m( o3 ?/ A( @
};
" f' X7 C4 F1 w( F
# y, W3 u; N& B7 u1 g; I' v&pinctrl {
) s1 ?# b2 I* K, e0 |% N* y# ~6 Y% L
pwm2_pins_b: pwm2-0 {
4 U$ X" d+ I5 s/ i/ ~2 M5 p
0 |$ v0 l& a* x5 n; v0 i9 d6 Zpins {. O8 N0 U7 R* ~2 }
8 o0 J9 P5 B, N) O" U* q: G
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */) l$ p; b% x" q+ l% [; K5 s) U
3 G/ s' R. A6 v; ~0 z7 H" o
bias-pull-down;
# _: [9 R$ d/ @
, W1 q, k5 I  u+ Q5 _5 ldrive-push-pull;
. S/ u; g& ]- R2 i# z" s) w! N% o% h
- x! n2 ^, o* v5 C1 I) Zslew-rate = <0>;' X6 _: |; N# [& I6 w
0 m1 X3 [# `" ~, U3 e0 w
};
5 ]- l7 S: u% [4 k8 ]# }4 D. r9 m
* \6 F0 l( [" ~+ f" C};/ x5 r  M8 y( Q) I2 _( `
; b# m0 t$ J& e. f
pwm2_sleep_pins_b: pwm1-sleep-0 {) s7 q( J* T" q+ n1 d  y% |

- }; E# u/ M2 e. epins {
* q6 c/ N* @3 Z0 S4 T5 _; b& I" _$ X5 a  S
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
' Z! D1 w; P* d" h
% ~* U9 B: g4 s' [  U5 V- a# d};
; ^8 u8 C+ L; A" R. f# g' m
( z& U# J0 ?4 J7 [) n& C6 [};
& G( e' p' J/ W* j& Q7 j! A
. _/ e' n- G  `};! @! [1 a! [0 f5 y+ q
: h3 Q9 J& e# r8 d" l5 `
4.添加背光内容
' F' [6 R, H/ q! L- \修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:
; x) d. d& ~) k( R8 w- g" v8 o6 B: o. Y! g6 C, {
panel_backlight: panel-backlight {' f& @! N# t# n! ]

  K" n! F& l( E8 |compatible = "pwm-backlight";! c. H: d% i( L; B3 M9 Y9 p

3 |' l; N. I4 hpwms = <&pwm2 0 5000000>;
  B* x: p* N" A$ e" ^3 @7 F2 _& V, r5 K/ p* E  T) }( q+ c. ~/ @
brightness-levels = <0 4 8 16 32 64 128 255>;
! C9 t% Y& p, Y: g
( [3 {' {/ ?5 y% k; E/ {default-brightness-level = <6>;
4 r# x& [, j9 M: v- ]' _
7 ]. ?7 x& W  D5 q" k+ F6 Nstatus = "okay";3 ^: N0 f  V8 j' B

9 y1 L$ {. s  F0 X  W/ |};5 r$ y0 p% u) |! ]  M1 c/ O! m  q9 X" V
) F! Y9 l0 K# v9 Q! k1 Y3 U/ v
5.增加设备树文件* y4 C$ n6 ]- i7 H4 d
由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。
  P  u5 T# n5 P% r) U+ Z
# w$ V1 U  N- ?( o' v, G在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:
: z7 k6 e# `  i# ?& f$ j7 S. R5 r
#include "stm32mp157a-fsmp1a.dts"
2 B$ H/ D1 k/ Y) k8 V1 X6 |8 {: S5 X( s1 ~& R
/ {
% |, d* K5 a- B9 G/ z- t9 e$ Y2 I! E4 p2 c1 B
model = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";
( q6 G! y& w; X7 n7 u( l+ A: Y* N
% l) l% N0 H# o! }compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
  h- X1 F8 D8 t( Z0 I  Q+ f; Z8 ]0 ~) f
};; I; t/ c+ t$ i+ C

7 Q5 O# Z9 D/ h( K: H" _由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容
) L$ z+ c* X: {7 e4 L" I% p' w0 v# R3 t7 t/ V6 y
dtb-$(CONFIG_ARCH_STM32) += \) o2 S9 F5 _& Y

" c  b) o" r  A. {6 a% F  T…..
+ c- v: F2 X8 j3 Z3 M! j3 j
  F6 G' U& Q9 ]; ~% E* wstm32mp157a-dk1.dtb \
/ E9 A( `/ Y$ H, v' E) ]6 R) J/ y
( }+ p% j8 j) Sstm32mp157a-fsmp1a.dtb \/ K$ ]- s+ Q! Y$ e  j  {9 l2 |

* y8 O6 [2 J$ @  }stm32mp157a-fsmp1a-mipi050.dtb \  U. `; D" ?. L- F7 f

- ^% V% M" [; estm32mp157d-dk1.dtb \
! S; |) T% J# H' [5 G7 u* W/ u- L6 V/ Q4 `* V
6.添加ltdc内容8 P8 [: U0 U: J( r0 p8 _
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:) E" B. _% G8 L- m* s/ r& e' y! C

) g" @0 ~7 [7 ^( i3 z3 C0 {<dc {
6 g! I7 Z  B$ a$ l" U5 e  o
) H* m# N$ p- A7 l7 x6 i5 ~status = "okay";
/ T! p1 l) X; i+ i2 y" ?% @3 I' x) b( ?/ S5 d
port {
7 A6 k7 Y5 }7 d2 F' m: W, V
1 q- @, T4 D( S- E5 @% w/ p6 w#address-cells = <1>;; N; b; z& U. V
& q- J. J! k% V: a  K& ~$ u
#size-cells = <0>;
5 ^* h* r0 U+ A# Z. g- W$ j( @  t2 O% |  |
ltdc_ep1_out: endpoint@1 {
5 E$ O* M# o7 N5 e) l. ?; J0 H1 X; I8 I+ w8 i
reg = <1>;
) L6 M$ G% b, [+ m6 N' X7 E" T# Z/ J2 V( Y
remote-endpoint = <&dsi_in>;
# V7 k4 Q" y3 \! z; E, {$ e5 U3 n  z+ W) n' {  E  M1 O
};
# x# v: r* d6 l) Q, Z( ^" W5 {! e$ P/ F& T" v
};6 j; H$ f( L: T  q# [/ ^

  T' e6 [- R4 r' w% O. g};. ~8 G/ v; Z, e' f

- g, l# V5 ~  \3 U7 j$ ~7.添加dts内容
1 p' Z! N7 ]  y5 F1 t* J+ e修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:
/ R1 c. D: C# f% \+ N
4 J) T  K9 x4 g5 e, c" a&dsi {' `  E8 Y# q4 L/ @; n0 K6 y

! `3 S8 y3 V  y0 n- K1 [#address-cells = <1>;, Z% o0 w' V' i5 G

& }3 d. l* S, [7 v% J; i, D#size-cells = <0>;
+ A9 r: @; [  Z: e- a
# l; }4 j+ T3 o+ T% Pstatus = "okay";
4 r. b! P; o+ j$ B: m0 E+ w! ^  e& {0 L0 f" r
ports {6 F% P! f, [1 i1 O3 c7 k! Q" V
5 K2 |: `' o6 x" C" b# y) s+ M
#address-cells = <1>;
/ U2 p6 X# H- m% u  V+ H$ c9 K: u0 i9 F! v9 f
#size-cells = <0>;% E) P2 B, T# x) B! O! J: b
2 V/ S; i; V+ t: u+ P, D' O5 A
port@0 {, A4 B. r) {' X. f' }

( ?2 L) z' W" i! oreg = <0>;
2 {1 A0 a: o" [7 f
4 o# ^3 E4 O4 V1 ^dsi_in: endpoint {
" T2 y2 X6 w4 a8 G  z* I! ~! F+ h' t0 o- h' G5 x
remote-endpoint = <<dc_ep1_out>;
' U2 l8 r7 U$ a! j0 U8 h* M. ]; H* G" P6 @$ W8 y$ l3 I; g+ O
};* Z9 k* R5 p8 n- ~3 v

' I$ ^2 P1 r/ D4 I};/ ]( o( s' F3 h8 F7 e: }- ^/ C. R7 `
5 ^( z3 N. l& C" v6 T
port@1 {
; d5 ?& g2 k6 O5 x( Y' x( s0 T. B0 o8 K" k! X! v2 @; y
reg = <1>;
/ c- G+ p0 h( [
  @4 l" ?" }6 M7 L# c7 L% hdsi_out: endpoint {( b* |# u7 x. z* g/ P0 @4 D3 p. O- ^
; h( ^2 R+ y  }3 ~; K
remote-endpoint = <&dsi_panel_in>;
" _4 ~: x4 x7 Q, p. k) X( a$ Z% {, }$ }
};
! v. \/ l$ N# T3 h: O3 V' ?
1 k1 X+ F" b! K! L7 l};
9 L4 \3 s( s3 O. f  R5 i6 S9 {& ^. d8 n0 D5 o% z
};
0 Y& |% |1 p; A, A2 A. c6 f# F7 d& w$ ?
panel_dsi: panel-dsi@0 {8 R. J% R, W% R  c) _5 u
6 Q# f; D5 e  d$ a) X
compatible = "sitronix,st7701";4 @5 {0 T5 v( e" E( r: R: s

4 o" l: P7 Y2 K0 D8 Wreg = <0>;# q* @# z0 Z! i! U3 i3 O* S0 d% T/ a

9 o( u4 U; D' z. M2 oreset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;
1 m: d) \2 q4 H5 ^5 Y3 ?
4 e2 ]1 {& @8 x# \" Ypower-supply = <&v3v3>;7 l, o. S/ e0 d+ Q- _

. C& [$ X& K1 q9 u; l. ^9 pstatus = "okay";
# n2 j+ }" Z" u. y! o) s8 b" ]
; |( d7 D$ A  f" R1 O$ Bport {
3 p  g% \; n7 b  B  @% B4 ?0 Q; ]) Y, M( Z( ~
dsi_panel_in: endpoint {
$ v7 ~* ?# Q5 u5 F7 _9 }4 Z' `
2 T7 G- Y6 l. a' o& L# [+ b! Fremote-endpoint = <&dsi_out>;2 ]& ~# N4 C2 C

4 k/ l, e( n/ x7 ^& J' P};
% J+ a8 p/ h# [) g
% o# q4 g. n5 Z};
/ G7 z% U9 U# q+ y, ^( C( T% N8 W
% A2 W( v! t1 Q4 ?/ I. j};
, \  u8 F* }3 h2 v8 ^3 R9 C
: f9 \1 W& N2 R' F3 n};
& G" X+ e# {. Y$ c: {( j# ?9 ]. z& W/ H
8.配置内核1 L& M5 U4 R6 L, H) }8 U1 Z
配置内核支持st7701,并列出主要选项,如下:7 n4 z( I! Y! K( w3 c7 d9 K

! V0 U- n. K) alinux@ubuntu make menuconfig. g5 k4 u; ?9 M
6 z: c% x1 V6 X
Device Drivers --->3 @+ c+ e4 o/ A, ~! |  U' P
% s& \/ w, ?. @% |( k( t) H. [
Graphics support --->1 ~% h+ J* ^5 M" A. c3 `
& K+ g9 f0 F5 ?! b4 `9 Q
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
7 C+ ^! v1 v+ ?" h- W
1 S: V* c1 h; d<*> DRM Support for STMicroelectronics SoC Series
( p- ~: |& W5 f; Z2 n, e) T& \$ X( o( {
<*> STMicroelectronics specific extensions for Synopsys MIPI DSI
8 B! b9 W" c/ P8 V; ~
. N$ n* W8 K% k8 t( h. V. EDisplay Panels --->
) t  f# [; U2 b2 U
4 ^+ O0 J5 y8 d4 }" i$ Q, N! G* N<*> Sitronix ST7701 panel driver: A; h% v# q  u6 D" S( I1 `

0 ?# f3 b& T* _; K3 S$ D( _Backlight & LCD device support --->
" y* \  J# e9 g- F- Z
6 ^0 a0 V: ]; P4 J0 k' ~& n<*> Generic PWM based Backlight Driver0 g7 j6 v1 E  u/ _

, `- g- y8 e( d, ?9 E2 x: r( m<*> Generic GPIO based Backlight Driver! y: k8 B; _, m% M3 k. v

0 D4 A+ _! s+ A8 D3 i! G( ^: p& ]9.增加启动项* J' R' D' ^0 O, Y! b$ I. N2 @4 r
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加
- L) z4 B: R$ T6 Y3 c
' r6 ]4 h7 u: Q& ]LABEL stm32mp157a-fsmp1a-mipi5 x2 C/ g1 s9 y* [7 u
KERNEL /uImage; G3 M/ l/ s4 m& i4 k
FDT /stm32mp157a-fsmp1a-mipi050.dtb! i9 c* T# M' N, B: r* F! @
APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200' K$ c& |0 i2 S- `, h, T
  g' K7 O' l5 w9 N
10.编译内核及设备树
6 H$ j6 x! F. W% y) n: ylinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
# c( l  e/ E: u$ s0 [3 p" b( }8 N) `4 h* z
重启测试* W& H$ X" H, |
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。+ I8 u2 ]6 W% _: ]( s
————————————————3 K. I$ D6 d. l3 S3 V3 w+ S0 o
版权声明:华清远见IT开放实验室- l1 Z4 h1 z# j4 U

. q6 @6 c- D4 _' v/ l  F' X7 ~
赞 收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答

所属标签

相似技术帖

官网相关资源

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