Android HID数字化仪描述符不';t在横向定位方面表现不佳 用例 使用USB为智能手机设备实现HID“触摸屏” “触摸屏”应在横向或纵向方向运行良好 开发环境 三星Galaxy 5 安卓5 问题描述

Android HID数字化仪描述符不';t在横向定位方面表现不佳 用例 使用USB为智能手机设备实现HID“触摸屏” “触摸屏”应在横向或纵向方向运行良好 开发环境 三星Galaxy 5 安卓5 问题描述,android,driver,hid,touchscreen,android-kernel,Android,Driver,Hid,Touchscreen,Android Kernel,当手机处于纵向(1080x1920)时,所有功能均正常工作;当更改为横向(1920x1080)时,坐标旋转90度,沿X轴(现在为1920)的移动限制为1080 手动切换通过HID报告发送的X&Y坐标会使光标与设备的物理运动对齐,但是水平轴(现在是1920)仍然限制为1080 在HID描述符上,使逻辑_最大值大于物理_最大值没有任何影响 是否有可能支持数字化仪设备的方向更改?我是否应该以任何方式更改描述符以使方向更改正常工作 更新 使用带有方位角使用ID(0x3F)的页面数字化仪(0x0D)没有

当手机处于纵向(1080x1920)时,所有功能均正常工作;当更改为横向(1920x1080)时,坐标旋转90度,沿X轴(现在为1920)的移动限制为1080

手动切换通过HID报告发送的X&Y坐标会使光标与设备的物理运动对齐,但是水平轴(现在是1920)仍然限制为1080

在HID描述符上,使逻辑_最大值大于物理_最大值没有任何影响

是否有可能支持数字化仪设备的方向更改?我是否应该以任何方式更改描述符以使方向更改正常工作

更新
  • 使用带有方位角使用ID(0x3F)的页面数字化仪(0x0D)没有任何影响
  • 使用用法页面“字母数字显示(0x14)”w/“显示方向”用法ID(0x84)没有任何影响
代码片段(根据实现)
通常情况下:HID设备发送0到最大值之间的坐标。然后,操作系统将这些值转换为屏幕的真实坐标。因此,您可以始终为X和Y发送0…10000,即使发生旋转或屏幕分辨率发生变化,它也应该像这样工作。如果它不工作,这是操作系统中的一个错误。(为什么先将物理最大值设置为10000,然后再设置为0?这肯定不是问题的原因,但毫无意义。您应该为X和Y声明物理+逻辑最小值+最大值)
            enum :BYTE { REPORT_ID = 4 };

            const UCHAR DESCRIPTOR[] = {
                0x05, 0x0d,                         // USAGE_PAGE (Digitizers)
                0x09, 0x04,                         // USAGE (Touch Screen)
                0xa1, 0x01,                         // COLLECTION (Application)
                0x85, REPORT_ID,                    //   REPORT_ID (4)
                0x09, 0x20,                         //   USAGE (Stylus)
                0xa1, 0x00,                         //   COLLECTION (Physical)
                0x09, 0x42,                         //     USAGE (Tip Switch)
                0x09, 0x32,                         //     USAGE (In Range)
                0x15, 0x00,                         //     LOGICAL_MINIMUM (0)
                0x25, 0x01,                         //     LOGICAL_MAXIMUM (1)
                0x75, 0x01,                         //     REPORT_SIZE (1)
                0x95, 0x02,                         //     REPORT_COUNT (2)
                0x81, 0x02,                         //     INPUT (Data,Var,Abs)
                0x75, 0x01,                         //     REPORT_SIZE (1)
                0x95, 0x06,                         //     REPORT_COUNT (6)
                0x81, 0x01,                         //     INPUT (Cnst,Ary,Abs)
                0x05, 0x01,                         //     USAGE_PAGE (Generic Desktop)
                0x46, 0x10, 0x27,                   //     PHYSICAL_MAXIMUM (10000)
                0x26, 0x10, 0x27,                   //     LOGICAL_MAXIMUM (10000)
                0x75, 0x10,                         //     REPORT_SIZE (16) 
                0x95, 0x01,                         //     REPORT_COUNT (1)            
                0x55, 0x0F,                         //     UNIT_EXPONENT (-1)           
                0x65, 0x11,                         //     UNIT (cm,SI Linear)                  
                0x35, 0x00,                         //     PHYSICAL_MINIMUM (0)         
                0x45, 0x00,                         //     PHYSICAL_MAXIMUM (0)
                0x09, 0x30,                         //     USAGE (X)                    
                0x81, 0x02,                         //     INPUT (Data,Var,Abs)         
                0x09, 0x31,                         //     USAGE (Y)                    
                0x81, 0x02,                         //     INPUT (Data,Var,Abs)
                0xc0,                               //   END_COLLECTION
                0xc0,                               // END_COLLECTION
            };

            struct Report {
                enum :LONG { RES_X = 10000, RES_Y = 10000 };
                UCHAR   report_id; // Must be set to 4
                struct {
                    UCHAR   bTipSwitch : 1;
                    UCHAR   bInRange   : 1;
                    UCHAR   reserved   : 6;
                } status;
                USHORT  wXData;
                USHORT  wYData;

                inline static void NormalizeCoordinates(IN const SIZE& res, IN OUT USHORT& x, IN OUT USHORT& y) {
                    if ((0 == res.cx) || (0 == res.cy)) {
                        assert(FALSE);
                        return;
                    }
                    x = (USHORT)((RES_X * x) / res.cx);
                    y = (USHORT)((RES_Y * y) / res.cy);
                }
            };