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 启动开发板


本笔记为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,未经允许不得用于商业用途。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值