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

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 16:02
1.实验原理
; L! ?+ m3 @' ^) \前文介绍过LTDC的内容,本节只需为LTDC添加一个面板即可。内核中包含一个通用的面板驱动,驱动之包含大量各种各样的面板。
! x; y8 c8 V$ k" y+ S9 {6 D. ?. |0 i) \& ~, j: ^
1.驱动修改
8 T! `2 v( f( m" s3 q: H8 ^驱动路径为:drivers/gpu/drm/panel/panel-simple.c! W% [# b% G0 {7 J  \0 X/ \1 S
0 T+ @% l( O, `* b& r5 T
移植时可以在驱动中支持新的面板的内容,也可以找到一个与自己面板相仿的内容进行修改,本节即使用在原有面板修改的方法。如本节参考面板名称为zj070na-01p,对于一个面板最关键的内容在驱动通过drm_display_mode的结构体描述,zj070na-01p的描述如下:
- m- T3 z& s1 [# C7 }
- z" `3 J8 s" P& O6 f% D
  1. static const struct drm_display_mode innolux_zj070na_01p_mode = {! k' p' G& Y1 `" w- L2 p

  2. & t; ]7 I' ~3 B& [
  3. .clock = 51501,3 t0 W$ G. ^' r6 w' `, N

  4. * O+ g* v' u" \# k, K6 g" _
  5. .hdisplay = 1024,
    ! ]5 n: U& Q9 a4 |, g' r; P' ?
  6. 7 B1 Q  b9 f3 @
  7. .hsync_start = 1024 + 128,
    7 M2 d; A* {7 s; x4 e; P3 }

  8. 4 g+ x; H- C( g4 p- Y# s
  9. .hsync_end = 1024 + 128 + 64,5 i" {6 [$ z- ]; n( y* m

  10. 7 h, y$ Y2 V0 e4 F: g+ l$ x
  11. .htotal = 1024 + 128 + 64 + 128,, [2 H8 B0 S- ]5 m- O
  12. ' R1 P% h; e+ m6 e: d% a$ P
  13. .vdisplay = 600,! J! T' z- o+ W. j# A
  14. 3 P& }9 J! }5 r# s+ ~. Y
  15. .vsync_start = 600 + 16,
    ' v0 A+ t) A% K) V4 _! k- w. r

  16. 7 @0 {! a/ q7 j" }* W) V; n- P
  17. .vsync_end = 600 + 16 + 4,
    ) O) L# \& J: r9 A( Q! W
  18. 6 l  i- Q( x1 _- F! Y' I0 K
  19. .vtotal = 600 + 16 + 4 + 16,
    3 h, j6 U" ]( e7 l: D9 @
  20. / ~" S  c2 U0 A! w
  21. .vrefresh = 60,
    + Y4 j; x* n, T
  22. 7 b: f$ i3 f2 I+ j2 f1 W
  23. };
复制代码
7 b7 g4 d# m$ w3 g1 f% z8 r
这个结构体主要用来描述面板的时序相关信息,时序框图如下:
- s9 m. F. P( y% A+ l. o
6 q6 S" G! z" p% W1 B" M; i 6cd2f076678c53430aa9ec45232450cf.png ! n! X3 g; i8 W# u" p/ p

9 `9 q9 C3 _3 c
0 w% n# K& e( ~" f% \& c  ]hdisplay:有效显示区水平像素数量,对应Active Width
& \& C4 V3 g* u3 o2 p# E2 X2 q; ~  H
hsync_start:水平同步开始,对应hdispay + HFP- j! Z- C. _& ]$ W% v* z" e3 T
  @+ N( N3 Y3 [. B% ~8 [3 d7 o! E
hsync_end:水平同步结束,对应hdisplay + HFP + HSYNC width(HPW)
+ L/ R9 T) ?0 v  U# l; J  b. O6 c" a4 w4 b: |5 f6 N
htotal:水平总像素,对应hdisplay + HFP + HSYNC width + HBP
$ |9 o1 `1 H" \; V( D
" S2 v# p* S# p9 ~% d' `vdisplay:垂直显示像素,对应Active Height
7 {, u) \1 A7 I3 a, q3 J5 M+ ~( f4 ^" u1 ?+ i! _
vsync_start:垂直同步开始,对应vdispay + VFP( g( W7 Q. v: r+ p
1 u# [6 C( H" C4 }, p& i! t. c
vsync_end:垂直像素结束,对应vdisplay + VFP + VSYNC width(VPW)
; }. Q! ^' L, u1 Z  U! W' c/ c5 {$ ?5 a
vtotal:垂直总像素,对应vdisplay + VFP + VSYNC width + VBP6 ^# T. w0 h( G  ]- u) ]

3 X7 i- m) `& _) Yvrefresh:刷新率8 e/ T2 f/ {' k. d& j7 D
! F( [/ S, {: g/ L4 @, X7 _
面板芯片手册中关于时序的描述如下:
3 f. Z+ n& |/ R' [: x" G1 n( o
" z( }% _2 R% s! F- |" r2 s d07217bd81b103146f8cb855a12bf7f4.jpg
+ P/ N: c8 ^. T# ?. }; g# X- V* n6 p& R1 L7 r6 L4 P: Z& c
表中可以确认HBP=140、HPW=20、HFP=160、VBP=20、VPW=3、VFP=12,修改面板信息如下:
0 B2 X( q) y  I8 \" x: U
" k) r# ]8 ]$ G. i/ U+ h1 Vstatic const struct drm_display_mode innolux_zj070na_01p_mode = {2 I7 |# S8 r8 u$ ?

) m! z0 O2 s2 P3 l( z0 t9 F6 t.clock = 51501,( g% U2 {6 f* F7 F( d& [7 k

8 \. o1 P0 t; r7 a  H.hdisplay = 1024,
" L, Y& ~! [1 F& }6 @: P& O- A) L% B' x! b3 z6 ^; I, s7 Z& T
.hsync_start = 1024 + 160,) I: O1 w7 H9 V/ ]5 U: g0 b
  o' i1 }; o$ z) v6 d5 ]
.hsync_end = 1024 + 160 + 20,
) O! u0 d* P4 W- m: @
! u# Q! A7 Q* P6 T3 I.htotal = 1024 + 160 + 20 + 140,. B. M  F; V+ @7 h

7 M# U) B0 I  d6 r.vdisplay = 600,) `0 k' H  {& Y) s+ ?
; I" ?: d" T" Y% C3 u
.vsync_start = 600 + 12,4 r- V+ I( k2 X! a! L

( ^5 l* f7 [( |1 n5 B/ a0 k0 j0 F9 |.vsync_end = 600 + 12 + 3,
* t5 g* I3 [# A4 C! b- r4 x
$ p% Q) f$ x* ^6 E% X# ~6 I.vtotal = 600 + 12 + 3 + 12,
3 c% {# x' W# }/ F% B# X
& b% @# u0 W$ l' q- q" T6 G.vrefresh = 60,- {" N4 u' y2 b+ Z9 O9 E

. N# Q; w2 g( P# @- J' V};
, D3 [, Q0 l5 W+ j5 d3 m; g( P' j7 n7 t$ [
2.设备树修改
& f- p% ]! K9 i( H9 C, f& R6 r增加ltdc输出端口:
4 _& n, b. ~% S1 I1 u8 G, f7 I+ h# d2 \% n% k
<dc {
. q' R/ q+ \0 ^; a  k' d4 O" A$ r5 q2 h% y
status = "okay";
% A: ?# q5 d  G1 v% P7 x4 k# c' D% u4 K3 a' |+ ^
port {
3 W' V$ I- `' [" q* N1 H- u7 d8 b- d( h! i
#address-cells = <1>;' N) D& z" k; m; k. W
& G; U$ D5 n- a8 `5 u& M& x, E' x& i
#size-cells = <0>;" ^$ {1 u5 l! b) L$ S

9 f5 m$ j- D/ S5 v; u: Zltdc_ep1_out: endpoint@1 {
) v0 w/ }8 p, F4 K8 O4 j4 u$ C& W) r
% ~. [$ Q6 ?& o' }) H' V" i& }8 {$ ~reg = <1>;/ Z: j4 `- {5 P+ E& |' b1 I+ _

! h5 b  _( Z! r. p0 {# gremote-endpoint = <&panel_in_rgb>;
0 M1 Q+ F6 U1 f* n+ U' G
$ `; [4 e1 B# s" ?& p% u7 n};
) S% s) Y' K4 u" b1 y9 c. P6 `+ r5 k2 d2 j5 b9 L8 o) l
};0 H+ v6 V8 K( Q& X4 ?$ ^0 n2 e

. x7 @! q6 q- o};- n$ ]; W8 T* m0 W: C# r

( a) [$ }) i4 P4 u8 v1 I3.增加面板节点:
8 x$ h) R1 c5 k/ p( t
/ _' Y; D* Q# C$ @- U% `panel: panel-rgb {
, _3 V& Y4 J2 ]; h" z; s; V2 W) C- P6 @& V% a
compatible = "innolux,zj070na-01p";
. t! E$ ]' Q9 ~% g* ~
6 Y- v$ @3 z( k3 r) X" _7 Apinctrl-names = "default", "sleep";+ p& [# i: v+ L) j: m7 |; i  a5 w4 _+ B
- q# g( I; `$ }3 y
backlight = <&panel_backlight>;
2 K! i4 K7 A) n9 f' S  S6 y; H
status = "okay";
- Z+ H% S" \( l) m- M9 |7 ?0 e0 v3 Q3 |: P6 D8 v1 j6 ]$ T% t1 v5 W
port {
# u# M. k$ B# W: W6 K
1 m7 l1 q5 _' \+ {5 B( Qpanel_in_rgb: endpoint {6 x: r+ \" d! r0 H, p' p

- o7 @- i, I' S; d6 ?; O2 Fremote-endpoint = <<dc_ep1_out>;
+ `- ~  i7 k0 M6 {/ a9 T. r/ V
0 b8 o- h, e8 x$ V) y; I) x  `};
9 L/ s& ^& m% {7 ]
$ ]1 k8 j. h" G3 T) Q};
/ }; Z3 K! ^9 _, K, |
8 S$ O5 Q* m5 W+ A7 O9 a7 i  H7 H};
" U  G7 O* t& R  A5 h3 }7 `. O* a7 V- h) O% W
4.PWM设备节点
5 m- t/ ^  l2 W9 x( m* [4 A9 _8 Y* z( _% f0 e2 S
内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
! r8 L' C( L4 F+ [( N, {9 M
2 X! M' w  e! N( c: E/ ^. o. j& ^arch/arm/boot/dts/stm32mp151.dtsi
& L& Q& A! N* C2 W5 Z7 g
  r7 a( h# p8 u/ c, u0 t/ J4 Istm32mp151中timers2定义如下:
1 `& J4 |  B/ k7 [, @# X$ u) z. J3 C& u; k( S7 q
timers2: timer@40000000 {
5 z6 t/ B% i$ V- `# \' q! `
2 R5 J+ t/ ]" B0 |* x#address-cells = <1>;
* I2 O' A6 o) |/ t6 s. c+ c/ Q1 k: l0 }
#size-cells = <0>;7 v3 V3 c, R$ F( I% m$ W% I

; M6 C* ?! j3 `; {( Dcompatible = "st,stm32-timers";$ ?0 m9 |5 @$ l

% q) w: {3 W( T$ _3 _2 V2 O! |; areg = <0x40000000 0x400>;
! u; ]/ C. k. C# b8 u  D! g9 ^$ P! G* f- ~/ a
clocks = <&rcc TIM2_K>;9 j; S1 i& t% n* T) e" V
* s& W4 Z, X) r6 b; }8 |
clock-names = "int";' b7 Z& Y! t2 b' e, }! K
/ x& r4 K% Z8 N* n3 X
dmas = <&dmamux1 18 0x400 0x80000001>,
- U) |" v' {. F$ N0 ]
; \. Q" o7 l6 ]7 u# s<&dmamux1 19 0x400 0x80000001>,' [+ P3 q: I6 a/ k6 h; c: W

- X5 M* L( z  x- p; D<&dmamux1 20 0x400 0x80000001>,
& P& U1 L% H7 R! E9 L
; s# z2 ~/ U, a) F8 H<&dmamux1 21 0x400 0x80000001>,
8 D5 ^/ f0 n3 ~# \( c( J' G9 l* S. o0 z3 T8 N
<&dmamux1 22 0x400 0x80000001>;, p8 q  z$ N5 E, W: Z" p  ^
% W9 s5 ]" Y+ `1 k
dma-names = "ch1", "ch2", "ch3", "ch4", "up";) N* ~( H0 v2 T( y0 \

/ \4 f! J# z- W# Z0 ~% fstatus = "disabled";  c" T- l" P) C3 U$ ^+ [. U5 a
# W, p6 H6 x7 G) C% T. N
pwm {
! N; \; r; [+ t
6 g& y& z& P: n, _compatible = "st,stm32-pwm";
9 f8 F6 u% e0 q3 G) p* m& B) M! ?# e- n1 h
#pwm-cells = <3>;
4 V  u2 V7 W  ?$ b  }, \* o0 A: j/ u) c
status = "disabled";
- b, g6 d% y& s) R8 y
5 A' O( j4 h9 e0 e};- i8 b- g$ @, Y1 [3 o

- L8 A9 u: p/ R/ L5 L1 W3 ]3 ytimer@1 {
  t4 I- |& F2 b" o6 U* V5 ?) f" @( R! q
compatible = "st,stm32h7-timer-trigger";
! u& {, G) U( ?6 ]
  |- ~3 A7 }5 }$ m8 r- Dreg = <1>;
& [3 X: S, i, a7 F- c4 Z. T
$ l7 V6 q+ ^7 W; U& Sstatus = "disabled";
: Y  {- ]" G0 v  g  ~* _5 `
9 a6 f5 m. Z* j- a2 _};
  {- ?; \/ W% c" ?% v% A- v
, ]* S: t& B: Q- R8 z" i5 [2 ?counter {2 W6 H/ w; E+ y5 S8 e6 E

! x9 t/ h1 S6 R5 rcompatible = "st,stm32-timer-counter";* h: a' p# w7 m# O, c, D& i

) j3 y( @0 @: [4 N4 f9 ustatus = "disabled";$ S9 [1 H6 D) R& N7 c
: f3 q% M4 W, T8 O6 a+ V% @5 v8 l
};
9 G! ^& E( O2 c% j3 I. ~$ D* Q
! Q; O: j% Z) L};
; _+ N' E7 ]& D
5 o3 n$ {" D( ^1 }上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。6 a5 w  c% g0 O% n( _3 ?* h9 P

* |. T1 m% ~# H  |, Q参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:5 q( L/ \4 A" L" d  {( Z
4 c" L) w' H4 N
&timers2 {3 u" j% z" a$ m7 H( z  y2 |
2 Q* \7 R0 Z; B: M7 h8 [
/* spare dmas for other usage */5 C& K9 J+ B8 x

3 y4 F9 e/ @+ `/delete-property/dmas;+ u, \5 v8 \' g& K7 p
! l0 P+ y1 V% z( D! v3 e( |
/delete-property/dma-names;$ @7 K" Y* x5 A% l
, }0 T4 E$ ?( R* _2 U" D- [  w
status = "okay";! X5 V6 _5 F& I! m! ]3 |
$ o& n+ o1 Z7 f3 @
pwm2: pwm {
: N/ ^% U) O+ o; H7 I5 k( K& a) V4 Y! f5 {6 h
pinctrl-0 = <&pwm2_pins_b>;  m5 w& X3 N5 e/ J

8 U/ ~" g: @( H+ Mpinctrl-1 = <&pwm2_sleep_pins_b>;- L, B9 S  \; E+ e
, l! B8 g9 o2 \" ]( n
pinctrl-names = "default", "sleep";
4 p. x* @; T  o: U' Y6 s3 M
* b5 ~+ M( N  L#pwm-cells = <2>;( l2 U6 ]! ?# `& k3 S) z
  P( d, o/ R+ A; x/ ~; M
status = "okay";
' \) b3 ?$ U8 s! U' n" `6 F  s" W9 Q* a; t; p& q
};0 l' d9 @' p+ [$ x4 Z0 O+ ?  X
) }1 V6 T9 R1 h3 T* I  I- F
timer@2 {5 q3 \4 X. q3 v  F( z6 w% j; X

4 R3 `8 u' K2 s9 O" N* z6 ?- Istatus = "disabled";
# B' W* |( P! r  j# C! e; Y- N& z( k5 X
};2 I5 N9 \5 J& U) R" \

7 M& B: ^- i% M( h};
* q& }; h+ s$ J
% j6 d) Q6 l( t+ X9 astm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:6 `: K: v/ L0 [8 V! n' r

9 M4 u4 s$ c4 }0 lpwm2_pins_b: pwm2-0 {
. t" E9 ^. p2 D9 ?. w+ y. o
1 ^; q: a' Z2 D0 f$ ^+ \0 S% i' Jpins {
+ O, N+ w  T1 M! `' q; _8 l4 W
  q0 U- I  }# [) x& o+ ^pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */1 k$ V5 G+ [& D- j9 ^8 K/ k

' a# ^& E5 B' Q- N; t' Vbias-pull-down;
4 f' H  X: Q9 S0 ~4 X* U: Q4 U" T4 o# X9 C7 p7 W
drive-push-pull;
) L' l' A9 d! R
! E  h( }& _' s* u, j# [slew-rate = <0>;5 z' H6 a: H6 A

7 J4 C; o* v4 e, v6 E+ ]( G' y};4 [, p/ g/ h( J' a+ Z

: ^) k% w2 G; I  Y2 U) k4 V- y  m% ~- Z7 C};# y' n; \$ w/ A$ D7 L3 \- f
. ]% @, f- [/ u
pwm2_sleep_pins_b: pwm1-sleep-0 {
$ M7 u  H; z2 l, d4 ^
7 a3 I( d( y4 c0 {$ F; Q- Tpins {
2 ?" H, W" p! I: e) R' E" [2 G' T- j4 R1 L. h2 e
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */$ |4 s! m0 P2 a

' _4 S3 \5 Z1 c8 I; ]4 p( |};
. [) z7 v2 D4 k/ I" p8 I2 Q( Y& z$ C
};
/ P" n, {  K7 |  s. Z/ E% a/ z, o2 V5 y9 Q
5.背光设备节点
5 W0 e( D1 h" ~* V+ q0 R# U% u
7 m/ t5 r: V5 s- t. D8 {1 ZFS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。! V8 e, D: G2 A8 v) ^. X+ _' R

* u+ r1 Y( U+ a: e: YGPIO驱动背光节点内容如下:' q; N1 g1 q: ]0 E

: q. p+ b3 v0 F! b/ I  Tpanel_backlight: panel-backlight {! m; t7 I/ |' }

0 ]) {8 |1 m2 Z# U+ bcompatible = "gpio-backlight";
' Q5 O% |8 B! A: t, F: G
9 ?" d' M0 q0 [! _gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
$ [7 V& j+ t4 F/ [4 k" D& ^' H+ |% G
default-on;
3 F; S% `; f- W; `/ X; B# c: G: s! ~7 g) b8 U  Y) t
status = "okay";
; j, h% s9 p# ?0 [" q' t
5 y. L0 L; x2 ?6 ], }, m) @};; F& S9 }& W" _3 g

% o5 |$ ?# [* v# mPWM驱动背光节点内容如下:
& S* Q0 l& c8 r( [) S3 H- y6 p- X, [" @1 {2 `
panel_backlight: panel-backlight {
7 h- h2 ^2 |% H9 j. b: r) `+ v
( Q& Z8 Q9 p- M. e/ jcompatible = "pwm-backlight";
  y9 w) C4 t/ D( W# G- O& h& Y( S. c- C( I
pwms = <&pwm2 0 5000000>;* D5 h1 P$ }, R: P7 w# k

: C2 S. @: o5 h) r! Jbrightness-levels = <0 4 8 16 32 64 128 255>;
0 w! J6 D5 d; F* M
3 _5 L4 _. ~1 l2 b  ydefault-brightness-level = <6>;
6 G) M4 E+ N$ n  Y. U& A, q
0 {  ^+ q8 S  t% \' S5 T: e! Tstatus = "okay";% Z$ p. G/ [/ q3 E7 Q( f

) K" o4 R' V, y# D  @% w};* @$ r7 K2 K) h( c8 I8 A
# N8 x& k/ w# H# H5 w1 |
2.实验目的
5 ?- |! L) ?8 w# Y1 q$ s) W
熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。0 h0 S9 P( n. @' j

" F) C, D+ o. i. z6 c7 l3.实验平台
" ?2 `/ [% Z7 U9 ?" y
华清远见开发环境,FS-MP1A平台;
4 C# A$ y1 Q  D9 H. ?1 r
: W) }6 }0 i: O% o: D- N4.实验步骤
8 U0 r0 L2 X5 j3 F3 E/ f1.导入交叉编译工具链
% H  X4 K  f3 D6 d+ Glinux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
) {( z7 q/ E5 b3 n) v, j+ K: D! u* g+ j) Z  C
2.增加设备树文件
- h1 x6 O0 c$ \  }8 k+ N0 ~5 e由于RGB LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。. U% S6 f; l2 ~6 F* j4 V& k
* g$ D* h9 T5 _
在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-rgb070.dts文件并添加如下内容:
4 ^  h0 b' I" e0 Y3 |. r" i
" S# T# J5 C9 B' g* V5 {8 }#include "stm32mp157a-fsmp1a.dts"5 Q  |% k$ H# S

/ x/ K9 V7 M1 E1 X; W' h/ {
+ `  q, |# i! j6 S
/ t; p+ C3 \; b3 \( n% ]model = "HQYJ STM32MP157 FSMP1A RGB Discovery Board";' [2 }# U3 m2 G* ^

; M! B* ]$ ]8 ]% @compatible = "st,stm32mp157a-dk1", "st,stm32mp157";4 E+ T1 G- l( ]' _, J1 n

1 a( N4 ~, ?* t. A' C: s};
- W! m4 G! w) M4 z: ]: u
) `' X7 \1 a" X: r由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容
' X1 \. P- y# z8 l6 H+ R
3 k1 ?$ q- U+ t3 W7 ~dtb-$(CONFIG_ARCH_STM32) += \) R6 U( j) J. h, I: n) \& `$ A

5 z  _) {0 p- @( B…..
3 a0 j% a% J+ A; p3 u5 V* Y
- c" s2 r% l. B1 Hstm32mp157a-dk1.dtb \# R# k; h; y* Y8 D. l' ]$ X
8 s: K& L2 D2 o( E  h
stm32mp157a-fsmp1a.dtb \
* r0 w3 q- o( ^" }3 D1 ?7 v9 g! E; ?' s) P
stm32mp157a-fsmp1a-mipi050.dtb \' X( _" |1 p  ~

) O. h- m9 D0 I2 _1 u- Z: vstm32mp157a-fsmp1a-rgb070.dtb \6 T  l9 d+ U1 M

2 }% H, t; `; H, s% lstm32mp157d-dk1.dtb \0 F" \7 ?* t; O" d
: b5 W" h4 \% b
添加pwm2内容( K7 e- J  D  f7 z* N
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:
- k  ^+ _5 j% s# f( A6 K' Z( {' ~2 q) e
&timers2 {; w: k) K4 @& ~# V4 H5 |3 n  j

) V# u8 |2 d  p5 @/* spare dmas for other usage */! V, ~6 I. K. d3 E
( C9 _7 B3 j: ^% m
/delete-property/dmas;+ h8 _$ k" U9 S; }! ^6 U
0 Z- o* {. D" }8 [
/delete-property/dma-names;
" |' p5 c% U8 @1 A# L3 p2 Q: R7 |$ F. m$ {5 c5 D' g
status = "okay";
* E+ ~' e: l8 G/ `; R3 [$ C
8 |; I" D7 M9 _5 _; A3 W/ B. tpwm2: pwm {" L+ S3 v, q1 w5 c& d0 {" ^+ f

1 G3 n: V! @- f+ ?7 v$ lpinctrl-0 = <&pwm2_pins_b>;
3 ^. N1 U& e2 H0 R2 ?1 G+ c  F; L' l' G# g, Y- F& [
pinctrl-1 = <&pwm2_sleep_pins_b>;, b/ A: L8 F1 B! b2 ]/ h5 g* l3 e' X

$ y: l' k0 D1 c6 e* l. Mpinctrl-names = "default", "sleep";  e( ~- d' B; K0 }! A2 e* u" U

0 G) a' M  G; ?0 k5 m#pwm-cells = <2>;, w! s" H5 a9 _/ K
8 q2 f' p1 R5 \. F$ U
status = "okay";
/ Q5 c- S4 I) {: d
* x7 W( x# L8 b9 g};
0 O! V& K( p: ^$ F* J/ {9 p1 m2 ^1 v/ A; R+ i' m9 x: f
timer@2 {
1 s7 f& x" g% C# P5 [- @2 A; @0 O* H8 G1 H0 t
status = "disabled";- I* k; k$ C, L  q* i) C9 P
/ z" F* {% q' j  a
};2 V; l3 J1 f4 h  u$ h7 _2 W

, B5 n& b1 t9 G( {5 d) J2 h7 k* O};
8 l- n& W6 ]5 V/ [. Z' K/ b# Y; K" a, Z" ?+ K1 y
&pinctrl {9 T" \# ^' D5 P) o. I6 c
5 d: [  h& a3 I$ ?& q& L* \, }9 g
pwm2_pins_b: pwm2-0 {
, D) b2 B0 w0 y" T4 i$ s/ i. c# S& K. m( q9 j4 M1 z( n
pins {
" K) O1 w8 v. {9 h, ?% C/ h; g! d
pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */
3 t2 Q  W2 o) \7 K; ?3 @" C6 a1 x7 b: G! A- t. K6 z$ p6 _) @. M
bias-pull-down;# C- m9 ~. K% N1 T4 A+ n
+ X/ A1 }9 o, l4 h* W# b$ \
drive-push-pull;2 Q3 ^3 ^3 z. C0 G/ v3 s( j1 F3 y
6 F/ ?& N( Z" Z: W- s9 W1 ]* ?
slew-rate = <0>;: q7 w! M1 K8 c1 }3 E$ d7 l
) F# V4 H; H  _0 ]4 n7 a% F
};
' d, t7 H& k2 S  `/ H, D5 X( H
: i. @( h6 \$ y, d  ^};4 @0 f: B. j6 `

. D4 p; R4 y3 s- ]* Z+ K4 `# `1 Npwm2_sleep_pins_b: pwm1-sleep-0 {  D) z! V; t4 h9 H5 ]. W8 q

, t+ ?5 ~0 ~) q7 mpins {
) E0 a/ R+ c$ n: R* I- S- V. Y- Q3 ~7 o7 h4 }# [( p6 ^
pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */
0 m- e5 J6 z8 f! A1 r0 N; ]+ ~9 y& O- e4 E  A
};
4 P) T! p6 C; P% v) q  a, g  D% b' e9 G* c) H
};; n2 q+ E5 O. i% T8 M5 D1 Y7 P

9 Q2 D" W+ |! t5 ]; p% t};/ S0 F6 X; l5 k
2 C! e! r/ a# E. P6 B9 v
3.添加背光内容/ D: }% x0 r' C5 I. L. B8 I
修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:8 ?0 S0 z( N! u( J( N; o( Q
8 E4 l6 }* O  s5 R) L
panel_backlight: panel-backlight {1 g. z) `: w' f% D
3 ?! n9 M# ]& M- g
compatible = "pwm-backlight";
- a. _/ g5 n" o! Z7 S  _# _: @/ q
1 X# P2 E2 @/ n0 \pwms = <&pwm2 0 5000000>;6 b; u4 o+ G7 l. H( i$ k  b$ m' w

; o5 c/ ^3 I7 p% ?  q$ ibrightness-levels = <0 4 8 16 32 64 128 255>;
! j2 ]1 {8 h" s  H. o8 }& e! M8 s* ^; `: M. N8 r' f6 ?
default-brightness-level = <6>;# E+ N. g5 u! p  E% G2 X  V2 \  i

6 e6 f- z9 v2 _status = "okay";
. B- D6 O( |, h- W* I6 S/ x$ A, |+ V' ^7 W, P, s3 f+ d, v$ V5 |* a
};6 V! A. t/ Y9 K4 W3 G
& e& d! G5 k7 z" m) k( S
4.添加ltdc端口
/ @5 _3 b6 T8 r* {$ C修改文件arm/arm/boot/dts/stm32mp157a-fsmp1a-rgb070.dts,在文件末尾添加如下内容:2 z) }" e% }8 u  C2 x1 d  Q" C3 j

9 a; Z' t' c# D0 r9 Z$ J# N<dc {/ W8 ^2 T; v/ F. _# u% E

) l  J& T" B3 {' i4 Dstatus = "okay";
8 u/ Q* e7 {; ^; q
8 b" O5 }9 \1 N& L3 f! hport {" B8 g* \; G4 Z/ t

/ _  ^' R3 L3 n, d$ V#address-cells = <1>;: J" i4 d( J; Z, S
1 @4 A2 _7 u  P9 X4 f* i6 h) e
#size-cells = <0>;
& J5 L) i! o. C/ J: w$ z
3 G0 l# ]" l+ Altdc_ep1_out: endpoint@1 {
; T( D% r& k  k: V( u! f$ i$ p) x9 c8 X: f* Y
reg = <1>;
, C5 f0 K" W/ \: ?) b+ M' a& O& r, {+ U
remote-endpoint = <&panel_in_rgb>;
! A/ a4 v" E5 e# s( X$ H: A
& K* z- M: i2 @# m};0 j/ w/ r: N) Q' e2 z
# V% k  Z& T  H5 u& z
};  n6 o2 s' u6 s3 D; V0 b
+ }' \$ g+ F4 u( M
};
; T: L: l! x# l0 t0 b9 m( C  g' y
2 N' _/ w8 o. c0 C9 B5.添加面板信息
+ J7 O8 x' F* ]4 V4 m修改文件arm/arm/boot/dts/stm32mp157a-fsmp1a-rgb070.dts,在根节点中添加如下内容:& l# R- r. q. I) }
9 k9 ^( p; o9 M4 T9 r, q
panel: panel-rgb {
1 ~: d# _, U1 G4 y/ h9 z  @
  s! l" p3 c- C) ~$ Pcompatible = "innolux,zj070na-01p";
: ^# O' a" A$ A1 m4 G: l6 F/ e
pinctrl-names = "default", "sleep";- i! \" h9 O: q; J# y. C- X
$ ^4 X, X- m$ Y; {
backlight = <&panel_backlight>;! f# ^5 e& c5 M+ l# r  V
! r% t  p( F# m4 F9 v6 c- L5 A
status = "okay";
4 @( C0 [5 {$ E3 ~+ |- k$ |' z# J; k2 H
port {
# T# T2 i; Z) _/ z1 P: [. k" s4 J
panel_in_rgb: endpoint {
  ^& s1 ~( p% ^5 I" d
" B4 Q1 {/ ^5 N( k. Bremote-endpoint = <<dc_ep1_out>;1 S5 Z9 h# ]( R/ m( i5 y

( @5 a9 ?' L. w};
) Z0 k, B' E3 z4 n6 a0 T3 m! T. B  q# Q+ Q& z& S# J
};8 D4 |2 |, v2 e: ]3 h/ {& r
0 R2 F! V# V5 `/ V; {7 Q
};
2 J: i3 v* _9 O9 n& L( Z8 m0 _7 ]% ~. _0 U. U9 t% m' x
修改面板驱动,修改面板时序参数, L/ [! h5 ~  F$ M
修改文件drivers/gpu/drm/panel/panel-simple.c,修改zj070na-01p面板信息,对照面板芯片手册修改原有内容,红色字体部分为修改内容:
# V4 {7 W; ?9 [/ Y* M
. _; z+ M2 F: o) X$ Gstatic const struct drm_display_mode innolux_zj070na_01p_mode = {
. d$ L' w8 t8 h/ n+ A8 w  X1 G# b
4 J! q" q7 _5 o  u  Y.clock = 51501,
8 y  u. Y2 f- W( t7 c7 r; S: t. E! q0 T% y+ G! b: M. N
.hdisplay = 1024,$ U  N. N. w; b* w, W
1 b* Z0 x9 A6 y0 T: I! f
.hsync_start = 1024 + 160,
. J$ g7 p( D2 a2 j* n' }+ G$ p& K; W8 u: U
.hsync_end = 1024 + 160 + 20,7 J8 a) f. |0 {3 H6 h
8 ], s" `! Q' a" G0 P0 @- G$ ]' W
.htotal = 1024 + 160 + 20 + 140,: y7 b3 ^( b4 U4 y8 S

/ H+ [, [3 g0 i5 |. v. k5 Q.vdisplay = 600,: `& @; G% Y' n, I9 H  p

1 n% C; q$ k/ ^3 A$ G/ C.vsync_start = 600 + 12,2 W, W  o- v) N6 t7 a0 e

- b1 K- F3 R$ C.vsync_end = 600 + 12 + 3,
" ^+ Y' v: D2 }6 U* y1 p& T! Y8 S2 W9 @: w+ ^# p1 Y
.vtotal = 600 + 12 + 3 + 12,
* R1 |8 P8 e. o8 w# B& m* p5 w7 d% w$ l( v( @
.vrefresh = 60,* u, d. R$ p. w8 s7 o
$ \' M: ?0 T" M7 |8 }$ {* q
};
! T. [, m) ?+ d+ a! A2 X$ ?) Z5 b7 y" ^+ _
6.配置内核3 C2 n% `" c& l4 R6 t0 o6 }  H1 M
由于内核默认支持通用面板驱动,本节列出主要选项,如下1 `2 f( ?& o7 l) I) P# u% h4 ?
( k1 B: w8 u0 G% H& c
linux@ubuntu make menuconfig
, z9 ~5 W! ?, M( M
1 y* N5 Z3 ^+ y  S- D0 VDevice Drivers --->  B- k( {6 H3 D8 a2 C
$ N* u; S+ k- j/ {5 b! _1 H
Graphics support --->( u5 G* s2 U6 F, e4 q. F
) ?+ }+ X. S0 a: N& s7 g
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
' Z* }' f7 g3 S- [
7 j% j9 @& p6 }3 f# y- [. E<*> DRM Support for STMicroelectronics SoC Series& Q  U5 }( h9 i: z

( N# C' Z2 M: `' F  c) jDisplay Panels --->
% B* R8 N' T6 D9 X6 d7 e: p
/ }$ N  |6 e& P) f4 F<*> support for simple panels* g& X9 a0 w6 r. n1 a

, T) C! f. ^3 @0 q& y  ]" b8 p4 FBacklight & LCD device support --->) g# D8 H4 l- k) _# |7 M0 |

' Q* V5 g. m( G2 u7 E- G! n1 B' s* }<*> Generic PWM based Backlight Driver
3 L  i& O4 ^0 x# n& W7 v& C7 W) M1 `: i
7.增加启动项7 M7 s& E8 \  Z; r" X% E7 s
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加: m- e: p) K2 w; [

" q; [9 E: V: p1 w' H8 kLABEL stm32mp157a-fsmp1a-mipi
4 Y# K0 u5 O: c' ?3 d% i# ZKERNEL /uImage+ t& A# p9 n% d& K8 J
FDT /stm32mp157a-fsmp1a-rgb070.dtb
" c2 ]2 h: w* n3 w. J* AAPPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
, `  m+ M  Z/ I) b/ J
/ R  \5 \( z3 U0 M( o: n8.编译内核及设备树
  M% ]7 X# \/ ~! {1 `linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040
2 c  E; I6 v/ |, G- I/ B$ ]5 b) p5 e0 m
9.重启测试: q' ^5 O7 U& d/ g8 T: p
安装上7寸LCD面板,将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,启动后可正常显示,如果屏幕显示不正可适当调节面板参数。' }5 E3 f3 \+ Q( f, P( E0 J2 `

7 M2 ^. y  M! h& D! ^ 7d0dcb6c2b3bc47a969a4cec6593abfd.jpg ' O* l* ]8 F; b. x
- _8 v0 T: |3 b+ k; i
————————————————7 y- T# v1 ~' s3 K4 W& Q3 O5 c
版权声明:华清远见IT开放实验室
6 @) j5 g3 j) f2 Z! N
3 X9 h4 P0 Q4 o2 l0 P
赞 收藏 评论0 发布时间:2022-9-30 16:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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