找到了一份代码很有参考价值: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给些指点,或者指明调查的方向。