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寄存器,然後與預先寫的比較,正確後,然後初始化屏初始化代碼。
-------------
感覺是一個順序相反的流程,不知道對不對,暫時的理解是這樣。