Last edited 2 months ago

Display bridges hardware components

Applicable for STM32MP13x lines, STM32MP15x lines, STM32MP21x lines, STM32MP23x lines, STM32MP25x lines

1. Article purpose[edit | edit source]

The purpose of this article is to:

  • List the display bridge hardware components that might be integrated in the different boards.
  • Link these components to the corresponding software framework(s).
  • Point to the appropriate component datasheets.
  • Explain, when necessary, how to configure these components.
Info white.png Information
Some of these hardware components are part of the accessories for STM32 boards like the B-LCDAD-HDMI1 for instance.

2. Software frameworks[edit | edit source]

Domain Peripheral Software components Comment
OP-TEE Linux STM32Cube
Visual Analog Devices adv7533 & adv7535 DRM/KMS framework MIPI® DSI to HDMI transmitter
Visual Silab sil9022 DRM/KMS framework Parallel RGB (DPI) to HDMI transmitter
Visual Toshiba tc358762 DRM/KMS framework MIPI® DSI to Parallel RGB (DPI)
Visual Analog Devices adv7513 DRM/KMS framework Parallel RGB (DPI) to HDMI transmitter

3. Analog Devices adv7533 & adv7535[edit | edit source]

The adv7533 and adv7535 (adv753x) DSI to HDMI transmitter support the HDMI® Specification on a wide range of mobile products.

For details and the datasheet please contact the adv753x HDMI transmitter provider.

The adv753x transmitter does not support DSI burst mode. Check the pixel clock constraints in non-burst mode.

3.1. adv7533 related boards[edit | edit source]

Info white.png Information
The adv7533 HDMI transmitter can be found on the adapter board B-LCDAD-HDMI1[1]. It is compatible with the STM32MP157 evaluation boards and can be plugged in place of the display. But note that:
  • Due to I2C address conflict, to use B-LCDAD-HDMI1 on STM32MP157 evaluation boards it is required to disconnect the camera module and remove the camera from the device tree.
  • The display connector of STM32MP157 evaluation boards does not provide audio signals; the B-LCDAD-HDMI1 will only convert DSI video signals.

3.2. adv7535 related boards[edit | edit source]

Info white.png Information
The adv7535 HDMI transmitter can be found on:


3.3. Linux driver[edit | edit source]

Bindings: Documentation/devicetree/bindings/display/bridge/adi,adv7533.yaml (for both adv7533 & adv7535)

Sources: drivers/gpu/drm/bridge/adv7511/

Configuration:

  • DRM_I2C_ADV7511
  • DRM_I2C_ADV7511_AUDIO
  • DRM_I2C_ADV7511_CEC

3.3.1. adv7533 device tree example[edit | edit source]

Devicetree example with the B-LCDAD-HDMI1[1] board connected to the STM32MP157 evaluation board: arch/arm/boot/dts/st/stm32mp157c-ev1.dts

/ {
	...
	hdmi-out {
		compatible = "hdmi-connector";
		type = "a";
	
		port {
			hdmi_con: endpoint {
					remote-endpoint = <&adv7533_out>;
				};
			};
	};
};

&dsi {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	ports {
		port@0 {
			reg = <0>;
			dsi_in: endpoint {
				remote-endpoint = <&ltdc_ep1_out>;
			};
		};

		port@1 {
			reg = <1>;
			dsi_out: endpoint {
				remote-endpoint = <&adv7533_in>;
			};
		};
	};
};

&i2c2 {
	adv7533: hdmi@3d {
		compatible = "adi,adv7533";
		reg = <0x3d>, <0x3c>, <0x3f>, <0x38>;
		reg-names = "main", "cec", "edid", "packet";
		status = "okay";
		adi,dsi-lanes = <2>;
		reset-gpios = <&gpiof 15 GPIO_ACTIVE_LOW>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				adv7533_in: endpoint {
					remote-endpoint = <&dsi_out>;
				};
			};

			port@1 {
				reg=<1>;
				adv7533_out: endpoint {
					remote-endpoint = <&hdmi_con>;
				};
			};
		};
	};
};

/* We disable the ov5640 node because it uses the same I2C address than HDMI-CEC */
&ov5640 {
	status = "disabled";
};

3.3.2. adv7535 device tree example[edit | edit source]

Devicetree example based on STM32MP25 Discovery kit: arch/arm64/boot/dts/st/stm32mp257f-dk.dts

/ {
...
	hdmi: connector {
		compatible = "hdmi-connector";
		label = "hdmi";
		type = "a";
		hdmi-pwr-supply = <&scmi_v5v_hdmi>;

		port {
			hdmi_connector_in: endpoint {
				remote-endpoint = <&adv7535_out>;
			};
		};
	};
...
};
...
&dsi {
	vdd-supply =  <&scmi_vddcore>;
	vdda18-supply = <&scmi_v1v8>;
	status = "okay";

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

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

		port@1 {
			reg = <1>;
			dsi_out1: endpoint {
				remote-endpoint = <&adv7535_in>;
			};
		};
	};
};
...

&i2c2 {
...
	adv7535: hdmi@3d {
		compatible = "adi,adv7535";
		reg = <0x3d>, <0x3c>, <0x3f>, <0x38>;
		reg-names = "main", "cec", "edid", "packet";
		status = "okay";
		adi,dsi-lanes = <4>;
		clocks = <&clk_ext_cec>;
		clock-names = "cec";
		interrupt-parent = <&gpiob>;
		interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
		reset-gpios = <&gpiob 6 GPIO_ACTIVE_LOW>;
		avdd-supply = <&scmi_v1v8>;
		dvdd-supply = <&scmi_v1v8>;
		pvdd-supply = <&scmi_v1v8>;
		a2vdd-supply = <&scmi_v1v8>;
		v3p3-supply = <&scmi_v3v3>;
		v1p2-supply = <&scmi_v1v8>;

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

			port@0 {
				reg = <0>;
				adv7535_in: endpoint {
					remote-endpoint = <&dsi_out1>;
				};
			};

			port@1 {
				reg = <1>;
				adv7535_out: endpoint {
					remote-endpoint = <&hdmi_connector_in>;
				};
			};

			port@2 {
				reg = <2>;
				adv7535_tx_endpoint: endpoint {
					remote-endpoint = <&i2s2_endpoint>;
				};
			};
		};
	};
...
};
...
&ltdc {
	status = "okay";

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

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

		ltdc_ep1_out: endpoint@1 {
			reg = <1>;
			remote-endpoint = <&lvds_in>;
		};
	};
};

4. Silab sil9022[edit | edit source]

The SiI9022A HDMI transmitter supports the HDMI® Specification on a wide range of mobile products.

For details and the datasheet please contact the SiI9022A HDMI transmitter provider.

Info white.png Information
This HDMI transmitter can be found on some STM32MP1 Discovery kits.

4.1. Linux driver[edit | edit source]

Bindings: Documentation/devicetree/bindings/display/bridge/sil,sii9022.yaml

Sources: drivers/gpu/drm/bridge/sii902x.c

Configuration: DRM_SII902X

Devicetree example: arch/arm/boot/dts/st/stm32mp15xx-dkx.dtsi

&i2c1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_pins_a>;
	pinctrl-1 = <&i2c1_sleep_pins_a>;
	i2c-scl-rising-time-ns = <100>;
	i2c-scl-falling-time-ns = <7>;
	status = "okay";
	/delete-property/dmas;
	/delete-property/dma-names;

	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>;
		#sound-dai-cells = <0>;
		status = "okay";

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

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

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

&ltdc {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&ltdc_pins_a>;
	pinctrl-1 = <&ltdc_sleep_pins_a>;
	status = "okay";

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

Devicetree pin control bindings example: arch/arm/boot/dts/st/stm32mp15-pinctrl.dtsi

&pinctrl {
...
	ltdc_pins_a: ltdc-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 = <1>;
		};
	};

	ltdc_sleep_pins_a: ltdc-sleep-0 {
		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 */
		};
	};
...
};

5. Toshiba tc358762[edit | edit source]

The tc358762 is a DSI de-serializer to parallel DPI or DBI. Only DPI output is supported in current Linux driver.

For details and the datasheet please contact the tc358762 device provider.

5.1. Linux driver[edit | edit source]

Bindings: Documentation/devicetree/bindings/display/bridge/toshiba,tc358762.yaml

Sources: drivers/gpu/drm/bridge/tc358762.c

Configuration:

  • DRM_TOSHIBA_TC358762

Devicetree example: check the complete example for the Raspberry Pi 7" Touch Display.

6. Analog Devices adv7513[edit | edit source]

The Analog Devices adv7513 Parallel RGB (DPI) to HDMI transmitter supports the HDMI® Specification on a wide range of mobile products.

For details and the datasheet please contact the adv7513 HDMI transmitter provider.

Info white.png Information
This HDMI transmitter can be found on some dh-electronics AVENGER 96Boards compliant consumer edition boards.

6.1. Linux driver[edit | edit source]

Bindings: Documentation/devicetree/bindings/display/bridge/adi,adv7511.yaml

Sources: drivers/gpu/drm/bridge/adv7511

Configuration:

  • DRM_I2C_ADV7511
  • DRM_I2C_ADV7511_AUDIO
  • DRM_I2C_ADV7511_CEC

Devicetree example: arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi

/ {

	hdmi-out {
		compatible = "hdmi-connector";
		type = "a";

		port {
			hdmi_con: endpoint {
				remote-endpoint = <&adv7513_out>;
			};
		};
	};
...
	sound {
		compatible = "audio-graph-card";
		label = "STM32MP1-AV96-HDMI";
		dais = <&sai2a_port>;
		status = "okay";
	};
...
};

&i2c4 {
	hdmi-transmitter@3d {
		compatible = "adi,adv7513";
		reg = <0x3d>, <0x4d>, <0x2d>, <0x5d>;
		reg-names = "main", "edid", "cec", "packet";
		clocks = <&cec_clock>;
		clock-names = "cec";

		avdd-supply = <&v3v3>;
		dvdd-supply = <&v3v3>;
		pvdd-supply = <&v3v3>;
		dvdd-3v-supply = <&v3v3>;
		bgvdd-supply = <&v3v3>;

		interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
		interrupt-parent = <&gpiog>;

		status = "okay";

		adi,input-depth = <8>;
		adi,input-colorspace = "rgb";
		adi,input-clock = "1x";

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

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

			port@1 {
				reg = <1>;
				adv7513_out: endpoint {
					remote-endpoint = <&hdmi_con>;
				};
			};

			port@2 {
				reg = <2>;
				adv7513_i2s0: endpoint {
					remote-endpoint = <&sai2a_endpoint>;
				};
			};
		};
	};
};

&ltdc {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&ltdc_pins_d>;
	pinctrl-1 = <&ltdc_sleep_pins_d>;
	status = "okay";

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

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

Devicetree pin control bindings example: arch/arm/boot/dts/st/stm32mp15-pinctrl.dtsi

&pinctrl {
...
	ltdc_pins_d: ltdc-3 {
		pins1 {
			pinmux = <STM32_PINMUX('G',  7, AF14)>; /* LCD_CLK */
			bias-disable;
			drive-push-pull;
			slew-rate = <3>;
		};
		pins2 {
			pinmux = <STM32_PINMUX('I', 10, AF14)>, /* LCD_HSYNC */
				 <STM32_PINMUX('I',  9, AF14)>, /* LCD_VSYNC */
				 <STM32_PINMUX('E', 13, AF14)>, /* LCD_DE */
				 <STM32_PINMUX('G', 13, 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('A',  5, AF14)>, /* LCD_R4 */
				 <STM32_PINMUX('H', 11, 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('B',  0, AF14)>, /* LCD_G1 */
				 <STM32_PINMUX('H', 13, AF14)>, /* LCD_G2 */
				 <STM32_PINMUX('E', 11, AF14)>, /* LCD_G3 */
				 <STM32_PINMUX('H', 15, AF14)>, /* LCD_G4 */
				 <STM32_PINMUX('H',  4,  AF9)>, /* LCD_G5 */
				 <STM32_PINMUX('I', 11,  AF9)>, /* LCD_G6 */
				 <STM32_PINMUX('G',  8, 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('E', 12, AF14)>, /* LCD_B4 */
				 <STM32_PINMUX('A',  3, AF14)>, /* LCD_B5 */
				 <STM32_PINMUX('B',  8, AF14)>, /* LCD_B6 */
				 <STM32_PINMUX('I',  7, AF14)>; /* LCD_B7 */
			bias-disable;
			drive-push-pull;
			slew-rate = <2>;
		};
	};

	ltdc_sleep_pins_d: ltdc-sleep-3 {
		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('E', 13, ANALOG)>, /* LCD_DE */
				 <STM32_PINMUX('G', 13, 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('A',  5, ANALOG)>, /* LCD_R4 */
				 <STM32_PINMUX('H', 11, 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('B',  0, ANALOG)>, /* LCD_G1 */
				 <STM32_PINMUX('H', 13, ANALOG)>, /* LCD_G2 */
				 <STM32_PINMUX('E', 11, ANALOG)>, /* LCD_G3 */
				 <STM32_PINMUX('H', 15, ANALOG)>, /* LCD_G4 */
				 <STM32_PINMUX('H',  4, ANALOG)>, /* LCD_G5 */
				 <STM32_PINMUX('I', 11, ANALOG)>, /* LCD_G6 */
				 <STM32_PINMUX('G',  8, 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('E', 12, ANALOG)>, /* LCD_B4 */
				 <STM32_PINMUX('A',  3, ANALOG)>, /* LCD_B5 */
				 <STM32_PINMUX('B',  8, ANALOG)>, /* LCD_B6 */
				 <STM32_PINMUX('I',  7, ANALOG)>; /* LCD_B7 */
		};
	};

...
};

7. References[edit | edit source]