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

STM32MP1嵌入式Linux驱动开发指南V1.7——RGB转HDMI实验

[复制链接]
STMCU小助手 发布时间:2022-9-26 21:06
RGB转HDMI实验
& P( F( L' `! G. K$ M+ e% f7 i! f目前大多数的显示器都提供了HDMI接口,HDMI的应用范围也越来越广,但是STM32MP157这颗芯片原生并不支持HDMI显示。我们可以通过RGB转HDMI芯片将RGB信号转为HDMI信号,这样就可以连接HDMI显示器了。本章我们就来学习一下如何在正点原子的STM32MP1开发板上实现RGB转HDMI。& N! n" S6 o) p! v  R/ S1 p

2 p8 c2 K7 q0 c- |! S4 f& I41.1 RGB转HMDI简介
: l# B' i1 z% p1 S5 nSTM32MP157这颗SOC没有HDMI外设,只有RGB屏幕接口,因此只能通过RGB转HDMI的芯片来实现HDMI连接。效果肯定是没法和原生支持HDMI接口的SOC比,当个玩具来玩一下还是可以的。因此本质上来讲还是RGB驱动,并非原生的HDM驱动。: Q: u: _1 R% ^2 S& N+ [4 z- S/ i
正点原子的STM32MP1开发板提供了RGB转HDM模块,如图41.1.1所示:) m) F  e$ \& u; _3 S+ l# R+ R

) U1 p! T) L' v2 p& _/ t) X7 P( K图41.1.1 Sii9022A芯片6 S0 |; P. J7 y$ N: Y( T
这里我们使用Sii9022A这颗芯片来完成RGB转HDMI,Sii9022A以前是Silicon Image公司出品的,但是Silicon Image后来被Lattice收购了。
$ N( F+ K- L% s) e/ v) ?SiI9022A是一款HDMI传输芯片,适用于高清便携相机、数字相机和个人移动设备,可以灵活的将其他音视频接口转换为HDMI或者DVI格式。SiI9022A支持预编程HDCP键码,可以完全自动进行HDCP检测和鉴定。SiI9022A是一个视频转换芯片,支持输入视频格式有:xvYCC、BTA-T1004、ITU-R.656,内置DE发生器支持SYNC格式(RGB格式)。输出格式支持:HDMI、HDCP和DVI、最高支持1080P视频输出、支持HDMI A、HDMI C和Micro-D连接器。SiI9022A功能非常多,具体使用什么功能需要进行配置,因此SiI9022A提供了一个I2C接口用于配置。
7 R8 F/ r/ v  @6 N! W' y41.2 硬件原理图分析+ {/ M' G( F$ ^9 U
我们先进行SiI9022A的硬件原理分析,打开开发板底版原理图,原理如图41.2.1所示:3 e2 E0 Z4 G6 A

- K6 R/ U, O: c 1235c32525dd468cbf203405e54b8a0a.png ; k9 E! p9 {$ \- k# I  E; B; D
+ r2 x. n' U8 N* g, m
图40.2.1 SiI9022A的原理图; k  D* x5 P) g1 L
上图就是板载的HDMI接口,在图中可以看出HDMI模块分为4部分:RGB接口、I2C2接口、I2S2音频接口和HDMI_CEC接口。主要还是使用RGB接口引脚获取显示数据,SiI9022A使用I2C来进行配置,这里使用STM32MP1的I2C2接口,使用到了到PH4和PH5这两个引脚。另外还有一个中断INT一个复位HDMI_RESET分别连接到PH6和PA3引脚上。在本章节里主要是实现HDMI的显示功能,其它接口就不用管它。
+ z5 B5 C( E& ^41.3 实验驱动编写) ~' v8 D1 R$ Z) t3 Y  L
41.3.1 修改设备树/ e2 S( u& t/ ~" b. f
1、设置I2C2的pinmux
0 C: |( Q7 T3 Q6 K1 g  J- R, X8 C如果要实现HDMI显示,就要给SiI9022A提供RGB接口和I2C2接口,RGB接口在《第三十九章LCD驱动》的39.5小节讲解了如何修改,这里就不再讲解了。我们主要看一下I2C2接口的pinmux配置,打开stm32mp15-pinctrl.dtsi文件,然后找到如下内容:7 N0 u' v" d9 d) o0 A0 y  w# p
9 R! }! x  [# h8 h" I6 W' l
  1. 示例代码41.3.1.1 I2C2的pinmux
    7 J- |9 u! z8 N1 b! E5 m) U7 z' O9 e
  2. 1  i2c2_pins_a: i2c2-0 {; z/ @0 Q& e% T
  3. 2                  pins {2 z8 K  v8 _5 p# |3 D% ?# `6 m" L8 @* A
  4. 3                       pinmux = <STM32_PINMUX('H', 4, AF4)>,         /* I2C2_SCL */, W& @) x' L8 V* i4 d& d0 _& l
  5. 4                              <STM32_PINMUX('H', 5, AF4)>;         /* I2C2_SDA */
    0 X3 @% G2 h1 G3 G4 A) N
  6. 5                       bias-disable;
    & M* Y3 P/ x: U6 G
  7. 6                       drive-open-drain;
    8 V. B% _( y  z
  8. 7                       slew-rate = <0>;
    " w! T! U: |, q
  9. 8           };/ P5 Q7 w0 U4 Z6 ]6 ^- h
  10. 9  };
    - a! _7 s  L" U! ?1 N2 K
  11. 10
    - c$ W7 w& Y+ _5 U: m7 D  k. M" ]
  12. 11 i2c2_pins_sleep_a: i2c2-1 {
    6 p3 m3 ?+ a# J# d7 @& E
  13. 12          pins {
    * ^5 ?% G: j! C; O+ M% s# `; d
  14. 13              pinmux = <STM32_PINMUX('H', 4, ANALOG)>,        /* I2C2_SCL */6 q  w+ x5 y( j) Z  T
  15. 14                             <STM32_PINMUX('H', 5, ANALOG)>;        /* I2C2_SDA */9 A  }4 a; V  O+ v% p% O
  16. 15          };
    ) S! Y4 E6 T& _8 s" W
  17. 16 };
复制代码

7 i8 R. j6 A( p6 g1 ^: e, Y示例代码41.3.1.1中,定义了I2C2接口的两个pinmux配置分别为:i2c2_pins_a和i2c2_pins_sleep_a。第一个默认的状态下使用,第二个是在sleep状态下使用。. L2 r/ ~! z' N& F* W
( A; Z& X" l3 n2 M" k; q* n
2、添加HDMI的电源节点6 ]* W( E8 [: Y) i# b. J
Sii9022A需要一个1.2V电压,这个开发板上已经提供了,图40.2.1中原理图上的XC6206P122MR芯片就是1.2V电源芯片。我们还需要在设备树中添加1.2V电压节点,供Sii9022A驱动程序使用。打开stm32mp157d-atk.dts文件,在根节点下添加如下内容所示:# z; j4 \% f1 F- K: b2 b" A
& W, I% g3 b, V7 `& n: v" U! g
  1. 示例代码41.3.1.2 HDMI的电源节点
    5 |! A$ h$ }1 \/ h- }
  2. 1   v1v2_hdmi: regulator-v1v2-hdmi {9 K2 e# Y  |5 t$ f, m& A
  3. 2       compatible = "regulator-fixed";( p+ m6 W  P) N4 L
  4. 3       regulator-name = "v1v2_hdmi";
    9 o6 ~" i$ G+ C- d: S. g. i
  5. 4       regulator-min-microvolt = <1200000>;0 G* X$ H% J" [! X( a7 b
  6. 5       regulator-max-microvolt = <1200000>;
      k5 a' ]6 d- k$ ^4 l: r% p
  7. 6       regulator-always-on;4 |7 G6 B& \% V% B3 O
  8. 7       regulator-boot-on;
    ! z  A' k: h& T
  9. 8   };
复制代码
& R- ?# Z: E6 T. }* L
这个没啥解析的就是提供一个简单的电压。3 i: H% {3 g9 E2 f: ^* l+ s

( \, O' C: [+ k/ J3、在i2c2节点追加HDMI子节点
) Q( }* F' Y! i' Y5 t8 B) _6 ~在讲解LCD驱动就告诉了各位,RGB接口是不用再次修改,我们只需要提供一个接口用来接收LTDC数据,HDMI就是用来接收LTDC接口的。在stm32mp157d-atk.dts文件下,用追加节点方式,把i2c2节点追加如下内容:3 d0 V) A! i0 r4 x9 w9 X% x
9 L( h9 g7 B; Z5 Z- r$ o" n8 x4 F
  1. 示例代码40.3.1.3 追加的I2C2节点内容2 q/ y( I4 j) r7 |
  2. 1   &i2c2 {
    6 F) w( o+ N2 _) J, [. ~
  3. 2       pinctrl-names = "default", "sleep";
    / D' e2 s( b% R9 n( {6 Q- j' W# V
  4. 3       pinctrl-0 = <&i2c2_pins_a>;# x3 X: l) K& ?
  5. 4       pinctrl-1 = <&i2c2_pins_sleep_a>;: {6 h% q' n! H' N% M" {6 E' X1 h( ~
  6. 5       status = "okay";
    ! D' ]7 N3 o' _
  7. 6 ) U; H: U, V$ a( f* s) b" i
  8. 7       hdmi: hdmi-transmitter@39 {3 N. C. r$ U# ^$ i' M! w
  9. 8           compatible = "sil,sii9022";
    6 k" ?* r+ q* ~' g$ O
  10. 9           reg = <0x39>;# H* M9 p* V1 V( d, |
  11. 10          iovcc-supply = <&v3v3>;
      w6 J6 o6 {9 K9 w$ P
  12. 11          cvcc12-supply = <&v1v2_hdmi>;  a# p* K* a7 M; w2 d0 @0 u
  13. 12          reset-gpios = <&gpioa 3 GPIO_ACTIVE_LOW>;
    4 l$ L5 w, f( Y7 F# U
  14. 13          interrupts = <6 IRQ_TYPE_EDGE_FALLING>;9 O" x8 a2 f3 Q. R! q
  15. 14          interrupt-parent = <&gpioh>;
    % z5 |5 p0 Z3 G4 A, G+ S
  16. 15          #sound-dai-cells = <1>;
    . s9 i8 x- O4 t" F
  17. 16          status = "okay";
    ! |% j4 e$ e6 q  @
  18. 17. Y* C# G8 o' g% h' {# [, N
  19. 18          ports {
    : t8 y2 `7 M& F& j  n
  20. 19              #address-cells = <1>;6 Y* Z& m. w0 z2 ~- [
  21. 20              #size-cells = <0>;' I$ X* L' i8 _3 q/ ~" U
  22. 21
    $ K( H; H# c/ i3 a
  23. 22              port@0 {
    . o  O9 `6 h1 ?3 C& U, m4 X
  24. 23                  reg = <0>;
    / K( d, O% k# G0 p- b
  25. 24                  sii9022_in: endpoint {
    ' D+ @9 o- p* A" C" f* r, Z; X6 l
  26. 25                      remote-endpoint = <<dc_ep0_out>;
    $ u* P# g7 O' R  p
  27. 26                  };/ H! c3 {% g- x( B5 e
  28. 27              };
    / M0 E2 H! |3 |) ]' }
  29. 28          };; K" ~/ @( U) i! t# Y) J) e
  30. 29      };% @$ |' |4 Z# Y2 b6 }: w, q2 l( B
  31. 30  };
复制代码
& w; E' K/ z5 d  O: D
第2~4行,配置了I2C2的两个pinmux设置。: k+ ?2 i/ n1 r) r( B6 S4 {; k/ N
第7~29行,就是I2C2下的HDMI子节点,接着我们就分析这个节点比较重要的属性的作用。第12行,设置复位引脚为PA3,低电压有效。第13~14行,设置中断引脚为PH6,下降沿有效。第22~27行,port节点就是用来接收LTDC数据的接口,第25行就是引用了ltdc_ep0_out节点。
! K# Y9 l, w) k6 y0 z& N- s" @5 R这里只是告诉了HDMI从LTDC接口获取数据,还需要告诉LTDC节点我们数据输出到HDMI,我们需要修改ltdc节点,修改完成以后的ltdc节点如下所示: : W# D* b2 ?% H) ?

8 Q0 n3 m/ h5 p
  1. 示例代码40.3.1.4 基于HDMI接口的LTDC
    9 c& `2 @" U. s7 W9 Q: |
  2. 1   <dc {! B" W) B  A8 A5 U& A& h5 d
  3. 2       pinctrl-names = "default", "sleep";
    ) x% R' a/ n8 c+ H1 H
  4. 3       pinctrl-0 = <<dc_pins_b>;
    ) L" d; v, [5 u* I$ u
  5. 4       pinctrl-1 = <<dc_pins_sleep_b>;
    ( T. e6 s) Y$ G( K
  6. 5       status = "okay";
    $ r* u2 |: ~7 u7 m* m
  7. 6 4 {, C, [) d5 p( ?" Z
  8. 7       port {: H" s/ H! ?5 n$ F1 S3 s, T% s/ r; b: Z
  9. 8           #address-cells = <1>;$ \8 m/ L* ^/ B5 @5 R
  10. 9           #size-cells = <0>;
    ' ^' h: r8 @5 J$ c( j
  11. 10# p; v! P( |( _( q/ q
  12. 11          ltdc_ep0_out: endpoint@0 {
    ' [% V0 n/ P  R1 o5 T- c% v
  13. 12              reg = <0>;1 U4 V4 b  W1 [/ K
  14. 13              remote-endpoint = <&sii9022_in>;4 K: e5 O3 ^0 T$ u
  15. 14          };
    $ z0 P7 l- t; ]
  16. 15      };
    7 A( A4 i8 j4 X0 _
  17. 16  };
复制代码

/ B1 F* {+ K2 J* v' C. J% ~! |第13行,就是告诉LTDC接口,数据输出到HDMI。* i* x" b3 _% t! `4 i
注意,我们需要将panel_rgb节点屏蔽掉,否则编译设备树的时候会如下所示警告:9 L# O. ~0 }; @% }6 R' L$ p7 A

# w6 F+ U; F  u( l! k8 bWarning (graph_endpoint): /panel-rgb/port/endpoint: graph connection to node ‘/soc/display-controller@5a001000/port/endpoint@0’ is not bidirectional
* b0 Z+ I) j2 ^+ @. _, o: Q最后执行“make dtbs”命令,重新编译设备树。; i7 A3 \8 v  g1 f  A
41.3.2 使能内核自带的sii902x驱动
* O% j4 ]4 r4 n, R! O' e: OST提供的linux内核已经集成了sii902x驱动了同已经使能了,我们还是需要教大家如何使能这个配置,配置路径如下:
- L2 F: x6 h% m/ j1 ]/ |7 S$ D/ M-> Device Drivers
; g  Y8 d+ o- c/ M7 b; ~5 t-> Graphics support. N1 Y1 n6 o* O( b' z+ H
-> Display Interface Bridges* ]; J" E# \% U
-> <*> Silicon Image sii902x RGB/HDMI bridge //选中
/ Q# `# K' C& f4 ^7 j' p$ A, x
3 J. V% q; K! K# J% A' O将sii902x驱动编译进Linux内核中,如图41.3.2.1所示:
% y, r1 [$ k/ P( ?' F# i
& u% S7 c( r8 \! n 5cb1227e1bbf45f78d4d3c486299bd08.png
6 e0 d$ K+ ^$ A" Y( M, V0 X4 |8 h% ?. }" p
图41.3.2.1 使能sii902x驱动, U* ?  ?0 y; G: h% M
内核默认已经使能了sii902x驱动,如果没使能的话就按照上述方法使能,然后重新编译内核,得到新的内核和设备树。2 ~7 N5 H% R! P; v( Z
41.4 RGB转HDMI测试. x. Y: |* V9 I+ t& m9 F
使用HDMI线将开发板和显示器连接起来,然后使用新编译得到的内核和设备树启动开发板,如果驱动工作正常,那么就会在HDMI显示器上显示信息,如图41.4.1所示(屏幕截图):2 _& m* M4 J3 N: Y$ F1 v
/ z# g0 }# V9 h6 X- F
720307b09a2443608080cffae17f28cc.png . l. P- ^5 w5 N1 U- M
& i. x. t: p) S# p+ L2 {  ^
图41.4.1 显示器显示
: C( Q! _4 G! s- X3 f( C至此HDMI驱动工作正常,我们可以使用HDMI显示器来进行Linux下的图形开发,但是本教程后续依旧会使用LCD屏幕,大家根据自己的喜好选择HDMI显示器还是LCD屏幕即可。
7 n" [* u, |5 z, P; I————————————————
( O: j; C' W6 a5 Y$ \# j% @/ K: z版权声明:正点原子
6 Y& h5 O3 y4 q+ \# x. ^" @% ]- c9 A. i
6 a" p5 k) B+ L# D1 L9 T8 V$ @
- `- O. s0 I! G: K) _9 y
赞 收藏 评论0 发布时间:2022-9-26 21:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

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