@@ -234,58 +234,6 @@ static __u8 pid0011_rdesc_fixed[] = {
234234 0xC0 /* End Collection */
235235};
236236
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-
289237static __u8 * dr_report_fixup (struct hid_device * hdev , __u8 * rdesc ,
290238 unsigned int * rsize )
291239{
@@ -296,16 +244,34 @@ static __u8 *dr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
296244 * rsize = sizeof (pid0011_rdesc_fixed );
297245 }
298246 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 ;
305247 }
306248 return rdesc ;
307249}
308250
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+
309275static int dr_probe (struct hid_device * hdev , const struct hid_device_id * id )
310276{
311277 int ret ;
@@ -352,6 +318,7 @@ static struct hid_driver dr_driver = {
352318 .id_table = dr_devices ,
353319 .report_fixup = dr_report_fixup ,
354320 .probe = dr_probe ,
321+ .input_mapping = dr_input_mapping ,
355322};
356323module_hid_driver (dr_driver );
357324
0 commit comments