Problém s komunikací I2C při přenosu dotykové obrazovky ctp

Odpovědět
Arthur
Příspěvky: 36
Registrován: 02 čer 2021, 03:37
Reputation: 0

Problém s komunikací I2C při přenosu dotykové obrazovky ctp

Příspěvek od Arthur » 23 čer 2021, 10:34

1. I2C s čipem Allwinner, i2c-sunxi.c, který používá sunxi_i2c_do_xfer k odesílání a přijímání zpráv I2C.
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;
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host