zoukankan      html  css  js  c++  java
  • RK Android7.1 移植gt9271 TP偏移

    一.原理图

     dts 配置

    	  goodix@14 {
                  compatible = "goodix,gt9xx";
                  reg = <0x14>;
                  max-x = <1280>;
                  max-y = <800>;
                  tp-size= <89>;
                  touch-gpio = <&gpio0 4 IRQ_TYPE_LEVEL_LOW>;
                  rst-gpio = <&gpio0 3 GPIO_ACTIVE_HIGH>;  

     通信失败

    [    1.661711] <<-GTP-ERROR->> GTP i2c test failed time 4.
    [    1.675859] <<-GTP-ERROR->> I2C Read: 0x8047, 1 bytes failed, errcode: -6! Process reset.
    [    1.758372] <<-GTP-ERROR->> GTP i2c test failed time 5.
    [    1.771698] <goodix_ts_probe>_2555    I2C communication ERROR!
    [    1.771717]    <goodix_ts_probe>_2623  prob error !!!!!!!!!!!!!!!
    [    1.771787] rk3x-i2c ff3d0000.i2c: Initialized RK3xxx I2C bus at ffffff80099d4000
    
     
    linux i2c 的通信函数i2c_transfer出错码
    参考errno-base.h
    #define EPERM 1 /* Operation not permitted */
    #define ENOENT 2 /* No such file or directory */
    #define ESRCH 3 /* No such process */
    #define EINTR 4 /* Interrupted system call */
    #define EIO 5 /* I/O error */
    #define ENXIO 6 /* No such device or address */
    #define E2BIG 7 /* Argument list too long */
    #define ENOEXEC 8 /* Exec format error */
    #define EBADF 9 /* Bad file number */
    #define ECHILD 10 /* No child processes */
    #define EAGAIN 11 /* Try again */
    #define ENOMEM 12 /* Out of memory */
    #define EACCES 13 /* Permission denied */
    #define EFAULT 14 /* Bad address */
    #define ENOTBLK 15 /* Block device required */

    正常 

    [    1.298163] tp 00000000000000000000000000000 DPT
    [    1.298163]
    [    1.335636] input: goodix-ts as /devices/virtual/input/input1

    三.kerneldriversinput ouchscreenGT9271gt9xx.c

    /*******************************************************
    Function:
        I2c probe.
    Input:
        client: i2c device struct.
        id: device id.
    Output:
        Executive outcomes. 
            0: succeed.
    *******************************************************/
    static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
    {
        s32 ret = -1;
        struct goodix_ts_data *ts;
        u16 version_info;
        
        struct device_node *np = client->dev.of_node;
        enum of_gpio_flags rst_flags, pwr_flags, tp_select_flags;
        unsigned long irq_flags;
        u32 val;
    	printk("___%s() start____ 
    ", __func__);
    
        
        GTP_DEBUG_FUNC();
        
        //do NOT remove these logs
        GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION);
        GTP_INFO("GTP Driver Built@%s, %s", __TIME__, __DATE__);
        GTP_INFO("GTP I2C Address: 0x%02x", client->addr);
    
        i2c_connect_client = client;
        
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 
        {
            GTP_ERROR("I2C check functionality failed.");
            return -ENODEV;
        }
        ts = kzalloc(sizeof(*ts), GFP_KERNEL);
        if (ts == NULL)
        {
            GTP_ERROR("Alloc GFP_KERNEL memory failed.");
            return -ENOMEM;
        }
        
        memset(ts, 0, sizeof(*ts));
        
        if (!np) {
        	dev_err(&client->dev, "no device tree
    ");
        	return -EINVAL;
        }
        if (of_property_read_u32(np, "tp-size", &val)) {
        	dev_err(&client->dev, "no max-x defined
    ");
        	return -EINVAL;
        }
        if(val == 89){
            m89or101 = TRUE;
            mGtpChange_X2Y = TRUE;
            mGtp_X_Reverse = FALSE;
            mGtp_Y_Reverse = FALSE;
        }else if(val == 101){
            m89or101 = TRUE;
            mGtpChange_X2Y = FALSE;
            mGtp_X_Reverse = FALSE;
            mGtp_Y_Reverse = FALSE;
        }
        ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)(&ts->irq_flags));
        ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);
        ts->pwr_pin = of_get_named_gpio_flags(np, "power-gpio", 0, &pwr_flags);
        ts->tp_select_pin = of_get_named_gpio_flags(np, "tp-select-gpio", 0, &tp_select_flags);
        if (of_property_read_u32(np, "max-x", &val)) {
        	dev_err(&client->dev, "no max-x defined
    ");
        	return -EINVAL;
        }
        //ts->abs_x_max = val;
        if (of_property_read_u32(np, "max-y", &val)) {
        	dev_err(&client->dev, "no max-y defined
    ");
        	return -EINVAL;
        }
        //ts->abs_y_max = val;
        ts->pendown =PEN_RELEASE;
        ts->client = client;
        
        
        INIT_WORK(&ts->work, goodix_ts_work_func);
        ts->client = client;
        spin_lock_init(&ts->irq_lock);          // 2.6.39 later
        // ts->irq_lock = SPIN_LOCK_UNLOCKED;   // 2.6.39 & before
    #if GTP_ESD_PROTECT
        ts->clk_tick_cnt = 2 * HZ;      // HZ: clock ticks in 1 second generated by system
        GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt);  
        spin_lock_init(&ts->esd_lock);
        // ts->esd_lock = SPIN_LOCK_UNLOCKED;
    #endif
        i2c_set_clientdata(client, ts);
        
        ts->gtp_rawdiff_mode = 0;
    
        ret = gtp_request_io_port(ts);
        if (ret < 0)
        {
            GTP_ERROR("GTP request IO port failed.");
            //return ret;
            goto probe_init_error_requireio;
        }
    
        if(gpio_get_value(ts->tp_select_pin))//WGJ
        {
        	printk("tp 11111111111111111111111111111 WGJ
    
    ");
        	mGtp_X_Reverse = FALSE;
        	mGtp_Y_Reverse = FALSE;
        }
        else//DPT
        {
        	printk("tp 00000000000000000000000000000 DPT
    
    ");
        	mGtpChange_X2Y = TRUE;
        	mGtp_X_Reverse = TRUE;//FALSE;
        	mGtp_Y_Reverse = FALSE;
        }

    mGtpChange_X2Y = TRUE;
    mGtp_X_Reverse = TRUE;  X镜像
    mGtp_Y_Reverse = FALSE;  Y镜像

    /*******************************************************
    Function:
        Report touch point event 
    Input:
        ts: goodix i2c_client private data
        id: trackId
        x:  input x coordinate
        y:  input y coordinate
        w:  input pressure
    Output:
        None.
    *********************************************************/
    static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w)
    {
        if(mGtpChange_X2Y){
            GTP_SWAP(x, y);
        }
    
        if(mGtp_X_Reverse){
            x = ts->abs_x_max - x;
        }
    
        if(mGtp_Y_Reverse){
            y = ts->abs_y_max - y;
        }
    

      

      

  • 相关阅读:
    c# TCP高性能通信
    c#实现的HTTP服务端
    c#的二进制序列化组件MessagePack介绍
    c# 任务超时执行
    c#项目总结
    etcd客户端c#
    开发的服务集群部署方案,以etcd为基础(java)
    udt的java版本judt项目持续升级1.2版本
    udt通信java再次升级1.1版
    (转)Spring Boot(二) & lombok
  • 原文地址:https://www.cnblogs.com/crushgirl/p/14902191.html
Copyright © 2011-2022 走看看