Hi, Sorry for disappearmign on you guys...
On 6/3/07, Jan Kratochvil <[EMAIL PROTECTED]> wrote:
Fixed input report handling for xbox 360 controller. Y/RY up is now positive and down negative. DPAD report fixed.
I have some concerns over this patch - when mapping dpad to buttons your new mapping follows mapping for classic xbox; however it is still different when mapping dpad to axes so this is suspicious. Could you please try the attached patch and tell me if it works for you? Also, please avoid constructs like this:
+ input_report_abs(dev, ABS_HAT0Y, !!((data[2] & 0x08) >> 3) - !!((data[2] & 0x04) >> 2));
Doing shift is meaningles if you convert result to 0/1. I.e. it is exactly the same as !!(data[2] & 0x08) - !!(data[2] &0x04). Thank you. -- Dmitry
--- drivers/input/joystick/xpad.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) Index: linux/drivers/input/joystick/xpad.c =================================================================== --- linux.orig/drivers/input/joystick/xpad.c +++ linux/drivers/input/joystick/xpad.c @@ -236,8 +236,8 @@ static void xpad_process_packet(struct u } else /* xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS */ { input_report_key(dev, BTN_LEFT, data[2] & 0x04); input_report_key(dev, BTN_RIGHT, data[2] & 0x08); - input_report_key(dev, BTN_0, data[2] & 0x01); // up - input_report_key(dev, BTN_1, data[2] & 0x02); // down + input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ + input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ } /* start/back buttons and stick press left/right */ @@ -275,40 +275,40 @@ static void xpad360_process_packet(struc /* digital pad */ if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) { - input_report_abs(dev, ABS_HAT0X, !!(data[2] & 0x01) - !!((data[2] & 0x08) >> 3)); - input_report_abs(dev, ABS_HAT0Y, !!((data[2] & 0x02) >> 1) - !!((data[2] & 0x04) >> 2)); - } else if ( xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS ) { + input_report_abs(dev, ABS_HAT0X, !!(data[2] & 0x08) - !!(data[2] & 0x04)); + input_report_abs(dev, ABS_HAT0Y, !!(data[2] & 0x02) - !!(data[2] & 0x01)); + } else if (xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS) { /* dpad as buttons (right, left, down, up) */ - input_report_key(dev, BTN_RIGHT, (data[2] & 0x01)); - input_report_key(dev, BTN_LEFT, (data[2] & 0x08) >> 3); - input_report_key(dev, BTN_0, (data[2] & 0x02) >> 1); - input_report_key(dev, BTN_1, (data[2] & 0x04) >> 2); + input_report_key(dev, BTN_LEFT, data[2] & 0x04); + input_report_key(dev, BTN_RIGHT, data[2] & 0x08); + input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ + input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ } /* start/back buttons */ - input_report_key(dev, BTN_START, (data[2] & 0x10) >> 4); - input_report_key(dev, BTN_BACK, (data[2] & 0x20) >> 5); + input_report_key(dev, BTN_START, data[2] & 0x10); + input_report_key(dev, BTN_BACK, data[2] & 0x20); /* stick press left/right */ input_report_key(dev, BTN_THUMBL, data[2] & 0x40); input_report_key(dev, BTN_THUMBR, data[2] & 0x80); /* buttons A,B,X,Y,TL,TR and MODE */ - input_report_key(dev, BTN_A, (data[3] & 0x10) >> 4); - input_report_key(dev, BTN_B, (data[3] & 0x20) >> 5); - input_report_key(dev, BTN_X, (data[3] & 0x40) >> 6); - input_report_key(dev, BTN_Y, (data[3] & 0x80) >> 7); - input_report_key(dev, BTN_TL, data[3] & 0x01 ); - input_report_key(dev, BTN_TR, (data[3] & 0x02) >> 1); - input_report_key(dev, BTN_MODE, (data[3] & 0x04) >> 2); + input_report_key(dev, BTN_A, data[3] & 0x10); + input_report_key(dev, BTN_B, data[3] & 0x20); + input_report_key(dev, BTN_X, data[3] & 0x40); + input_report_key(dev, BTN_Y, data[3] & 0x80); + input_report_key(dev, BTN_TL, data[3] & 0x01); + input_report_key(dev, BTN_TR, data[3] & 0x02); + input_report_key(dev, BTN_MODE, data[3] & 0x04); /* left stick */ input_report_abs(dev, ABS_X, (__s16) (((__s16)data[7] << 8) | (__s16)data[6])); - input_report_abs(dev, ABS_Y, ~(__s16) (((__s16)data[9] << 8) | (__s16)data[8])); + input_report_abs(dev, ABS_Y, (__s16) (((__s16)data[9] << 8) | (__s16)data[8])); /* right stick */ - input_report_abs(dev, ABS_RY, ~(__s16) (((__s16)data[13] << 8) | (__s16)data[12])); input_report_abs(dev, ABS_RX, (__s16) (((__s16)data[11] << 8) | (__s16)data[10])); + input_report_abs(dev, ABS_RY, (__s16) (((__s16)data[13] << 8) | (__s16)data[12])); /* triggers left/right */ input_report_abs(dev, ABS_Z, data[4]);