【Android驱动】LCD代码读ID流程想法

高通平台读取液晶(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寄存器,然后与预先写的比较,正确后,然后初始化屏初始化代码。

-------------
感觉是一个顺序相反的流程,不知道对不对,暂时的理解是这样。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值