Lines Matching +full:0 +full:- +full:127
1 // SPDX-License-Identifier: GPL-2.0-only
10 #define VID_UGEE 0x28BD /* VID is shared with SinoWealth and Glorious and prob others */
11 #define PID_ARTIST_PRO14_GEN2 0x095A
12 #define PID_ARTIST_PRO16_GEN2 0x095B
21 * - the device reports Eraser instead of using Secondary Barrel Switch
22 * - when the eraser button is pressed and the stylus is touching the tablet,
28 0x05, 0x0d, // Usage Page (Digitizers) 0
29 0x09, 0x02, // Usage (Pen) 2
30 0xa1, 0x01, // Collection (Application) 4
31 0x85, 0x07, // Report ID (7) 6
32 0x09, 0x20, // Usage (Stylus) 8
33 0xa1, 0x00, // Collection (Physical) 10
34 0x09, 0x42, // Usage (Tip Switch) 12
35 0x09, 0x44, // Usage (Barrel Switch) 14
36 …0x09, 0x5a, // Usage (Secondary Barrel Switch) 16 /* changed from 0x45 (Er…
37 0x09, 0x3c, // Usage (Invert) 18
38 …0x09, 0x45, // Usage (Eraser) 16 /* created over a paddin…
39 0x15, 0x00, // Logical Minimum (0) 20
40 0x25, 0x01, // Logical Maximum (1) 22
41 0x75, 0x01, // Report Size (1) 24
42 0x95, 0x05, // Report Count (5) 26 /* changed from 4 to 5 */
43 0x81, 0x02, // Input (Data,Var,Abs) 28
44 0x09, 0x32, // Usage (In Range) 34
45 0x15, 0x00, // Logical Minimum (0) 36
46 0x25, 0x01, // Logical Maximum (1) 38
47 0x95, 0x01, // Report Count (1) 40
48 0x81, 0x02, // Input (Data,Var,Abs) 42
49 0x95, 0x02, // Report Count (2) 44
50 0x81, 0x03, // Input (Cnst,Var,Abs) 46
51 0x75, 0x10, // Report Size (16) 48
52 0x95, 0x01, // Report Count (1) 50
53 0x35, 0x00, // Physical Minimum (0) 52
54 0xa4, // Push 54
55 0x05, 0x01, // Usage Page (Generic Desktop) 55
56 0x09, 0x30, // Usage (X) 57
57 0x65, 0x13, // Unit (EnglishLinear: in) 59
58 0x55, 0x0d, // Unit Exponent (-3) 61
59 0x46, 0xff, 0x34, // Physical Maximum (13567) 63
60 0x26, 0xff, 0x7f, // Logical Maximum (32767) 66
61 0x81, 0x02, // Input (Data,Var,Abs) 69
62 0x09, 0x31, // Usage (Y) 71
63 0x46, 0x20, 0x21, // Physical Maximum (8480) 73
64 0x26, 0xff, 0x7f, // Logical Maximum (32767) 76
65 0x81, 0x02, // Input (Data,Var,Abs) 79
66 0xb4, // Pop 81
67 0x09, 0x30, // Usage (Tip Pressure) 82
68 0x45, 0x00, // Physical Maximum (0) 84
69 0x26, 0xff, 0x3f, // Logical Maximum (16383) 86
70 0x81, 0x42, // Input (Data,Var,Abs,Null) 89
71 0x09, 0x3d, // Usage (X Tilt) 91
72 0x15, 0x81, // Logical Minimum (-127) 93
73 0x25, 0x7f, // Logical Maximum (127) 95
74 0x75, 0x08, // Report Size (8) 97
75 0x95, 0x01, // Report Count (1) 99
76 0x81, 0x02, // Input (Data,Var,Abs) 101
77 0x09, 0x3e, // Usage (Y Tilt) 103
78 0x15, 0x81, // Logical Minimum (-127) 105
79 0x25, 0x7f, // Logical Maximum (127) 107
80 0x81, 0x02, // Input (Data,Var,Abs) 109
81 0xc0, // End Collection 111
82 0xc0, // End Collection 112
88 __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */); in SEC()
91 return 0; /* EPERM check */ in SEC()
98 if (hctx->hid->product == PID_ARTIST_PRO14_GEN2) { in SEC()
99 data[63] = 0x2e; in SEC()
100 data[62] = 0x62; in SEC()
101 data[73] = 0x1c; in SEC()
102 data[72] = 0xfd; in SEC()
110 __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 10 /* size */); in xppen_16_fix_eraser()
113 return 0; /* EPERM check */ in xppen_16_fix_eraser()
115 if ((data[1] & 0x29) != 0x29) /* tip switch=1 invert=1 inrange=1 */ in xppen_16_fix_eraser()
116 return 0; in xppen_16_fix_eraser()
118 /* xor bits 0,3 and 4: convert Tip Switch + Invert into Eraser only */ in xppen_16_fix_eraser()
119 data[1] ^= 0x19; in xppen_16_fix_eraser()
121 return 0; in xppen_16_fix_eraser()
132 * >>> [round(h*math.sin(math.radians(d))) for d in range(0, 128)]
133 * [0, 13, 26, ....]
138 0, 3, 5, 8, 11, 13, 16, 19, 21, 24, 27, 29, 32, 35, 37, 40, 42, 45, 47, 50, 53,
140 101, 103, 105, 107, 109, 111, 112, 114, 116, 118, 119, 121, 123, 124, 126, 127,
145 132, 130, 129, 127, 126, 124, 123
148 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 59, 64, 68, 72, 76, 80, 84,
149 88, 92, 96, 100, 104, 108, 112, 115, 119, 123, 127, 130, 134, 137, 141, 145, 148,
160 0, 2, 5, 7, 9, 12, 14, 16, 19, 21, 23, 26, 28, 30, 33, 35, 37, 39, 42, 44, 46, 48,
163 116, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 129, 130,
166 128, 127, 126, 126, 125, 124, 123, 122, 121, 120, 119, 118, 116, 115, 114, 113,
170 0, 4, 8, 11, 15, 19, 22, 26, 30, 34, 37, 41, 45, 48, 52, 56, 59, 63, 66, 70, 74,
188 …__u8 direction = tilt > 0 ? 0 : 1; /* Positive tilt means we need to subtract the compensation (vs… in compensate_coordinates_by_tilt()
189 __u8 angle = tilt > 0 ? tilt : -tilt; in compensate_coordinates_by_tilt()
191 if (angle > 127) in compensate_coordinates_by_tilt()
196 if (direction == 0) { in compensate_coordinates_by_tilt()
197 coords = (coords > compensation) ? coords - compensation : 0; in compensate_coordinates_by_tilt()
200 __u16 max = logical_maximum - compensation; in compensate_coordinates_by_tilt()
205 data[idx] = coords & 0xff; in compensate_coordinates_by_tilt()
211 __u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 10 /* size */); in xppen_16_fix_angle_offset()
214 return 0; /* EPERM check */ in xppen_16_fix_angle_offset()
232 * bytes 0 - report id in xppen_16_fix_angle_offset()
233 * 1 - buttons in xppen_16_fix_angle_offset()
234 * 2-3 - X coords (logical) in xppen_16_fix_angle_offset()
235 * 4-5 - Y coords in xppen_16_fix_angle_offset()
236 * 6-7 - pressure (ignore) in xppen_16_fix_angle_offset()
237 * 8 - tilt X in xppen_16_fix_angle_offset()
238 * 9 - tilt Y in xppen_16_fix_angle_offset()
244 if (hctx->hid->product == PID_ARTIST_PRO14_GEN2) { in xppen_16_fix_angle_offset()
247 } else if (hctx->hid->product == PID_ARTIST_PRO16_GEN2) { in xppen_16_fix_angle_offset()
252 return 0; in xppen_16_fix_angle_offset()
277 ctx->retval = ctx->rdesc_size != 113; in probe()
278 if (ctx->retval) in probe()
279 ctx->retval = -EINVAL; in probe()
282 if (ctx->rdesc[17] != 0x45) /* Eraser */ in probe()
283 ctx->retval = -EINVAL; in probe()
285 return 0; in probe()