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

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理* e( r0 D' X3 G0 q. u& [" ?+ q
DSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。; r% v- L; Q2 A% l! T
( h# M4 ?* E1 V: t& n5 p  ]
MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。
4 F7 B3 j: ]" w, H, b! |; c
+ Q( f1 N* Y3 O8 W" R2 E' f edc326cbe2a595fc4b1166c428f390cf.png ( K- Q2 K$ v5 N/ [) F. D# f! K
" e! T0 x; G% }- f* X
FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。! t2 h9 i9 K2 u# m
) X" o7 ]8 D! c4 ^/ Y- g' S" C! B
bb2cebf753fade0b3a712cbdab54f2c3.png & o3 f) b- Q) t7 }1 X% D
- I1 t% r2 Q5 Z6 r* 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的支持。
3 Y( R% L0 x5 }. ]( e
0 J9 G( U; ~: E1 W/ C  O9 HDSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。
! v& w4 |4 w. U! d5 u4 O4 i2 o+ I0 X( A' d  x: \
MIPI LCD接口管脚对应关系:
- z8 c. `9 h6 \% E/ [3 a% U4 h' Y+ g& p3 d
69260c05eeb6ed21b9271b6430afe809.png 6 r: P9 B1 t1 l- C% t8 x! _  l0 W
# B. ~4 [3 W8 N( Z; i
989321323dbac9ca83311c4b7d45e11c.png
" V; N" r) {8 q. d, ?3 P2 V0 B# V: b# |* T, l3 C
e6cbe903854fd66e44880f300d4a184b.png ( Q, ^4 f/ H* ?3 I3 ?
+ o' Y  c  b% w: q6 w9 ?
43e8dd79ca02794994127213f61ac3db.png
8 G* v. j$ @/ J4 g$ x1 N4 y4 v %2IAQZU(INJWMPJ__5)R@(N.png
8 E  H& u: o% t0 D" I6 L* g3 ^& `9 ^: x$ a/ L4 {
1.PWM设备节点8 N  _2 N# M  j5 X" g
1 M* ?0 X* U2 S
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:/ d0 `1 z8 C+ ^1 t# K+ z1 {
+ C" P; K+ |, L8 u9 a
arch/arm/boot/dts/stm32mp151.dtsi
0 [: d5 ^5 s1 A% b( c! J- M* w  m
: B' G; m$ y6 B+ v: J& @0 Lstm32mp151中timers2定义如下:* W$ M( e% p0 `8 W
2 d# W  D7 G# a
timers2: timer@40000000 {
# X1 X4 Z' }+ `; x
- E1 Q: p4 r5 C" k+ z#address-cells = <1>;
) I: s8 N& M, q" |
) p# l  @) K: ~+ b#size-cells = <0>;
* S  ~3 z/ X- l# T9 `9 V5 E) u" c! r
compatible = "st,stm32-timers";
, ?, H% @1 O  p7 }. n8 Z7 l+ [# E- b" |0 z
reg = <0x40000000 0x400>;
* _- a0 U, L9 k, |( x8 o' o/ a5 Y+ a0 x. v3 |/ X, d
clocks = <&rcc TIM2_K>;
) w) B9 f4 @6 m1 z8 ]- h& K. r% B% X& m: T* V3 b/ s
clock-names = "int";' E9 i( X( J* q: y* e' i) g& a0 ]
7 u5 C( I5 X' H; |
dmas = <&dmamux1 18 0x400 0x80000001>,$ U6 [7 X  _- a& c+ X% h7 w6 F
" ?" ]. V6 v/ A; l6 ^
<&dmamux1 19 0x400 0x80000001>,
2 G% j) p3 q1 D: d, b, p: ]9 c- k! U+ g# l. O
<&dmamux1 20 0x400 0x80000001>,' ?0 K5 k5 {, c! w0 k
7 O8 Q& g# y' _3 ?0 C; j
<&dmamux1 21 0x400 0x80000001>,
: G, B, e. C9 _$ C- ~$ d; S
& g4 _8 v( D2 v  L  L<&dmamux1 22 0x400 0x80000001>;! o$ F0 D; P: f( l* P
+ s9 M) \5 V. L- V2 G4 N- Q
dma-names = "ch1", "ch2", "ch3", "ch4", "up";8 e9 n4 \& q3 Y2 J' I/ X) m; G

+ y3 {& t* i$ T! {status = "disabled";0 L8 ~7 ?! ]- D! m5 G* l, ~
" N) Z% R! u1 R* r2 T; f
pwm {& [3 ?! R# j7 d# c5 }- p& j3 o
+ s' [: O, G, f% m% U5 }
compatible = "st,stm32-pwm";% w' M" L1 d$ V# J

' o% G. V4 `; ^$ V#pwm-cells = <3>;
# n+ N5 I! N' t, X  Y" s/ }( j# m2 F5 W6 S% k  Y
status = "disabled";5 B* w' p; _! C2 x0 K! u) j
2 F. A- o2 v% H' }
};
+ q3 A$ P5 m0 B4 @+ x
  {" b' o6 ?% T( xtimer@1 {) a  J5 K8 V+ F& s2 G  n7 `

2 K9 [$ f( }3 J4 G! X9 Ycompatible = "st,stm32h7-timer-trigger";
* f9 e( F/ l0 a/ S3 K0 I
% @6 \& X0 Q" @9 a. f# _5 w( kreg = <1>;
5 K; Y) w6 ~, s2 Q
) T# \$ _" a4 ]* ustatus = "disabled";" N0 A) e5 i' }3 L

  I: @6 G! J- f  W};
; R( `2 u% A5 f9 q* j! \, Y1 ?+ w
counter {
% f( s2 u2 i$ z
: k) v/ s) C5 i. W+ q% l( acompatible = "st,stm32-timer-counter";8 y, w. X" r( ~+ _; T, h

2 c0 I  j& u' Y1 _1 ]status = "disabled";
* ^4 i, ~4 O- X+ d# |, k0 v
$ B6 F# W( p1 J6 `};' B7 L, ^$ R4 ?, |
( \; m; r4 t& u" n% B3 R
};
6 v1 K/ F# G# O
& _5 }' @8 `( V  d上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。
% R: V5 M% i9 M- w4 I
! K3 y% W' j0 @4 g2 w+ d参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:. c; a4 H# r& z, i$ `! c
; S" Q. W( S# j$ K
&timers2 {, ~1 C3 X. a0 @$ D3 h
' T6 t1 e6 W# f; C
/* spare dmas for other usage */+ q$ `6 e* I% ^

' e  w1 l  q5 ]5 g/delete-property/dmas;3 @: K: n4 H2 O0 l4 _( E) C9 |

( t0 [& [7 A$ P9 G! E+ C$ r9 ^/delete-property/dma-names;# i# \4 i; p/ f  a
! N6 d% l& U% I' k' B% G
status = "okay";& w1 a3 U% \+ Y- }9 b7 D8 k* {1 Q
) F; E( p% F3 V( {7 Y
pwm2: pwm {
" F( Z9 z% K5 H" S! {! Y$ |2 {$ u& W4 c
pinctrl-0 = <&pwm2_pins_b>;
( _6 i4 R$ |% N) y0 B! |; N7 }2 l- b. n# ~2 o. ]% |
pinctrl-1 = <&pwm2_sleep_pins_b>;- }! T) E3 O" e' o3 Z! J$ P- @0 J9 r
, s* [0 a' G7 y9 @( ^
pinctrl-names = "default", "sleep";
* S' B0 J' c7 w/ |% f* x/ u- n, k1 P, {& T6 B
#pwm-cells = <2>;! Z2 u: {0 P0 L# z% e. \
) r0 Z$ A8 A# y$ L0 l) H
status = "okay";
& L8 q' n' u7 Y- f6 ~/ E5 T) z" s& K+ \9 W: b- h! y/ b, z6 E
};
1 o' a% d- r8 y1 z: V
! n$ y" J( Y7 V7 |; h/ _timer@2 {
& m$ k" j# u3 _. B" |9 D0 u7 w) d. w3 @$ n2 s9 C8 D& e& m
status = "disabled";) J2 \  N& g/ P) I0 K; q, M5 M" j; E

; ^* h1 i, i: L# S$ v' i4 d};; i( G7 J) G9 i: _/ a; C, H
! K* }* a) k7 z4 E5 i
};
, F+ K8 \* g- F5 F
+ p0 Y; p6 a. _2 s" a! p1 Qstm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:- g& c4 z$ d- v1 X& @) h

0 [  \. k; v" v, l8 S& X0 Upwm2_pins_b: pwm2-0 {1 c* p, M( U+ `8 V
" X7 L7 a+ j* U5 Z
pins {
) y, n2 W# f$ R5 `5 m* L+ g1 _; C( y! ?
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
7 B: I0 O1 J9 T5 N! N$ c: @6 T1 @( V7 i
bias-pull-down;
2 q: p7 h$ i% z4 m1 X8 ~" t& @! k& o: k, ~* m
drive-push-pull;+ T6 d# c9 n3 Z7 F' m! e! ^

- p  i( B: M: j# m- o7 uslew-rate = <0>;+ h! m: r9 C1 W9 `
$ I8 D/ R- B  G/ _* {
};- }2 X- z( q% w2 b

9 D1 G% `) @- s2 {9 M7 k" ~};
$ C0 G2 o. ?6 a3 p3 o1 t4 P9 T$ K/ q% z) d4 }5 O
pwm2_sleep_pins_b: pwm1-sleep-0 {2 \6 K* a  C" |7 i1 w/ R

) s9 {" e# [, [! I3 bpins {
2 h1 T' p1 n! @6 ^; m" B
% P7 X4 `) q- _" ]  V3 A3 `7 t5 |pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */& g1 w' L9 N$ w' F6 M* I

0 a0 e& m- |; A};0 O* j  A7 t& \: j
6 h. O  N+ t- B8 j  `
};
5 c7 \- M8 C% K# l
( s" Z: T- O" ^4 h% S2.背光设备节点, R3 Z9 l- ]) r. g  V
/ l, I& @% {# t
FS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。0 i% J& C9 l$ K8 J. V' G8 K5 p
  ?/ T/ S+ k# S7 U2 W$ g  n) c
GPIO驱动背光节点内容如下:- H- S# f5 d3 n: u/ H
1 E* ^; f' R) g  C- U- \7 V
panel_backlight: panel-backlight {
* Y$ J% G) {! P3 i! D
; G/ \3 f9 R( M' e* m6 Fcompatible = "gpio-backlight";& q3 y/ ^& [  o  I

+ s" |8 O+ b8 g; @0 c% d& Bgpios = <&gpiod 13 GPIO_ACTIVE_LOW>;- j$ a+ T# K- ]3 R5 ]
+ t4 a6 e3 `8 u/ H' P# l
default-on;
1 @* y2 N5 y$ l+ B2 d5 @
1 ?6 u$ b% C4 |5 [9 Y* _status = "okay";8 s7 R- d2 t( V9 z" V: B& }4 ~
+ F, L# _& r  L0 k! o5 Z# C
};
- C# B& C3 U% }& q8 q3 b6 C+ G# q9 ~2 J; `" v. [
PWM驱动背光节点内容如下:
) B) s: G* J; U3 e0 w, y
4 g6 b( v# @, n0 D  Q& A3 e2 qpanel_backlight: panel-backlight {5 c3 N8 K# k% U1 m+ W: r) f
# F* E; t; ]! e" k  p1 F! G
compatible = "pwm-backlight";
7 E. P6 d2 R: r. ?7 }7 ], U( z6 Y) ]5 B
pwms = <&pwm2 0 5000000>;
+ Y2 J* W8 i: E1 k! z% N5 W9 N+ E2 t; p1 K
brightness-levels = <0 4 8 16 32 64 128 255>;5 f3 x1 l$ m0 @* @/ [3 ]' H2 G0 M) J
7 w6 @5 S# t% j: g; e' b: Z9 F
default-brightness-level = <6>;
: f" y* Z: L$ I2 `! N) f8 r* D( @7 D) @! B" g
status = "okay";
. ^- h% E6 f- R; ?) x, Y( p1 }# k# H! r& H  ^+ h
};3 l: N# P5 p" R$ P
* q3 K; e3 A3 o1 d
3.LTDC设备节点
/ p6 C5 J) N9 i* w& J- }6 V7 k: S
+ \( C  K: M& N+ y. e由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。: R& k$ r( G5 V
5 C5 w. n& B7 N9 E2 ]
<dc {
& t; h+ Y) z' m# A  S1 a9 H- x$ u& x; @/ x
status = "okay";' s( s/ M2 k# K4 J5 B) M! b. C! E
# F  |: S* L1 R
port {
- F% ?) B0 E4 H- o5 t: j9 T8 B
" u1 \# Y& {/ [, w& ^#address-cells = <1>;
/ _/ e0 T6 }( m. r4 h
2 v3 L) k, }; a#size-cells = <0>;
3 h8 _. X* c  E# F$ @+ {* J
2 b4 A. D& L2 t6 e; g: {' Rltdc_ep1_out: endpoint@1 {5 b. i  @' @; X' ^
2 l5 T* s  @' |
reg = <1>;
* s3 Z! K1 A2 r2 d
/ I6 p% w5 m0 d+ Q1 Gremote-endpoint = <&dsi_in>;
- ?5 O5 N. C" A" T! a3 x6 g$ K4 X- o; T& I; c
};7 b- C2 Z( ^" D$ \
% j+ }( L% l5 _: _2 m5 g
};: w) m8 t( O" o8 h- L& [
6 c( g( s) x4 k6 o
};
$ a( n" V+ }7 k" c, E) B7 x
7 R; S4 J. k" W) ?, N) A4.Panel设备树节点: x$ ~. ~4 c5 W
0 I" Y" a* M; S9 d- ?1 ^9 ^
结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:5 A; f; A) ]" V

' L; u& |1 h! h' M# ]) ^5 kpanel: panel@0 {
/ \0 N8 e6 d: i0 U0 r! e, [  N
, H, c% ^5 g6 W  e; j) ^compatible = "sitronix,st7701";4 v# q7 L$ k9 r6 F* R+ x# @
' ^  D/ S9 G# s1 Y: f; L6 E
reg = <0>;; V. X$ \* A: X3 C" c/ o

, t7 F9 R) r$ y7 [4 W7 Dreset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;
% ]# B/ @' a3 [, t: P% e* V$ U* m5 p
power-supply = <&v3v3>;
" T9 T$ j8 o5 V& p
7 _+ C; Z% L7 ~" q: O5 s% H: Bstatus = "okay";5 X/ x0 d& ~4 \

% ^2 c* l4 h; {/ P  O  f! Pport {
, d% P3 G# }/ U' `) _6 c
3 G* c* w  N/ ]3 F4 Z2 m/ z/ zpanel_in: endpoint {
1 Q; k8 v- X& ?1 w' b1 Z' A$ B% K; \: G4 N- z6 e% r3 i$ P  _
remote-endpoint = <&dsi_out>;
( C) S# ?( m& W1 @& b
: y6 [- `% g7 e. k  M* P};$ h. i/ Q1 N- Y
* o$ @; J& O8 g( L9 s3 P
};
6 j. \0 V, w  d! ]9 D
- O! W8 R- Z! X};( y; I# i( r% m( S& A) E
' U! @5 e% d0 d2 s
5.DSI设备树节点; r! u+ J, J6 z6 S/ B% R7 W
% v7 j" L9 g1 E+ E! D
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
' ~0 J' D" ^$ F& b0 U3 x
& U8 K9 e8 u3 [9 j9 Xarch/arm/boot/dts/stm32mp157.dtsi
. N, P+ a+ _1 F' U( H; ?) N8 Z. P  ~' ~1 n! B; _
stm32mp157中dsi定义如下:
0 G0 `' @4 S( u. x& l9 E7 i/ U7 `1 R% Y9 F( R7 r' {
dsi: dsi@5a000000 {
, _. h6 }' H4 \1 ]. J1 k' n* f
+ \2 U, t; h0 j; H+ p" vcompatible = "st,stm32-dsi";
! B0 R$ ^' R$ f3 ]* i+ W+ m  T
; @' j2 ]9 f; j5 {1 J1 k6 ]( Sreg = <0x5a000000 0x800>;
; D5 K- ]( r3 e9 V  c' \
: d* i+ x6 H% V, Wphy-dsi-supply = <®18>;1 U, ^% f1 y' \

+ N5 n2 L! ]2 U5 mclocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;5 W7 |# Q0 v- h6 l- D- W% ]) A
9 x, n. o% T9 w6 A0 H9 @
clock-names = "pclk", "ref", "px_clk";& |! Y2 J/ |2 l% S5 Q- |# v4 H; @
. s4 m( H% i0 _5 u; Z
resets = <&rcc DSI_R>;
! r2 H$ E( T$ K: M- N+ O9 `+ y1 l
reset-names = "apb";
3 A' [; u& E1 Q) U- j$ b& Y0 Z6 ]% o: B/ l1 b; o1 Q0 i
status = "disabled";
1 i( n  y5 k' _) Z+ v. Q) i1 }- f3 `8 y! k
};# ^9 `! n  D" M. v
+ V* `/ T! v; L
上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:
' k4 ?3 p; C, m& w  ^/ [1 p4 w- A
1 I+ A3 q2 K7 M8 D7 o&dsi {9 ~3 S6 M" q( U( r9 `/ v$ y

/ L- Q# q* h: `2 K#address-cells = <1>;$ f- ^* h' N, Z2 y6 j; j; ]. @& X

4 g7 h6 i2 }- r2 e5 ^: {% F#size-cells = <0>;& O; [. j5 ~4 B- x  I8 f0 d& ?* I
; e9 E! H, m# g9 L+ v6 i
status = "okay";7 _  X) B/ U% E2 g1 z) f

- d2 v: J0 P1 `0 N# Eports {
9 @4 Y4 m+ h- ~, y3 ^2 R8 B) T4 I2 K
#address-cells = <1>;
3 N% K5 k& U9 u% g0 M$ T0 C) o/ P0 p8 z% U
#size-cells = <0>;+ z- s4 P/ F7 T1 E

# G$ L0 u" |5 R! jport@0 {
0 x$ X* Q( l3 t5 l8 s% N( V/ |9 v6 k5 j9 U
reg = <0>;; o- F4 u: S7 y: p) \9 [1 @
2 G( ]0 A2 ?: j# }. M! z
dsi_in: endpoint {: [+ W$ G! J3 o$ f6 U; x
8 o6 H1 S# a" J/ H& O, E
remote-endpoint = <<dc_ep1_out>;
+ F2 R6 o' W: C/ g4 J. ^- j6 H7 m) n; T, U/ K2 ]/ ]
};- l$ V- e0 ^8 O" }# r

; X. U$ X( r4 v4 v4 j};4 s1 Y) b: J! Y3 a) g3 w* w

# i  S& T3 ?. `! a4 u* Hport@1 {4 q  [7 w# T# p3 ]
: x! ^8 P7 W# W7 y, j; K
reg = <1>;5 V6 ^4 h6 {: c
! Y7 d% ^9 }. E9 w# E# Y9 J
dsi_out: endpoint {
% `5 L8 b5 ]7 a4 L6 M  p9 s3 x; J/ d( E! R% W' g7 l
remote-endpoint = <&dsi_panel_in>;; Y  e+ c+ j3 q' L9 Z$ L* v" F1 L  [

, v+ |/ l- _  Q};6 t3 o% P& d% L  ]
  c  _$ s/ U# m
};4 @8 ^3 C" c; ~; ^  V/ U, @* a8 }

3 N- Q0 N4 e" X1 `3 g( E};
8 {; [& m. u& e+ f" ~' V7 {1 R( [% r5 X2 V! i% A1 u5 a8 Q
panel_dsi: panel-dsi@0 {
- s+ P- R- |4 l& k6 F( Y' q- }, Z3 A( n, T
compatible = "sitronix,st7701";
6 a% y: X. G6 f8 W( c: G/ v) g* x& G+ ~; @' Q: M3 w3 u
reg = <0>;/ g1 H8 j( s# W1 ]. u5 \: H* M

% c+ L2 N; z# `6 F$ v% L6 n; ireset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
8 O/ W$ B$ Z0 z8 z  S
& _5 w8 f* N' \6 [3 P6 W# r% k7 qbacklight = <&panel_backlight>;( B1 a5 ]1 \7 o: s$ v& @4 H0 {# Q7 h

; z: m- H& K5 Q; s* q6 R- I0 V# Vpower-supply = <&v3v3>;( N3 E- ^  V1 ]
" o& ~1 l7 U' ?
status = "okay";
; w; q" g5 j: q, \. i& \! i0 _
1 |6 V# Z5 R, _0 U- ~# w- cport {
- k. T+ t1 K# B2 G8 |" e
4 k- V, o8 S- g5 L- `$ F; |dsi_panel_in: endpoint {% ~: Z. [9 g$ k5 r! \
0 o( O. K5 [/ K3 @4 Z
remote-endpoint = <&dsi_out>;. z  l9 P' w) _9 _
$ E3 U$ s; o3 l0 H
};
5 O2 q  p8 O9 D" L0 U) p) p- y6 h5 m: O% @2 h+ N. q
};& _# Q0 w9 N  I# T

: k# m( |. Y2 h. y5 W};! h* O5 j$ X0 _: T9 Q+ C1 w4 {

1 @  w1 }& a: Q9 X};$ {3 o5 m$ |( q4 K
, K+ Q' q' K: o% S$ Y, D, m
2.实验目的3 e( _, \7 U. p0 t* r6 l5 V; |
熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。
; ^6 n  s: }7 S- l0 s
) f, ~2 S/ i. c' t3.实验平台. d/ p# Z2 N+ J  Y2 ?3 Q
华清远见开发环境,FS-MP1A平台;( E! r3 c* B, z0 K$ f1 s) ?" B5 W

- |  `, E7 q% X0 x+ u4.实验步骤
9 |3 a; s" f' [& a0 V5 i  c2 F! i1.导入交叉编译工具链
4 [- p3 k* s7 h) p% _% i: k+ ulinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
2 e; X$ s/ x2 C' V$ V; p$ s1 e* O8 R4 T$ P$ O
2.添加MIPI-LCD驱动0 O- E" I1 d; @! S, f' r4 G" F
FS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动
0 R8 u# q$ e8 j% ]* ?0 e
- {6 S& T. G8 E8 m; z& J8 \将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。) x1 T! q9 g- a" S# K
5 l' l/ Y; x" [) a" e0 n. r; Q
linux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/
% y6 I! |' _8 C% B! G: L$ C/ ^' T9 m; u
3.添加pwm2内容$ b& J3 Q3 F, }9 Y  K
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:% T3 Q4 }' T. D1 D4 I) N, G) r0 C
5 |( p, ^/ b" C
&timers2 {
7 [* B& T" H5 L0 I. {+ R, ?; s, j2 n
/* spare dmas for other usage */
0 o3 P3 ?# f7 N  S, ^/ M8 d3 }  X( Z8 [1 ?& ^/ S" \9 c) X# i) X
/delete-property/dmas;7 ~) c% y& E) ?& e6 l! @. i
* v/ s- o' U$ @4 E& t
/delete-property/dma-names;" K2 c& X3 F% t( o3 q& a

3 ]6 o) f2 Z" ^1 X# [0 ?: \2 vstatus = "okay";
" D# G% S2 l! B9 s7 P9 |
' R/ _8 |  P; P* E  g$ qpwm2: pwm {
5 d# J  [" [; e9 G/ C# s* \4 ?9 ~$ R
1 V' F( `$ u0 f0 {3 \pinctrl-0 = <&pwm2_pins_b>;
+ j& b2 O) W* b7 e( ^% K1 y
# X& [7 B( q& O- gpinctrl-1 = <&pwm2_sleep_pins_b>;
' p' [! z9 f9 Z( v; g. ~: y8 j  |
. x& x1 y) U4 O3 h: mpinctrl-names = "default", "sleep";
! n6 f; A; b% t! D2 H4 u! L7 a. H  q* O8 I' a) j/ h5 N
#pwm-cells = <2>;& f7 `3 U, |3 d# e
9 s) Z! C6 G! s6 b. Q4 y7 e
status = "okay";& o: e& d$ r' a$ e1 N

6 |8 s7 ^9 Z0 E4 q$ ~" N+ F: o};
% O7 X( ]6 A( ]5 I( H, c, G/ j. X2 V$ q# I; n  T9 {9 R/ N+ ?2 ]
timer@2 {8 c& D: |$ O1 i; o1 Z8 z

/ z' E. ^; }- d) lstatus = "disabled";5 R. U6 ]& u9 U) [' V
( |" E1 j: q6 w& `/ S
};
2 v2 x) p/ p9 R4 y* A6 q- X
& `2 E# Z7 a8 S};) ~0 n2 q0 k" ^

8 Z8 ~, t+ ?6 ?5 R7 q&pinctrl {
  [! J, w/ F$ ~. n# t! T* ]8 ?& y* K# s9 q4 H8 P4 v4 C
pwm2_pins_b: pwm2-0 {
( A! L$ W3 t) r  }8 w: c$ ^
: G2 f- L; f& l- Rpins {4 K* s! P2 _9 C! _7 ?

$ o/ W0 J* z8 l9 N# W! vpinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */$ k, \5 D" B0 R3 [# ?3 l% A

0 O* v4 w1 L, @) p6 @bias-pull-down;
' u/ @6 @. t5 ?7 V" e4 J+ {
0 Z: C/ ^/ Q# r! _4 |drive-push-pull;
: ^) U) h* N, y+ }# c5 R) _4 w/ x; {, c
slew-rate = <0>;
  K7 u- X! d: Z  s
4 f# Q7 _0 I4 V! r  M};
6 u; k, ^  Z# N* z: R" L
, G7 _4 C* y" F" V2 o  H9 I) t: P};
5 W* h- }) s. V. `7 L
5 I0 t7 k8 b" E0 ipwm2_sleep_pins_b: pwm1-sleep-0 {" _5 _2 ~# k/ r) ]5 k9 k3 s
/ N( q( m8 x- D: a) s" F
pins {
; S; p% n1 Y) _' p6 R$ r- i' A1 @' v+ P9 p0 a
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
) N/ y) J& b. }
: t4 W" U" J1 c};
% H3 P( t7 {, h9 I& B5 _6 K8 t1 Y! W1 k' o
};  |0 N3 y9 d8 z: V2 Y- P

; n/ A0 \4 ^- Y$ t9 Y6 @6 m, J7 k( L0 V};
& ]7 q( [0 ]  {$ |/ @8 Y
: p3 k. r9 R% A4.添加背光内容
" }  {; i# x* s/ V! {' W修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:+ }  f" B  M% d3 C7 c* p
! Y$ L8 m3 [, }) c8 E
panel_backlight: panel-backlight {
; }7 S& N" F2 Z) D4 ]& @2 h0 w1 o
0 {1 X6 A6 \' [1 |- Scompatible = "pwm-backlight";
  ^; c: S( \/ a/ L; R) C3 c+ c" k4 e: ]
2 b( U' q' _: f# c" [3 cpwms = <&pwm2 0 5000000>;* d! e) H# Y8 H- t  X1 l# D
8 Z! U& f: p6 g' ]) I6 S
brightness-levels = <0 4 8 16 32 64 128 255>;
& b% q8 g/ \* q9 }0 x
- b' q- o3 S6 n: D5 ?( w5 jdefault-brightness-level = <6>;
& m- d; y; K& q( P0 B" j
; b$ z3 q8 F% [status = "okay";. O; F$ J1 q# p) i, H( n
& n: ?' l3 B4 ^! l
};1 g  A9 D; R5 `9 W2 B* ]# |
: r% n. w2 j- c8 x) s2 F
5.增加设备树文件$ \! }5 o7 |' \8 ~% p+ G. M  E
由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。1 r9 B8 v$ H" L. b# Y+ q; l* z
: A( ^0 w" K3 g0 r
在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:
7 ^9 }( o5 k" q& U' y; Y
5 D9 {, x: s* R7 J% N: d: o1 y$ f#include "stm32mp157a-fsmp1a.dts"; V4 [# }" E- W& B! t# j; ^3 o+ ]
8 D9 `- ^8 w9 N3 [( X* s" r
/ {
" s  E+ R0 ?+ G3 g. Q) h' E
) [/ K" @+ f2 Y* k' b+ z  s" Emodel = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";+ Y& N3 O. `- U3 m# w) x) C* K* Y

" D+ N* g( ~" l. ?4 [" ?2 vcompatible = "st,stm32mp157a-dk1", "st,stm32mp157";
- V' ~" T2 G* h  k4 ?# E; s" ?' y% x# v8 [3 O, D
};% F* h. N! R7 G( A/ O- \4 U' A

" x" L* C6 `; E' V( B9 ]由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容
' ?' a) H9 |5 P" n: h) {. D  e8 e$ }7 D" v- T0 n8 X
dtb-$(CONFIG_ARCH_STM32) += \
! K" T2 ~1 ~' ~7 G% a( l, ~6 M! T! |' L# q- R
…..9 t  D- t' x: V7 x* [

& O- @  X& ]2 g( z; I# o% gstm32mp157a-dk1.dtb \
5 H& o' T2 N: i& Y  s. M
, Q" v- y; U9 x- V( ^stm32mp157a-fsmp1a.dtb \
! `+ {7 t2 a$ |% M, {7 Y; i
0 T! ?9 W( l9 k; p; [stm32mp157a-fsmp1a-mipi050.dtb \5 s; s3 R; l9 t/ E7 l* Y
; z! a! ]  g# H. P& y
stm32mp157d-dk1.dtb \
8 J/ M' ^7 A, G- }: H% ]/ e
$ T' p% }8 w3 d" ^' }7 o6.添加ltdc内容1 S2 C6 p) q2 W, s; {5 ?
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:
) Y& `  T7 i! B' |9 J6 j% \% l4 H/ N
<dc {* j, S: P7 V* o: e" k
9 `0 f6 f) k; z( Q: c- K
status = "okay";
; ~, `! g  r2 w& A1 }0 _8 J2 A$ D" \
port {
9 Z# Y2 O0 S* i/ N8 t/ E2 E9 U2 h& U/ s( o7 x
#address-cells = <1>;
. G, W8 M! n, G, P4 k6 R# s% v! a. S7 G: w6 \
#size-cells = <0>;7 I2 s$ t3 F/ r. t
/ {) s3 ~% k5 J# K
ltdc_ep1_out: endpoint@1 {
  q7 ?% e  P7 C) w) g) L
4 E) R7 i8 Y9 Qreg = <1>;& Y$ F7 y+ X* L0 [: z+ r2 U# T, p, |
+ k7 |, a+ U9 s/ \6 s4 \
remote-endpoint = <&dsi_in>;! j& {, C6 Q7 i
6 e: A) o6 b* C
};
+ E4 j: i% s- \- w0 F0 l" ^: k* E7 w# U3 k
};
6 `5 |; L2 e' _0 l* k) E# X" L$ |' Y0 A* t6 Q! H
};. ^1 {9 R) C* _" `. z" U+ E

6 {) s( w6 T0 J7 h& ?' h7.添加dts内容
# Q$ n, l& k# i, ^9 e2 y修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:
* V/ p: Z- U  ^
; v/ p7 F- a9 h- J% S- Q. D  O&dsi {
$ N4 W' Z9 L( i1 {. D" S5 N: I8 s4 D7 P: h) o0 _
#address-cells = <1>;
0 K) a" {" n0 x7 M8 q: H9 f
! g4 Z8 [5 g' U; H" C# c2 \# X#size-cells = <0>;+ D. }7 t" J% _7 x4 n7 o  U1 R1 t

8 o$ S: Q2 d6 O) y( Istatus = "okay";4 _! f# E2 Z! O7 H/ x! U; j# V

+ o! o4 F( z6 j+ e3 ~ports {
/ T# W9 y4 d4 ]) A1 M
3 I& ]$ a2 x6 A; A7 V$ Z4 y#address-cells = <1>;" \% Z4 i! }: z8 q" Q
1 Q) p" V8 Y6 q: q! d0 ^$ @; a
#size-cells = <0>;
1 {  Z, X4 j, [- ~( _3 ~3 G5 y4 F0 j$ ^0 L5 t
port@0 {4 v+ W* `' T& ^1 p& [

" V& }. e7 ]% w4 Breg = <0>;* w) H+ Q, S1 A4 C0 Z( e6 L

8 k% K# z: B& O5 i$ e0 ^1 Cdsi_in: endpoint {
% \( y0 [* F: f. \% M5 m' R; b$ k& h( M
remote-endpoint = <<dc_ep1_out>;
& P4 V. S) \, N& @3 N+ x! w
+ q$ z% m" ~3 z' G" b};! Q; _' l: }" l1 }; m$ K

1 e1 T2 W" M9 ^) q};
2 r+ _2 q" L" j6 ]- w( W7 X8 Q, B9 u3 j0 v; n; d' L
port@1 {; u& w- g6 N1 @5 D  [0 T
  J' ~+ O4 B6 Z4 h
reg = <1>;
7 p2 i$ q- l! t2 n7 P
  A1 t, S; z* z% n- V& y1 \dsi_out: endpoint {
) {  [& V% f6 k; T7 D; F7 W, B, w; }% K
remote-endpoint = <&dsi_panel_in>;& G% \& d4 X- t$ x2 e7 N

" v: v7 b- @5 e};! A$ l; V# ~& N0 ~
5 Y: U/ g% k% G: ?. C
};% H, A. d. x- I/ f' ~" }7 \: q
+ R. P& e0 t/ a
};! k8 G0 G+ G+ V

% Q3 q& w0 q  Y4 G1 f# H3 epanel_dsi: panel-dsi@0 {- O3 a' W$ x  M% J0 m
9 l' X) V7 k$ j: B
compatible = "sitronix,st7701";
( z7 i) e4 a% V  N1 z; y3 @, e" u: I
reg = <0>;5 m  ]! r  \! ^: s- t

& V6 F# F6 S& U* R4 `6 ?+ d( `reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;& z; l. o" c7 @$ A$ t
, M9 ?9 J3 d7 v) |5 d  C
power-supply = <&v3v3>;  u& h5 c0 m! R3 w: l

! Y8 ~; I& u! `7 u8 fstatus = "okay";
8 w7 ?, R5 Q+ m9 V+ ~4 `: z' r2 A
: k" r" M/ |2 |1 f$ x7 B( l: Vport {
7 E7 Y8 G2 Q" g6 |- j  f6 k( D
- r# O: G' [6 x6 n+ Adsi_panel_in: endpoint {
2 m2 t3 |- O; E6 m6 a) q6 f3 S- a/ Y: o! y" b2 l% y
remote-endpoint = <&dsi_out>;
: q, V( E+ Z, O
2 u5 q; Q0 z, w};
. Z" J7 t+ N, J% R
, ^3 A3 R" C# J0 U, |};
  p; `) u: e/ N4 d; |
% K+ G2 S0 V* g+ f% R4 i6 e' i! c};
6 `! |. Q" `) g2 N0 `7 k/ u" z( F+ B3 e0 J+ w* E) l+ Q6 J( l* G7 s: X5 N
};  M, C& @6 g1 \0 r1 P, j! \
" @- K( Y( a; Z2 x/ s: ?/ H# r' E
8.配置内核' U: u: a; j1 H7 {$ p1 W
配置内核支持st7701,并列出主要选项,如下:5 Q3 B9 }7 W& \7 B% b5 f9 l

: Y- M# E& ]# e8 _* u3 O7 P8 A( W: ^linux@ubuntu make menuconfig1 z6 A- W4 S- ]

) |" D( W- l, h# x3 zDevice Drivers --->: \- p1 L  f. X$ l0 T" u. H

2 e! y3 N* _& _2 cGraphics support --->9 u/ \0 V+ g; w3 N6 q
8 q+ _  o4 F- {- M( [8 Q; \% j
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->; n, Y4 ]# i: |

; ~$ S% v* ?$ f& j9 y: A6 h: V<*> DRM Support for STMicroelectronics SoC Series1 ]" ~' }, u- `4 {& p2 J
2 n1 A3 r0 G& Y( C" z
<*> STMicroelectronics specific extensions for Synopsys MIPI DSI* O$ d% S9 t4 x' J/ y% l
( K* L4 e4 [% {, G% W
Display Panels --->
! M! L2 E1 u! g, `) U  |2 n# h* D/ R6 F& K, ~$ q# ^
<*> Sitronix ST7701 panel driver. y4 s6 v5 Q8 e. [2 ~2 X' A0 r6 j% _
) Z6 ~* v% y; i5 G- }' Q7 l1 K
Backlight & LCD device support --->- L3 c9 Z- _3 t) U7 I. a
( O0 b: o6 Q, {+ t- {: Z' n% s
<*> Generic PWM based Backlight Driver7 H  T3 Y6 u  d
9 q2 u+ ^8 g: F. X! j
<*> Generic GPIO based Backlight Driver8 b- o0 g9 _6 I3 G2 Z, e

4 w4 Y/ z4 `) C! m! g7 d" {9.增加启动项8 `' B' n; d6 l/ @  @
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加
/ N& ~" d9 N* j6 p9 {. n' j' {2 W* }* s6 Z. I, w
LABEL stm32mp157a-fsmp1a-mipi
2 w8 P2 D6 H$ A8 JKERNEL /uImage
  D4 `% K# |# ]FDT /stm32mp157a-fsmp1a-mipi050.dtb
+ O$ F9 |9 A. F" D9 p# GAPPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200- T; [, D& W& A+ R: U" U
; [; J4 P) C$ A/ {( {4 \
10.编译内核及设备树
  u& \2 o! `9 f0 ylinux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
0 b# x! K$ G0 P' x7 s% v
' m3 a" D3 h# a3 p. ?; L2 H2 I重启测试
* [& o" R3 M, x' D$ [; e7 `: N将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。
* x/ J* [" l% z+ Z/ j9 d' |————————————————
1 s9 P7 P/ }! y/ q版权声明:华清远见IT开放实验室
! I6 H5 S$ V% }3 ]5 N- G4 M, T% N, k' |1 N, O

- c# A$ {: P8 W3 T+ w
赞 收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答

所属标签

相似技术帖

官网相关资源

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