“LTDC device tree configuration”的版本间的差异

来自百问网嵌入式Linux wiki
 
 
(未显示2个用户的8个中间版本)
第1行: 第1行:
[[Category:Linux_Operating_System]]
+
== Article purpose ==
[[Category:Visual]]
+
本文介绍了如何在将外围设备分配给 Linux<sup>&reg;</sup>时配置“ LTDC” <ref name="LTDC">[[LTDC internal peripheral]]</ref>  操作系统。
[[Category:DRM_KMS]]
+
 
 +
使用'''设备树机制''' <ref> [[Device tree]]</ref>执行配置。
 +
 
 +
The [[Device tree]]提供了STM32“ LTDC Linux驱动程序”使用的LTDC <ref name="LTDC"/>的硬件描述。
 +
 
 +
== DT bindings documentation ==
 +
LTDC由STM32 LTDC设备树绑定表示 <ref>{{CodeSource | Linux kernel | Documentation/devicetree/bindings/display/st,stm32-ltdc.txt | Linux kernel STM32 LTDC bindings (st,stm32-ltdc.txt)}}</ref>.
 +
 
 +
== DT configuration ==
 +
该硬件描述是“''STM32微处理器”''设备树文件(扩展名为.dtsi)和“''板子”设备树文件(扩展名为.dts)的组合。 有关设备树文件分割的说明,请参见[[Device tree]]。
 +
 
 +
'''STM32CubeMX'''可用于生成板卡设备树。 有关更多详细信息,请参考[[#How_to_configure_the_DT_using_STM32CubeMX|How to configure the DT using STM32CubeMX]]。
 +
 
 +
===DT configuration (STM32 level) ===
 +
LTDC设备树节点在stm32mp157c.dtsi <ref name="stm32mp157c_dtsi">{{CodeSource | Linux kernel | arch/arm/boot/dts/stm32mp157c.dtsi | Linux kernel STM32MP157C device tree (stm32mp157c.dtsi)}}</ref>. 声明(如下所示)提供了硬件寄存器的基地址,时钟,中断和复位。
 +
<pre>
 +
ltdc: display-controller@5a001000 {
 +
compatible = "st,stm32-ltdc";
 +
reg = <0x5a001000 0x400>;
 +
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
 +
    <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 +
clocks = <&rcc LTDC_PX>;
 +
clock-names = "lcd";
 +
resets = <&rcc LTDC_R>;
 +
status = "disabled";
 +
};
 +
</pre>
 +
 
 +
{{Warning|该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。}}
 +
 
 +
=== DT configuration (board level) ===
 +
与特定板卡相关的LTDC设备树可能具有以下节点,具体取决于板卡硬件:
 +
* '''ltdc'''节点:包含输入/输出端口说明。
 +
*'''panel'''或'''i2cx'''网桥rgb节点(取决于板硬件):包含LTDC Pinctrl和输入/输出端口说明
 +
* '''panel_backlight'''节点(取决于板硬件):与面板节点有关
 +
 
 +
LTDC引脚的完整示例<ref>[[Pinctrl device tree configuration]]</ref> 在stm32mp157-pinctrl.dtsi中提供 <ref name="stm32mp157_pinctrl_dtsi">{{CodeSource | Linux kernel | arch/arm/boot/dts/stm32mp157-pinctrl.dtsi | Linux kernel STM32MP157 pinctrl device tree (stm32mp157-pinctrl.dtsi)}}</ref>
 +
<pre>
 +
ltdc_pins_a: ltdc-a-0 {
 +
pins {
 +
pinmux = <STM32_PINMUX('G',  7, AF14)>, /* LCD_CLK */
 +
<STM32_PINMUX('I', 10, AF14)>, /* LCD_HSYNC */
 +
<STM32_PINMUX('I',  9, AF14)>, /* LCD_VSYNC */
 +
<STM32_PINMUX('F', 10, AF14)>, /* LCD_DE */
 +
<STM32_PINMUX('H',  2, AF14)>, /* LCD_R0 */
 +
<STM32_PINMUX('H',  3, AF14)>, /* LCD_R1 */
 +
<STM32_PINMUX('H',  8, AF14)>, /* LCD_R2 */
 +
<STM32_PINMUX('H',  9, AF14)>, /* LCD_R3 */
 +
<STM32_PINMUX('H', 10, AF14)>, /* LCD_R4 */
 +
<STM32_PINMUX('C',  0, AF14)>, /* LCD_R5 */
 +
<STM32_PINMUX('H', 12, AF14)>, /* LCD_R6 */
 +
<STM32_PINMUX('E', 15, AF14)>, /* LCD_R7 */
 +
<STM32_PINMUX('E',  5, AF14)>, /* LCD_G0 */
 +
<STM32_PINMUX('E',  6, AF14)>, /* LCD_G1 */
 +
<STM32_PINMUX('H', 13, AF14)>, /* LCD_G2 */
 +
<STM32_PINMUX('H', 14, AF14)>, /* LCD_G3 */
 +
<STM32_PINMUX('H', 15, AF14)>, /* LCD_G4 */
 +
<STM32_PINMUX('I',  0, AF14)>, /* LCD_G5 */
 +
<STM32_PINMUX('I',  1, AF14)>, /* LCD_G6 */
 +
<STM32_PINMUX('I',  2, AF14)>, /* LCD_G7 */
 +
<STM32_PINMUX('D',  9, AF14)>, /* LCD_B0 */
 +
<STM32_PINMUX('G', 12, AF14)>, /* LCD_B1 */
 +
<STM32_PINMUX('G', 10, AF14)>, /* LCD_B2 */
 +
<STM32_PINMUX('D', 10, AF14)>, /* LCD_B3 */
 +
<STM32_PINMUX('I',  4, AF14)>, /* LCD_B4 */
 +
<STM32_PINMUX('A',  3, AF14)>, /* LCD_B5 */
 +
<STM32_PINMUX('B',  8, AF14)>, /* LCD_B6 */
 +
<STM32_PINMUX('D',  8, AF14)>; /* LCD_B7 */
 +
bias-disable;
 +
drive-push-pull;
 +
slew-rate = <2>;
 +
};
 +
};
 +
 
 +
ltdc_pins_sleep_a: ltdc-a-1 {
 +
pins {
 +
pinmux = <STM32_PINMUX('G',  7, ANALOG)>, /* LCD_CLK */
 +
<STM32_PINMUX('I', 10, ANALOG)>, /* LCD_HSYNC */
 +
<STM32_PINMUX('I',  9, ANALOG)>, /* LCD_VSYNC */
 +
<STM32_PINMUX('F', 10, ANALOG)>, /* LCD_DE */
 +
<STM32_PINMUX('H',  2, ANALOG)>, /* LCD_R0 */
 +
<STM32_PINMUX('H',  3, ANALOG)>, /* LCD_R1 */
 +
<STM32_PINMUX('H',  8, ANALOG)>, /* LCD_R2 */
 +
<STM32_PINMUX('H',  9, ANALOG)>, /* LCD_R3 */
 +
<STM32_PINMUX('H', 10, ANALOG)>, /* LCD_R4 */
 +
<STM32_PINMUX('C',  0, ANALOG)>, /* LCD_R5 */
 +
<STM32_PINMUX('H', 12, ANALOG)>, /* LCD_R6 */
 +
<STM32_PINMUX('E', 15, ANALOG)>, /* LCD_R7 */
 +
<STM32_PINMUX('E',  5, ANALOG)>, /* LCD_G0 */
 +
<STM32_PINMUX('E',  6, ANALOG)>, /* LCD_G1 */
 +
<STM32_PINMUX('H', 13, ANALOG)>, /* LCD_G2 */
 +
<STM32_PINMUX('H', 14, ANALOG)>, /* LCD_G3 */
 +
<STM32_PINMUX('H', 15, ANALOG)>, /* LCD_G4 */
 +
<STM32_PINMUX('I',  0, ANALOG)>, /* LCD_G5 */
 +
<STM32_PINMUX('I',  1, ANALOG)>, /* LCD_G6 */
 +
<STM32_PINMUX('I',  2, ANALOG)>, /* LCD_G7 */
 +
<STM32_PINMUX('D',  9, ANALOG)>, /* LCD_B0 */
 +
<STM32_PINMUX('G', 12, ANALOG)>, /* LCD_B1 */
 +
<STM32_PINMUX('G', 10, ANALOG)>, /* LCD_B2 */
 +
<STM32_PINMUX('D', 10, ANALOG)>, /* LCD_B3 */
 +
<STM32_PINMUX('I',  4, ANALOG)>, /* LCD_B4 */
 +
<STM32_PINMUX('A',  3, ANALOG)>, /* LCD_B5 */
 +
<STM32_PINMUX('B',  8, ANALOG)>, /* LCD_B6 */
 +
<STM32_PINMUX('D',  8, ANALOG)>; /* LCD_B7 */
 +
};
 +
};
 +
</pre>
 +
 
 +
一个完整的例子[[STM32MP157X-DKX - hardware description | STM32MP157 Discovery board]] 设备树在stm32mp157a-dk1.dts中可用 <ref name="stm32mp157c_dk1_dts">{{CodeSource | Linux kernel | arch/arm/boot/dts/stm32mp157a-dk1.dts | Linux kernel STM32MP157 Discovery board device tree (stm32mp157a-dk1.dts)}}</ref>.
 +
 
 +
<pre>
 +
&ltdc {
 +
status = "okay";
 +
 
 +
port {
 +
#address-cells = <1>;
 +
#size-cells = <0>;
 +
 
 +
ltdc_ep0_out: endpoint@0 {
 +
reg = <0>;
 +
remote-endpoint = <&sii9022_in>;
 +
};
 +
};
 +
};
 +
 
 +
&i2c1 {
 +
...
 +
hdmi-transmitter@39 {
 +
compatible = "sil,sii9022";
 +
reg = <0x39>;
 +
iovcc-supply = <&v3v3_hdmi>;
 +
cvcc12-supply = <&v1v2_hdmi>;
 +
reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
 +
interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
 +
interrupt-parent = <&gpiog>;
 +
pinctrl-names = "default", "sleep";
 +
pinctrl-0 = <&ltdc_pins_a>;
 +
pinctrl-1 = <&ltdc_pins_sleep_a>;
 +
status = "okay";
 +
 
 +
ports {
 +
#address-cells = <1>;
 +
#size-cells = <0>;
 +
 
 +
port@0 {
 +
reg = <0>;
 +
sii9022_in: endpoint {
 +
remote-endpoint = <&ltdc_ep0_out>;
 +
};
 +
};
 +
 
 +
port@1 {
 +
reg = <1>;
 +
sii9022_tx_endpoint: endpoint {
 +
remote-endpoint = <&i2s2_endpoint>;
 +
};
 +
};
 +
};
 +
};
 +
};
 +
</pre>
 +
 
 +
==How to configure the DT using STM32CubeMX==
 +
[[STM32CubeMX]] 工具可用于配置STM32MPU设备并获取相应的 [[Device_tree#STM32|platform configuration device tree]] 文件。<br />
 +
STM32CubeMX可能不支持以上 [[#DT bindings documentation|DT bindings documentation]]段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入'''用户部分'''。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见[[STM32CubeMX]] 用户手册。
 +
 
 +
==References==
 +
请参考以下链接以获取更多信息:
 +
<references />

2020年11月9日 (一) 17:00的最新版本

Article purpose

本文介绍了如何在将外围设备分配给 Linux®时配置“ LTDC” [1] 操作系统。

使用设备树机制 [2]执行配置。

The Device tree提供了STM32“ LTDC Linux驱动程序”使用的LTDC [1]的硬件描述。

DT bindings documentation

LTDC由STM32 LTDC设备树绑定表示 [3].

DT configuration

该硬件描述是“STM32微处理器”设备树文件(扩展名为.dtsi)和“板子”设备树文件(扩展名为.dts)的组合。 有关设备树文件分割的说明,请参见Device tree

STM32CubeMX可用于生成板卡设备树。 有关更多详细信息,请参考How to configure the DT using STM32CubeMX

DT configuration (STM32 level)

LTDC设备树节点在stm32mp157c.dtsi [4]. 声明(如下所示)提供了硬件寄存器的基地址,时钟,中断和复位。

		ltdc: display-controller@5a001000 {
			compatible = "st,stm32-ltdc";
			reg = <0x5a001000 0x400>;
			interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
				     <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&rcc LTDC_PX>;
			clock-names = "lcd";
			resets = <&rcc LTDC_R>;
			status = "disabled";
		};
Warning.png 该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。

DT configuration (board level)

与特定板卡相关的LTDC设备树可能具有以下节点,具体取决于板卡硬件:

  • ltdc节点:包含输入/输出端口说明。
  • paneli2cx网桥rgb节点(取决于板硬件):包含LTDC Pinctrl和输入/输出端口说明
  • panel_backlight节点(取决于板硬件):与面板节点有关

LTDC引脚的完整示例[5] 在stm32mp157-pinctrl.dtsi中提供 [6]

			ltdc_pins_a: ltdc-a-0 {
				pins {
					pinmux = <STM32_PINMUX('G',  7, AF14)>, /* LCD_CLK */
						 <STM32_PINMUX('I', 10, AF14)>, /* LCD_HSYNC */
						 <STM32_PINMUX('I',  9, AF14)>, /* LCD_VSYNC */
						 <STM32_PINMUX('F', 10, AF14)>, /* LCD_DE */
						 <STM32_PINMUX('H',  2, AF14)>, /* LCD_R0 */
						 <STM32_PINMUX('H',  3, AF14)>, /* LCD_R1 */
						 <STM32_PINMUX('H',  8, AF14)>, /* LCD_R2 */
						 <STM32_PINMUX('H',  9, AF14)>, /* LCD_R3 */
						 <STM32_PINMUX('H', 10, AF14)>, /* LCD_R4 */
						 <STM32_PINMUX('C',  0, AF14)>, /* LCD_R5 */
						 <STM32_PINMUX('H', 12, AF14)>, /* LCD_R6 */
						 <STM32_PINMUX('E', 15, AF14)>, /* LCD_R7 */
						 <STM32_PINMUX('E',  5, AF14)>, /* LCD_G0 */
						 <STM32_PINMUX('E',  6, AF14)>, /* LCD_G1 */
						 <STM32_PINMUX('H', 13, AF14)>, /* LCD_G2 */
						 <STM32_PINMUX('H', 14, AF14)>, /* LCD_G3 */
						 <STM32_PINMUX('H', 15, AF14)>, /* LCD_G4 */
						 <STM32_PINMUX('I',  0, AF14)>, /* LCD_G5 */
						 <STM32_PINMUX('I',  1, AF14)>, /* LCD_G6 */
						 <STM32_PINMUX('I',  2, AF14)>, /* LCD_G7 */
						 <STM32_PINMUX('D',  9, AF14)>, /* LCD_B0 */
						 <STM32_PINMUX('G', 12, AF14)>, /* LCD_B1 */
						 <STM32_PINMUX('G', 10, AF14)>, /* LCD_B2 */
						 <STM32_PINMUX('D', 10, AF14)>, /* LCD_B3 */
						 <STM32_PINMUX('I',  4, AF14)>, /* LCD_B4 */
						 <STM32_PINMUX('A',  3, AF14)>, /* LCD_B5 */
						 <STM32_PINMUX('B',  8, AF14)>, /* LCD_B6 */
						 <STM32_PINMUX('D',  8, AF14)>; /* LCD_B7 */
					bias-disable;
					drive-push-pull;
					slew-rate = <2>;
				};
			};

			ltdc_pins_sleep_a: ltdc-a-1 {
				pins {
					pinmux = <STM32_PINMUX('G',  7, ANALOG)>, /* LCD_CLK */
						 <STM32_PINMUX('I', 10, ANALOG)>, /* LCD_HSYNC */
						 <STM32_PINMUX('I',  9, ANALOG)>, /* LCD_VSYNC */
						 <STM32_PINMUX('F', 10, ANALOG)>, /* LCD_DE */
						 <STM32_PINMUX('H',  2, ANALOG)>, /* LCD_R0 */
						 <STM32_PINMUX('H',  3, ANALOG)>, /* LCD_R1 */
						 <STM32_PINMUX('H',  8, ANALOG)>, /* LCD_R2 */
						 <STM32_PINMUX('H',  9, ANALOG)>, /* LCD_R3 */
						 <STM32_PINMUX('H', 10, ANALOG)>, /* LCD_R4 */
						 <STM32_PINMUX('C',  0, ANALOG)>, /* LCD_R5 */
						 <STM32_PINMUX('H', 12, ANALOG)>, /* LCD_R6 */
						 <STM32_PINMUX('E', 15, ANALOG)>, /* LCD_R7 */
						 <STM32_PINMUX('E',  5, ANALOG)>, /* LCD_G0 */
						 <STM32_PINMUX('E',  6, ANALOG)>, /* LCD_G1 */
						 <STM32_PINMUX('H', 13, ANALOG)>, /* LCD_G2 */
						 <STM32_PINMUX('H', 14, ANALOG)>, /* LCD_G3 */
						 <STM32_PINMUX('H', 15, ANALOG)>, /* LCD_G4 */
						 <STM32_PINMUX('I',  0, ANALOG)>, /* LCD_G5 */
						 <STM32_PINMUX('I',  1, ANALOG)>, /* LCD_G6 */
						 <STM32_PINMUX('I',  2, ANALOG)>, /* LCD_G7 */
						 <STM32_PINMUX('D',  9, ANALOG)>, /* LCD_B0 */
						 <STM32_PINMUX('G', 12, ANALOG)>, /* LCD_B1 */
						 <STM32_PINMUX('G', 10, ANALOG)>, /* LCD_B2 */
						 <STM32_PINMUX('D', 10, ANALOG)>, /* LCD_B3 */
						 <STM32_PINMUX('I',  4, ANALOG)>, /* LCD_B4 */
						 <STM32_PINMUX('A',  3, ANALOG)>, /* LCD_B5 */
						 <STM32_PINMUX('B',  8, ANALOG)>, /* LCD_B6 */
						 <STM32_PINMUX('D',  8, ANALOG)>; /* LCD_B7 */
				};
			};

一个完整的例子 STM32MP157 Discovery board 设备树在stm32mp157a-dk1.dts中可用 [7].

&ltdc {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		ltdc_ep0_out: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&sii9022_in>;
		};
	};
};

&i2c1 {
...
	hdmi-transmitter@39 {
		compatible = "sil,sii9022";
		reg = <0x39>;
		iovcc-supply = <&v3v3_hdmi>;
		cvcc12-supply = <&v1v2_hdmi>;
		reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
		interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
		interrupt-parent = <&gpiog>;
		pinctrl-names = "default", "sleep";
		pinctrl-0 = <&ltdc_pins_a>;
		pinctrl-1 = <&ltdc_pins_sleep_a>;
		status = "okay";

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;
				sii9022_in: endpoint {
					remote-endpoint = <&ltdc_ep0_out>;
				};
			};

			port@1 {
				reg = <1>;
				sii9022_tx_endpoint: endpoint {
					remote-endpoint = <&i2s2_endpoint>;
				};
			};
		};
	};
};

How to configure the DT using STM32CubeMX

STM32CubeMX 工具可用于配置STM32MPU设备并获取相应的 platform configuration device tree 文件。
STM32CubeMX可能不支持以上 DT bindings documentation段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入用户部分。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见STM32CubeMX 用户手册。