How to enable MIPI display(ST7796S) on i.MX6Q sabresd?

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

How to enable MIPI display(ST7796S) on i.MX6Q sabresd?

7,514 Views
jiangshao
Contributor V

I want to use a MIPI display on our custom board(imx6q sabresd),

and I only got the datasheet of st7796s and a text file from board maker, like this:

 //************* Start Initial Sequence **********//
Delay(120);
WriteComm(0x11);
Delay(120);
WriteComm(0xf0);
WriteData(0xc3);

:

Delay(120);
WriteComm(0x29);

I do not know how to use this text file(Start Initial Sequence)。

Do I need to get something else from board maker? 

Labels (3)
0 Kudos
8 Replies

4,044 Views
jiangshao
Contributor V

另外我想问问fae,4.2.2是否支持320*480这个分辨率?如果不支持,需要修改哪里来支持呢?

还有就是fbset出错,不知道是什么原因。。。

busybox fbset –info执行后出错

1|root@android:/ # busybox fbset --info

fbset: can't open '/dev/fb0': No such file or directory

0 Kudos

4,043 Views
jiangshao
Contributor V

屏终于亮了(之前可能硬件连接有问题),但是是花屏,如图。

有哪位知道这种情况应该微调哪里吗?

0 Kudos

4,044 Views
jiangshao
Contributor V

找到了一份代码很有参考价值:added otm3201a mipi dsi display support · guh/linux-imx6-3.14-tune@8ad29ad · GitHub 

参考这个,我做了如下修改:

板文件,修改如下:

static struct mipi_dsi_platform_data mipi_dsi_pdata = {
.ipu_id = 0,
//change by shao, 2016-11-29
//.disp_id = 1,
.disp_id = 0,
//.lcd_panel = "TRULY-WVGA",
.lcd_panel = "ST7796S-HVGA",
.reset = mx6_reset_mipi_dsi,
};

static struct ipuv3_fb_platform_data sabresd_fb_data[] = {
{//change by shao, 2016-11-29
.disp_dev = "mipi_dsi",
.interface_pix_fmt = IPU_PIX_FMT_RGB24,
.mode_str = "ST7796S-HVGA",
.default_bpp = 24,
.int_clk = false,
.late_init = false,
},......

mipi_dsi.c修改如下:

static struct mipi_dsi_match_lcd mipi_dsi_lcd_db[] = {
#ifdef CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL
{
"TRULY-WVGA",
{mipid_hx8369_get_lcd_videomode, mipid_hx8369_lcd_setup}
},
#endif
//add by shao, 2016-12-05
#ifdef CONFIG_FB_MXC_ST9976S_HVGA_PANEL
{
"ST7796S-HVGA",
{mipid_st7796s_get_lcd_videomode, mipid_st7796s_lcd_setup}
},
#endif
{
"", {NULL, NULL}
}
};

mipi_dsi.h修改如下:

#ifdef CONFIG_FB_MXC_ST9976S_HVGA_PANEL
void mipid_st7796s_get_lcd_videomode(struct fb_videomode **mode, int *size,
struct mipi_lcd_config **data);
int mipid_st7796s_lcd_setup(struct mipi_dsi_info *);
#endif

#ifndef CONFIG_FB_MXC_ST9976S_HVGA_PANEL
#error "Please configure MIPI LCD panel, we cannot find one!"
#endif

追加一个c文件,名为mxcfb_st7796s_hvga.c

Kconfig和Makefile做相应修改,修改内核配置,选中st7796s

追加的mxcfb_st7796s_hvga.c内容如下:

#define REFRESH 36
#define XRES 320
#define YRES 480
#define LEFT_MARGIN 20
#define RIGHT_MARGIN 20
#define UPPER_MARGIN 50
#define LOWER_MARGIN 20
#define HSYNC_LEN 6
#define VSYNC_LEN 6
#define PIXCLOCK (1e12/((XRES+LEFT_MARGIN+RIGHT_MARGIN+HSYNC_LEN)*(YRES+UPPER_MARGIN+LOWER_MARGIN+VSYNC_LEN)*REFRESH))
#define CHECK_RETCODE(ret) \
do { \
if (ret < 0) { \
dev_err(&mipi_dsi->pdev->dev, \
"%s ERR: ret:%d, line:%d.\n", \
__func__, ret, __LINE__); \
return ret; \
} \
} while (0)


static struct fb_videomode st7796s_lcd_modedb[] = {
{
"ST7796S-HVGA", /* name */
REFRESH, /* refresh /frame rate */
XRES, YRES, /* resolution */
PIXCLOCK, /* pixel clock*/
LEFT_MARGIN, RIGHT_MARGIN, /* l/r margin */
UPPER_MARGIN, LOWER_MARGIN, /* u/l margin */
HSYNC_LEN, VSYNC_LEN, /* hsync/vsync length */
FB_SYNC_OE_LOW_ACT, /* sync */
FB_VMODE_NONINTERLACED, /* vmode */
0, /* flag */
},
};

static struct mipi_lcd_config lcd_config = {
.virtual_ch = 0,
.data_lane_num = 1,
.max_phy_clk = 800,
.dpi_fmt = MIPI_RGB565_PACKED,
};

void mipid_st7796s_get_lcd_videomode(struct fb_videomode **mode, int *size,
struct mipi_lcd_config **data)
{
*mode = &st7796s_lcd_modedb[0];
*size = ARRAY_SIZE(st7796s_lcd_modedb);
*data = &lcd_config;
}

int mipid_st7796s_lcd_setup(struct mipi_dsi_info *mipi_dsi)
{
u32 buf[DSI_CMD_BUF_MAXSIZE];
int err;

//printk("MIPI DSI pixelclock = %lu", PIXCLOCK);
dev_info(&mipi_dsi->pdev->dev, "MIPI DSI LCD setup.\n");

msleep(120);

/* Sleep out (R11h) */
buf[0] = 0x11;
err = mipi_dsi_pkt_write(mipi_dsi, MIPI_DSI_GENERIC_LONG_WRITE, buf, 1);
CHECK_RETCODE(err);
printk("err = %i", err);

msleep(120);

/* Command Set Control:C3h enable command 2 part I (RF0h) */
buf[0] = 0xF0C3;
err = mipi_dsi_pkt_write(mipi_dsi, MIPI_DSI_GENERIC_LONG_WRITE, buf, 2);
CHECK_RETCODE(err);

/* Command Set Control:96h enable command 2 part II (RF0h) */
buf[0] = 0xF096;
err = mipi_dsi_pkt_write(mipi_dsi, MIPI_DSI_GENERIC_LONG_WRITE, buf, 2);
CHECK_RETCODE(err);

/* Memory Data Access Control (R36h)*/
buf[0] = 0x3648;
err = mipi_dsi_pkt_write(mipi_dsi, MIPI_DSI_GENERIC_LONG_WRITE, buf, 2);
CHECK_RETCODE(err);

《中略》

/* wait until sleepout is finished */
msleep(120);

/* Display on (R29h) */
buf[0] = 0x29;
err = mipi_dsi_pkt_write(mipi_dsi, MIPI_DSI_GENERIC_LONG_WRITE, buf, 1);
CHECK_RETCODE(err);
dev_info(&mipi_dsi->pdev->dev, "ST7796S MIPI DSI setup done.\n");

return err;
}

其中,函数mipid_st7796s_lcd_setup的内容是参考屏厂提供的初期化脚本写的:

//************* Start Initial Sequence **********//
Delay(120);
WriteComm(0x11);
Delay(120);
WriteComm(0xf0);
WriteData(0xc3);

WriteComm(0xf0);
WriteData(0x96);

WriteComm(0x36);
WriteData(0x48);

《中略》

Delay(120);
WriteComm(0x29);

uboot参数如下:

video=mxcfb0:dev=mipi_dsi,ST7796S-HVGA,bpp=RGB24

遗憾的是,烧写后从dmesg看,没有错误输出,但是屏不能点亮。

恳请有经验的fae给些指点,或者指明调查的方向。

0 Kudos

4,044 Views
jiangshao
Contributor V

/kernel_imx/drivers/video/mxc/mipi_dsi.中也有个列表:

 

static struct mipi_dsi_match_lcd mipi_dsi_lcd_db[] = {

#ifdef CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL

         {

          "TRULY-WVGA",

          {mipid_hx8369_get_lcd_videomode, mipid_hx8369_lcd_setup}

         },

#endif

         {

         "", {NULL, NULL}

         }

};

 

改为:

static struct mipi_dsi_match_lcd mipi_dsi_lcd_db[] = {

#ifdef CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL

         {

          //change by shao, 2016-12-01

          //"TRULY-WVGA",

          "HALF-VGA",

          {mipid_hx8369_get_lcd_videomode, mipid_hx8369_lcd_setup}

         },

#endif

         {

         "", {NULL, NULL}

         }

};

 

错误变为:

 

<6>mxc_mipi_dsi mxc_mipi_dsi: i.MX MIPI DSI driver probed

<6>MIPI DSI driver module loaded

<6>mxc_sdc_fb mxc_sdc_fb.0: register mxc display driver mipi_dsi

<3>mxc_mipi_dsi mxc_mipi_dsi: mipi_dsi_pkt_read err:-5, data:0x0.

<6>mxc_mipi_dsi mxc_mipi_dsi: MIPI DSI LCD not detected!

<3>mxc_mipi_dsi mxc_mipi_dsi: failed to init mipi lcd.

<3>mxc_sdc_fb mxc_sdc_fb.0: enable error, dispdrv:mipi_dsi.

<4>detected fb_set_par error, error code: -22

<3>mxc_sdc_fb mxc_sdc_fb.0: Error fb_set_var ret:-22

<4>mxc_sdc_fb: probe of mxc_sdc_fb.0 failed with error -22

<3>mxc_sdc_fb mxc_sdc_fb.1: Can't get fb option for mxcfb1!

感觉hx8369的源码是不能用了,可是Initial Sequence里的command和data怎么写入呢?

有人做过类似mipi屏的porting吗?希望能给些帮助。

0 Kudos

4,043 Views
jiangshao
Contributor V

板文件修改导致的编译错误解决了,请参考:undefined reference to `imx_add_mipi_dsi' `imx6q_mipi_dsi_data' 

但是现在有了新的疑问。

我根据手册(附件)修改板文件如下:

static struct mipi_dsi_platform_data mipi_dsi_pdata = {

         .ipu_id               = 0,

         //change by shao, 2016-11-29

         //.disp_id = 1,

         .disp_id    = 0,

         //.lcd_panel     = "TRULY-WVGA",

         .lcd_panel         = "HALF-VGA",

         .reset                 = mx6_reset_mipi_dsi,

};

 

static struct ipuv3_fb_platform_data sabresd_fb_data[] = {

         {//change by shao, 2016-11-29

         .disp_dev = "mipi_dsi",

         .interface_pix_fmt = IPU_PIX_FMT_RGB24,

         .mode_str = "HALF-VGA",

         .default_bpp = 24,

         .int_clk = false,

         .late_init = false,

         },

 

mxcfb_hx8369_wvga.c修改如下

 

static struct fb_videomode truly_lcd_modedb[] = {

         {

          //change by shao, 2016-11-29

          //"TRULY-WVGA", 64, 480, 800, 37880,

          //8, 8,

          //6, 6,

          //8, 6,

          "HALF-VGA",          //name

          60,                    //refresh

          320,                           //xres

          480,                           //yres

          37880,                      //pixclock

          4,                      //left_margin, HBP (Horizontal Back Porch)

          38,                    //right_margin, HFP (Horizontal Front Porch)

          4,                      //upper_margin, VBP (Vertical Back Porch)

          8,                      //lower_margin, VFP (Vertical Front Porch)

          2,                      //hsync_len, HPW (HSYNC plus width), HWH(HSYNC width)

          4,                      //vsync_len, VPW (VSYNC width), VWH(VSYNC width)

          FB_SYNC_OE_LOW_ACT,       //sync

          FB_VMODE_NONINTERLACED,//vmode      

          0,                      // flag

         },

};

uboot参数:video=mxcfb0:dev=mipi_dsi,HALF-VGA,bpp=RGB24

烧写后,查看dmesg

 

mxc_mipi_dsi mxc_mipi_dsi: i.MX MIPI DSI driver probed

MIPI DSI driver module loaded

mxc_sdc_fb mxc_sdc_fb.0: register mxc display driver mipi_dsi

mxc_mipi_dsi mxc_mipi_dsi: failed to find supported lcd panel.

mxc_mipi_dsi mxc_mipi_dsi: failed to init mipi dsi lcd

Trying to free nonexistent resource <00000000020e0000-00000000020e0fff>

mxc_sdc_fb mxc_sdc_fb.0: NO mxc display driver found!

mxc_sdc_fb mxc_sdc_fb.1: Can't get fb option for mxcfb1!

这是屏的厂家给的Initial Sequence,根据手册分析如下:

 

//************* Start Initial Sequence **********//

Delay(120);

WriteComm(0x11); Sleep Out

Delay(120);

WriteComm(0xf0); Command Set Control

WriteData(0xc3); C3h enable command 2 part I

 

WriteComm(0xf0); Command Set Control

WriteData(0x96); 96h enable command 2 part II

 

WriteComm(0x36); Memory Data Access Control

WriteData(0x48);

WriteComm(0xe8); Display Output Ctrl Adjust

WriteData(0x40); 第一参数

WriteData(0x82);

WriteData(0x07);

WriteData(0x18);

WriteData(0x27);

WriteData(0x0a);

WriteData(0xb6);

WriteData(0x33); 第八参数

WriteComm(0xc2); Power Control 3 

WriteData(0xa7); 

WriteComm(0xc5); VCOM Control

WriteData(0x25);//13

WriteComm(0xb7); Entry Mode Set

WriteData(0x46);//13  06

WriteComm(0xe0); Positive Gamma Control

WriteData(0xf0); 第一参数

WriteData(0x07);

WriteData(0x11);

WriteData(0x10);

WriteData(0x11);

WriteData(0x0b);

WriteData(0x3c);

WriteData(0x43);

WriteData(0x4b);

WriteData(0x0b);

WriteData(0x17);

WriteData(0x16);

WriteData(0x1b);

WriteData(0x1d); 第十四参数

WriteComm(0xe1); Negative Gamma Control

WriteData(0xf0);

WriteData(0x07);

WriteData(0x11);

WriteData(0x0f);

WriteData(0x10);

WriteData(0x1a);

WriteData(0x39);

WriteData(0x55);

WriteData(0x4a);

WriteData(0x0b);

WriteData(0x16);

WriteData(0x15);

WriteData(0x1a);

WriteData(0x1d);

WriteComm(0xf0); Command Set Control

WriteData(0x3c); 3Ch disable command 2 part I

 

WriteComm(0xf0); Command Set Control

WriteData(0x69); 69h disable command 2 part II

 

WriteComm(0x3A); Interface Pixel Format

WriteData(0x55);

Delay(120);

WriteComm(0x29); Display On

1,通过查看上述command,发现和hx8369一致的非常少。这是不是意味着不能使用mxcfb_hx8369_wvga.c而必须自己写一个驱动?

2,Initial Sequence里的command和data怎么写入呢?

0 Kudos

4,042 Views
jiangshao
Contributor V

最近参考了i.MX_Linux_Reference_Manual.pdf和

Integating mipi lcd display over i.mx6. 

动手做了一些修改,但是在板文件中打开如下注释:

// change by shao, 2016-11-16
// imx6q_add_mipi_dsi(&mipi_dsi_pdata);
imx6q_add_mipi_dsi(&mipi_dsi_pdata);

编译出现了错误:

arch/arm/mach-mx6/built-in.o: In function `mx6_sabresd_board_init':
/media/myandroid/work/20161018newB/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c:2272: undefined reference to `imx_add_mipi_dsi'
/media/myandroid/work/20161018newB/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c:2474: undefined reference to `imx6q_mipi_dsi_data'
make: *** [.tmp_vmlinux1] 错误 1

而确认板文件包含的头文件devices-imx6q.h中,明明有如下定义

extern const struct imx_mipi_dsi_data imx6q_mipi_dsi_data __initconst;
#define imx6q_add_mipi_dsi(pdata) \
imx_add_mipi_dsi(&imx6q_mipi_dsi_data, pdata)

make distclean也都试过了,错误依旧,

有哪位知道为什么吗?

0 Kudos

4,042 Views
igorpadykov
NXP Employee
NXP Employee

Hi jiang

for new lcd its timings parameters should be entered in struct fb_videomode,

please check example in linux/drivers/video/fbdev/mxc/ mxcfb_hx8369_wvga.c

Chapter 7 MIPI DSI Driver attached Linux Manual.

Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

4,042 Views
jiangshao
Contributor V

Thank you for your reply.

I will read the DOC, but the OS of the board is Android4.2.2

0 Kudos