LCD代碼流程想法

https://blog.csdn.net/jxhln/article/details/89090216

把這個博客,mipi讀lcd ID寄存器的代碼敲了一遍,原排版不太好,強迫症看了不舒服,順便熟悉一下

static char to_page1[] = {0x04, 0x00, 0x39, 0xc0, 0xff, 0x98, 0x81, 0x01};

static char read_max_package[4] = {0x08, 0x00, 0x37, 0x80}

static read_id_reg0[4] = {0x00, 0x00, 0x06, 0xa0};		//讀0x00寄存器
static read_id_reg1[4] = {0x01, 0x00, 0x06, 0xa0};              //讀0x01寄存器
static read_id_reg2[4] = {0x02, 0x00, 0x06, 0xa0};              //讀0x02寄存器

static struct mipi_dsi_cmd ili9881c_panel_set_cmd[] = {
	{sizeof(to_page1), to_page1},}
};

static struct mipi_dsi_cmd ili9881c_panel_pkt_size_cnd[] = {
	{sizeof(read_max_package), read_max_package},
};

static struct mipi_dsi_cmd ili9881c_panel_manufacture_id_cmd0[] = {
	{sizeof(read_id_reg0), read_id_reg0},
};

static struct mipi_dsi_cmd ili9881c_panel_manufacture_id_cmd1[] = {
	{sizeof(read_id_reg0), read_id_reg1},
};

static struct mipi_dsi_cmd ili9881c_panel_manufacture_id_cmd2[] = {
	{sizeof(read_id_reg0), read_id_reg2},
};

static uint32_t mdss_dsi_read_panel_id()
{
	char rec_buf[24];
	char *rp = rec_buf;
	uint32_t *lp, ret, data = 0;
	ret = mipi_dsi_cmds_tx(ili9881c_panel_set_cmd, ARRAY_SIZE(ili9881c_panel_set_cmd));
	mdelay(10);
	ret = mipi_dsi_cmds_tx(ili9881c_panel_set_pkt_size_cmd, ARRAY_SIZE(ili9881c_panel_pkt_size_cnd));
	mdelay(10);
	ret = mipi_dsi_cmds_tx(ili9881c_panel_manufacture_id_cmd0, ARRAY_SIZE(ili9881c_panel_manufacture_id_cmd0));
	if (ret < 0)
		dprintf(CRITICAL, "mipi read panel id failed\n");
		
	mdelay(10);
	ret = mipi_dsi_cmds_rx(&lp, 3);
	lp = (uint32_t*)rp;
	data = (uint32_t)*lp;
	data = ntohl(data);
	data = (uint32_t)*lp;
	dprintf(CRITICAL, "panel ID:%x\n, data");
}

結構體:

命令結構體
struct mipi_dsi_cmd {
    int size;
    char *payload;
    int wait;
    uint8_t cmds_post_tg;
};                                   //lk/platform/msm_shared/include/mipi_dsi.h

---------------------------------------
struct msm_fb_panel_data panel;
struct msm_fb_panel_data {
     struct msm_panel_info panel_info;
     struct fbcon_config fb;
     int mdp_rev;
     int rotate;
 
     /* function entry chain */
     int (*power_func) (int enable, struct msm_panel_info *);
     int (*clk_func) (int enable);
     int (*bl_func) (int enable);
     int (*pll_clk_func) (int enable, struct msm_panel_info *);
     int (*post_power_func)(int enable);
     int (*pre_init_func)(void);
 }; 

struct panel_struct panelstruct;
typedef struct panel_struct{
     struct panel_config         *paneldata;
     struct panel_resolution     *panelres;
     struct color_info           *color;
     struct videopanel_info      *videopanel;
     struct commandpanel_info    *commandpanel;
     struct command_state        *state;
     struct lane_configuration   *laneconfig;
     struct panel_timing         *paneltiminginfo;
     struct panel_reset_sequence *panelresetseq;
     struct backlight            *backlightinfo;
     struct fb_compression       fbcinfo;
 };

-------------------------------------------

gcdb_display_init  ------> oem_panel_select -----> ret = msm_display_init(&panel);


gcdb_display_init裏面主要是這兩個函數,
與這兩個函數相關的是 struct msm_fb_panel_data 和 panel_struct。

oem_panel_select任務:
            初始化pane_struct這個結構體,屏頭文件裏面的信息配置到這寫結構體裏面去了。

msm_display_init任務:
            初始化msm_fb_panel_data結構體,這個裏面主要是fb的成員初始化和控制函數初始化。


---------------
想的問題是:
    msm_display_init裏面是校驗了signature,signature與ddb寄存器值相等,就返回0.

所以想的是高通的屏幕通過ID寄存器兼容的流程是:
    先把初始化代碼等信息初始化,然後比較signature,
    如果不等就是初始化失敗,然後target_display.c裏面的target_display_init裏的do-while循環又走一次,
    第二次的時候再根據循環變量換一個panel_id,然後初始化屏.h裏的東西,後面到msm_display_init裏又比較一次signature,
    相等了就初始化成功往後面走。

---------------
以前mtk平臺(有點忘了一年前),應該是先讀DA、DB、DC這些id寄存器,然後與預先寫的比較,正確後,然後初始化屏初始化代碼。

-------------
感覺是一個順序相反的流程,不知道對不對,暫時的理解是這樣。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章