1、介绍
STM32MP157A 系列 SoC 中默认没有 HDMI 相关控制器, FS-MP1A 使用 SiI9022 芯片将RGB 信号转化为 HDMI 信号。 STM32MP157A 集成 LTDC(LCD-TFT Display Controller),提供一个 24bit RGB 并行接口用于连接到各种 LCD 和 TFT 面板
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 接口用于配置。
SiI9022 芯片通过 I2C5 总线与 SoC 进行交互,通过 SoC 的 LCD_PCLK、 LCD_VSYNC、LCD_HSYNC、 LCD_DEN 与 RGB 信号线来进行图像信号的传输,通过 I2S2 总线进行音频数据的传输。
原理图网络编号 | 对应管脚 | 管脚功能 | 管脚功能码 |
---|---|---|---|
I2C5_SCL | PA11 | I2C5_SCL | AF4 |
I2C5_SDA | PA12 | I2C5_SDA | AF4 |
HDMI_RST | PA13 | GPIO | |
HDMI_INT | PA14 | INT |
原理图网络编号 | 对应管脚 | 管脚功能 | 管脚功能码 |
---|---|---|---|
LCD_R0 | PI15 | LCD_R0 | AF14 |
LCD_R1 | PJ0 | LCD_R1 | AF14 |
LCD_R2 | PJ1 | LCD_R2 | AF14 |
LCD_R3 | PJ2 | LCD_R3 | AF14 |
LCD_R4 | PJ3 | LCD_R4 | AF14 |
LCD_R5 | PJ4 | LCD_R5 | AF14 |
LCD_R6 | PJ5 | LCD_R6 | AF14 |
LCD_R7 | PJ6 | LCD_R7 | AF14 |
LCD_G0 | PJ8 | LCD_G0 | AF14 |
LCD_G1 | PJ7 | LCD_G1 | AF14 |
LCD_G2 | PJ10 | LCD_G2 | AF14 |
LCD_G3 | PJ19 | LCD_G3 | AF14 |
LCD_G4 | PJ11 | LCD_G4 | AF14 |
LCD_G5 | PK0 | LCD_G5 | AF14 |
LCD_G6 | PK1 | LCD_G6 | AF14 |
LCD_G7 | PK2 | LCD_G7 | AF14 |
LCD_B0 | PJ12 | LCD_B0 | AF14 |
LCD_B1 | PJ13 | LCD_B1 | AF14 |
LCD_B2 | PJ14 | LCD_B2 | AF14 |
LCD_B3 | PJ15 | LCD_B3 | AF14 |
LCD_B4 | PK3 | LCD_B4 | AF14 |
LCD_B5 | PK4 | LCD_B5 | AF14 |
---|---|---|---|
LCD_B6 | PK5 | LCD_B6 | AF14 |
LCD_B7 | PK6 | LCD_B7 | AF14 |
LCD_PCLK | PI14 | LCD_PCLK | AF14 |
LCD_DEN | PK7 | LCD_DEN | AF14 |
LCD_HSYNC | PI12 | LCD_HSYNC | AF14 |
LCD_VSYNC | PI13 | LCD_VSYNC | AF14 |
主要还是使用 RGB 接口引脚获取显示数据, SiI9022A使用 I2C 来进行配置,这里使用 STM32MP1 的 I2C5 接口。
2、修改步骤
1、配置I2C5控制器引脚,硬件适配
2、配置LDTC, 硬件适配
添加 i2c5 及 sii9022 内容
修改 arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi 文件,在文件末尾添加如下内容:
IIC节点追加HDMI节点
&i2c5 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&i2c5_pins_a>;
pinctrl-1 = <&i2c5_pins_sleep_a>; //配置了 I2C2 的两个 pinmux 设置。
i2c-scl-rising-time-ns = <100>;
i2c-scl-falling-time-ns = <7>;
clock-frequency = <100000>;
/* spare dmas for other usage */
/delete-property/dmas;
/delete-property/dma-names;
status = "okay";
hdmi-transmitter@39 {
compatible = "sil,sii9022";
reg = <0x39>;
iovcc-supply = <&v3v3_hdmi>;
cvcc12-supply = <&v1v2_hdmi>;
reset-gpios = <&gpioa 13 GPIO_ACTIVE_LOW>; // PA13 低电平有效
interrupts = <14 IRQ_TYPE_EDGE_FALLING>; // PA14 下降沿
interrupt-parent = <&gpioa>;
#sound-dai-cells = <0>;
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
sii9022_in: endpoint {
remote-endpoint = <<dc_ep0_out>;
};
};
};
};
};
这里只是告诉了 HDMI 从 LTDC 接口获取数据,还需要告诉 LTDC 节点我们数据输出到HDMI
分析:
pinctrl-0 = <&i2c5_pins_a>;
pinctrl-1 = <&i2c5_pins_sleep_a>;
i2c5_pins_a: i2c5-0 {
360 pins {
361 pinmux = <STM32_PINMUX('A', 11, AF4)>, /* I2C5_SCL */
362 <STM32_PINMUX('A', 12, AF4)>; /* I2C5_SDA */
363 bias-disable;
364 drive-open-drain;
365 slew-rate = <0>;
366 };
367 };
368
369 i2c5_pins_sleep_a: i2c5-1 {
370 pins {
371 pinmux = <STM32_PINMUX('A', 11, ANALOG)>, /* I2C5_SCL */
372 <STM32_PINMUX('A', 12, ANALOG)>; /* I2C5_SDA */
373
374 };
375 };
pinmux
是一种设备树属性,用于指定微控制器引脚的复用配置。它确定了每个引脚在特定外设(如 I2C、SPI、UART、PWM 等)中的功能。
在设备树中,
pinmux 属性用于配置引脚的备用功能(Alternate Function)。它可以将引脚设置为不同的外设功能,确保系统能够正确地使用硬件外设。
STM32_PINMUX
是一个宏定义,通常用于在设备树中配置 STM32 微控制器引脚的功能。这个宏将引脚的端口、引脚号和备用功能结合起来,以生成设备树中使用的配置值。
宏定义: STM32_PINMUX(PORT, PIN, FUNCTION)
PORT: 引脚所在的端口(如 'A', 'B', 'C' 等)。
PIN: 引脚编号(如 0, 1, 2 等)。
FUNCTION: 引脚的备用功能模式(如 GPIO, AF1, AF2, ANALOG 等)。
这个宏简化了设备树中的引脚配置,确保正确地将引脚设置为所需的功能模式。
AF4 PA11 PA12(stm32mp157a.pdf)
添加 ltdc内容
修改
arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:
<dc {
pinctrl-names = "default", "sleep";
pinctrl-0 = <<dc_pins_b>;
pinctrl-1 = <<dc_pins_sleep_b>;
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
ltdc_ep0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&sii9022_in>;
};
};
};
添加 电源 内容
修改
arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点末尾添加如下内容:
v3v3_hdmi: regulator-v3v3-hdmi {
compatible = "regulator-fixed";
regulator-name = "v3v3_hdmi ";
regulator-min-microvolt = <3300000>; // 最大最小电压
regulator-max-microvolt = <3300000>;
regulator-always-on; // 常开
regulator-boot-on; // 开机开
};
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;
};
配置内核:
linux@ubuntu:$ make menuconfig
Device Drivers --->
Graphics support --->
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
<*> DRM Support for STMicroelectronics SoC Series
Display Interface Bridges --->
<*> Silicon Image sii902x RGB/HDMI bridge
3、编译内核及设备树:
linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040
1. make
解释:
make 是一个构建自动化工具,用于根据
Makefile 中的指令构建项目。在这里,它用于编译 Linux 内核及其相关组件。
2. -j4
解释: 这个选项告诉
make 使用 4 个并行线程来加速构建过程。
-j 后面跟的数字表示同时进行的任务数量。使用并行构建可以显著缩短编译时间,尤其是在多核处理器上。
3. uImage
解释:
uImage 是 Linux 内核的一个目标文件,它是经过压缩和头信息处理的内核映像格式,通常用于嵌入式系统中。
uImage 格式是由
mkimage 工具创建的,适用于 U-Boot 引导加载器。
4. dtbs
解释:
dtbs 指代设备树二进制文件(Device Tree Blobs)。这些文件描述了硬件的布局和配置,内核使用这些文件来正确地初始化和配置硬件设备。
5. LOADADDR=0xC2000040
解释: 这个环境变量
LOADADDR 用于设置内核的加载地址。
0xC2000040 是一个十六进制地址,指定内核在内存中的加载位置。这个地址通常由启动加载器(如 U-Boot)在加载内核时使用。设置正确的加载地址是确保内核可以正确运行的关键。
综上所述
整个命令的作用是使用 make 工具并行编译(使用 4 个线程),生成一个 uImage 格式的 Linux 内核映像和设备树二进制文件(DTBs),并设置内核的加载地址为 0xC2000040。
这是在嵌入式系统开发中常见的编译步骤,确保生成的内核映像和设备树文件可以在目标硬件上正确运行。
cp arch/arm/boot/uImage /tftpboot/
cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/
cp arch/arm/boot/dts/stm32mp157a-fsmp1a*.dtb /tftpboot/
run bootcmd_pxe