• RK3288 android7.1 修改双屏异触usb tp触摸方向


    一,问题描述:

    android机器要求接两个屏(lvds+mipi)两个usb tp要实现双屏异触。由于mipi的方向和lvds方向转成一样的了。两个usb tp的方向在异显示的时候也要作用一样。这个时候要根据pid和vid修改触摸上报的数据。usb tp有通用的触摸驱动/kernel/drivers/hid/hid-multitouch.c
    即通过vid pid区分!

    二,修改方法:

    1. device/rockchip/rk3288/下添加idc文件:
    Vendor_222a_Product_0001.idc
    
    #*****************************************************
    # Input Device Configuration File for the generaltouch touch screen.
    #*****************************************************
    
    # Basic Parameters
    touch.deviceType = touchScreen
    touch.orientationAware = 1
    
    keyboard.layout = qwerty
    keyboard.characterMap = qwerty
    keyboard.orientationAware = 1
    keyboard.builtIn = 1
    
    cursor.mode = navigation
    cursor.orientationAware = 1
    
    device.internal = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    Vendor_0457_Product_0819.idc
    
    #*****************************************************
    # Input Device Configuration File for the generaltouch touch screen.
    #*****************************************************
    
    # Basic Parameters
    touch.deviceType = touchScreen
    touch.orientationAware = 1
    
    keyboard.layout = qwerty
    keyboard.characterMap = qwerty
    keyboard.orientationAware = 1
    keyboard.builtIn = 1
    
    cursor.mode = navigation
    cursor.orientationAware = 1
    
    device.internal = 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    2. device/rockchip/rk3288/device.mk,拷贝到系统中:
    # for usb tp
    PRODUCT_COPY_FILES += \
       device/rockchip/rk3288/Vendor_222a_Product_0001.idc:system/usr/idc/Vendor_222a_Product_0001.idc \
       device/rockchip/rk3288/Vendor_0457_Product_0819.idc:system/usr/idc/Vendor_0457_Product_0819.idc
    
    • 1
    • 2
    • 3
    • 4
    3. kernel/drivers/hid/hid-multitouch.c修改驱动:
    diff --git a/kernel/drivers/hid/hid-multitouch.c b/kernel/drivers/hid/hid-multitouch.c
    old mode 100644new mode 100755
    index 9de379c1b3..b8456b1e50
    --- a/kernel/drivers/hid/hid-multitouch.c
    +++ b/kernel/drivers/hid/hid-multitouch.c
    @@ -98,7 +98,23 @@ struct mt_fields {
        unsigned usages[HID_MAX_FIELDS];
        unsigned int length;
    };
    -
    +#define GTP_SWAP(x, y)                 do{\
    +                                         typeof(x) z = x;\
    +                                         x = y;\
    +                                         y = z;\
    +                                       }while (0)
    +                              
    +#define MAINmGtpChange_X2Y   1 
    +#define MIANmGtp_X_Reverse    1
    +#define MAINNmGtp_Y_Reverse      0 
    +static int  MAINX_max=0;
    +static int  MAINY_max=0;
    +                              
    +#define AUXmGtpChange_X2Y    1 
    +#define AUXmGtp_X_Reverse    1
    +#define AUXNmGtp_Y_Reverse   0 
    +static int  AUXX_max=0;
    +static int  AUXY_max=0;
    struct mt_device {
        struct mt_slot curdata; /* placeholder of incoming data */
        struct mt_class mtclass;    /* our mt device class */
    @@ -461,6 +477,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
        case HID_UP_GENDESK:
            switch (usage->hid) {
            case HID_GD_X:
    +       if (hdev->vendor==0x0457 && hdev->product==0x0819)
    +       {
    +           MAINX_max =     field->logical_maximum;
    +       }
    +       else if (hdev->vendor==0x222a && hdev->product ==0x0001)
    +       {
    +           AUXX_max =  field->logical_maximum;
    +       }
                if (prev_usage && (prev_usage->hid == usage->hid)) {
                    hid_map_usage(hi, usage, bit, max,
                        EV_ABS, ABS_MT_TOOL_X);
    @@ -476,6 +500,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
                mt_store_field(usage, td, hi);
                return 1;
            case HID_GD_Y:
    +       if (hdev->vendor==0x0457 && hdev->product==0x0819)
    +       {
    +           MAINY_max =     field->logical_maximum;
    +       }
    +       else if (hdev->vendor==0x222a && hdev->product ==0x0001)
    +       {
    +           AUXY_max =  field->logical_maximum;
    +       }
                if (prev_usage && (prev_usage->hid == usage->hid)) {
                    hid_map_usage(hi, usage, bit, max,
                        EV_ABS, ABS_MT_TOOL_Y);
    @@ -613,8 +645,10 @@ static int mt_compute_slot(struct mt_device *td, struct input_dev *input)
      * this function is called when a whole contact has been processed,
      * so that it can assign it to a slot and store the data there
      */
    -static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
    +static void mt_complete_slot(struct mt_device *td, struct input_dev *input,struct hid_device *hid_device)
    {
    +   
    +   
        if ((td->mtclass.quirks & MT_QUIRK_CONTACT_CNT_ACCURATE) &&
            td->num_received >= td->num_expected)
            return;
    @@ -649,7 +683,33 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
                int major = max(s->w, s->h) >> 1;
                int minor = min(s->w, s->h) >> 1;
    -           input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
    +if (hid_device->vendor==0x0457 && hid_device->product==0x0819)
    +{
    +   #if MAINmGtpChange_X2Y
    +       GTP_SWAP(s->x, s->y);
    +   #endif
    +       if(MIANmGtp_X_Reverse){
    +           s->x = MAINX_max -s->x;+       }
    +
    +       if(MAINNmGtp_Y_Reverse){
    +           s->y = MAINY_max - s->y;
    +       }
    +}
    +else if (hid_device->vendor==0x222a && hid_device->product==0x0001)
    +{
    +   #if AUXmGtpChange_X2Y
    +       GTP_SWAP(s->x, s->y);
    +   #endif
    +       if(AUXmGtp_X_Reverse){
    +           s->x = AUXX_max -s->x;
    +       }
    +
    +       if(AUXNmGtp_Y_Reverse){
    +           s->y = AUXY_max - s->y;
    +       }
    +}
              input_event(input, EV_ABS, ABS_MT_POSITION_X, s->x);
                input_event(input, EV_ABS, ABS_MT_POSITION_Y, s->y);
                input_event(input, EV_ABS, ABS_MT_TOOL_X, s->cx);
                input_event(input, EV_ABS, ABS_MT_TOOL_Y, s->cy);
    @@ -752,7 +812,7 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
            if (usage->usage_index + 1 == field->report_count) {
                /* we only take into account the last report. */
                if (usage->hid == td->last_slot_field)
    -               mt_complete_slot(td, field->hidinput->input);
    +               mt_complete_slot(td, field->hidinput->input,hid);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

    定义宏参数含义:
    define MAINmGtpChange_X2Y 1 //为主屏tp的x和y互换宏定义
    define MIANmGtp_X_Reverse 1 //为主屏tp的x反向宏定义
    define MAINNmGtp_Y_Reverse 0 //为主屏tp的y反向宏定义
    define AUXmGtpChange_X2Y 1 //为副屏tp的x和y互换宏定义
    define AUXmGtp_X_Reverse 1 //为副屏tp的x反向宏定义
    define AUXNmGtp_Y_Reverse 0 //为副屏tp的y反向宏定义


    以上修改在rk3288_7.1上实测有效,其他平台可参考修改,整体实现方法类似。

    关于idc文件控制触摸屏的属性可参考链接:Android系统 调试usb接口触摸屏问题

  • 相关阅读:
    ruoyi识别访问设备是pc端还是移动端跳转到对应的登录页面
    Arxiv 2209 | Switchable Self-attention Module
    基于Hardhat编写合约测试用例
    Day01——瑞吉外卖
    为什么高防服务器比普通服务器贵
    numpy基础
    2023.9.8 基于传输层协议 UDP 和 TCP 编写网络通信程序
    Linux之httpd及虚拟主机的配置及使用
    LeetCode-784. 字母大小写全排列【字符串】
    C++ 继承
  • 原文地址:https://blog.csdn.net/weixin_45639314/article/details/133686687