高通平台读取液晶(ILI9881C芯片)ID的方法---根据此读取ID方法可适配多个屏幕_jxhln的博客-CSDN博客_ili9881c
把这个博客,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寄存器,然后与预先写的比较,正确后,然后初始化屏初始化代码。
-------------
感觉是一个顺序相反的流程,不知道对不对,暂时的理解是这样。