The aim of this section is to properly configure custom display: LVDS and eDP panels.
Standard Display Timings
Verify the signal timing specifications of the LCD in the datasheet and then calculate following parameters:
Parameter | Definition |
---|---|
hback-porch | Horizontal Back Porch (HBP) - Number of pixel clock pulses between HSYNC signal and the first valid pixel data. |
hfront-porch | Horizontal Front porch (HFP) - Number of pixel clock pulses between the last valid pixel data in the line and the next HSYNC pulse. |
vback-porch | Vertical Back Porch (VBP) - Number of lines (HSYNC pulses) from a VSYNC signal to the first valid line. |
vfront-porch | Vertical Front Porch (VFP) - Number of lines (HSYNC pulses) between the last valid line of the frame and the next VSYNC pulse. |
hsync-len | Number of PIXCLK pulses when a HSYNC signal is active. |
vsync-len | Number of HSYNC pulses when a VSYNC signal is active. |
LVDS Customization Guide for i.MX6
In order to bring up custom display following steps are needed:
1. Kernel: Adding Custom LVDS support in Device tree file
The target file to edit is linux-seco/arch/arm/boot/dts/imx6qdl-seco_lvds_display.dtsi. This last contains the list of available LVDS resolutions.
cd linux-seco/arch/arm/boot/dts vi imx6qdl-seco_lvds_display.dtsi
A newest one have to be enclosed into “timing” structure.
To obtain the information about the ldb structure, you can refer to the documentation available into the Kernel:
linux-seco/Documentation/devicetree/bindings/display/imx/ldb.txt
linux-seco/Documentation/devicetree/bindings/fb/fsl_ipuv3_fb.txt
Is this the struct you were talking about?
timing9: $name { clock-frequency = <$Clock-frequency>; hactive = <$Hactive>; vactive = <$Vactive>; hback-porch = <$Hback>; hfront-porch = <$Hfront>; vback-porch = <$Vback>; vfront-porch = <$Vfront>; hsync-len = <$Hsync>; vsync-len = <$Vsync>; };
Here below an example of lbd structure got for SVGA TFT LCD(800x600) 10.4 inches panel (datasheet avalaible here) is the sample timing data for SVGA TFT LCD(800x600) 10.4 inches (BA104S01-100):
name = LBD-SVGA-BA Clock-frequency = 39600000 Hactive = 800 Vactive = 600 Hback = 45 Hfront = 45 Vback = 25 Vfront = 25 Hsync = 10 Vsync = 10
2. U-Boot: Adding Custom LVDS resolution into list
The resolution to use is passed from U-Boot to the kernel via bootargs. The seco_config command help the user to perform the selection of the video settings and resolution.
In order to add a new custom LVDS resolution, please follow steps below described:
The target file to edit is u-boot-seco/cmd/cmd_seco_config.c. This last contains the list of available LVDS resolutions to pass to kernel via bootargs (selection is performed via seco_config command).
cd u-boot-seco/cmd/ vi cmd_seco_config.c
Add the custom resolution settings by appending new items into the following structure:
static lvds_video_spec_t lvds_video_spec_list [] = { { "WVGA [800x480]", "LDB-WVGA", "RGB666", "datamap=spwg", "", 1 }, { "SVGA [800x600]", "LDB-SVGA", "RGB666", "datamap=spwg", "", 1 }, { "XGA [1024x768]", "LDB-XGA", "RGB666", "datamap=spwg", "", 1 }, { "WXGA [1368x768]", "LDB-WXGA", "RGB24", "datamap=jeida", "", 1 }, { "WXGAP60 [1280x800]", "LDB-1280P60", "RGB24,bpp=32","datamap=spwg", "", 1 }, { "SXGA [1280x1024]", "LDB-SXGA", "RGB24", "datamap=jeida", "", 1 }, { "HD1080 [1920x1080]", "LDB-1080P60", "RGB24", "datamap=spwg", "ldb=spl0", 2 }, {<DISPLAY NAME>, <KERNEL DISPLAY NAME>, <PIXEL FORMAT>, <DATA MAPPING>, "LDB SETTING", <CHANNEL NUMBER>} };
The fields <DISPLAY NAME>, <KERNEL DISPLAY NAME>, <PIXEL FORMAT>, <DATA MAPPING>, "LDB SETTING", <CHANNEL NUMBER>
are here described:
Field | Description |
---|---|
DISPLAY NAME | Name shown into the resolution list when seco_config command is used |
KERNEL DISPLAY NAME | Name of the resolution added into the kernel file arch/arm/boot/dts/imx6qdl-seco_lvds_display.dtsi ($name variable) |
PIXEL FORMAT | Display interface pixel format: RGB666 IPU_PIX_FMT_RGB666 RGB565 IPU_PIX_FMT_RGB565 RGB24 IPU_PIX_FMT_RGB24 BGR24 IPU_PIX_FMT_BGR24 GBR24 IPU_PIX_FMT_GBR24 YUV444 IPU_PIX_FMT_YUV444 YUYV IPU_PIX_FMT_YUYV UYVY IPU_PIX_FMT_UYVY YVYV IPU_PIX_FMT_YVYU VYUY IPU_PIX_FMT_VYUY |
DATA MAPPING | Color signals mapping order [ jeida | spwg | vesa ] |
LDB SETTING | i.MX6 LVDS setting. Leave empty to use the default (display single channel) (ldb=spl0 -> split mode, used for display dual channel) |
CHANNEL NUMBER | Number of channel to use (leave 1 for default configuration) |
3. U-Boot: Adding Custom LVDS resolution for Splash Screen
Also the U-Boot uses the Display to display the Splash Screen. So, if the scope is to use also the custom resolution at U-Boot level, this task have to be performed:
Editing the file board/seco/common/display.c
A new node into struct display_info_t const displays[] must to be added. Under the sub-structure
}, { .bus = -1, .addr = -1, .pixfmt = IPU_PIX_FMT_RGB24, .detect = NULL, .enable = enable_lvds, .mode = { // Rif. Panel 1024x768 Panel UMSH-8596MD-15T .name = "LDB-1280P60", .refresh = 60, .xres = 1280, .yres = 800, .pixclock = 15128, .left_margin = 220, .right_margin = 40, .upper_margin = 21, .lower_margin = 7, .hsync_len = 60, .vsync_len = 10, .sync = 0, .vmode = FB_VMODE_NONINTERLACED } },
Insert the new custom resolution, starting from the one above and edit the sub-structure "mode", considering the following fields:
Field | Description |
---|---|
name | name of the resolution, to use at U-Boot level |
refresh | refrash rate of the panel (pixecl clock / [ ( tot horiz. pixel) * (tot vert. pixel) ] |
xres | horizontal active area |
yres | vertical active area |
pixclock | pixel clock in pico seconds |
left_margin | horizontal back porch |
right_margin | horizontal fromt porch |
upper_margin | vertical back porch |
lower_margin | vertical fromt porch |
hsync_len | horizontal SYNC |
vsync_len | vertical SYNC |
4. Boot with new resolution
Set right resolution at U-Boot:
setenv panel "<resolution name> saveen
Set right resolution at kernel, using seco_config command:
MX6QDLS SBC-A62 U-Boot > seco_config ... __________________________________________________ Chose Video Setting. __________________________________________________ 1) no display 2) LVDS 3) HDMI 4) LVDS - LVDS (clone) 5) LVDS - LVDS (dual) 6) LVDS - HDMI 7) HDMI - LVDS > 2 __________________________________________________ Chose LVDS resolution for LVDS1. __________________________________________________ 1) WVGA [800x480] 2) SVGA [800x600] 3) XGA [1024x768] 4) WXGA [1368x768] 5) WXGAP60 [1280x800] 6) SXGA [1280x1024] 7) HD1080 [1920x1080] 8) NEW_RESOLUTION > 8 ... Saving Environment to MMC... Writing to MMC(1)... OK
The board has now successfully been loaded with LVDS
Display Customization Guide for i.MX8
The MIPI DSI support on i.MX8-based boards is configured via the overlays device trees and Kernel sources.
SECO boards with i.MX8 SoC support the following MIPI-DSI interface to LVDS / eDP bridges:
Texas Instruments SN65DSI84 MIPI® DSI bridge to FlatLink™ LVDS single-channel DSI to dual-link LVDS bridge;
Texas Instruments SN65DSI86 Dual-channel MIPI® DSI to embedded DisplayPort™ (eDP ) bridge.
DCSS vs eLCDIF
i.MX8M boards come with 2 display controllers, DCSS and eLCDIF:
DCCS can be connected to HDMI, DP or MIPI-DSI and supports up to 4K resolution;
eLCDIF can be connected only to MIPI-DSI and supports up to 1080p resolution.
Adding Custom LVDS / eDP panel support in panel-simple.c for i.MX8
The panel is configured by the following nodes located in the board device tree, for example arch/arm64/boot/dts/seco/seco-imx8mm-c61.dts:
panel_edp: edp_panel { compatible = "boe,ev156fhm"; #address-cells = <1>; #size-cells = <0>; }; panel_lvds: lvds_panel { compatible = "auo,p215hca-high"; #address-cells = <1>; #size-cells = <0>; };
These nodes represent the links between the device tree and the panel-simple.c structure through the compatible property to an existing or newly added panel from the panel-simple driver.
linux-seco/drivers/gpu/drm/panel/panel-simple.c
Example: Configure the custom display timing for AUO Panel model p215hca
In the Seco BSP's the references panels are configured and tested with 10000 on/off cycle. Below the panel structure from drivers/gpu/drm/panel/panel-simple.c for LVDS 1920x1080 from Seco BSP9:
static const struct display_timing auo_p215hca_high_timing = { .pixelclock = { 139000000, 160000000, 165000000 }, .hactive = { 1920, 1920, 1920 }, .hfront_porch = { 1, 85, 90 }, .hsync_len = { 1, 10, 45 }, .hback_porch = { 1, 85, 150 }, .vactive = { 1080, 1080, 1080 }, .vfront_porch = { 3, 20, 50 }, .vsync_len = { 6, 10,60 }, .vback_porch = { 11, 20, 37 }, .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_LOW | DISPLAY_FLAGS_PIXDATA_NEGEDGE, }; static const struct panel_desc auo_p215hca_high = { .timings = &auo_p215hca_high_timing, .num_timings = 1, .bpc = 8, .size = { .width = 68, .height = 121, }, .delay = { /* * The panel spec recommends one second delay * to the below items. However, it's a bit too * long in pratical. Based on tests, it turns * out 100 milliseconds is fine. */ .prepare = 100, .enable = 100, .unprepare = 100, .disable = 100, }, .bus_format = MEDIA_BUS_FMT_RGB888_1X24,//MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, }; static const struct of_device_id platform_of_match[] = { { }, { .compatible = "auo,p215hca-high", .data = &auo_p215hca_high, }, { /* sentinel */ } };
In this case the configured panel is the: auo,p215hca-high, all the parameters configured in struct display_timing are derived from panel datasheet.
After setup panel configuration, you need to check for LVDS the following file (for eDP this part can be skipped):
linux-seco/arch/arm64/boot/dts/seco/overlays/seco-imx8mm-c61-lcdif-sn65dsi84-overlay.dts
This is the content:
target = <&adv_bridge>; __overlay__ { #address-cells = <1>; #size-cells = <0>; lvds,datamap = "jeida"; lvds,dual-channel; lvds,channel-swap; lvds,preserve-dsi-timings; /*include/drm/drm_mipi_dsi.h*/ dsi,mode-flags = <0x805>; /*MIPI_DSI_MODE_VIDEO*/ clocks = <&si5351a 0>; status = "okay"; };
To complete bridge configuration, it is necessary to correctly configure the following parameters:
lvds,datamap: can be configured as jeida or spwg, other configurations are not supported.
lvds,dual-channel: if inserted, it enables bridge dual channel output. The DSI video signal is splitted in LVDS channel A and LVDS channel B.
lvds,preserve-dsi-timings: this parameter is useful when the LVDS display timing is synchronized with Data Enable, while it should be removed if the panel is not DE sync. LVDS panels that are not synchronized with Data Enable must be configured without
lvds
,preserve-dsi-timing parameter
andclocks = <&si5351a 0>
should be commented out to ensure timing sync.
The above configurations can be useless in some cases and prevent the panel from turning on.
This is due to the i.MX8 DSI video driver that recalculates the panel timing to adapt them to the i.MX8 DSI video output. In these cases, a fine tuning in the admitted panel timing is necessary: clocks, front and back porch until the LVDS panel turns on.
SECO preconfigured Panels
Below are some pre-built Device Tree Overlay files for i.MX8-based boards.
Once the setup has been defined, the Kernel, including LVDS display resolution, can be built. After compiling, please copy the file into the device and boot the board by setting up the custom device tree file with the support of seco_config file.
Device tree display overlay for i.MX8
Board | Type of product | Peripheral | Overlays |
---|---|---|---|
SM-C12 | SMARC module | MIPI-DSI to LVDS |
|
SBC-C20 | SBC | MIPI-DSI to LVDS |
|
Q7-C25 | Qseven module | MIPI-DSI to LVDS MIPI-DSI to eDP |
|
μQ7-C72 | μQseven module | MIPI-DSI to LVDS MIPI-DSI to eDP |
|
SBC-C61 | SBC | MIPI-DSI to LVDS MIPI-DSI to eDP |
|
SBC-C57 | SBC | MIPI-DSI to eDP |
|
SM-D16 | SMARC module | MIPI-DSI to eDP |
|
From BSP9.0 onwards, our images comes with available pre-built overlays binaries as (.dtbo).
In Linux BSP 9.0, you can list the available files on the boot partition.
For example, with the SBC-C61:
ls -l boot/ total 25604 -rw-r--r-- 1 secospa secospa 26073600 Sep 16 02:55 Image -rw-r--r-- 1 secospa secospa 6000 Sep 16 02:55 imx8mm_m4_TCM_hello_world.bin -rw-r--r-- 1 secospa secospa 16528 Sep 16 02:55 imx8mm_m4_TCM_rpmsg_lite_pingpong_rtos_linux_remote.bin -rw-r--r-- 1 secospa secospa 16028 Sep 16 02:55 imx8mm_m4_TCM_rpmsg_lite_str_echo_rtos.bin -rw-r--r-- 1 secospa secospa 40092 Sep 16 02:55 imx8mm_m4_TCM_sai_low_power_audio.bin -rw-r--r-- 1 secospa secospa 53688 Sep 16 02:55 seco-imx8mm-c61.dtb -rw-r--r-- 1 secospa secospa 2140 Sep 16 02:55 seco-imx8mm-c61-lcdif-sn65dsi84.dtbo -rw-r--r-- 1 secospa secospa 1797 Sep 16 02:55 seco-imx8mm-c61-lcdif-sn65dsi86.dtbo
Once it is done, you can boot the board using seco_config
tool to configure the Device Tree Overlay.
Below are the commands for the setup:
u-boot seco c61=> seco_config __________________________________________________ Choose boot Device for Kernel. __________________________________________________ 1) eMMC onboard 2) uSD onboard 3) TFTP 4) USB > 1 Choose the partition > 1 Path of the Kernel (enter for default Image) > __________________________________________________ Choose boot Device for FDT. __________________________________________________ 1) eMMC onboard 2) uSD onboard 3) TFTP 4) USB > 1 Choose the partition > 1 Path of the FDT (enter for default seco-imx8mm-c61.dtb) > __________________________________________________ Choose boot Device for FileSystem. __________________________________________________ 1) eMMC onboard 2) uSD onboard 3) NFS 4) USB > 1 Choose the partition > 2 __________________________________________________ Choose Video Output Configuration. __________________________________________________ 1) no video - no dtbo 2) eDP LCDIF-1920x1080 - seco-imx8mm-c61-lcdif-sn65dsi86.dtbo 3) LVDS LCDIF-1920x1080 - seco-imx8mm-c61-lcdif-sn65dsi84.dtbo > 2 __________________________________________________ Choose Board Options. __________________________________________________ 1) No addons > 1 Saving Environment to MMC... Writing to MMC(0)... OK
The board will boot with your display configuration.
The board has now successfully been loaded with the selected display device tree.