Dotyková obrazovka tyto informace ovladače jsou načteny ze souboru sys_config.fex, ctp_detect a další funkce jsou provedeny. Ale ve funkci probe je test komunikace i2c dotykové obrazovky, objeví se sunxi_i2c_do_xfer objeví se neúplné xfer (status: 0x20, adresa: 0x48) situace, opravdu nevím, co situace. Požádejte o pomoc.
2. Kód.
Kód: Vybrat vše
static int icn83xx_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct icn83xx_ts_data *icn83xx_ts;
int err = 0;
#if SUPPORT_FW_UPDATE
short fwVersion = 0;
short curVersion = 0;
int retry;
#endif
printk(" %s begin: addr = 0x%02x . \n", __func__, client->addr);
printk("%s,line=%d,ctp_name=%s\n",__func__,__LINE__,client->name);
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
printk("\n %s I2C check functionality failed. \n",__func__);
return -ENODEV;
}
icn83xx_ts = kzalloc(sizeof(*icn83xx_ts), GFP_KERNEL);
if (!icn83xx_ts) {
printk("Alloc icn83xx_ts memory failed.\n");
return -ENOMEM;
}
memset(icn83xx_ts, 0, sizeof(*icn83xx_ts));
this_client = client;
this_client->addr = client->addr;
i2c_set_clientdata(client, icn83xx_ts);
printk("%s,this_client->addr=%d,line=%d\n",__func__,this_client->addr,__LINE__);
icn83xx_ts->work_mode = 0;
printk("work_mode:%d\n",icn83xx_ts->work_mode);
INIT_WORK(&icn83xx_ts->pen_event_work, icn83xx_ts_pen_irq_work);
icn83xx_ts->ts_workqueue = create_singlethread_workqueue(dev_name(&client->dev));
if (!icn83xx_ts->ts_workqueue) {
printk("create_singlethread_workqueue failed.\n");
kfree(icn83xx_ts);
return -ESRCH;
}
err = icn83xx_iic_test();
if (err < 0) {
printk("icn83xx_iic_test failed.\n");
..........
}
static int icn83xx_iic_test(void)
{
int ret = -1;
char value = 0;
int retry = 0;
while(retry++ < 3) {
ret = icn83xx_read_reg(0xa, &value);
if(ret > 0){
printk("iic test success! %d,value=0x%x.\n", ret,value);
return ret;
}
printk("iic test error! %d\n", retry);
msleep(3);
}
return ret;
}
int icn83xx_read_reg(unsigned short addr, char *pdata)
{
int ret = -1;
ret = icn83xx_i2c_rxdata(addr, pdata, 1);
return ret;
}
int icn83xx_i2c_rxdata(unsigned short addr, char *rxdata, int length)
{
int ret = -1;
int retries = 0;
unsigned char tmp_buf[2];
struct i2c_msg msgs[] = {
{
.addr = this_client->addr,
.flags = 0,
.len = 2,
.buf = tmp_buf,
}, {
.addr = this_client->addr,
.flags = I2C_M_RD,
.len = length,
.buf = rxdata,
},
};
//tmp_buf[0] = addr;
tmp_buf[0] = (unsigned char)(addr>>8);
tmp_buf[1] = (unsigned char)(addr);
while(retries < IIC_RETRY_NUM) {
printk("#####%s,line=%d,this_client->adapter->nr=%d\n",__func__,__LINE__,this_client->adapter->nr);
printk("#####%s,line=%d,this_client->adapter->name=%s\n",__func__,__LINE__,this_client->adapter->name);
ret = i2c_transfer(this_client->adapter, msgs, 2);
if(ret == 2)break;
retries++;
}
if (retries >= IIC_RETRY_NUM)
printk("%s i2c read error: %d\n", __func__, ret);
return ret;
}