高通MTK展讯平台读ID介绍
0赞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;
}