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?
另外我想问问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
找到了一份代码很有参考价值: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给些指点,或者指明调查的方向。
/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吗?希望能给些帮助。
板文件修改导致的编译错误解决了,请参考: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怎么写入呢?
最近参考了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也都试过了,错误依旧,
有哪位知道为什么吗?
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!
-----------------------------------------------------------------------------------------------------------------------
Thank you for your reply.
I will read the DOC, but the OS of the board is Android4.2.2