OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4670|回复: 0

《I.MX6U嵌入式Linux驱动开发指南V1.0》第七十二章 RGB转HDMI实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4666
金钱
4666
注册时间
2019-5-8
在线时间
1224 小时
发表于 2021-9-24 10:45:49 | 显示全部楼层 |阅读模式
1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《《I.MX6U嵌入式Linux驱动开发指南V1.0》》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335 QQ群.png

原子哥.jpg

微信公众号.png




第七十二章 RGB转HDMI实验





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

72.1 RGB转HMDI简介
        I.MX6ULL这颗SOC是没有HDMI外设,只有RGB屏幕接口,因此只能通过RGB转HDMI的芯片来实现HDMI连接。效果肯定是没法和原生支持HDMI接口的SOC比,当个玩具来玩一下还是可以的。因此本质上来讲还是RGB驱动,并非原生的HDMI驱动。
        正点原子为I.MX6U-ALPHA开发板提供了RGB转HDMI模块,如图72.1.1所示:
第七十二章 RGB转HDMI实验369.png
图72.1.1 RGB转HDMI模块正反面
        图72.1.1中左侧为RGB转HDMI模块正面,右侧为模块的反面。通过40Pin的FPC排线将模块与ALPHA开发板的RGB接口连接在一起,另一端通过HDMI线将模块与显示器连接在一起。
        模块使用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接口用于配置。
72.2 硬件原理图分析
        由于RGB转HDMI模块详细的原理图比较大,这里就不贴出来了,大家自行查看相应的原理图,RGB转HDMI模块的原理图已经放到了开发板光盘中,路径为:2、开发板原理图->正点原子其他模块原理图->ATK-RGB2HDMI模块V1.3.pdf。这里我们重点来看一下模块原理图中与ALPHA开发板的FPC连接口,如图72.2.1所示:
第七十二章 RGB转HDMI实验1059.png
图72.2.1 RGB转HDMI模块FPC接口
        上图就是RGB转HDMI模块的40P FPC接口,使用一根40P反向FPC连接线与ALPHA开发板的RGB接口连接,FPC线一定要短,推荐使用5CM长的。从图72.2.1可以看出,主要是RGB接口引脚,右上角一路I2C接口,这路I2C最终连接到了ALPHA开发板的触摸屏I2C接口上,也就是I.MX6ULL的I2C2接口。另外还有一个中断INT和一个复位HDMI_RESET引脚。
72.3 实验驱动编写
72.3.1 修改设备树
        1、HDMI模块IO节点信息添加
        HDMI模块分为两部分:RGB接口以及I2C2,I2C2接口的IO配置已经在《第六十四章 Linux多点电容触摸屏实验》的64.3.1小节讲解了这么修改,这里就不再讲解了。重点说一下RGB接口部分的配置,打开imx6ull-alientek-emmc.dts文件,在iomuxc节点下的imx6ul-evk子节点里面加入如下内容:
示例代码72.3.1.1 iomuxc子节点imx6ul-evk中添加的RGB引脚信息
  1. 1  pinctrl_hdmi_dat: hdmidatgrp {
  2. 2      fsl,pins = <
  3. 3          MX6UL_PAD_LCD_DATA00__LCDIF_DATA00          0x49
  4. 4          MX6UL_PAD_LCD_DATA01__LCDIF_DATA01          0x49
  5. 5          MX6UL_PAD_LCD_DATA02__LCDIF_DATA02          0x49
  6. 6          MX6UL_PAD_LCD_DATA03__LCDIF_DATA03          0x49
  7. 7          MX6UL_PAD_LCD_DATA04__LCDIF_DATA04          0x49
  8. 8          MX6UL_PAD_LCD_DATA05__LCDIF_DATA05          0x49
  9. 9          MX6UL_PAD_LCD_DATA06__LCDIF_DATA06          0x49
  10. 10         MX6UL_PAD_LCD_DATA07__LCDIF_DATA07          0x49
  11. 11         MX6UL_PAD_LCD_DATA08__LCDIF_DATA08          0x49
  12. 12         MX6UL_PAD_LCD_DATA09__LCDIF_DATA09          0x49
  13. 13         MX6UL_PAD_LCD_DATA10__LCDIF_DATA10          0x49
  14. 14         MX6UL_PAD_LCD_DATA11__LCDIF_DATA11          0x49
  15. 15         MX6UL_PAD_LCD_DATA12__LCDIF_DATA12          0x49
  16. 16         MX6UL_PAD_LCD_DATA13__LCDIF_DATA13          0x49
  17. 17         MX6UL_PAD_LCD_DATA14__LCDIF_DATA14          0x49
  18. 18         MX6UL_PAD_LCD_DATA15__LCDIF_DATA15          0x51
  19. 19         MX6UL_PAD_LCD_DATA16__LCDIF_DATA16          0x49
  20. 20         MX6UL_PAD_LCD_DATA17__LCDIF_DATA17          0x49
  21. 21         MX6UL_PAD_LCD_DATA18__LCDIF_DATA18          0x49
  22. 22         MX6UL_PAD_LCD_DATA19__LCDIF_DATA19          0x49
  23. 23         MX6UL_PAD_LCD_DATA20__LCDIF_DATA20          0x49
  24. 24         MX6UL_PAD_LCD_DATA21__LCDIF_DATA21          0x49
  25. 25         MX6UL_PAD_LCD_DATA22__LCDIF_DATA22          0x49
  26. 26         MX6UL_PAD_LCD_DATA23__LCDIF_DATA23          0x49
  27. 27     >;
  28. 28 };
  29. 29
  30. 30 /* zuozhongkai HDMI RGB */
  31. 31 pinctrl_hdmi_ctrl: hdmictrlgrp {
  32. 32     fsl,pins = <
  33. 33         MX6UL_PAD_LCD_CLK__LCDIF_CLK                0x49
  34. 34         MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE          0x49
  35. 35         MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC            0x49
  36. 36         MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC            0x49
  37. 37     >;
  38. 38 };
  39. 39
  40. 40 /* zuozhongkai SII902X  INT*/
  41. 41  pinctrl_sii902x: hdmigrp-1 {
  42. 42      fsl,pins = <
  43. 43          MX6UL_PAD_GPIO1_IO09__GPIO1_IO09           0x11
  44. 44      >;
  45. 45  };
复制代码


        另外,还需要在iomuxc_snvs节点下的imx6ul-evk子节点里面加入如下RGB转HDMI模块复位引脚信息,需要添加的内容如下:
示例代码72.3.1.2 iomuxc_snvs子节点imx6ul-evk中的复位引脚信息
  1. 1 ts_reset_hdmi_pin: ts_reset_hdmi_mux {
  2. 2   fsl,pins = <
  3. 3       MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x49
  4. 4   >;
  5. 5 };
复制代码


     
2、sii902x节点创建
        sill902x通过I2C接口配置,正点原子RGB转HDMI模块的I2C接口连接到了ALPHA开发板的I2C2接口上,因此需要在I2C2节点下创建sil902x芯片子节点。在imx6ull-alientek-emmc.dts文件的“i2c2”节点下添加如下所示内容:
示例代码72.3.1.3 i2c2节点下添加sii902x子节点
  1. 1  sii902x: sii902x@39 {
  2. 2       compatible = "SiI,sii902x";
  3. 3       pinctrl-names = "default";
  4. 4       pinctrl-0 = <&pinctrl_sii902x>;
  5. 5       interrupt-parent = <&gpio1>;
  6. 6       interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
  7. 7           irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
  8. 8       mode_str = "1280x720M@60";
  9. 9       bits-per-pixel = <16>;
  10. 10      resets = <&sii902x_reset>;
  11. 11      reg = <0x39>;
  12. 12      status = "okay";
  13. 13  };
复制代码


        第8行的mode_str设置屏幕的分辨率帧率,这里设置为1280*720,帧率为60。
在“/”节点下创建名为“sii902x_reset”的子节点,这个子节点用于描述sii902x的复位IO,节点内容如下所示:
示例代码72.3.1.4 根节点"/"下添加sii902x复位子节点
  1. 1 sii902x_reset: sii902x-reset {
  2. 2      compatible = "gpio-reset";
  3. 3      reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
  4. 4   reset-delay-us = <100000>;
  5. 5      #reset-cells = <0>;
  6. 6      status = "disabled";
  7. 7  };
复制代码


3、修改lcdif节点下的像素极性
RGB接口我们默认都是连接的RGB屏幕,现在换为了RGB转HDMI模块,因此需要对一些参数做修改,这里只需要修改一下像素时钟极性属性pixelclk-active,lcdif节点下的其他属性全部都不需要修改!只需要将pixelclk-active改为1,如下所示:
示例代码72.3.1.5 修改lcdif节点的pixelclk-active属性
  1. 1  &lcdif {
  2. 2           pinctrl-names = "default";
  3. 3           pinctrl-0 = <&pinctrl_lcdif_dat
  4. 4            &pinctrl_lcdif_ctrl>;
  5. 5           display = <&display0>;
  6. 6           status = "okay";
  7. 7  
  8. 8           display0: display {
  9. ......
  10. 28                          pixelclk-active = <1>;
  11. 29                          };
  12. 30              };
  13. 31          };
  14. 32 };
复制代码


        第28行仅仅将pixelclk-active属性改为1,lcdif节点其他属性全部不需要修改。
        4、屏蔽其他复用的IO
        RGB转HDMI模块的RESET和INT这两个引脚作为GPIO使用,对应GPIO5_IO09和GPIO1_IO09。所有我们要检查整个设备树,找到其他用到GPIO5_IO09和GPIO1_IO09的地方,让后将其屏蔽掉,在整个设备树中搜索“gpio5 9”和“gpio1 9”这两个字符串,将所有非HDMI模块的节点中出现这两个字符串的属性都屏蔽掉。
        这一步一定要做!否则加载sii902x驱动的时候会要因为IO被其他设备占用而导致驱动加载失败!
72.3.2 使能内核自带的sii902x驱动
        NXP提供的linux内核已经继承了sii902x驱动了,我们只需要配置使能即可,路径如下:
  1. -> Device Drivers                                                                           
  2.         -> Graphics support                                                                       
  3.                    -> Frame buffer Devices                  
  4.                         -> <*> Si Image SII9022 DVI/HDMI Interface Chip  
复制代码


        将sii902x驱动编译进Linux内核中,如图72.3.2.1所示:
第七十二章 RGB转HDMI实验5686.png
图72.3.2.1 使能sii902x驱动
        使能以后编译一下内核,看看能不能正常编译,能正常编译的话在进行下一步。
72.3.3 修改sii902x驱动
        linux内核自带的sii902x驱动需要做一点小修改,首先打开drivers/video/fbdev/mxc/mxsfb_sii902x.c这个文件,我们需要对其中的sii902x_poweron和sii902x_poweroff这两个函数进行修改,修改后的sii902x_poweron和sii902x_poweroff函数如下所示:
示例代码72.3.3.1 修改mxsfb_sii902x.c文件
  1. 1  static void sii902x_poweron(void)
  2. 2  {
  3. 3           /* Turn on DVI or HDMI */
  4. 4           i2c_smbus_write_byte_data(sii902x.client, 0x1A, 0x00);
  5. 5           return;
  6. 6  }
  7. 7  
  8. 8  static void sii902x_poweroff(void)
  9. 9  {
  10. 10          /* disable tmds before changing resolution */
  11. 11          i2c_smbus_write_byte_data(sii902x.client, 0x1A, 0x10);
  12. 12          return;
  13. 13 }
  14.         继续修改mxsfb_sii902x.c文件,找到mxsfb_get_of_property函数,我们需要在此函数中配置sii902x的中断IO,修改后的mxsfb_get_of_property函数如下所示:
  15. 示例代码72.3.3.2 mxsfb_get_of_property函数
  16. 1  static int mxsfb_get_of_property(void)
  17. 2  {
  18. 3           struct device_node *np = sii902x.client->dev.of_node;
  19. 4           const char *mode_str;
  20. 5           int bits_per_pixel, ret;
  21. 6           int irq_pin;
  22. 7  
  23. 8           ret = of_property_read_string(np, "mode_str", &mode_str);
  24. ......
  25. 19          sii902x.mode_str = mode_str;
  26. 20          sii902x.bits_per_pixel = bits_per_pixel;
  27. 21
  28. 22          irq_pin = of_get_named_gpio(np, "irq-gpios", 0);
  29. 23          gpio_direction_output(irq_pin, 1);
  30. 24
  31. 25          return ret;
  32. 26 }
复制代码


        示例代码72.3.3.2中第6、22和23这三行就是新添加进去的,mxsfb_get_of_property函数其他部分均不用做任何修改!
        最后在mxsfb_sii902x.c文件里面添加如下头文件:
示例代码72.3.3.3 mxsfb_sii902x.c文件添加头文件
1 #include <linux/of_gpio.h>
        至此,mxsfb_sii902x.c文件修改完成,重新编译linux内核。
72.4 RGB转HDMI测试
        使用FPC线将RGB转HDMI模块连接到开发板上的RGB屏幕接口上,RGB转HDMI模块通过HDMI线连接到显示器上。
使用新编译得到的zImage和imx6ull-alientek-emmc.dtb启动开发板,如果驱动工作正常的话显示器就会有显示,如图72.4.1所示:
第七十二章 RGB转HDMI实验7260.png
图72.4.1 显示器显示
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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