Linux学习第56天:RGB转HDMI
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
本章的思维导图如下:
1.RGB转HDMI简介
RGB转HDMI,其实不是原生的HDMI,本质上还是RGB.
IIC接口
2.硬件原理图分析
IIC接口
3.实验程序编写
1)修改设备树
(1)HDMI 模块 IO 节点信息添加
2部分:RGB接口、IIC接口。
打开 imx6ull-alientek-emmc.dts 文件,在 iomuxc 节点下的 imx6ul-evk 子节点里面加入如下内容:
1 pinctrl_hdmi_dat: hdmidatgrp {
2 fsl,pins = <
3 MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x49
4 MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x49
5 MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x49
6 MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x49
7 MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x49
8 MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x49
9 MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x49
10 MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x49
11 MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x49
12 MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x49
13 MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x49
14 MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x49
15 MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x49
16 MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x49
17 MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x49
18 MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x51
19 MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x49
20 MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x49
21 MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x49
22 MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x49
23 MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x49
24 MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x49
25 MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x49
26 MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x49
27 >;
28 };
29
30 /* zuozhongkai HDMI RGB */
31 pinctrl_hdmi_ctrl: hdmictrlgrp {
32 fsl,pins = <
33 MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x49
34 MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x49
35 MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x49
36 MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x49
37 >;
38 };
39
40 /* zuozhongkai SII902X INT*/
41 pinctrl_sii902x: hdmigrp-1 {
42 fsl,pins = <
43 MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x11
44 >;
45 };
在 iomuxc_snvs 节点下的 imx6ul-evk 子节点里面加入如下 RGB 转 HDMI 模块复位引脚信息,需要添加的内容如下:
1 ts_reset_hdmi_pin: ts_reset_hdmi_mux {
2 fsl,pins = <
3 MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x49
4 >;
5 };
(2)sii902x 节点创建
在 I2C2 节点下创建 sil902x 芯片子节点。
1 sii902x: sii902x@39 {
2 compatible = "SiI,sii902x";
3 pinctrl-names = "default";
4 pinctrl-0 = <&pinctrl_sii902x>;
5 interrupt-parent = <&gpio1>;
6 interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
7 irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
8 mode_str = "1280x720M@60";/*mode_str 设置屏幕的分辨率帧率,这里设置为 1280*720,帧率为 60。*/
9 bits-per-pixel = <16>;
10 resets = <&sii902x_reset>;
11 reg = <0x39>;
12 status = "okay";
13 };
在“/”节点下创建名为“sii902x_reset”的子节点,这个子节点用于描述 sii902x 的复位 IO,节点内容如下所示:
1 sii902x_reset: sii902x-reset {
2 compatible = "gpio-reset";
3 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
4 reset-delay-us = <100000>;
5 #reset-cells = <0>;
6 status = "disabled";
7 };
(3)修改 lcdif 节点下的像素极性
修改一下像素时钟极性属性 pixelclk-active, lcdif 节点下的其他属性全部都不需要修改!只需要将 pixelclk-active 改为 1。
(4)屏蔽其他复用的IO
RGB 转 HDMI 模块的 RESET 和 INT 这两个引脚作为 GPIO 使用,对应 GPIO5_IO09 和GPIO1_IO09。
2)使能内核自带的sii902x驱动
配置路径如下:
-> Device Drivers
-> Graphics support
-> Frame buffer Devices
-> <*> Si Image SII9022 DVI/HDMI Interface Chip
使能以后编译一下内核。
3)修改sii902x驱动
sii902x_poweron 和 sii902x_poweroff 函数如下所示:
1 static void sii902x_poweron(void)
2 {
3 /* Turn on DVI or HDMI */
4 i2c_smbus_write_byte_data(sii902x.client, 0x1A, 0x00);
5 return;
6 }
7 8
static void sii902x_poweroff(void)
9 {
10 /* disable tmds before changing resolution */
11 i2c_smbus_write_byte_data(sii902x.client, 0x1A, 0x10);
12 return;
13 }
配置 sii902x 的中断 IO,修改后的 mxsfb_get_of_property 函数如下所示:
/*
第 6、 22 和 23 这三行就是新添加进去的, mxsfb_get_of_property 函数
其他部分均不用做任何修改!
*/
1 static int mxsfb_get_of_property(void)
2 {
3 struct device_node *np = sii902x.client->dev.of_node;
4 const char *mode_str;
5 int bits_per_pixel, ret;
6 int irq_pin;
7 8
ret = of_property_read_string(np, "mode_str", &mode_str);
......
19 sii902x.mode_str = mode_str;
20 sii902x.bits_per_pixel = bits_per_pixel;
21
22 irq_pin = of_get_named_gpio(np, "irq-gpios", 0);
23 gpio_direction_output(irq_pin, 1);
24
25 return ret;
26 }
在 mxsfb_sii902x.c 文件里面添加如下头文件:
#include <linux/of_gpio.h>
文件修改完成,重新编译 linux 内核。
4.RGB转HDMI测试
使用新编译得到的 zImage 和 imx6ull-alientek-emmc.dtb 启动开发板
本笔记为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,未经允许不得用于商业用途。