@@ -234,58 +234,6 @@ static __u8 pid0011_rdesc_fixed[] = {
234
234
0xC0 /* End Collection */
235
235
};
236
236
237
- static __u8 pid0006_rdesc_fixed [] = {
238
- 0x05 , 0x01 , /* Usage Page (Generic Desktop) */
239
- 0x09 , 0x04 , /* Usage (Joystick) */
240
- 0xA1 , 0x01 , /* Collection (Application) */
241
- 0xA1 , 0x02 , /* Collection (Logical) */
242
- 0x75 , 0x08 , /* Report Size (8) */
243
- 0x95 , 0x05 , /* Report Count (5) */
244
- 0x15 , 0x00 , /* Logical Minimum (0) */
245
- 0x26 , 0xFF , 0x00 , /* Logical Maximum (255) */
246
- 0x35 , 0x00 , /* Physical Minimum (0) */
247
- 0x46 , 0xFF , 0x00 , /* Physical Maximum (255) */
248
- 0x09 , 0x30 , /* Usage (X) */
249
- 0x09 , 0x33 , /* Usage (Ry) */
250
- 0x09 , 0x32 , /* Usage (Z) */
251
- 0x09 , 0x31 , /* Usage (Y) */
252
- 0x09 , 0x34 , /* Usage (Ry) */
253
- 0x81 , 0x02 , /* Input (Variable) */
254
- 0x75 , 0x04 , /* Report Size (4) */
255
- 0x95 , 0x01 , /* Report Count (1) */
256
- 0x25 , 0x07 , /* Logical Maximum (7) */
257
- 0x46 , 0x3B , 0x01 , /* Physical Maximum (315) */
258
- 0x65 , 0x14 , /* Unit (Centimeter) */
259
- 0x09 , 0x39 , /* Usage (Hat switch) */
260
- 0x81 , 0x42 , /* Input (Variable) */
261
- 0x65 , 0x00 , /* Unit (None) */
262
- 0x75 , 0x01 , /* Report Size (1) */
263
- 0x95 , 0x0C , /* Report Count (12) */
264
- 0x25 , 0x01 , /* Logical Maximum (1) */
265
- 0x45 , 0x01 , /* Physical Maximum (1) */
266
- 0x05 , 0x09 , /* Usage Page (Button) */
267
- 0x19 , 0x01 , /* Usage Minimum (0x01) */
268
- 0x29 , 0x0C , /* Usage Maximum (0x0C) */
269
- 0x81 , 0x02 , /* Input (Variable) */
270
- 0x06 , 0x00 , 0xFF , /* Usage Page (Vendor Defined) */
271
- 0x75 , 0x01 , /* Report Size (1) */
272
- 0x95 , 0x08 , /* Report Count (8) */
273
- 0x25 , 0x01 , /* Logical Maximum (1) */
274
- 0x45 , 0x01 , /* Physical Maximum (1) */
275
- 0x09 , 0x01 , /* Usage (0x01) */
276
- 0x81 , 0x02 , /* Input (Variable) */
277
- 0xC0 , /* End Collection */
278
- 0xA1 , 0x02 , /* Collection (Logical) */
279
- 0x75 , 0x08 , /* Report Size (8) */
280
- 0x95 , 0x07 , /* Report Count (7) */
281
- 0x46 , 0xFF , 0x00 , /* Physical Maximum (255) */
282
- 0x26 , 0xFF , 0x00 , /* Logical Maximum (255) */
283
- 0x09 , 0x02 , /* Usage (0x02) */
284
- 0x91 , 0x02 , /* Output (Variable) */
285
- 0xC0 , /* End Collection */
286
- 0xC0 /* End Collection */
287
- };
288
-
289
237
static __u8 * dr_report_fixup (struct hid_device * hdev , __u8 * rdesc ,
290
238
unsigned int * rsize )
291
239
{
@@ -296,16 +244,34 @@ static __u8 *dr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
296
244
* rsize = sizeof (pid0011_rdesc_fixed );
297
245
}
298
246
break ;
299
- case 0x0006 :
300
- if (* rsize == sizeof (pid0006_rdesc_fixed )) {
301
- rdesc = pid0006_rdesc_fixed ;
302
- * rsize = sizeof (pid0006_rdesc_fixed );
303
- }
304
- break ;
305
247
}
306
248
return rdesc ;
307
249
}
308
250
251
+ #define map_abs (c ) hid_map_usage(hi, usage, bit, max, EV_ABS, (c))
252
+ #define map_rel (c ) hid_map_usage(hi, usage, bit, max, EV_REL, (c))
253
+
254
+ static int dr_input_mapping (struct hid_device * hdev , struct hid_input * hi ,
255
+ struct hid_field * field , struct hid_usage * usage ,
256
+ unsigned long * * bit , int * max )
257
+ {
258
+ switch (usage -> hid ) {
259
+ /*
260
+ * revert to the old hid-input behavior where axes
261
+ * can be randomly assigned when hid->usage is reused.
262
+ */
263
+ case HID_GD_X : case HID_GD_Y : case HID_GD_Z :
264
+ case HID_GD_RX : case HID_GD_RY : case HID_GD_RZ :
265
+ if (field -> flags & HID_MAIN_ITEM_RELATIVE )
266
+ map_rel (usage -> hid & 0xf );
267
+ else
268
+ map_abs (usage -> hid & 0xf );
269
+ return 1 ;
270
+ }
271
+
272
+ return 0 ;
273
+ }
274
+
309
275
static int dr_probe (struct hid_device * hdev , const struct hid_device_id * id )
310
276
{
311
277
int ret ;
@@ -352,6 +318,7 @@ static struct hid_driver dr_driver = {
352
318
.id_table = dr_devices ,
353
319
.report_fixup = dr_report_fixup ,
354
320
.probe = dr_probe ,
321
+ .input_mapping = dr_input_mapping ,
355
322
};
356
323
module_hid_driver (dr_driver );
357
324
0 commit comments