xpad - Allow mapping triggers to buttons
Subsystems (3)
PATCH 2/2 xpad - Allow mapping triggers to buttons
From: Michael Gruber <[email protected]>
If the new module option triggers_to_buttons is set, the two analog shoulder triggers will be mapped to 2buttons instead of 2axes for all controllers.
Signed-off-by Michael Gruber <[email protected]>
---
A lot of Xbox360 games use LT and RT just like digital buttons, usually for important commands like attack. Linux users should have access to the same functionality.
Documentation/input/xpad.txt | 3 ++ drivers/input/joystick/xpad.c | 40 ++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-)
Documentation/input/xpad.txt +3 -0
@@ -29,6 +29,9 @@ dpad_to_buttons has no effect for known d-pad mapping to use buttons instead of axes for a known controller you should set force_dpad_to_buttons to Y. The default is N. +You can also map the two analog shoulder triggers to digital buttons by +setting triggers_to_buttons to Y. The default is N. + 0.1 Normal Controllers ---------------------- With a normal controller, the directional pad is mapped to its own X/Y axes.
drivers/input/joystick/xpad.c +35 -5
@@ -101,6 +101,9 @@ MODULE_PARM_DESC(dpad_to_buttons, "Map Dstatic int force_dpad_to_buttons;module_param (force_dpad_to_buttons, bool,S_IRUGO );MODULE_PARM_DESC (force_dpad_to_buttons,"Map D-PAD to buttons rather than axes for all pads" ); +static int triggers_to_buttons; +module_param (triggers_to_buttons, bool,S_IRUGO ); +MODULE_PARM_DESC (triggers_to_buttons,"Map triggers to buttons rather than axes for all pads" ); static const struct xpad_device { u16 idVendor;
@@ -176,10 +179,15 @@ static const signed short xpad360_btn[] -1 }; +/* only used if triggers_to_buttons is set */ +static const signed short xpad_btn_trigger[] = { +BTN_TL2 ,BTN_TR2 ,/* triggers left/right */ +-1 /* terminating entry */ +}; +static const signed short xpad_abs[] = {ABS_X ,ABS_Y ,/* left stick */ ABS_RX ,ABS_RY ,/* right stick */ -ABS_Z ,ABS_RZ ,/* triggers left/right */ -1 /* terminating entry */ };
@@ -189,6 +197,12 @@ static const signed short xpad_abs_pad[] -1 /* terminating entry */ }; +/* only used if triggers_to_buttons is not set */ +static const signed short xpad_abs_trigger[] = { +ABS_Z ,ABS_RZ ,/* triggers left/right */ +-1 /* terminating entry */ +}; +/* Xbox 360 has a vendor-specific class, so we cannot match it with only * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we * match against vendor id as well. Wired Xbox 360 devices have protocol 1,
@@ -272,8 +286,13 @@ static void xpad_process_packet(struct u ~(__s16) le16_to_cpup((__le16 *)(data + 18)));/* triggers left/right */ -input_report_abs (dev,ABS_Z , data[10 ]); -input_report_abs (dev,ABS_RZ , data[11 ]); +if (triggers_to_buttons) { +input_report_key (dev,BTN_TL2 , data[10 ] >0x50 ); +input_report_key (dev,BTN_TR2 , data[11 ] >0x50 ); + }else { +input_report_abs (dev,ABS_Z , data[10 ]); +input_report_abs (dev,ABS_RZ , data[11 ]); + }/* digital pad */ if (xpad->dpad_mapping ==MAP_DPAD_TO_AXES ) {
@@ -366,8 +385,13 @@ static void xpad360_process_packet(struc ~(__s16) le16_to_cpup((__le16 *)(data + 12)));/* triggers left/right */ -input_report_abs (dev,ABS_Z , data[4 ]); -input_report_abs (dev,ABS_RZ , data[5 ]); +if (triggers_to_buttons) { +input_report_key (dev,BTN_TL2 , data[4 ] >0x50 ); +input_report_key (dev,BTN_TR2 , data[5 ] >0x50 ); + }else { +input_report_abs (dev,ABS_Z , data[4 ]); +input_report_abs (dev,ABS_RZ , data[5 ]); + }input_sync (dev); }
@@ -786,6 +810,9 @@ static int xpad_probe(struct usb_interfaif (xpad->dpad_mapping ==MAP_DPAD_TO_BUTTONS )for (i =0 ; xpad_btn_pad[i] >=0 ; i++)set_bit (xpad_btn_pad[i], input_dev->keybit); +if (triggers_to_buttons) +for (i =0 ; xpad_btn_trigger[i] >=0 ; i++) +set_bit (xpad_btn_trigger[i], input_dev->keybit);/* set up axes */ for (i =0 ; xpad_abs[i] >=0 ; i++)
@@ -793,6 +820,9 @@ static int xpad_probe(struct usb_interfaif (xpad->dpad_mapping ==MAP_DPAD_TO_AXES )for (i =0 ; xpad_abs_pad[i] >=0 ; i++)xpad_set_up_abs (input_dev, xpad_abs_pad[i]); +if (!triggers_to_buttons) +for (i =0 ; xpad_abs_trigger[i] >=0 ; i++) +xpad_set_up_abs (input_dev, xpad_abs_trigger[i]); error =xpad_init_output (intf, xpad);if (error)
Signature · 2 lines
Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten Browser-Versionen downloaden: http://www.gmx.net/de/go/browser