iMX6Q AI board support for 1280×800 HDMI Display

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

iMX6Q AI board support for 1280×800 HDMI Display

10,627 Views
rohitpatle
Contributor III

Hello Experts,

I am working on display integration for iMX6Q AI, Here we procured HDMI display with 720p(1280×800, 10.1 inch Captive Touch Screen LCD). But it looks like the default support for the iMX6Q BSP supports only 1080p. Kindly help to add support for 720p.

Below is my technical analysis of integration:

  1. While in probe as per the cmd line display argument,  we retrieve the display parameters in function mxc_hdmi_disp_init (file : mxc_hdmi.c)
    1. The values retrieved are xres:1280, yres:720, pixclock:13468, hsync_len:40, vsync_len:5, sync:3, vmode:32.  Since in cmdline, I am passing the argument 1280x720@60.

With this parameters, I see the display is working fine on FHD TV. But same is not working with the above 720p display panel I have.

  1. There is one important thing to note here is, mxc_hdmi_read_edid function always fails. For my FHD display as well as for the above mentioned panel.

  1. When hdmi cable is connected from sabre board to the panel or the TV, mxc_hmi_cable_connected event is triggered. Here it calls mxc_hdmi_read_edid function. But since this function always fails it goes to switch case :”HDMI_EDID_FAIL”

After which it will go and configure the default display.

I believe the root of the issue is this failure only. On success it will retrieve all the display parameters(hsync, vsync, clock, resolution etc.) from the target and will set accordingly.

But here it is setting some preconfigured parameters hard coded in imx6 kernel code.

  1. I have connected  my Linux as well as windows laptop to the above mentioned panel and I see it works without any issue. I am sure in those environment mxc_hdmi_read_edid function will not be failing.

  1. While searching on google I come across below link:

https://community.nxp.com/thread/379601.

It seems the issue I am facing is the known issue on imx6 platform. Also, fix for the issue is given in the form of patch here.

But the patch is based on some later version of kernel and so I am unable to apply the patch.

The kernel version I am using is 3.14.52. Is there any later updated version than this for imx6 platform. Please let me know.

For more info on HDMI panel I am using, please refer below vendor web site:

http://www.waveshare.com/wiki/10.1inch_HDMI_LCD_(B)_(with_case)

Please provide me the patch for above mentioned issue.

Thank you,

Rohit

19 Replies

6,109 Views
sanjeevsharma
Contributor IV

Thanks Qiang.

unfortunately our display doesn't has EDID information.

cat /sys/devices/soc0/soc.0/20e0000.hdmi_video/edid returning always zero. 

If device doesn't have EDID embed in display, then is there any possibility that display still work in Linux. I mean to say, if we get timing parameters from vendor or VESA, and add mode as per your reference patch. will unsupported resolution display still work ?

0 Kudos

6,109 Views
hitenpchauhan
Contributor I

Hello,

Is anyone find solution for 1024x600 resolution LCD?

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

You can reference to the 1600*900 patch to add your 1024*600 parameters, of cource this is not a standard HDMI timing, you should get the timing parameters from the LCD vendor.

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

This resolution is not a standard CEA-861-D resolution, so the default HDMI driver doesn't support it.

You can add this format into drivers\video\mxc\mxc_hdmi.c, and in mxc_hdmi_edid_rebuild_modelist(), add this format.

+static const struct fb_videomode wvga_mode = {

+ /* 1280x960 @ 60 Hz */

+ NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3,

+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,

+ FB_VMODE_NONINTERLACED | FB_VMODE_ASPECT_4_3, FB_MODE_IS_VESA,

+};

static void mxc_hdmi_edid_rebuild_modelist(struct mxc_hdmi *hdmi)
{
int i;
struct fb_videomode *mode;

dev_dbg(&hdmi->pdev->dev, "%s\n", __func__);

console_lock();

fb_destroy_modelist(&hdmi->fbi->modelist);
fb_add_videomode(&vga_mode, &hdmi->fbi->modelist);

+ fb_add_videomode(&wvga_mode, &hdmi->fbi->modelist);

0 Kudos

6,109 Views
rohitpatle
Contributor III

Hi Qiang,

Thank you for your reply. I tried the changes you suggested, but still not able to get the Display. Could you please give provide me data for 1280x800@60 Hz i hope that will be great help to me. Please help me.

Many Thanks,

Rohit Kp,

Work: (91) 80 67807777 | Extn: 851478 | Mob: (91) 78 2986 2989

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

In drivers/video/mxc/mxc_edid.c

const struct fb_videomode mxc_cea_mode[64], we also need to add this video format:

/* #60: 1280x800p@60 */

[60] = {

  NULL, 60, 1280, 800, 14084, 10, 6, 14, 3, 4, 6,

  FB_SYNC_HOR_HIGH_ACT,

  FB_VMODE_NONINTERLACED | FB_VMODE_ASPECT_4_3, 0

},

The above 1280*800 timing parameters are from "VESA and Industry Standards and Guidelines for Computer Display Monitor Timing (DMT)" specification.

When boot up the kernel, set video mode as followed:

     video=mxcfb0:dev=hdmi,1280x800M@60,if=RGB24,bpp=32

After booted into rootfs, you can use the followed command to check the resolution:

# cat /sys/class/graphics/fb0/mode

6,109 Views
rohitpatle
Contributor III

Hi Qiang,


I applied the changes as suggested by you in below mentioned files:


In driver/video/mxc/mxc_edid.c

driver/video/mxc/mxc_hdmi.c
 

myandroid/device/fsl/sabreauto_6q/BoardConfig.mk

for /* #60: 1280x800p@60 */.

After applying it, i am get the android boot animation logo with flickers on display and at log code is running below loop continuously till "

period 66, timeout is 0, wake up is :0":

======================log_start================
Rohit mxc_hdmi_cable_connected:1974

Rohit Func:mxc_hdmi_default_edid_cfg, Line:1847

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_default_modelist

mxc_hdmi 20e0000.hdmi_video: create default modelist

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected exit

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x0

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x2

mxc_hdmi 20e0000.hdmi_video: EVENT=plugin

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected

Rohit Func:mxc_hdmi_cable_connected, Line:1947, EDID_STATUS-1

mxc_hdmi 20e0000.hdmi_video: Read EDID again

Rohit Func:mxc_hdmi_cable_connected, Line:1956, retry_status-1

Rohit mxc_hdmi_cable_connected:1974

Rohit Func:mxc_hdmi_default_edid_cfg, Line:1847

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_default_modelist

mxc_hdmi 20e0000.hdmi_video: create default modelist

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected exit

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x0

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x2

mxc_hdmi 20e0000.hdmi_video: EVENT=plugin

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected

Rohit Func:mxc_hdmi_cable_connected, Line:1947, EDID_STATUS-1

mxc_hdmi 20e0000.hdmi_video: Read EDID again

Rohit Func:mxc_hdmi_cable_connected, Line:1956, retry_status-1

Rohit mxc_hdmi_cable_connected:1974

Rohit Func:mxc_hdmi_default_edid_cfg, Line:1847

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_default_modelist

mxc_hdmi 20e0000.hdmi_video: create default modelist

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected exit

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x0

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x2

mxc_hdmi 20e0000.hdmi_video: EVENT=plugin

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected

Rohit Func:mxc_hdmi_cable_connected, Line:1947, EDID_STATUS-1

mxc_hdmi 20e0000.hdmi_video: Read EDID again

Rohit Func:mxc_hdmi_cable_connected, Line:1956, retry_status-1

Rohit mxc_hdmi_cable_connected:1974

Rohit Func:mxc_hdmi_default_edid_cfg, Line:1847

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_default_modelist

mxc_hdmi 20e0000.hdmi_video: create default modelist

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected exit

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x0

mxc_hdmi 20e0000.hdmi_video: phy_int_stat=0x3d, phy_int_pol=0x2

mxc_hdmi 20e0000.hdmi_video: EVENT=plugin

mxc_hdmi 20e0000.hdmi_video: mxc_hdmi_cable_connected

Rohit Func:mxc_hdmi_cable_connected, Line:1947, EDID_STATUS-1

mxc_hdmi 20e0000.hdmi_video: Read EDID again

Rohit Func:mxc_hdmi_cable_connected, Line:1956, retry_status-1

==========================log_end============================= 

  But after "period 66, timeout is 0, wake up is :0" this log display goes black. :smileysad:
 
Do i need to do some more changes in order to add support for above display. Please suggest.
 

  Best Regards

  Rohit Kp,
0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

I think you need dump the EDID from your HDMI display and check what's timing parameter for the 1280*800 resolution.

You can search the EDIDViewer from google and dump the EDID from PC with this tool, then update the 1280*800 timing parameters into mxc_edid.c and mxc_hdmi.c.

6,109 Views
taehyukkwon
Contributor I

Hello Qiang,

Could you do me a favor?

We have 1024 X 600 HDMI display and would like to apply similar changes.  

Thanks in advance. 

BR,

Taehyuk

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

You just need find a workable 1024x600 HDMI timing parameters for your display, then followed the above steps.

0 Kudos

6,109 Views
taehyukkwon
Contributor I

Hello Qiang,

I could not find the setting for 1024x600. So i tried some values from a codes in for other Soc. It was something like below, 

        /* #48: 1024x600p@60Hz */         [48] = {                 NULL,  60, 1024, 600, 40846, 144,  40, 18, 1, 104, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,          FB_VMODE_NONINTERLACED,0         },

But it did not work. BTW, I also tried on imx7 board and the panel is working without any changes. 
I have the latest release,

IMX6_M6.0.1_2.1.0_ANDROID_DEMO_iMX7D_BSP

I would like to understand how 1024x600 is working on IXM7. Also I am wondering if the same changes can be applied back to imx6 boards.

Thanks in advance. 

Taehyuk

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

You need get the timing parameters from your HDMI display for this special 1024x600 resolution, it is not a standard mode, so the timing parameters are not defined from specification.

For iMX7, there is no HDMI module in the chip, so this modification has no effect to it.

0 Kudos

6,109 Views
taehyukkwon
Contributor I

Thanks for responding. 

We have IMX7 Sabre board and it has HDMI port on it. I connected the display to the connector. I am seeing it is working. Could you double check ?

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

Hi Taehyuk Kwon, on iMX7 Sabre board, the HDMI function is implemented by external SII902x chip, it will convert the parallel display signal to HDMI signal. So the driver is not same as iMX6.

0 Kudos

6,109 Views
sanjeevsharma
Contributor IV

Hi Qiang,

I have gone through this post and looks like we have similar problem.

We wanted to attach 5inch HDMI LCD (B) of resolution 800x480 http://www.waveshare.com/wiki/5inch_HDMI_LCD_(B) on nitrogen6x board. This display has HDMI interface.

We are using 3.14.55 kernel. we have explored the code for mxc_edid.c( drivers/video/mxc) and found that this mode 800x480 is not defined in struct fb_videomode.
hdmi supports only modes which are found in  struct fb_videomode, This is the reason we are not seeing any output on display when we connect 5inch HDMI LCD (B) 

I think we can set “mxc_hdmi.only_cea=0” in Kernel command line parameters an see if 800x480 appears in mode list. if it appears, we can select that mode.

or we have to add this format  into drivers\video\mxc\mxc_hdmi.c, and in mxc_hdmi_edid_rebuild_modelist(), suggested in above post by you.

Thanks in advance.

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

Hi Sanjeev,

Attached is a reference patch to add a new resolution for iMX6 HDMI.

One thing should be pay attentioned: for HDMI, the Min pixel clock is 25MHz, so for 800*480 display, the pixel clock frequency should also be bigger than it.

0 Kudos

6,109 Views
sanjeevsharma
Contributor IV

Thanks Qiang for your prompt reply.

you meant to say, now there is no need of "mxc_hdmi.only_cea=0” kernel command line parameter required? If I refer your patch, problem should be fixed.. I have gone through your patch and find, some point need clarification.

+    [60] = {
+                NULL, 60, 1600, 900, 8457, 256, 88, 26, 3, 168, 5,
+                0,
+                FB_VMODE_NONINTERLACED, 0
+        },

What does[60] represent here. in my kernel code in struct fb_videomode() after[9] we have entry start from [14] and so on also I didn't get  VESA timing parameters for 800*480 display 5 inch Resistive Touch Screen LCD, HDMI interface, supports various systems. Let me know where i can get timings for this display and i will verify new resolution is added and working fine.

0 Kudos

6,109 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

The CEA-861 specification had defined 1~59 formats, from [60], they are reserved formats which can be defined by user.

And for these non-standard formats, the timing parameters should be defined by yourself based on your display datasheet.

0 Kudos

6,109 Views
rohitpatle
Contributor III

Hi Qiang,

My EDID was failing all the time.

So in mxc_hdmi_read_edid() even ret < 0, I am returning HDMI_EDID_SUCCESS instead HDMI_EDID_FAIL.

Now I am able to see the display on screen. Thank you for your prompt replies all the time.

BR,

Rohit Kp

0 Kudos