qq_39914891 2019-12-05 10:55 采纳率: 0%
浏览 2994

在移植ctp触摸屏时,I2C通信出现问题,触摸屏通信时sunxi_i2c_do_xfer出现incomplete xfer(status:0x20,address:0x48)

1.I2C用的全志芯片,i2c-sunxi.c,里面用的sunxi_i2c_do_xfer收发I2C消息,
触摸屏这些驱动信息都是从sys_config.fex文件里读取到的,ctp_detect等等函数也做完了。但是在probe函数中有对触摸屏i2c通信进行测试,会出现sunxi_i2c_do_xfer出现incomplete xfer(status:0x20,address:0x48)的情况,实在是不知道什么情况了。请求帮助。
2.代码:

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;
}

  • 写回答

1条回答 默认 最新

  • 南方有大雪 2022-09-23 11:18
    关注

    解决这个问题没,我也遇到了

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料