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

原理图:

esp32外接hdml屏幕_子节点


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 的配置:

esp32外接hdml屏幕_stm32_02

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中可以找到这个驱动的使能位置:

esp32外接hdml屏幕_stm32_03


在Linux LCD实验中,已经将与显示有关的设置配置好。本节中将相应的信号转换成HDMI信号后,并使能对应的芯片驱动,就直接可以使用HDMI显示器进行显示。