Last edited one year ago

Display panels hardware components

Applicable for STM32MP13x lines, STM32MP15x lines

1. Article purpose[edit source]

The purpose of this article is to:

  • List the display panel 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.

2. Software frameworks[edit source]

Domain Peripheral Software components Comment
OP-TEE Linux STM32Cube
Visual Raydium RM68200 DRM/KMS framework MIPI® DSI panel driver
Visual Orise Tech OTM8009a DRM/KMS framework MIPI® DSI panel driver
Visual Raspberry Pi 7" Touch DRM/KMS framework MIPI® DSI panel driver
Visual Rocktech rk043fn48h DRM/KMS framework Parallel RGB (DPI) panel driver

3. Raydium RM68200[edit source]

The Raydium RM68200 is a single-chip solution for a-Si TFT LCD that incorporates gate drivers and is capable of driving different panel resolutions. It supports MIPI® DSI Interface.

For details and the datasheet please contact the RM68200 driver provider.

Info white.png Information
This panel driver can be found on some STM32MP15 Evaluation boards.

3.1. Linux driver[edit source]

Bindings: Documentation/devicetree/bindings/display/panel/raydium,rm68200.yaml

Sources: drivers/gpu/drm/panel/panel-raydium-rm68200.c

Configuration: DRM_PANEL_RAYDIUM_RM68200

Devicetree example: arch/arm/boot/dts/stm32mp157d-ev1.dts

/ {
...
	panel_backlight: panel-backlight {
		compatible = "gpio-backlight";
		gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
		default-on;
		status = "okay";
	};
};

&dsi {
	#address-cells = <1>;
	#size-cells = <0>;
	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_out: endpoint {
				remote-endpoint = <&dsi_panel_in>;
			};
		};
	};

	panel_dsi: panel-dsi@0 {
		compatible = "raydium,rm68200";
		reg = <0>;
		reset-gpios = <&gpiof 15 GPIO_ACTIVE_LOW>;
		backlight = <&panel_backlight>;
		power-supply = <&v3v3>;
		status = "okay";

		port {
			dsi_panel_in: endpoint {
				remote-endpoint = <&dsi_out>;
			};
		};
	};
};

&i2c2 {
	gt9147: goodix_ts@5d {
		compatible = "goodix,gt9147";
		reg = <0x5d>;
		panel = <&panel_dsi>;
		pinctrl-0 = <&goodix_pins>;
		pinctrl-names = "default";
		status = "okay";

		interrupts = <14 IRQ_TYPE_EDGE_RISING>;
		interrupt-parent = <&stmfx_pinctrl>;
	};
};

&ltdc {
	status = "okay";

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

3.2. U-Boot driver[edit source]

Bindings: drivers/video/raydium-rm68200.c

4. Orise Tech OTM8009a[edit source]

The Orise Tech OTM8009a is a MIPI® DSI panel driver.

For details and the datasheet please contact the OTM8009a driver provider.

Info white.png Information
This panel driver can be found on some STM32MP15 Discovery kits.

4.1. Linux driver[edit source]

Bindings: Documentation/devicetree/bindings/display/panel/orisetech,otm8009a.yaml

Sources: drivers/gpu/drm/panel/panel-orisetech-otm8009a.c

Configuration: DRM_PANEL_RAYDIUM_RM68200

Devicetree example: arch/arm/boot/dts/stm32mp157f-dk2.dts

&dsi {
	status = "okay";

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

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

	panel_otm8009a: panel-otm8009a@0 {
		compatible = "orisetech,otm8009a";
		reg = <0>;
		reset-gpios = <&gpioe 4 GPIO_ACTIVE_LOW>;
		power-supply = <&v3v3>;
		status = "okay";

		port {
			panel_in: endpoint {
				remote-endpoint = <&dsi_out>;
			};
		};
	};
};

&i2c1 {
	touchscreen@2a {
		compatible = "focaltech,ft6236";
		reg = <0x2a>;
		interrupts = <2 2>;
		interrupt-parent = <&gpiof>;
		interrupt-controller;
		touchscreen-size-x = <480>;
		touchscreen-size-y = <800>;
		panel = <&panel_otm8009a>;
		vcc-supply = <&v3v3>;
		iovcc-supply = <&v3v3>;
		status = "okay";
	};
	touchscreen@38 {
		compatible = "focaltech,ft6236";
		reg = <0x38>;
		interrupts = <2 2>;
		interrupt-parent = <&gpiof>;
		interrupt-controller;
		touchscreen-size-x = <480>;
		touchscreen-size-y = <800>;
		panel = <&panel_otm8009a>;
		vcc-supply = <&v3v3>;
		iovcc-supply = <&v3v3>;
		status = "okay";
	};
};

&ltdc {
	status = "okay";

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

4.2. U-Boot driver[edit source]

Bindings: drivers/video/orisetech_otm8009a.c

5. Raspberry Pi 7" Touch[edit source]

The Raspberry Pi 7" Touch Display is an integrated module including:

  • a DSI to DPI bridge Toshiba TC358762;
  • a DPI panel 800x480 7 inches with touchscreen;
  • a power controller;
  • a touchscreen controller.

For details and datasheet please contact the display provider [1].

The display can be plugged in the DSI connector CN4 of the board STM32MP157F-DK2 through the ribbon cable provided with the display.

Warning white.png Warning
An incorrect connection could damage either the display and/or the board.

Pay attention that the connector CN4 is wider than the ribbon cable; the proper connection requires the pin 1 of the ribbon cable to be plugged at the pin 1 of CN4. This requires the ribbon cable to touch only the edge of the connector CN4 that is closer to the ethernet plug, thus having empty space between the ribbon cable and the other edge of the connector CN4.

Two additional wires for 5V supply and GND are required between STM32MP157F-DK2 board and the display. Don't use a USB cable to power the display from the board because the board's USB plugs would be enabled too late for the display to operate. Use instead two of the spare wires provided with the display and connect:

  • STM32MP157F-DK2 connector CN2 pin 2 to display connector GPIO pin 5V;
  • STM32MP157F-DK2 connector CN2 pin 6 to display connector GPIO pin GND.

5.1. Linux driver[edit source]

Bindings:

Sources:

Configuration:

  • DRM_TOSHIBA_TC358762
  • DRM_PANEL_SIMPLE
  • REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY
Info white.png Information
Different versions of the panel use different touchscreen controllers. The touchscreen is not further described here.
Info white.png Information
Don't use the old driver Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.yaml .
It has been replaced by the new driver since kernel v5.10.

Devicetree example:

&dsi {
	status = "okay";

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

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

	bridge@0 {
		compatible = "toshiba,tc358762";
		reg = <0>;
		vddc-supply = <&reg_rpi>;
		status = "okay";

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

			port@0 {
				reg = <0>;
				bridge_in: endpoint {
					remote-endpoint = <&dsi_out>;
				};
			};
			port@1 {
				reg = <1>;
				bridge_out: endpoint {
					remote-endpoint = <&panel_in>;
				};
			};
		};
	};
};

/ {
	panel-rgb {
		/* Unknown; use a reasonably similar one */
		compatible = "powertip,ph800480t013-idf02";
		power-supply = <&reg_rpi>;
		status = "okay";

		port {
			panel_in: endpoint {
				remote-endpoint = <&bridge_out>;
			};
		};
	};
};

&i2c1 {
	reg_rpi: regulator@45 {
		compatible = "raspberrypi,7inch-touchscreen-panel-regulator";
		reg = <0x45>;
		vin-supply = <&v3v3>;
		status = "okay";
	};
};

5.2. U-Boot driver[edit source]

Not available.

6. Rocktech rk043fn48h[edit source]

The Rocktech rk043fn48h is a parallel RGB panel driver.

For details and the datasheet please contact the rk043fn48h driver provider.

Info white.png Information
This panel driver can be found on some STM32MP13 Discovery kits.

6.1. Linux driver[edit source]

Bindings: Documentation/devicetree/bindings/display/panel/panel-dpi.yaml

Sources: drivers/gpu/drm/panel/panel-simple.c

Configuration: DRM_PANEL_SIMPLE

Devicetree example: arch/arm/boot/dts/stm32mp135f-dk.dts

/ {
...
	panel_backlight: panel-backlight {
		compatible = "gpio-backlight";
		gpios = <&gpioe 12 GPIO_ACTIVE_HIGH>;
		default-on;
		default-brightness-level = <0>;
		status = "okay";
	};

	panel_rgb: panel-rgb {
		compatible = "rocktech,rk043fn48h", "panel-dpi";
		enable-gpios = <&gpioi 7 GPIO_ACTIVE_HIGH>;
		backlight = <&panel_backlight>;
		power-supply = <&scmi_v3v3_sw>;
		status = "okay";

		width-mm = <105>;
		height-mm = <67>;

		port {
			panel_in_rgb: endpoint {
				remote-endpoint = <&ltdc_out_rgb>;
			};
		};

		panel-timing {
			clock-frequency = <10000000>;
			hactive = <480>;
			vactive = <272>;
			hsync-len = <52>;
			hfront-porch = <10>;
			hback-porch = <10>;
			vsync-len = <10>;
			vfront-porch = <10>;
			vback-porch = <10>;
		};
	};

...
};

&i2c5 {
...
	goodix: goodix_ts@5d {
		compatible = "goodix,gt911";
		reg = <0x5d>;
		pinctrl-names = "default";
		pinctrl-0 = <&goodix_pins_a>;
		interrupt-parent = <&gpiof>;
		interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
	        reset-gpios = <&gpioh 2 GPIO_ACTIVE_LOW>;
	        AVDD28-supply = <&scmi_v3v3_sw>;
	        VDDIO-supply = <&scmi_v3v3_sw>;
		touchscreen-size-x = <480>;
		touchscreen-size-y = <272>;
		status = "okay" ;
	};
};

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

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

		ltdc_out_rgb: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&panel_in_rgb>;
		};
	};
};

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

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

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

};

6.2. U-Boot driver[edit source]

Bindings: drivers/video/simple_panel.c

7. References[edit source]