2023-11-06 06:30 AM
i have been trying to use the LTDC peripheral on the Linux kernel to use it on the ILI9340 / ILI9340 in 8 bit mode.
i use this in the device tree:
<dc {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
ltdc_ep1_out: endpoint@1 {
reg = <1>;
remote-endpoint = <&dsi_in>;
};
};
};
&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 = <<dc_ep1_out>;
};
};
port@1 {
reg = <1>;
dsi_out: endpoint {
remote-endpoint = <&panel_in>;
};
};
};
panel_ili9341: panel-ili9341@0 {
compatible = "displaytech,dt024ctft", "ilitek,ili9341";
reg = <0>;
reset-gpios = <&gpioe 4 GPIO_ACTIVE_LOW>;
power-supply = <&v3v3>;
status = "okay";
port {
panel_in: endpoint {
remote-endpoint = <&dsi_out>;
};
};
};
};
////
ltdc_pins_mx: ltdc_mx-0 {
pins1 {
pinmux = <STM32_PINMUX('A', 9, AF14)>, /* LTDC_R5 */
<STM32_PINMUX('B', 9, AF14)>, /* LTDC_B7 */
<STM32_PINMUX('D', 3, AF14)>, /* LTDC_G7 */
<STM32_PINMUX('E', 13, AF14)>, /* LTDC_DE */
<STM32_PINMUX('E', 15, AF14)>, /* LTDC_R7 */
<STM32_PINMUX('H', 3, AF14)>, /* LTDC_R1 */
<STM32_PINMUX('H', 4, AF9)>, /* LTDC_G5 */
<STM32_PINMUX('H', 12, AF14)>, /* LTDC_R6 */
<STM32_PINMUX('I', 1, AF14)>, /* LTDC_G6 */
<STM32_PINMUX('I', 6, AF14)>, /* LTDC_B6 */
<STM32_PINMUX('I', 9, AF14)>, /* LTDC_VSYNC */
<STM32_PINMUX('I', 10, AF14)>; /* LTDC_HSYNC */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('E', 14, AF14)>; /* LTDC_CLK */
bias-disable;
drive-push-pull;
slew-rate = <1>;
};
};
ltdc_sleep_pins_mx: ltdc_sleep_mx-0 {
pins {
pinmux = <STM32_PINMUX('A', 9, ANALOG)>, /* LTDC_R5 */
<STM32_PINMUX('B', 9, ANALOG)>, /* LTDC_B7 */
<STM32_PINMUX('D', 3, ANALOG)>, /* LTDC_G7 */
<STM32_PINMUX('E', 13, ANALOG)>, /* LTDC_DE */
<STM32_PINMUX('E', 14, ANALOG)>, /* LTDC_CLK */
<STM32_PINMUX('E', 15, ANALOG)>, /* LTDC_R7 */
<STM32_PINMUX('H', 3, ANALOG)>, /* LTDC_R1 */
<STM32_PINMUX('H', 4, ANALOG)>, /* LTDC_G5 */
<STM32_PINMUX('H', 12, ANALOG)>, /* LTDC_R6 */
<STM32_PINMUX('I', 1, ANALOG)>, /* LTDC_G6 */
<STM32_PINMUX('I', 6, ANALOG)>, /* LTDC_B6 */
<STM32_PINMUX('I', 9, ANALOG)>, /* LTDC_VSYNC */
<STM32_PINMUX('I', 10, ANALOG)>; /* LTDC_HSYNC */
};
};
now this seems to compile fine , however i have nothing shown in the device
i use this command to see what is going on
$> modetest -M stm
this yeilds the following
root@stm32mp157c:~# id crtc type possible crtcs possible clones
Connectors:
id encoder status name size (mm) modes encoders
CRTCs:
id fb pos size
33 0 (0,0) (0x0)
#0 nan 0 0 0 0 0 0 0 0 0 flags: ; type:
props:
24 VRR_ENABLED:
flags: range
values: 0 1
value: 0
28 GAMMA_LUT:
flags: blob
blobs:
value:
29 GAMMA_LUT_SIZE:
flags: immutable range
values: 0 4294967295
value: 256
Planes:
id crtc fb CRTC x,y x,y gamma size possible crtcs
31 0 0 0,0 0,0 0 0x00000001
formats: AR24 XR24 RG24 RG16 AR15 XR15 AR12 XR12 C8
props:
8 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 1
30 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000000900000018000000
01000000400000004152323458523234
52473234524731364152313558523135
41523132585231324338202000000000
ff010000000000000000000000000000
0000000000000000
in_formats blob decoded:
AR24: LINEAR
XR24: LINEAR
RG24: LINEAR
RG16: LINEAR
AR15: LINEAR
XR15: LINEAR
AR12: LINEAR
XR12: LINEAR
C8 : LINEAR
34 0 0 0,0 0,0 0 0x00000001
formats: AR24 RG24 RG16 AR15 AR12 C8
props:
8 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 0
30 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000000600000018000000
01000000300000004152323452473234
52473136415231354152313243382020
3f000000000000000000000000000000
0000000000000000
in_formats blob decoded:
AR24: LINEAR
RG24: LINEAR
RG16: LINEAR
AR15: LINEAR
AR12: LINEAR
C8 : LINEAR
Frame buffers:
id size pitch
This means that the device is not well configured since there are no connectors or devices,
now this driver sources seem to exist in the linux kernel source folder upon searching. however at this point i don't know if doing the right things or if im in the right path ? can any one help and tell me why im not finding any connectors ? or how to get this working properly
Many Thanks
2023-11-06 04:29 PM
I'm no expert, but I think the DSI interface is completely separate to the LTCD system, and the ILI9340 does not support DSI. LTDC on the STM32 products is what the ILI datasheets calls the "8080" interface. In the device tree you need to set up the LTDC interface, as you have done, and then point it to a "panel", instead of DSI.
\ {
...
// Orient Display 480x272
panel {
status = "okay";
compatible = "qiaodian,qd43003c0-40", "simple-panel";
power-supply = <&vdd>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in: endpoint {
remote-endpoint = <<dc_ep0_out>;
};
};
};
};
};
...
<dc {
status = "okay";
pinctrl-names = "default", "sleep";
pinctrl-0 = <<dc_pins_mx>;
pinctrl-1 = <<dc_sleep_pins_mx>;
port {
ltdc_ep0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&panel_in>;
};
};
};
This is an example from a project I did previously using an Orient Display which has the same "8080" interface as the ILI chips, change the "compatible" string to your ILI chip. Here's the full DTS for context if it helps:
Not sure if that's what you were after, but I did have a similar confusion when trying to get an ILI display working on the STM32157-DK2 and got there eventually but I don't have the actual code anymore, sorry.