Hello,
I want to connect the display SL101PM1794FOG-V15 (1920x1200) to the MIPI-DSI of a Verdin iMX8MM that runs with BSP6.0. This panel has the HX8279D as drive IC.
Therefore I activated the related driver in the kernel ( CONFIG_DRM_PANEL_BOE_HIMAX8279D
) and made the following device tree overlay:
/dts-v1/;
/plugin/;
#include <dt-bindings/gpio/gpio.h>
#include "imx8mm-pinfunc.h"
/ {
compatible = "toradex,verdin-imx8mm";
};
&backlight {
enable-gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>; // Verdin GPIO_10_DSI (SODIMM 21)
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_10_dsi>;
status = "okay";
};
&gpu {
status = "okay";
};
&lcdif {
status = "okay";
};
&mipi_dsi {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
port@1 {
mipi_dsi_panel1_out: endpoint {
remote-endpoint = <&panel1_in>;
};
};
panel@0 {
compatible = "boe,himax8279d8p", "boe,himax8279d10p";
reg = <0>;
backlight = <&backlight>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_panel_gpios>;
enable-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; // I2S_2_BCLK (SODIMM 42)
pp18-gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>; // I2S_2_SYNC (SODIMM 44)
pp33-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; // I2S_2_D_OUT (SODIMM 46)
// Alternatives Panel-Timing
panel-timing {
// 1920x1200p60
clock-frequency = <159400000>; // Panel clock/Pixel rate [Hz]
hactive = <1200>; // Horizontal panel resolution [px]
hback-porch = <32 60 60>; // Horizontal back porch timing
hfront-porch = <42 80 81>; // Horizontal front porch panel timing
hsync-len = <1>; // Horizontal sync length panel timing
vactive = <1920>; // Vertical panel resolution [px]
vback-porch = <25>; // Vertical back porch panel timing
vfront-porch = <35 35 36>; // Vertical front porch panel timing
vsync-len = <1>; // Vertical sync length panel timing
//hsync-active = <1>; // Horizontal sync pulse (0 selects active low, 1 selects active high) - If omitted then it is not used by the hardware
//vsync-active = <1>; // Vertical sync pulse (0 selects active low, 1 selects active high) - If omitted then it is not used by the hardware
//de-active = <1>; // Data enable (0 selects active low, 1 selects active high) - If omitted then it is not used by the hardware
//pixelclk-active = <1>; // Data driving on rising or falling edge
// 0 to drive pixel data on falling edge and sample data on rising edge
// 1 to drive pixel data on rising edge and sample data on falling edge
};
port {
panel1_in: endpoint {
remote-endpoint = <&mipi_dsi_panel1_out>;
};
};
};
};
&iomuxc {
pinctrl_panel_gpios: panelgpiosgrp {
fsl,pins = <
MX8MM_IOMUXC_SAI5_RXD2_GPIO3_IO23 0x146 /* SODIMM 42 - reset of display (pulled-up as active-low) */
MX8MM_IOMUXC_SAI5_RXD1_GPIO3_IO22 0x106 /* SODIMM 44 - enable of 1P8 (pulled-down as active-high) */
MX8MM_IOMUXC_SAI5_RXD3_GPIO3_IO24 0x106 /* SODIMM 46 - enable of 3P3 (pulled-down as active-high) */
>;
};
};
During boot the software driver tries to send the startup commands to the panel driver (line 160 of drivers/gpu/drm/panel/panel-boe-himax8279d.c
), but get a -EBUSY because of a tx timeout in line 719 of drivers/gpu/drm/bridge/sec-dsim.c
:
[ 8.152313] imx_sec_dsim_drv 32e10000.mipi_dsi: wait pkthdr tx done time out
[ 8.152335] panel-boe-himax8279d 32e10000.mipi_dsi.0: failed to send DCS Init Code: -16
[ 8.152347] imx_sec_dsim_drv 32e10000.mipi_dsi: panel prepare failed: -16
The output of dmesg
: dmesg.log (39.4 KB)
I found this thread where it is pointed out that the use of mipi_dsi_dcs_write_buffer()
instead of mipi_dsi_generic_write()
in the prepare function can be the cause. I patched the driver source file with
diff --git a/drivers/gpu/drm/panel/panel-boe-himax8279d.c b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
index 42854bd37fd5..abb96e548349 100644
--- a/drivers/gpu/drm/panel/panel-boe-himax8279d.c
+++ b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
@@ -72,7 +72,7 @@ static int send_mipi_cmds(struct drm_panel *panel, const struct panel_cmd *cmds)
int err;
for (i = 0; i < pinfo->desc->on_cmds_num; i++) {
- err = mipi_dsi_dcs_write_buffer(pinfo->link, &cmds[i],
+ err = mipi_dsi_generic_write(pinfo->link, &cmds[i],
sizeof(struct panel_cmd));
if (err < 0)
but I get the same error.
Can someone please give me an advice how to solve this problem?
Best regards,
Markus