滴滴FAE

各种调屏经验分享:TFT,AMOLED,PMOLED,详情见麦瑞科技术mrklcd.com

高通MTK展讯平台读ID介绍

0
阅读(2280)

1、高通8916平台 MIPI接口读ILI9881C ID

static uint32_t mipi_ili9881_ida(void)

{

//读之前先上电再调用复位函数,此处已省略

uint32_t rec_buf[1];

uint32_t *lp = rec_buf;

char panel_ili9881_fb_page1[8] = {0x04,0x00,0x39,0xC0,0xFF,0x98,0x81,0x01};//page1

char ili9881_fb_reg0[4] = {0x00,0x00,0x06,0xA0};//page1 00h

char ili9881_fb_reg1[4] = {0x01,0x00,0x06,0xA0};//page1 01h

struct mipi_dsi_cmd ili9881_id_page1[]={{sizeof(panel_ili9881_fb_page1),panel_ili9881_fb_page1}};

struct mipi_dsi_cmd ili9881_id_cmda0[]={{sizeof(ili9881_fb_reg0),ili9881_fb_reg0}};

struct mipi_dsi_cmd ili9881_id_cmda1[]={{sizeof(ili9881_fb_reg1),ili9881_fb_reg1}};

uint32_t data;    //存回读的值

int ret = 0;

mipi_dsi_cmds_tx(&ili9881_manufacture_id_page1, 1);//写page0

mipi_dsi_cmds_tx(&ili9881_manufacture_id_cmda0, 1);//读page0 的00h


#if (DISPLAY_TYPE_MDSS == 1)

if (!mdss_dsi_cmds_rx(&lp, 1, 1))

ret = -1;

data = ntohl(*lp);     //应返回page1 00h的值(0x98)  

data = data >> 16; //右移16bit

data &= 0x00FF;    //data=0x98

response_value = data;   

mipi_dsi_cmds_tx(&ili9881_manufacture_id_cmda1,1);//读page0 的01h

if (!mdss_dsi_cmds_rx(&lp, 1, 1))

ret = -1;

data = ntohl(*lp);        //应返回page1 00h的值(0x81)

data = data >> 16;     //右移16bit

data &= 0x00FF;        //data=0x81   

response_value = (response_value<<8)|data;//将第一次读的值与第二次读到的值,合并成0x9881

#endif

dprintf(CRITICAL,"ili9881 Panel id:0x%x.\n",response_value);    //打log读到的值,长度为16bit

rSeturn ret;

//以上是高通平台其中一种读法,大家可以借鉴

}


2、MTK6580 MIPI读ILI9881P 读ID

在MTK平台,mipi写初始化一般有有两种方式:push table跟data array;

push table是结构体的写法很常见,送初始化就是调用这个,第一个字节是寄存器,第二个字节是参数长度(通常用十进制),剩下的就是参数,举例如下

{0xff,3,{0x98,0x81,0x06}},

{寄存器,参数长度,{参数1,参数2,参数3}},

static unsigned int lcm_compare_id(void)

{

//注意:读之前需上电后再给复位信号

    unsigned int id1 = 0, id2 = 0,id3 = 0;    //定义三个变量用来存ID

    unsigned char buffer[4];

    unsigned int data_array[16];

    SET_RESET_PIN(1);                     //RESET=1

    MDELAY(10);                               //延时10ms

    SET_RESET_PIN(0);                      //RESET=0

    MDELAY(10);                                //延时10ms

    SET_RESET_PIN(1);                        //RESET=1

    MDELAY(120);                          //延时120ms

    //===== Page6 =====//

    data_array[0]=0x00043902;//04代表长度(寄存器+参数),3902代表长包写

    data_array[1]=0x068198ff;//第一个参数0xFF,第二个参数0x98,第三个参数0x81,第四个参数0x06

    //相当于push_table里面的这一句{0xff,3,{0x98,0x81,0x06}},


    dsi_set_cmdq(data_array, 2, 1);

    MDELAY(10); 

    data_array[0] = 0x00013700;// read id return 1 byte,id

    dsi_set_cmdq(data_array, 1, 1);

    MDELAY(10); 

    read_reg_v2(0xf0, buffer, 1); //读page6的f0h,存到 buffer[0]

    read_reg_v2(0xf1, buffer+1, 1); //读page6的f1h,存到 buffer[1]

    read_reg_v2(0xf2, buffer+2, 1); //读page6的f2h,存到 buffer[2]

    id1 = buffer[0];

    id2 = buffer[1];

    id3 = buffer[2];

#ifdef BUILD_LK

    printf("%s, ili9881P id1 = 0x%x  id2 = 0x%x  id3 = 0x%x\n", __func__, id1,id2,id3);

#else

    printk("%s, ili9881P id1 = 0x%08x  id2 = 0x%08x  id3 = 0x%08x\n", __func__, id1,id2,id3);

#endif    

    return ((buffer[0]==0x98 && buffer[1]==0x81 && buffer[2]==0x10))?1:0;

}

3、SC9832A MIPI读SSD2201 读ID

案例1

static uint32_t ssd2201_readid(struct panel_spec *self)

{

//注意:读之前需上电后再给复位信号

        int32_t i = 0;

uint32 j =0;

uint8_t read_data[10] = {0};

int32_t read_rtn = 0;

int a = 0;

LCM_Force_Cmd_Code * rd_prepare = rd_prep_code;

unsigned int tag = 0;

mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;

mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;

mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;

mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;

LCD_PRINT("lcd_ssd2201_mipi read id!\n");

mipi_set_cmd_mode();

mipi_eotp_set(1,1);

sprd_gpio_request(NULL, 29);

sprd_gpio_direction_output(NULL, 29);

sprd_gpio_set(NULL, 29, 1);

a = sprd_gpio_get(NULL, 29);

return 0x2201;


for(j = 0; j < 5; j++)

{

// send prepare code

LCD_PRINT("read id %d times\n",j);//打印

for(i = 0; i < ARRAY_SIZE(rd_prep_code); i++)

{

tag = (rd_prepare->real_cmd_code.tag >> 24);

if(tag & LCM_TAG_SEND)

{

mipi_force_write(rd_prepare->datatype, rd_prepare->real_cmd_code.data, (rd_prepare->real_cmd_code.tag & LCM_TAG_MASK));

}else if(tag & LCM_TAG_SLEEP)

{

mdelay(rd_prepare->real_cmd_code.tag & LCM_TAG_MASK);

}

rd_prepare++;

}

LCD_PRINT("send prepare code done\n");

read_rtn = mipi_force_read(0xA1, 2,(uint8_t *)read_data);//读A1h 两个字节

LCD_PRINT("read return is %d\n",read_rtn); //打印读到的值

LCD_PRINT("lcd_ssd2201_mipi read id 0xA1 value is 0x%x, 0x%x!\n", read_data[0], read_data[1]);//打印读到的值

if((0x01 == read_data[0])&&(0x57 == read_data[1]))//判断读到的值,如果条件为真,则返回0x2201

{

LCD_PRINT("lcd_ssd2201_mipi read id success!\n");

return 0x2201;

}

LCD_PRINT("read id fail, return zero\n");

return 0;

}


案例2

static int jd9366d_readid(void)

{

//注意:读之前需上电后再给复位信号

struct sprd_dsi *dsi = &dsi_device;

uint8_t read_buf[4] = {0};    //定义数组,用于存储ID

uint8_t pwr_val;

mipi_dsi_lp_cmd_enable(dsi, true);//打开MIPI DSCI LP MODE

mipi_dsi_set_max_return_size(dsi, 2);//设置返回值的数量

mipi_dsi_dcs_read(dsi, 0x04, read_buf, 2);//读04h,返回两个值

pr_info("jd9366d read id 0x%02x%02x\n", read_buf[0], read_buf[1]);

if ((read_buf[0] == 0x93) && (read_buf[1] == 0x66)) 

        {

pr_info("jd9366d read id success!\n");//读到0x9366,则返回成功

return 0;

}

pr_err("jd9366d read id failed!\n");//否则返回失败

return -1;

}