• 正点原子嵌入式linux驱动开发——RGB转HDMI


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

    RGB转HDMI简介

    STM32MP157这颗SOC没有HDMI外设,只有RGB屏幕接口,因此只能通过RGB转HDMI的芯片来实现HDMI连接。效果肯定是没法和原生支持HDMI接口的SOC比,当个玩具来玩一下还是可以的。因此本质上来讲还是RGB驱动,并非原生的HDMI驱动。

    正点原子的STM32MP1开发板提供了RGB转HDMI模块,如下图所示:

    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接口用于配置

    硬件原理图分析

    先进行SiI9022A的硬件原理分析,打开开发板底版原理图,原理如下图所示:

    SiI9022A原理图

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

    实验驱动编写

    修改设备树

    设置I2C2的pinmux

    如果要实现HDMI显示,就要给SiI9022A提供RGB接口和I2C2接口,RGB接口在在之前的LCD屏幕的实验中已经有过学习,这里就不再讲解了。主要看一下I2C2接口的pinmux配置,打开stm32mp15-pinctrl.dtsi文件,然后找到如下内容:

    示例代码 42. 3.1.1 I2C2 的 pinmux
    1  i2c2_pins_a: i2c2-0 { 
    2      pins { 
    3          pinmux = <STM32_PINMUX('H', 4, AF4)>, /* I2C2_SCL */ 
    4                  <STM32_PINMUX('H', 5, AF4)>; /* I2C2_SDA */ 
    5          bias-disable; 
    6          drive-open-drain; 
    7          slew-rate = <0>; 
    8      }; 
    9  }; 
    10 
    11 i2c2_pins_sleep_a: i2c2-1 { 
    12     pins {
    13         pinmux = <STM32_PINMUX('H', 4, ANALOG)>, /* I2C2_SCL */ 
    14                 <STM32_PINMUX('H', 5, ANALOG)>; /* I2C2_SDA */ 
    15     }; 
    16 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    示例代码42.3.1.1中,定义了I2C2接口的两个pinmux配置分别为:i2c2_pins_a和i2c2_pins_sleep_a。第一个默认的状态下使用,第二个是在sleep状态下使用。

    添加HDMI的电源节点

    Sii9022A需要一个1.2V电压,这个开发板上已经提供了,原理图上的XC6206P122MR芯片就是1.2V电源芯片。还需要在设备树中添加1.2V电压节点,供Sii9022A驱动程序使用。打开stm32mp157d-atk.dts文件,在根节点下添加如下内容所示:

    示例代码 42. 3.1.2 HDMI 的电源节点
    1 v1v2_hdmi regulator v1v2 hdmi {
    2     compatible "regulator fixed"
    3     regulator name "v1v2_
    4     regulator min microvolt 1200000
    5     regulator max microvolt 1200000
    6     regulator always on
    7     regulator boot on
    8 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这个就是提供一个简单的电压。

    在i2c2节点追加HDMI子节点

    在学习LCD驱动就有学到,RGB接口是不用再次修改的,只需要提供一个接口用来接收LTDC数据,HDMI就是用来接收LTDC接口的。在stm32mp157d-atk.dts文件下,用追加节点方式,把i2c2节点追加如下内容:

    示例代码 4 2.3.1.3 追加的 I 2C2 节点内容
    1  &i2c2 {
    2      pinctrl-names = "default", "sleep";
    3      pinctrl-0 = <&i2c2_pins_a>;
    4      pinctrl-1 = <&i2c2_pins_sleep_a>;
    5      status = "okay";
    6
    7      hdmi: hdmi-transmitter@39 {
    8          compatible = "sil,sii9022";
    9          reg = <0x39>;
    10         iovcc-supply = <&v3v3>;
    11         cvcc12-supply = <&v1v2_hdmi>;
    12         reset-gpios = <&gpioa 3 GPIO_ACTIVE_LOW>;
    13         interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
    14         interrupt-parent = <&gpioh>;
    15         #sound-dai-cells = <1>;
    16         status = "okay";
    17
    18         ports {
    19             #address-cells = <1>;
    20             #size-cells =<0>;
    21
    22             port@0 {
    23                 reg = <0>;
    24                 sii9022_in: endpoint {
    25                     remote-endpoint = <&ltdc_ep0_out>;
    26                 };
    27             };
    28         };
    29     };
    30 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    第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节点如下所示:

    示例代码 4 2.3.1.4 基于 H DMI 接口的 L TDC
    1  &ltdc {
    2      pinctrl-names = "default", "sleep";
    3      pinctrl-0 = <&ltdc_pins_b>;
    4      pinctrl-1 = <&ltdc_pins_sleep_b>;
    5      status = "okay";
    6
    7      port {
    8          #address-cells = <1>;
    9          #size-cells = <0>;
    10
    11         ltdc_ep0_out: endpoint@0 {
    12             reg = <0>;
    13             remote-endpoint = <&sii9022_in>;
    14         };
    15     };
    16 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    第13行,就是告诉LTDC接口,数据输出到HDMI。

    注意,需要将panel_rgb节点屏蔽掉,否则编译设备树的时候会如下所示警告:

    Warning (graph_endpoint): /panel-rgb/port/endpoint: graph connection to node '/soc/display-controller@5a001000/port/endpoint@0' is not bidirectional

    最后执行“make dtbs”命令,重新编译设备树。

    使能内核自带sii902x驱动

    ST提供的linux内核已经集成了sii902x驱动了同时已经使能了,还是需要看看如何使能这个配置,配置路径如下:

    -> Device Drivers
    -> Graphics support
    -> Display Interface Bridges
    -> <*> Silicon Image sii902x RGB/HDMI bridge //选中

    将sii902x驱动编译进Linux内核中,如下图所示:

    使能sii902x驱动

    内核默认已经使能了sii902x驱动,如果没使能的话就按照上述方法使能,然后重新编译内核,得到新的内核和设备树。

    RGB转HDMI测试

    使用HDMI线将开发板和显示器连接起来,然后使用新编译得到的内核和设备树启动开发板,如果驱动工作正常,那么就会在HDMI显示器上显示信息,如下图所示(屏幕截图):

    显示器显示

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

    总结

    这一章比较简单,只要在设备树里面,添加hdmi的电源节点,然后在i2c2节点下追加hdmi子节点,最后在ltdc节点的remote-endpoint修改成hdmi。这样就可以使用HDMI显示屏来进行开发了。

  • 相关阅读:
    修改PyCharm主题、字体大小、汉化PyCharm、安装translation翻译插件
    码住这些视频配音软件,一键完成配音
    RK3588 利用gpio与extcon实现热插拔检测系统层发出广播(一)
    亚马逊欧洲站FBA有哪些物流方式
    Linux设备驱动模型之SPI
    Jenkins 自动打包发布 SpringCloud 微服务项目
    java-php-python-基于EE技术的“日进斗金”理财大师系统设计与实现计算机毕业设计
    shell_53.理解Linux输入和输出
    vue 中的性能优化
    npm error File “xxx\.node-gyp\18.18.2\include\node\common.gypi“, line 1
  • 原文地址:https://blog.csdn.net/xhj12138/article/details/134044884