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

STM32MP157 Linux系统移植开发篇14:Linux内核RGB LCD驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 16:02
1.实验原理4 o5 T; \7 z  ]8 C8 i& `) e
前文介绍过LTDC的内容,本节只需为LTDC添加一个面板即可。内核中包含一个通用的面板驱动,驱动之包含大量各种各样的面板。4 V4 s* w4 _" \" V
, e  c/ T2 u# d9 r- ?
1.驱动修改5 O, n( T* K4 A6 u/ ~% `: Q4 `, K
驱动路径为:drivers/gpu/drm/panel/panel-simple.c+ l$ m7 J1 W' g' [) Z

0 L+ g# x) n& r$ k" Y移植时可以在驱动中支持新的面板的内容,也可以找到一个与自己面板相仿的内容进行修改,本节即使用在原有面板修改的方法。如本节参考面板名称为zj070na-01p,对于一个面板最关键的内容在驱动通过drm_display_mode的结构体描述,zj070na-01p的描述如下:
. a( X6 @; Y- ~( [" M( g* X- V, l8 O! @3 q2 g
  1. static const struct drm_display_mode innolux_zj070na_01p_mode = {: n) W5 V% }5 C+ O7 |$ [8 y( X" g

  2. # Q2 A( m9 `, t% X
  3. .clock = 51501,
    ' N" h2 b) R* f0 h5 o

  4. ' q2 Y6 a% o* Y9 e1 K
  5. .hdisplay = 1024,
    ! f# N5 F0 \) v: J0 `. G& h
  6. 9 w6 W( Q: k- P& m/ V
  7. .hsync_start = 1024 + 128," g- ]' z/ p) N5 h+ M  ^
  8. 5 a& ~  }# Y5 J+ a
  9. .hsync_end = 1024 + 128 + 64,( m3 Q* x# U0 ^* z% w: q* y/ h7 \2 h

  10. 5 @/ A7 w1 e9 A1 ^
  11. .htotal = 1024 + 128 + 64 + 128,
    $ q- `2 q% C8 s
  12. $ y8 g- \3 j4 m! }0 V3 r
  13. .vdisplay = 600,
    $ ~3 a$ U7 c4 P4 \0 P2 m0 A

  14. - I/ U6 @5 f/ U3 P) }
  15. .vsync_start = 600 + 16,
    * @5 b8 q5 y- L0 }0 f( o. P

  16. 9 ~3 R2 W+ g" E. x0 p  V& q
  17. .vsync_end = 600 + 16 + 4,
    4 n4 u9 x5 R3 e5 n6 g
  18. 4 S9 w; K7 p# Z
  19. .vtotal = 600 + 16 + 4 + 16,
    6 V, V5 z( _7 o6 @# E

  20. % R' I9 Z* [5 `/ q7 v# q; E1 }
  21. .vrefresh = 60,
    8 z) K( e: e, ]* o
  22. 6 ~8 D0 m: R, o2 s
  23. };
复制代码
" K% q6 Y: }9 s2 N0 |( P7 z
这个结构体主要用来描述面板的时序相关信息,时序框图如下:
; l) h4 _( e0 v3 A- w1 K6 R0 Z6 A( D/ x, n! J( L' M
6cd2f076678c53430aa9ec45232450cf.png
4 l& R( y9 C( f9 o/ Q
9 y0 j" M  a. ?+ T) W
: d) \& T8 n/ k  w" v; M+ }hdisplay:有效显示区水平像素数量,对应Active Width
' Q' w4 l! b8 j' c% }; T5 M
  P9 |/ v3 k) Z7 ]7 Z7 Chsync_start:水平同步开始,对应hdispay + HFP: ~- W$ Q  r8 m2 }" e

( m; V9 ~/ b1 }$ C. I1 m; Uhsync_end:水平同步结束,对应hdisplay + HFP + HSYNC width(HPW)
, R2 x4 K7 ~! J* \) H9 x/ M9 f9 @8 ~% }; D0 M
htotal:水平总像素,对应hdisplay + HFP + HSYNC width + HBP
* F+ [' ~+ W. M! w# ]9 _2 b- [- ^
& _: f( W5 R) b; x' e0 A5 u3 |- kvdisplay:垂直显示像素,对应Active Height! K" M, [# i# C$ c

( G7 H: d0 X( `" V3 u5 ~# ~vsync_start:垂直同步开始,对应vdispay + VFP
0 c. _' S) [9 T3 _1 h/ |/ `
1 X) b% l+ ^8 yvsync_end:垂直像素结束,对应vdisplay + VFP + VSYNC width(VPW)
- v! }$ K3 g6 p" t9 r
7 [( V, ~0 f) `vtotal:垂直总像素,对应vdisplay + VFP + VSYNC width + VBP
4 f& b0 P8 t# H; i& X3 t( a& i6 s$ `/ k% o3 m
vrefresh:刷新率& E7 j! O  _5 R: Y+ E' h0 a# N

* Q6 N# e! q* ~8 _; [面板芯片手册中关于时序的描述如下:+ z0 ?. _7 B! S: x( l

* N, ?: E% Z7 W8 Z( P3 r d07217bd81b103146f8cb855a12bf7f4.jpg $ W% {9 |) r6 H
% O3 Q! V" T$ b% }: X( G. C( L
表中可以确认HBP=140、HPW=20、HFP=160、VBP=20、VPW=3、VFP=12,修改面板信息如下:
+ N: e$ `9 ?; T) `  W( @) ~" c5 t
; l1 }8 n5 `, {+ v3 d$ wstatic const struct drm_display_mode innolux_zj070na_01p_mode = {6 h; j: K! O) \! z  n1 f- ?
2 t$ ?+ v( U: `. Z, k
.clock = 51501,9 D; ]9 y7 m3 c8 l1 r. m: g

7 c/ l' Q  |& L5 r" M) G.hdisplay = 1024,& s9 Z6 T% q; E, G6 s  U$ g
0 v+ R0 P% S# D
.hsync_start = 1024 + 160,, T" b( p  ]: j3 m/ P0 i2 C

0 |4 V, P2 F( N! Q, E+ l" C.hsync_end = 1024 + 160 + 20,
! p* S6 i( r6 S) \. ]$ C: X4 A9 v5 |. K  I6 o
.htotal = 1024 + 160 + 20 + 140,$ e- L( \4 G- F6 E3 T
" U/ p' P& U+ q- U6 {& b5 v
.vdisplay = 600,
+ F3 L2 m7 a/ Q& \( s* z& ?# ?0 q- P' \) C8 {% j0 i
.vsync_start = 600 + 12,# a# O& n! c* w7 M, M1 ^

7 O+ T* Y# z3 X1 A$ s.vsync_end = 600 + 12 + 3,/ [; ]% d+ g7 `; u2 v
; {7 D3 [* M' r- S. P. P
.vtotal = 600 + 12 + 3 + 12,
% b' h( g9 ]) A+ k4 m
3 S3 t: A; J' A( x* Z/ V.vrefresh = 60,, z; z0 k3 r/ ?5 o3 K! w9 V/ _. P2 O
% \7 i* y( ~; U- [# M- b2 t% g
};
8 l7 Y, T8 y5 C/ u% y( ~  B$ b
; w1 u* C) y2 K. g5 A2.设备树修改' Z1 k2 Y, H# q5 N
增加ltdc输出端口:
5 A, E- c5 t$ c+ E, D  Y6 k' l
; R$ F/ I. m; p<dc {+ s( v  Z$ f) l  [2 g8 m
2 s* b% @) v/ u) Q5 `
status = "okay";* l" M* E& ^- Z7 i' B# x

7 r6 y4 t* v$ q' p+ K9 Nport {
- T% A* E# J1 `' s! N- R/ d! @) t8 y( B. z/ W$ u9 ^! ^8 D" o
#address-cells = <1>;7 x: @2 @+ v- W6 x' i6 x+ r

( V) ]( L& b( y5 ], L0 m/ ~#size-cells = <0>;. ~8 H$ i1 L& }

! \' u8 B1 v$ ?2 Q1 [$ Xltdc_ep1_out: endpoint@1 {
* a6 _- ^  \5 ~( m: `( G) A) C
, V2 Y7 k% J. q6 T- s- Nreg = <1>;2 E9 t6 q" a# `- \

1 h( D6 Y+ v. l" E- Mremote-endpoint = <&panel_in_rgb>;
& @) E3 m! y9 b- p
+ n- _' n* I$ @$ I, \& S};
5 x  J4 {- e% r/ a$ W+ _
: }5 i: Q: z' E8 D9 @& l! m! H5 l( q};
! v/ S" j0 v, Y& @& l) I: I
% e; O1 }& d0 ^- N};+ h: W- u: ^) N" w6 d; ~. p% v

5 f; f) y: ], [6 j2 G3.增加面板节点:# b) f, l) d& Y* a) C
+ k; @9 Z$ K1 E* {! F. V
panel: panel-rgb {
2 M3 K) N- u4 m( k. k  ?- E8 D: l- a0 O! }& ]9 l
compatible = "innolux,zj070na-01p";  f$ V. G$ e1 C8 ~( W
. M/ j, r0 ]0 |( b
pinctrl-names = "default", "sleep";& I& W, G- d. R* ]4 ~

3 [% q2 `& ~& `4 Vbacklight = <&panel_backlight>;" |; L3 _5 Y; M! I; X$ R

& `) b! T- T7 ]1 J; }! Y! b7 Jstatus = "okay";
- z1 o, _: A; S. i3 q+ z3 F' k0 J  }- i% t  v
port {
" m# U: R: o1 P+ {. l  F! Y9 l3 X8 T( F# F+ S
panel_in_rgb: endpoint {
; }5 n. m$ L! ^/ R
  i5 M0 A1 O& t! }remote-endpoint = <<dc_ep1_out>;
+ o1 f7 b, H7 n. Q! k: n+ |- T0 S* e1 W, V6 v. n
};
/ {7 ?- [3 A7 s' i; E  Z/ ~$ o
1 G; s! C, T' k1 p};  u; x1 ]$ F# P( w

/ s) h7 J6 [( g' R! }; o! j- N+ f5 o};
$ a( I" K; A2 m5 {9 X) A. g6 n6 p$ W% I
4.PWM设备节点0 |) V7 K0 z" D$ F. N

- U5 I& s+ d: q9 ~内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
8 Z. w0 C! N# k8 u% I( O
% I: S8 i2 h% j5 j, A* t4 Zarch/arm/boot/dts/stm32mp151.dtsi
0 e4 V5 I" I4 I/ r9 W0 J" v% e# G/ [" P: M! A# Q! F' @8 s) p& y
stm32mp151中timers2定义如下:; w+ A5 U2 |6 j& q1 G, y; |

7 g" E. I4 v& B2 c2 {. |; `% xtimers2: timer@40000000 {
) l! T, W* _1 x- X% R
" M$ D! \  U$ x4 O4 y& O9 h#address-cells = <1>;
* y3 R7 q9 W( O3 A+ W
& \+ d, ^% @! t#size-cells = <0>;& u* n3 I+ g6 H( O% O
, a1 ^% |5 A7 f  ]4 P) B0 t
compatible = "st,stm32-timers";* P  @9 r2 U  y- _4 @! ]

5 M8 U+ L9 H7 ]9 Y  @' @2 V4 @: t' Xreg = <0x40000000 0x400>;
; N7 Q1 O3 y, n6 h* J, i
9 W% ^+ {0 d5 cclocks = <&rcc TIM2_K>;
: _  P) f. ^+ h$ e/ X) G! w7 p0 e! g: F: [' r6 h5 h2 ]- p# r. x
clock-names = "int";
" a, p' X$ y3 }9 ~4 I% _0 B1 Q6 p# \# d" h( y; Y, m! ~) E' M& {
dmas = <&dmamux1 18 0x400 0x80000001>,
; }& l. I& Q( H$ c8 m- ]6 Q. N. N* x3 e. [9 g2 L8 p1 g
<&dmamux1 19 0x400 0x80000001>,2 u! F9 w1 B+ j: r' n: O
' Z" ^+ j5 o+ l: E' K: o
<&dmamux1 20 0x400 0x80000001>,
7 H- s* |! h3 ~3 k/ C, M* w' M& ~5 |& h7 g% n0 I9 X  S% A
<&dmamux1 21 0x400 0x80000001>,
& R" Z" ?/ {3 T& D( J- a( n" _9 M8 A
<&dmamux1 22 0x400 0x80000001>;
4 U' V% r1 z2 Y* g, Z
( e: e8 @3 k& B$ E5 h5 G4 B9 Wdma-names = "ch1", "ch2", "ch3", "ch4", "up";
+ p& \) |- a+ B% T) H# h3 V" K& M1 f$ F, U
status = "disabled";
* W+ `" n$ ^7 V! D5 O; Q
! t2 p4 _) V; fpwm {) J& D4 E2 q# _; i: t
. G& I9 a0 g; z" E- S9 L9 p
compatible = "st,stm32-pwm";
& c# ]2 t; V3 ^5 P0 J* }& z' o! f2 _5 k' o8 c5 v6 w
#pwm-cells = <3>;- @* a4 E' q7 A, x. \* f0 B

) n9 b# B0 c- H; L  W! Wstatus = "disabled";9 n7 m- e3 h. T: ^: Q
, [1 i# n4 i& N
};% A$ s1 G! b! L- y+ y! v9 C. E5 v9 m

- I# R( h0 c4 f( ]- m8 jtimer@1 {
0 `1 F/ ]" w& l5 p& p$ V& d4 g+ u
5 H! z! q& |0 V% }compatible = "st,stm32h7-timer-trigger";% i$ V5 D4 N- g1 M* J8 Q3 S
2 H' Z2 _7 i& S3 D
reg = <1>;. J6 w+ K7 [2 H/ r. Z
+ P) ^, _3 f+ X6 p' Y# ~( Z* _
status = "disabled";* ~& h; V; P% e* M3 u2 t

" ~# _3 f6 q  W2 i/ T9 b/ F};$ b/ i7 L% d/ o  @# V# B

( G9 o; x% s! |counter {
  _0 i1 {- C5 f. ?$ z6 u# F2 I- {7 l, A1 V8 c  y2 K
compatible = "st,stm32-timer-counter";
* n& ]7 H" I6 W5 k6 V0 R2 D8 A6 g- X+ d  ^% D, ?
status = "disabled";' k0 T1 k' X; w% V% K
$ o- ~0 l/ y1 e- J
};, \4 t2 W/ ^, R4 p! q

* U: Q" b9 H. Z# ~1 P  M1 Q};. w7 N1 {9 e# c- p) j% k* g

% P  k. A9 }# x$ l* H7 W6 Z上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。- v  Q% |; v: f0 q" g& S- k
* R4 _; V: D. [0 D& {
参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:+ n) J5 ~7 T5 B; h6 \. ~' Q  u0 [
2 k: @& Y  f2 @6 `1 C( @
&timers2 {
: b6 v; k. |( I6 V
! G* o% Z- e2 Z4 F: s/* spare dmas for other usage */0 f" x, ~0 V! J
" ^! N! I3 U- P" K
/delete-property/dmas;' \1 f1 c2 H% c
" \+ Q  s( A1 j/ n
/delete-property/dma-names;
- p, o6 ~5 O- i, }- W4 o! [$ m: E" Z% s5 b' [3 J/ x. N% D% X
status = "okay";9 S6 t- x! k1 u; J8 i: R3 E4 `# @4 \

7 N% J( D* i! u8 `7 M2 Q2 Z- J" b3 Y. |pwm2: pwm {
; R) m8 s. e  Z) N
$ W8 w+ v* W4 g& k6 ?) M5 r% Spinctrl-0 = <&pwm2_pins_b>;
* D5 _, h: z. H( h
, N) [/ `, x& S$ T: Gpinctrl-1 = <&pwm2_sleep_pins_b>;# A7 p: U; q$ i# x& g% M- _

) N+ o, V+ Y: v& Bpinctrl-names = "default", "sleep";8 R6 F: Y9 l! j! f

1 d- f" ?! K" C* X+ w) |2 @9 G( p#pwm-cells = <2>;$ Y2 a2 s: T8 r% s- I' u
0 U+ O& m; T+ a  \0 O4 e  R! p  k
status = "okay";
, `4 K' F* O! _( _5 N% E: q$ d
+ i8 ?5 E* U) r. o; j};- v+ d% [. W/ l

. Z- c/ d: P1 `/ `+ Utimer@2 {! [/ ]& x+ v7 o2 b0 ~) h

! V8 y1 k$ B5 Y1 Y8 xstatus = "disabled";* l! g) o, i0 w# ^. C' n& f  }5 w

. d" h0 s% z, B6 b  q2 I6 Q};
; `" P) m, R; z
3 y# V2 C$ U4 @' a2 V- t};
# w- {0 y; t: _$ f4 J/ a  A
* P* }6 Y8 f" ]4 Ystm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:
- M& y' L) c- u4 Q: ]1 n7 P: H$ S. {3 x; s1 I4 B! _/ X4 @
pwm2_pins_b: pwm2-0 {
" X3 o6 d1 G1 q
/ k  K2 ~1 h) R/ }- F+ y: D+ Z& Ypins {0 \9 I* j8 Y: v) S3 |
. B5 H: w( P$ Z2 N6 z. `
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
$ V2 c1 X# N) N* d; T& i$ x, }2 Q) ]6 M- l: v5 m
bias-pull-down;
, ?2 L8 p+ t; \1 T, x* P
& l; X/ [: }% C% Wdrive-push-pull;
$ I& n! p! {; n/ B  I- ~( j; X9 Y2 a3 D
slew-rate = <0>;) y6 `7 y! w0 [/ X# Z3 e0 ~
% G1 I. \& X3 C; V
};$ X( t7 H! n2 v# P
! {4 }$ W" k$ m0 W
};% |6 I' j7 Z4 v1 c
( k1 V. I+ y0 K7 H% p
pwm2_sleep_pins_b: pwm1-sleep-0 {, C7 ?  J5 {- |6 M0 o. N0 O
1 u/ i6 u8 _# n3 ?- U. U" ~
pins {$ F+ C$ G( M8 R! A# W/ I$ m

8 @4 f) x0 S" E/ X8 _, d& L+ t% p& I) Zpinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */0 m) y: l& h/ n$ }9 o; `6 q4 p& V' d
( ~! l* P: ^, g0 ^
};
& ]' C9 u4 A0 f5 u) ^/ p6 J* o, |% [2 `* P4 D
};
9 L1 C: v8 b# z5 o$ a0 ~# U1 k6 n4 N( ], V$ U' R. J
5.背光设备节点% a) v5 m0 H3 X6 P% Z5 [) D4 D) t
+ b  B; k) T$ I2 v, @" Q/ d
FS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。
# \, ^- w: J9 x, E7 a( F3 ]7 l
# F$ H8 I5 z1 n6 t" RGPIO驱动背光节点内容如下:
) b" I# Q# m* Q) P, `& B9 ~$ [, u& h. I' [6 b
panel_backlight: panel-backlight {
& w. c' }+ s* ^- N$ A# l7 l
6 f* \% O  ~3 o# K& mcompatible = "gpio-backlight";
+ n7 O" Z& b3 [
' B7 |3 X1 I. kgpios = <&gpiod 13 GPIO_ACTIVE_LOW>;2 m& E8 i3 \# |6 L6 F& _# A, @( S1 r
1 K" S6 |% C' E" q
default-on;
* B. u; i  R/ Z- ?2 o
' e% s$ {& L3 vstatus = "okay";
/ M  P9 x4 T* b; }% k6 N; ]( @9 b9 h
};( q% t; d' L3 n" a+ n

3 T; O# k1 n7 F8 T) ]) {PWM驱动背光节点内容如下:
$ F: ~9 k# z. x- }. S# h! G# I
, o/ s8 s, b; a" ppanel_backlight: panel-backlight {$ j( ^/ k; q' q; N4 }0 }
+ Z2 z( ~( M: r  S$ \' @
compatible = "pwm-backlight";1 ]- N  q# ]3 L* l: G6 u
# L6 ~( l: l2 }. {- S7 P* u2 q
pwms = <&pwm2 0 5000000>;
2 `# q& ?) a8 K5 N) Z, m' H4 G$ t% V
brightness-levels = <0 4 8 16 32 64 128 255>;
5 Q7 _) k8 t2 v! v2 f" j* K  K& c% x) C2 v4 d6 ~4 Q4 r
default-brightness-level = <6>;% s/ G6 I1 T: p0 h! B/ F

) h* K+ O7 k2 H2 D- Q" A. M  Tstatus = "okay";$ y& u4 ^& X3 `! R/ o
7 d& p( X0 l4 N7 A* B
};* G; c* l1 s! F
0 l9 n& v% d7 t' Y' Q& s% U
2.实验目的

$ G+ G$ Y, R- Q$ f6 f" T) ^熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。5 E2 W5 D* Z. _4 p% B2 z
: _; ?9 C" \2 e! S4 `2 ]. J
3.实验平台

  K& U8 ~8 p" _( l华清远见开发环境,FS-MP1A平台;
6 [+ {, W( {3 }  w: j
1 K) q2 Q7 r$ k4.实验步骤
8 N9 g. v5 T2 q7 ]1.导入交叉编译工具链
: M8 ~+ ?  y- nlinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi5 I  T% V% R/ [* |$ |( O
& v6 F2 A$ {. _' J6 O
2.增加设备树文件
; b( g* }( G9 t9 ~/ k. A* p由于RGB LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。, T/ h4 k; V& z7 `( k& C6 t& I

+ ]* |0 q% Y: K5 x- t在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-rgb070.dts文件并添加如下内容:
: J8 o# e2 h3 w
0 {- ?; }0 d' ]) Y9 O#include "stm32mp157a-fsmp1a.dts"7 a/ w  b, o- m8 A% j

8 L0 \& m5 y) G: h' y# D/ {
, @0 C( K" B; R' G  H, N
+ U' c0 ]& {, R0 h5 Omodel = "HQYJ STM32MP157 FSMP1A RGB Discovery Board";! z0 D( X6 |( n) M( ^

8 M3 ^4 w. y1 |& l; g1 {, z# Zcompatible = "st,stm32mp157a-dk1", "st,stm32mp157";, b  l% u* K  _

3 K8 [9 Y0 f+ O  l; v3 e% a};' N3 i3 w: p9 j% x% z
+ p' S% Y. E2 S- X1 h1 F: S6 R7 Y
由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容) h% Q/ P  L# }* {) w
0 ~' V- T; y) u5 n
dtb-$(CONFIG_ARCH_STM32) += \
- S7 R6 ?- z. H5 h7 ?% `4 S4 T$ y* J
2 ~. l4 D+ C$ N# @# K…..# o8 K& e2 ]- {2 V) w+ ~
3 z0 {1 ^5 z0 X/ z$ D, }8 ]
stm32mp157a-dk1.dtb \% h3 S/ z! H% f1 f. b( E. x7 z  R

  `6 P- B9 Y5 ~* J+ Ustm32mp157a-fsmp1a.dtb \
& J% x: K3 L6 h# ^  C# {! \; z, z
stm32mp157a-fsmp1a-mipi050.dtb \) ]: f7 i- @( [: X4 u
4 H& X5 B. Q; K/ e1 X
stm32mp157a-fsmp1a-rgb070.dtb \1 r( b  _8 S/ d) |9 @0 u  Z

% @2 [+ R/ s0 S( F, b- x* i6 Ustm32mp157d-dk1.dtb \
% c& Q. }# z, U3 i) k" `
% n8 u# K1 e  j9 o添加pwm2内容5 s4 E3 B) z2 o# b
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:
$ H; w; m7 D) I5 ~& r% N& c0 [' z: n  v' p5 F
&timers2 {- S7 c1 |  k& V, o. n

' W% B& n3 C4 @% V- h% C0 C/* spare dmas for other usage */
4 |+ g9 Q6 v' Z/ \) \7 R$ a6 L. ~3 B8 j; q% t+ ]+ g# D' H
/delete-property/dmas;
% s$ j# g4 G1 l9 t) j
# w$ H1 A& G, H9 X- @- e/delete-property/dma-names;/ p3 U. d4 Q* Q# N: e) V7 U

8 r, q1 Z( w0 s2 A9 D  o: _# [status = "okay";1 d1 i& ]$ Q1 R8 U
1 Q( p. r1 q+ J* U. N
pwm2: pwm {
  s5 ]2 Z0 O8 Y/ O$ q* c
" L& `, k3 Z& N5 W3 ^7 w5 _pinctrl-0 = <&pwm2_pins_b>;8 ]' [7 y# k7 p7 M: t

) `* x4 d1 K' I. M4 K! x- vpinctrl-1 = <&pwm2_sleep_pins_b>;# l/ Q4 A8 J+ u5 {0 p# u, B8 e
, ~% t( y, G( T( W% ?
pinctrl-names = "default", "sleep";
5 _2 h# @: _1 n9 ~
4 E$ f& l, z- F% |3 b. e' n#pwm-cells = <2>;
/ g0 ?& o+ N6 [1 G
4 W6 F0 @" x1 H0 g. l4 U/ astatus = "okay";
( D3 z8 \! F" J3 q9 U  G$ j; e: r2 x
};
: Q( }) K( B+ e. ^4 B. ~/ X
, Y; y& g! I+ _  O: A) y( V$ Ytimer@2 {7 S8 l4 [8 O& `. [( E

& Q' F. w" N. bstatus = "disabled";9 \' d" P: g, |. w8 Q$ I5 c* ~

! p. L1 A* d1 T# Y};: A% }4 b0 S! V9 ~
5 K; m" d$ P$ U7 [- O' i* S2 {$ W. y5 o
};
$ i; C  ?) T6 Y2 A8 R
9 _. M0 a2 W' t0 O& z&pinctrl {
5 s# K0 _2 g8 T- Q1 W/ v  L5 ~& b+ c2 {
pwm2_pins_b: pwm2-0 {
& U- E+ p6 {: i9 c5 `2 H; N! f% J. V' x2 J8 E" E1 u2 s, Y0 ?
pins {( K( z9 z+ E) Q8 l
1 m% R9 h4 }7 q3 c& f: @" u. r
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
" J/ q' j0 Y) L$ }6 F# K9 L$ O
, Y5 v1 u( |8 a% X5 tbias-pull-down;6 ~$ z+ e+ f* L. O1 v/ J0 C" I4 M
2 R+ Y$ Y" _1 p' Z# a& K9 H
drive-push-pull;  j% p" L( C: P# y2 j

4 b$ G1 l$ U3 t# Xslew-rate = <0>;
6 |8 _/ U5 j8 ~5 V( k0 R
- @* H. p- Y+ M* a3 G" u. P};5 l. O: d2 J: A* x( E

$ u0 g9 ?1 D9 a, c' Z};
" O) D: N/ k- ~, W/ D4 t& Q8 Z( A
% }7 c' v. e. p4 s: M8 k% Epwm2_sleep_pins_b: pwm1-sleep-0 {2 b7 w# p: v# P2 a6 M3 A/ n2 M, Y

( D" s) L5 ^* b( {pins {
" g. b/ s" q( N. V, h- Y) u# B% P) e
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */2 o% g2 Y4 W7 ]0 d; [
  l5 W. ^, f: l2 T5 R/ y6 T0 m
};" b$ E9 I: b- D) n
: c3 t- V  X% K$ f, u
};7 S+ z9 e3 s& j( r$ v3 d
& i3 \3 K( |7 [0 W& B1 @1 r# E
};
4 W3 p* Z. e; d  Y$ [% s9 v
- W: n1 r' g" H5 `. q2 u, ~3.添加背光内容
2 G+ C) d& d+ |& \$ l: r修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:* Q( a- s1 U* z& H) T0 e0 G

, }# I/ d# |! ~. I! c% [+ {. }) lpanel_backlight: panel-backlight {
& T; J/ b  K" q  D4 D9 F- {) H% ]. l9 B( \/ I1 L
compatible = "pwm-backlight";
& P, r$ a9 d- |6 x1 B0 X6 J
1 V! B. F1 F: c8 |! \; k! m9 }5 npwms = <&pwm2 0 5000000>;/ L- d! Q  C9 k( V! J" N3 v7 Y

) d& M4 {. a- t7 O- w: Obrightness-levels = <0 4 8 16 32 64 128 255>;
2 r& F3 V) e% E3 t( ^# G6 w; @" K2 c6 n: }& `) Q4 Q9 x& P3 q9 d
default-brightness-level = <6>;
! l5 p. R* d3 t5 Q9 w% K' f2 o+ D
. h& F1 L! `! Z6 A. Z! ?6 ^- u) t* mstatus = "okay";
$ K* T: k, |! V
; @5 P* }  O$ d5 T* P7 y$ }};
" P* F7 w6 }. \% e: f! N& E' g! k- [4 r% U& y+ t% G* Y
4.添加ltdc端口0 g  s: |0 m* |  R+ ?; {
修改文件arm/arm/boot/dts/stm32mp157a-fsmp1a-rgb070.dts,在文件末尾添加如下内容:+ D, k3 i+ G3 t+ w) F: \8 S
2 r* ?/ F7 K0 Y: ~
<dc {- S. P/ D5 z: j  X% z# H2 ?% Q

" ~# d, D9 N- x: Z9 o! Sstatus = "okay";
  H7 Y; `- T; P6 \9 v3 Z: F- J" F- t# F- H5 k$ X
port {
0 P4 f+ b+ p5 V. v7 u5 p( N! W! \3 w, t$ R& c
#address-cells = <1>;; B2 @9 b; T/ x9 b- O$ Q, o4 \: S

! n' H+ S2 e5 I5 U9 F& W  R; m/ m#size-cells = <0>;
; ]4 M7 v- w/ f1 g3 [0 d/ V3 p) F& y6 O
ltdc_ep1_out: endpoint@1 {9 [" K  m7 b4 N% k- B/ Q

/ ]* |) L- q7 }/ N0 M4 }reg = <1>;, q, V, z8 f5 d

; y8 Z) ]6 b4 W7 R5 Cremote-endpoint = <&panel_in_rgb>;, @* t5 \5 w& L$ v
! \5 y# Q0 p0 ?$ |2 U  t$ \& @, K8 |
};
8 H( M1 M: Q6 Z! p
; T; a1 Z2 \" a4 j' ^* X7 a};
7 W  E' E: J) t' m" d6 V& t2 d# T+ p: t' K
};
9 N! e. h' ~0 I, {" }: Q* A3 D5 _( y& I  m1 z
5.添加面板信息
: }) K2 J, T- F) B修改文件arm/arm/boot/dts/stm32mp157a-fsmp1a-rgb070.dts,在根节点中添加如下内容:
* v( t( _1 u9 c9 v2 l8 `4 Z" e, [, m4 g, \4 E) ]7 x8 H) U3 n% U; E) U
panel: panel-rgb {& ?( N+ v1 e& P( \% @

2 j+ K0 e! ?" {+ jcompatible = "innolux,zj070na-01p";
+ l. s  m3 d; S5 U$ b0 }: Y' l8 B1 u. s
pinctrl-names = "default", "sleep";
- i; e# _" k* a. a' M
7 G' q) J7 r: @1 D, H/ `( u4 Qbacklight = <&panel_backlight>;
3 q( j1 [; u" \2 I5 Y# ~" \" t3 v4 \( i* b
status = "okay";7 j  ~. i& o3 P# U

% V# E) ?8 c8 X; B6 vport {( S; m2 b. N& n, `- ?  {1 Z
' ]5 V, B( Z1 T% v: J
panel_in_rgb: endpoint {
) f! ^& d. L8 C2 A1 ]* ^( p7 r
( M: ~9 _( |4 b3 G9 \remote-endpoint = <<dc_ep1_out>;5 \+ O1 A+ f: L
1 o9 ]9 b8 f' W5 t9 L7 `7 `- H
};
" o+ x3 ]( {: Q+ A  X! S
; }8 I' A( J. k};& ]" Z! _# U' \6 O) x
2 a4 B6 m3 B  S; P; f8 X* d% y
};
8 u8 ~3 G& z/ ?* N0 T* T
+ R4 w2 z9 g2 |0 Z( C9 ^4 G9 q/ p修改面板驱动,修改面板时序参数
+ d1 \! Y. L( {$ @2 F7 _修改文件drivers/gpu/drm/panel/panel-simple.c,修改zj070na-01p面板信息,对照面板芯片手册修改原有内容,红色字体部分为修改内容:& X9 c. Q* h2 y$ M8 Q- G2 q: w0 L
0 u( G5 {5 l5 Q4 L! @' z
static const struct drm_display_mode innolux_zj070na_01p_mode = {  B1 i' F% D+ ]' }5 C

1 E$ c: `' H8 y3 O0 D( S.clock = 51501,
& [3 M2 Y) w0 W3 B1 ~9 T9 v  N7 b" B& ?$ {+ S
.hdisplay = 1024,
, s1 T, g7 {4 u# O9 M' H2 I) |
, F+ v0 t' J  ~! F  S$ h8 I.hsync_start = 1024 + 160,
0 V( i, g* U. s* U! t0 C# n
: _4 q$ F3 q# H+ u8 \; c.hsync_end = 1024 + 160 + 20,
1 x9 K1 P- B- c2 Q9 O! K# K+ b( z0 Y7 m1 t
.htotal = 1024 + 160 + 20 + 140,
$ d4 e/ o: Y% V8 L6 I( a
4 ?* n/ w# G: L* `; L$ `; [5 F* i- C.vdisplay = 600,
8 }( O7 V/ B& @9 ~! k! @( Y2 @, V8 L, f1 m4 Z2 H4 w% f  W) H
.vsync_start = 600 + 12,4 e9 `1 K# D2 U

1 `7 q9 I1 }7 S7 q( I; O.vsync_end = 600 + 12 + 3,
/ m* s9 T7 Y5 K
; s$ ?% J7 _# @1 e' N* }.vtotal = 600 + 12 + 3 + 12,# b$ h; C6 C. E7 A

7 S, `2 P* W1 ]- z.vrefresh = 60,
( X+ l9 i0 Y1 R4 c. Y" M6 l1 Y! Q4 q3 E0 N- e, _1 z) @
};
" Q& n5 n  o) y1 Q+ U
6 ~, p5 o" n1 u0 a& ~4 U6.配置内核. c, d9 e/ O6 ?! Z! `% Z
由于内核默认支持通用面板驱动,本节列出主要选项,如下
" N  v  C/ x- }+ R- _- }+ d3 s& a5 O/ {5 ]1 w% F
linux@ubuntu make menuconfig
/ S+ z' a: p3 m: {8 c" C/ m; u/ G
9 i+ i+ I) X$ `0 n& Z4 B5 yDevice Drivers --->
( h- P7 `; m$ ]( h- d  X( W5 Z0 p* h0 U8 N' n3 V; o- W
Graphics support --->! K! g5 j9 Y, `( l

6 A4 _- E7 Y. Y! g) r<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
9 a2 O. f& h, b6 i3 v5 E
' L9 G3 i$ ^) m% `<*> DRM Support for STMicroelectronics SoC Series
, g" L$ a6 v$ L, @1 X
, ?4 O4 B5 D# _Display Panels --->
9 p4 m7 n( c; W: }! b2 ^
4 O# U  Z! j; p8 \<*> support for simple panels5 W" [( R& Y4 S. P: |& Y+ r5 F
6 ?% x; V( A3 {% \" R: j- L" [+ D
Backlight & LCD device support --->, \2 p; e( Y" a& ?6 t  G

: n  _1 D' l# _; n<*> Generic PWM based Backlight Driver
7 x1 C/ U* W; a7 O3 ~' v# g3 B8 b' m) K+ }& _0 U
7.增加启动项& Y# a) r+ U+ L! Y! [
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加
2 E! F# _8 u' P# y& @3 f: ^; F. C( l
LABEL stm32mp157a-fsmp1a-mipi
9 C1 ^1 B' i: |' M8 eKERNEL /uImage
5 X' l1 h5 @1 w5 h8 ]- H8 iFDT /stm32mp157a-fsmp1a-rgb070.dtb0 p9 C3 v0 A  V
APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
% J* \! B5 ]) ^/ A+ @% P# L+ r- h" I8 F# F
8.编译内核及设备树. L! h$ s  @9 C" D/ _
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC20000400 f6 d% p6 E$ a0 V9 z$ J

1 O5 ^4 k. P2 N. y) k- }; h0 H9.重启测试
# m, m8 Q! n. Q2 k安装上7寸LCD面板,将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,启动后可正常显示,如果屏幕显示不正可适当调节面板参数。; y  p9 v- u/ V( d/ i+ I, `

* C; X, t7 ]( {8 o! F 7d0dcb6c2b3bc47a969a4cec6593abfd.jpg 5 L& T- H$ O. p5 l  ?- F

1 L# G2 f; {- u" u, v$ U; A/ J————————————————
  T, M2 I( q" k4 K版权声明:华清远见IT开放实验室
4 ?0 T" R4 [; a4 v: ]9 |7 S) r* i
) K$ T7 }2 t; f& `3 O; E- M2 p
收藏 评论0 发布时间:2022-9-30 16:02

举报

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