STM32MP157驱动开发——RGB转HDMI
- 0.前言
- 一、原理简述
- 二、驱动编写
- 1.修改设备树
- 1)设置 I2C2 的pinmux
- 2)添加 HDMI 的电源节点
- 3)在i2c2节点追加HDMI子节点
- 4)修改ltdc节点,输出到HDMI子节点
- 2.使能内核自带的sii902x驱动
0.前言
上一节学习了STM32MP157的 RGB LCD 接口,但是手头没有 LCD 屏幕,所以本节直接开始学习 RGB 转 HDMI 部分,体验一下图形交互界面。
一、原理简述
STM32MP157 这颗 SOC 没有 HDMI 外设,只有 RGB 屏幕接口,所以使用 Sii9022A 芯片来完成 RGB 转 HDMI。SiI9022A 功能非常多,具体使用什么功能需要进行配置,因此 SiI9022A 提供了一个 I2C 接口用于配置。
原理图:
HDMI 模块分为 4 部分:RGB 接口、I2C2 接口、I2S2 音频接口和 HDMI_CEC 接口。本章节是仅实现 HDMI 的显示功能。
二、驱动编写
1.修改设备树
SiI9022A 使用 I2C 来进行功能配置,这里使用 STM32MP1 的 I2C2 接口,用到了到 PH4 和 PH5 两个引脚。另外还有一个中断 INT,一个复位 HDMI_RESET 分别连接到 PH6 和 PA3 引脚。
1)设置 I2C2 的pinmux
在stm32mp15-pinctrl.dtsi中,可以找到官方对于 I2C2 的配置:
2)添加 HDMI 的电源节点
Sii9022A 需要一个 1.2V 电压,这个开发板上已经提供,原理图上的 XC6206P122MR 芯片就是 1.2V 电源芯片。所以还需要在设备树中的根节点添加 1.2V 电压节点,供 Sii9022A 驱动程序使用。
v1v2_hdmi: regulator-v1v2-hdmi {
compatible = "regulator-fixed";
regulator-name = "v1v2_hdmi";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-boot-on;
};
3)在i2c2节点追加HDMI子节点
由于只是将RGB信号通过芯片转换成HDMI信号,所以不需要参考什么手册编写对应的HDMI节点,只需要提供一个接口用来接收 LTDC 数据。这里的HDMI子节点就是用来接收 LTDC 接口的。
在设备树文件中添加如下节点:
&i2c2 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&i2c2_pins_a>;
pinctrl-1 = <&i2c2_pins_sleep_a>;
status = "okay";
hdmi: hdmi-transmitter@39 {
compatible = "sil,sii9022";
reg = <0x39>;
iovcc-supply = <&v3v3>;
cvcc12-supply = <&v1v2_hdmi>;
reset-gpios = <&gpioa 3 GPIO_ACTIVE_LOW>;
interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
interrupt-parent = <&gpioh>;
#sound-dai-cells = <1>;
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
sii9022_in: endpoint {
remote-endpoint = <<dc_ep0_out>;
};
};
};
};
};
①配置 I2C2 的两个 pinmux 设置
②在HDMI子节点中,设置复位引脚为 PA3,低电压有效。设置中断引脚为 PH6,下降沿有效。port 节点就是用来接收 LTDC 数据的接口,设置为引用 ltdc_ep0_out节点。
4)修改ltdc节点,输出到HDMI子节点
<dc {
pinctrl-names = "default", "sleep";
pinctrl-0 = <<dc_pins_b>;
pinctrl-1 = <<dc_pins_sleep_b>;
status = "okay";
port {
#aggress-cells = <1>;
#size-cell = <0>;
ltdc_ep0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&sii9022_in>;
};
};
};
并将之前的输出位置:rgb_panel_in 节点屏蔽掉。
最后执行make dtbs
编译出设备树即可
2.使能内核自带的sii902x驱动
ST 提供的 linux 内核已经集成了 sii902x 驱动,并且已经使能。在内核的menuconfig中可以找到这个驱动的使能位置:
在Linux LCD实验中,已经将与显示有关的设置配置好。本节中将相应的信号转换成HDMI信号后,并使能对应的芯片驱动,就直接可以使用HDMI显示器进行显示。