搜索
bottom↓
回复: 0

《STM32MP157嵌入式Linux驱动开发指南》四十一章 RGB转HDMI实验

[复制链接]

出0入234汤圆

发表于 2021-7-8 17:26:36 | 显示全部楼层 |阅读模式
1)实验平台:正点原子STM32MP157开发板
2)  章节摘自【正点原子】《STM32MP157嵌入式Linux驱动开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=629270721801
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyzmp157.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子ST
M32MP157技术交流群:691905614    1.png

2.jpg

3.png



四十一章 RGB转HDMI实验


       目前大多数的显示器都提供了HDMI接口,HDMI的应用范围也越来越广,但是STM32MP157这颗芯片原生并不支持HDMI显示。我们可以通过RGB转HDMI芯片将RGB信号转为HDMI信号,这样就可以连接HDMI显示器了。本章我们就来学习一下如何在正点原子的STM32MP1开发板上实现RGB转HDMI。


41.1 RGB转HMDI简介
        STM32MP157这颗SOC没有HDMI外设,只有RGB屏幕接口,因此只能通过RGB转HDMI的芯片来实现HDMI连接。效果肯定是没法和原生支持HDMI接口的SOC比,当个玩具来玩一下还是可以的。因此本质上来讲还是RGB驱动,并非原生的HDM驱动。
        正点原子的STM32MP1开发板提供了RGB转HDM模块,如图41.1.1所示:
四十一章 RGB转HDMI实验358.png

图41.1.1 Sii9022A芯片

        这里我们使用Sii9022A这颗芯片来完成RGB转HDMI,Sii9022A以前是Silicon Image公司出品的,但是Silicon Image后来被Lattice收购了。
        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接口用于配置。
41.2 硬件原理图分析
        我们先进行SiI9022A的硬件原理分析,打开开发板底版原理图,原理如图41.2.1所示:
四十一章 RGB转HDMI实验833.png

图40.2.1 SiI9022A的原理图

        上图就是板载的HDMI接口,在图中可以看出HDMI模块分为4部分:RGB接口、I2C2接口、I2S2音频接口和HDMI_CEC接口。主要还是使用RGB接口引脚获取显示数据,SiI9022A使用I2C来进行配置,这里使用STM32MP1的I2C2接口,使用到了到PH4和PH5这两个引脚。另外还有一个中断INT一个复位HDMI_RESET分别连接到PH6和PA3引脚上。在本章节里主要是实现HDMI的显示功能,其它接口就不用管它。
41.3 实验驱动编写
41.3.1 修改设备树

1、设置I2C2的pinmux
        如果要实现HDMI显示,就要给SiI9022A提供RGB接口和I2C2接口,RGB接口在《第三十九章LCD驱动》的39.5小节讲解了如何修改,这里就不再讲解了。我们主要看一下I2C2接口的pinmux配置,打开stm32mp15-pinctrl.dtsi文件,然后找到如下内容:
示例代码41.3.1.1 I2C2的pinmux
  1. 1  i2c2_pins_a: i2c2-0 {
  2. 2                  pins {
  3. 3                       pinmux = <STM32_PINMUX('H', 4, AF4)>,         /* I2C2_SCL */
  4. 4                              <STM32_PINMUX('H', 5, AF4)>;         /* I2C2_SDA */
  5. 5                       bias-disable;
  6. 6                       drive-open-drain;
  7. 7                       slew-rate = <0>;
  8. 8           };
  9. 9  };
  10. 10
  11. 11 i2c2_pins_sleep_a: i2c2-1 {
  12. 12          pins {
  13. 13              pinmux = <STM32_PINMUX('H', 4, ANALOG)>,        /* I2C2_SCL */
  14. 14                             <STM32_PINMUX('H', 5, ANALOG)>;        /* I2C2_SDA */
  15. 15          };
  16. 16 };
复制代码

        示例代码41.3.1.1中,定义了I2C2接口的两个pinmux配置分别为:i2c2_pins_a和i2c2_pins_sleep_a。第一个默认的状态下使用,第二个是在sleep状态下使用。
2、添加HDMI的电源节点
        Sii9022A需要一个1.2V电压,这个开发板上已经提供了,图40.2.1中原理图上的XC6206P122MR芯片就是1.2V电源芯片。我们还需要在设备树中添加1.2V电压节点,供Sii9022A驱动程序使用。打开stm32mp157d-atk.dts文件,在根节点下添加如下内容所示:
示例代码41.3.1.2 HDMI的电源节点
  1. 1   v1v2_hdmi: regulator-v1v2-hdmi {
  2. 2       compatible = "regulator-fixed";
  3. 3       regulator-name = "v1v2_hdmi";
  4. 4       regulator-min-microvolt = <1200000>;
  5. 5       regulator-max-microvolt = <1200000>;
  6. 6       regulator-always-on;
  7. 7       regulator-boot-on;
  8. 8   };
复制代码

        这个没啥解析的就是提供一个简单的电压。
3、在i2c2节点追加HDMI子节点
        在讲解LCD驱动就告诉了各位,RGB接口是不用再次修改,我们只需要提供一个接口用来接收LTDC数据,HDMI就是用来接收LTDC接口的。在stm32mp157d-atk.dts文件下,用追加节点方式,把i2c2节点追加如下内容:
示例代码40.3.1.3 追加的I2C2节点内容
  1. 1   &i2c2 {
  2. 2       pinctrl-names = "default", "sleep";
  3. 3       pinctrl-0 = <&i2c2_pins_a>;
  4. 4       pinctrl-1 = <&i2c2_pins_sleep_a>;
  5. 5       status = "okay";
  6. 6
  7. 7       hdmi: hdmi-transmitter@39 {
  8. 8           compatible = "sil,sii9022";
  9. 9           reg = <0x39>;
  10. 10          iovcc-supply = <&v3v3>;
  11. 11          cvcc12-supply = <&v1v2_hdmi>;
  12. 12          reset-gpios = <&gpioa 3 GPIO_ACTIVE_LOW>;
  13. 13          interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
  14. 14          interrupt-parent = <&gpioh>;
  15. 15          #sound-dai-cells = <1>;
  16. 16          status = "okay";
  17. 17
  18. 18          ports {
  19. 19              #address-cells = <1>;
  20. 20              #size-cells = <0>;
  21. 21
  22. 22              port@0 {
  23. 23                  reg = <0>;
  24. 24                  sii9022_in: endpoint {
  25. 25                      remote-endpoint = <<dc_ep0_out>;
  26. 26                  };
  27. 27              };
  28. 28          };
  29. 29      };
  30. 30  };
复制代码

        第2~4行,配置了I2C2的两个pinmux设置。
        第7~29行,就是I2C2下的HDMI子节点,接着我们就分析这个节点比较重要的属性的作用。第12行,设置复位引脚为PA3,低电压有效。第13~14行,设置中断引脚为PH6,下降沿有效。第22~27行,port节点就是用来接收LTDC数据的接口,第25行就是引用了ltdc_ep0_out节点。
        这里只是告诉了HDMI从LTDC接口获取数据,还需要告诉LTDC节点我们数据输出到HDMI,我们需要修改ltdc节点,修改完成以后的ltdc节点如下所示:
示例代码40.3.1.4 基于HDMI接口的LTDC
  1. 1   <dc {
  2. 2       pinctrl-names = "default", "sleep";
  3. 3       pinctrl-0 = <<dc_pins_b>;
  4. 4       pinctrl-1 = <<dc_pins_sleep_b>;
  5. 5       status = "okay";
  6. 6
  7. 7       port {
  8. 8           #address-cells = <1>;
  9. 9           #size-cells = <0>;
  10. 10
  11. 11          ltdc_ep0_out: endpoint@0 {
  12. 12              reg = <0>;
  13. 13              remote-endpoint = <&sii9022_in>;
  14. 14          };
  15. 15      };
  16. 16  };
复制代码

        第13行,就是告诉LTDC接口,数据输出到HDMI。
        注意,我们需要将panel_rgb节点屏蔽掉,否则编译设备树的时候会如下所示警告:
  1. Warning (graph_endpoint): /panel-rgb/port/endpoint: graph connection to node '/soc/display-controller@5a001000/port/endpoint@0' is not bidirectional
复制代码

        最后执行“make dtbs”命令,重新编译设备树。
41.3.2 使能内核自带的sii902x驱动
        ST提供的linux内核已经集成了sii902x驱动了同已经使能了,我们还是需要教大家如何使能这个配置,配置路径如下:
  1. -> Device Drivers                                                         
  2.         -> Graphics support                                                   
  3.             -> Display Interface Bridges   
  4.                         -> <*> Silicon Image sii902x RGB/HDMI bridge   //选中
复制代码


        将sii902x驱动编译进Linux内核中,如图41.3.2.1所示:
四十一章 RGB转HDMI实验4635.png

图41.3.2.1 使能sii902x驱动

        内核默认已经使能了sii902x驱动,如果没使能的话就按照上述方法使能,然后重新编译内核,得到新的内核和设备树。
41.4 RGB转HDMI测试
        使用HDMI线将开发板和显示器连接起来,然后使用新编译得到的内核和设备树启动开发板,如果驱动工作正常,那么就会在HDMI显示器上显示信息,如图41.4.1所示(屏幕截图):
四十一章 RGB转HDMI实验4821.png

图41.4.1 显示器显示

        至此HDMI驱动工作正常,我们可以使用HDMI显示器来进行Linux下的图形开发,但是本教程后续依旧会使用LCD屏幕,大家根据自己的喜好选择HDMI显示器还是LCD屏幕即可。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 17:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表