diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-02-21 23:54:28 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-02-22 01:09:49 -0500 |
| commit | d38fcb9690532e6e2e064d711262b14d638113b9 (patch) | |
| tree | 714536bba2d5872e99c8c5769b7982c1eeb5cb7f | |
| parent | 7aa9e0e8263259f4517ba1788f4fbaa88e878400 (diff) | |
Input: gamecon - fix some formatting issues
Fix formatting of 'switch' statements and change the code to stay closer
to 80 column limit where it does not hurt code readability.
Tested-by: Scott Moreau <oreaus@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| -rw-r--r-- | drivers/input/joystick/gamecon.c | 347 |
1 files changed, 194 insertions, 153 deletions
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index bbde4e524da3..ec01bea8dc81 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
| @@ -93,15 +93,21 @@ static struct gc *gc_base[3]; | |||
| 93 | 93 | ||
| 94 | static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; | 94 | static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; |
| 95 | 95 | ||
| 96 | static char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", | 96 | static char *gc_names[] = { |
| 97 | "Multisystem 2-button joystick", "N64 controller", "PSX controller", | 97 | NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", |
| 98 | "PSX DDR controller", "SNES mouse" }; | 98 | "Multisystem 2-button joystick", "N64 controller", "PSX controller", |
| 99 | "PSX DDR controller", "SNES mouse" | ||
| 100 | }; | ||
| 101 | |||
| 99 | /* | 102 | /* |
| 100 | * N64 support. | 103 | * N64 support. |
| 101 | */ | 104 | */ |
| 102 | 105 | ||
| 103 | static unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 }; | 106 | static unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 }; |
| 104 | static short gc_n64_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START }; | 107 | static short gc_n64_btn[] = { |
| 108 | BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, | ||
| 109 | BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START | ||
| 110 | }; | ||
| 105 | 111 | ||
| 106 | #define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */ | 112 | #define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */ |
| 107 | #define GC_N64_STOP_LENGTH 5 /* Length of encoded stop bit */ | 113 | #define GC_N64_STOP_LENGTH 5 /* Length of encoded stop bit */ |
| @@ -157,7 +163,8 @@ static void gc_n64_send_stop_bit(struct gc *gc, unsigned char target) | |||
| 157 | 163 | ||
| 158 | /* | 164 | /* |
| 159 | * gc_n64_read_packet() reads an N64 packet. | 165 | * gc_n64_read_packet() reads an N64 packet. |
| 160 | * Each pad uses one bit per byte. So all pads connected to this port are read in parallel. | 166 | * Each pad uses one bit per byte. So all pads connected to this port |
| 167 | * are read in parallel. | ||
| 161 | */ | 168 | */ |
| 162 | 169 | ||
| 163 | static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | 170 | static void gc_n64_read_packet(struct gc *gc, unsigned char *data) |
| @@ -175,7 +182,8 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
| 175 | local_irq_restore(flags); | 182 | local_irq_restore(flags); |
| 176 | 183 | ||
| 177 | /* | 184 | /* |
| 178 | * Wait for the pad response to be loaded into the 33-bit register of the adapter | 185 | * Wait for the pad response to be loaded into the 33-bit register |
| 186 | * of the adapter. | ||
| 179 | */ | 187 | */ |
| 180 | 188 | ||
| 181 | udelay(GC_N64_DELAY); | 189 | udelay(GC_N64_DELAY); |
| @@ -192,8 +200,9 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
| 192 | } | 200 | } |
| 193 | 201 | ||
| 194 | /* | 202 | /* |
| 195 | * We must wait 200 ms here for the controller to reinitialize before the next read request. | 203 | * We must wait 200 ms here for the controller to reinitialize before |
| 196 | * No worries as long as gc_read is polled less frequently than this. | 204 | * the next read request. No worries as long as gc_read is polled less |
| 205 | * frequently than this. | ||
| 197 | */ | 206 | */ |
| 198 | 207 | ||
| 199 | } | 208 | } |
| @@ -201,9 +210,9 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
| 201 | static void gc_n64_process_packet(struct gc *gc) | 210 | static void gc_n64_process_packet(struct gc *gc) |
| 202 | { | 211 | { |
| 203 | unsigned char data[GC_N64_LENGTH]; | 212 | unsigned char data[GC_N64_LENGTH]; |
| 204 | signed char axes[2]; | ||
| 205 | struct input_dev *dev; | 213 | struct input_dev *dev; |
| 206 | int i, j, s; | 214 | int i, j, s; |
| 215 | signed char x, y; | ||
| 207 | 216 | ||
| 208 | gc_n64_read_packet(gc, data); | 217 | gc_n64_read_packet(gc, data); |
| 209 | 218 | ||
| @@ -217,23 +226,26 @@ static void gc_n64_process_packet(struct gc *gc) | |||
| 217 | 226 | ||
| 218 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { | 227 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { |
| 219 | 228 | ||
| 220 | axes[0] = axes[1] = 0; | 229 | x = y = 0; |
| 221 | 230 | ||
| 222 | for (j = 0; j < 8; j++) { | 231 | for (j = 0; j < 8; j++) { |
| 223 | if (data[23 - j] & s) | 232 | if (data[23 - j] & s) |
| 224 | axes[0] |= 1 << j; | 233 | x |= 1 << j; |
| 225 | if (data[31 - j] & s) | 234 | if (data[31 - j] & s) |
| 226 | axes[1] |= 1 << j; | 235 | y |= 1 << j; |
| 227 | } | 236 | } |
| 228 | 237 | ||
| 229 | input_report_abs(dev, ABS_X, axes[0]); | 238 | input_report_abs(dev, ABS_X, x); |
| 230 | input_report_abs(dev, ABS_Y, -axes[1]); | 239 | input_report_abs(dev, ABS_Y, -y); |
| 231 | 240 | ||
| 232 | input_report_abs(dev, ABS_HAT0X, !(s & data[6]) - !(s & data[7])); | 241 | input_report_abs(dev, ABS_HAT0X, |
| 233 | input_report_abs(dev, ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); | 242 | !(s & data[6]) - !(s & data[7])); |
| 243 | input_report_abs(dev, ABS_HAT0Y, | ||
| 244 | !(s & data[4]) - !(s & data[5])); | ||
| 234 | 245 | ||
| 235 | for (j = 0; j < 10; j++) | 246 | for (j = 0; j < 10; j++) |
| 236 | input_report_key(dev, gc_n64_btn[j], s & data[gc_n64_bytes[j]]); | 247 | input_report_key(dev, gc_n64_btn[j], |
| 248 | s & data[gc_n64_bytes[j]]); | ||
| 237 | 249 | ||
| 238 | input_sync(dev); | 250 | input_sync(dev); |
| 239 | } | 251 | } |
| @@ -321,7 +333,9 @@ static int __init gc_n64_init_ff(struct input_dev *dev, int i) | |||
| 321 | 333 | ||
| 322 | static unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 }; | 334 | static unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 }; |
| 323 | static unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 }; | 335 | static unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 }; |
| 324 | static short gc_snes_btn[] = { BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR }; | 336 | static short gc_snes_btn[] = { |
| 337 | BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR | ||
| 338 | }; | ||
| 325 | 339 | ||
| 326 | /* | 340 | /* |
| 327 | * gc_nes_read_packet() reads a NES/SNES packet. | 341 | * gc_nes_read_packet() reads a NES/SNES packet. |
| @@ -373,16 +387,19 @@ static void gc_nes_process_packet(struct gc *gc) | |||
| 373 | 387 | ||
| 374 | if (s & gc->pads[GC_NES]) | 388 | if (s & gc->pads[GC_NES]) |
| 375 | for (j = 0; j < 4; j++) | 389 | for (j = 0; j < 4; j++) |
| 376 | input_report_key(dev, gc_snes_btn[j], s & data[gc_nes_bytes[j]]); | 390 | input_report_key(dev, gc_snes_btn[j], |
| 391 | s & data[gc_nes_bytes[j]]); | ||
| 377 | 392 | ||
| 378 | if (s & gc->pads[GC_SNES]) | 393 | if (s & gc->pads[GC_SNES]) |
| 379 | for (j = 0; j < 8; j++) | 394 | for (j = 0; j < 8; j++) |
| 380 | input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]); | 395 | input_report_key(dev, gc_snes_btn[j], |
| 396 | s & data[gc_snes_bytes[j]]); | ||
| 381 | 397 | ||
| 382 | if (s & gc->pads[GC_SNESMOUSE]) { | 398 | if (s & gc->pads[GC_SNESMOUSE]) { |
| 383 | /* | 399 | /* |
| 384 | * The 4 unused bits from SNES controllers appear to be ID bits | 400 | * The 4 unused bits from SNES controllers appear |
| 385 | * so use them to make sure iwe are dealing with a mouse. | 401 | * to be ID bits so use them to make sure we are |
| 402 | * dealing with a mouse. | ||
| 386 | * gamepad is connected. This is important since | 403 | * gamepad is connected. This is important since |
| 387 | * my SNES gamepad sends 1's for bits 16-31, which | 404 | * my SNES gamepad sends 1's for bits 16-31, which |
| 388 | * cause the mouse pointer to quickly move to the | 405 | * cause the mouse pointer to quickly move to the |
| @@ -445,10 +462,11 @@ static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data) | |||
| 445 | static void gc_multi_process_packet(struct gc *gc) | 462 | static void gc_multi_process_packet(struct gc *gc) |
| 446 | { | 463 | { |
| 447 | unsigned char data[GC_MULTI2_LENGTH]; | 464 | unsigned char data[GC_MULTI2_LENGTH]; |
| 465 | int data_len = gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH; | ||
| 448 | struct input_dev *dev; | 466 | struct input_dev *dev; |
| 449 | int i, s; | 467 | int i, s; |
| 450 | 468 | ||
| 451 | gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); | 469 | gc_multi_read_packet(gc, data_len, data); |
| 452 | 470 | ||
| 453 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 471 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 454 | 472 | ||
| @@ -459,8 +477,10 @@ static void gc_multi_process_packet(struct gc *gc) | |||
| 459 | s = gc_status_bit[i]; | 477 | s = gc_status_bit[i]; |
| 460 | 478 | ||
| 461 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { | 479 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { |
| 462 | input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3])); | 480 | input_report_abs(dev, ABS_X, |
| 463 | input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1])); | 481 | !(s & data[2]) - !(s & data[3])); |
| 482 | input_report_abs(dev, ABS_Y, | ||
| 483 | !(s & data[0]) - !(s & data[1])); | ||
| 464 | input_report_key(dev, BTN_TRIGGER, s & data[4]); | 484 | input_report_key(dev, BTN_TRIGGER, s & data[4]); |
| 465 | } | 485 | } |
| 466 | 486 | ||
| @@ -503,9 +523,13 @@ static int gc_psx_delay = GC_PSX_DELAY; | |||
| 503 | module_param_named(psx_delay, gc_psx_delay, uint, 0); | 523 | module_param_named(psx_delay, gc_psx_delay, uint, 0); |
| 504 | MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)"); | 524 | MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)"); |
| 505 | 525 | ||
| 506 | static short gc_psx_abs[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y }; | 526 | static short gc_psx_abs[] = { |
| 507 | static short gc_psx_btn[] = { BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y, | 527 | ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y |
| 508 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR }; | 528 | }; |
| 529 | static short gc_psx_btn[] = { | ||
| 530 | BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y, | ||
| 531 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR | ||
| 532 | }; | ||
| 509 | static short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; | 533 | static short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; |
| 510 | 534 | ||
| 511 | /* | 535 | /* |
| @@ -513,18 +537,18 @@ static short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; | |||
| 513 | * the psx pad. | 537 | * the psx pad. |
| 514 | */ | 538 | */ |
| 515 | 539 | ||
| 516 | static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVICES]) | 540 | static void gc_psx_command(struct gc *gc, int b, unsigned char *data) |
| 517 | { | 541 | { |
| 542 | struct parport *port = gc->pd->port; | ||
| 518 | int i, j, cmd, read; | 543 | int i, j, cmd, read; |
| 519 | 544 | ||
| 520 | for (i = 0; i < GC_MAX_DEVICES; i++) | 545 | memset(data, 0, GC_MAX_DEVICES); |
| 521 | data[i] = 0; | ||
| 522 | 546 | ||
| 523 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { | 547 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { |
| 524 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; | 548 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; |
| 525 | parport_write_data(gc->pd->port, cmd | GC_PSX_POWER); | 549 | parport_write_data(port, cmd | GC_PSX_POWER); |
| 526 | udelay(gc_psx_delay); | 550 | udelay(gc_psx_delay); |
| 527 | read = parport_read_status(gc->pd->port) ^ 0x80; | 551 | read = parport_read_status(port) ^ 0x80; |
| 528 | for (j = 0; j < GC_MAX_DEVICES; j++) | 552 | for (j = 0; j < GC_MAX_DEVICES; j++) |
| 529 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; | 553 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; |
| 530 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); | 554 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); |
| @@ -544,24 +568,29 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES] | |||
| 544 | unsigned long flags; | 568 | unsigned long flags; |
| 545 | unsigned char data2[GC_MAX_DEVICES]; | 569 | unsigned char data2[GC_MAX_DEVICES]; |
| 546 | 570 | ||
| 547 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */ | 571 | /* Select pad */ |
| 572 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); | ||
| 548 | udelay(gc_psx_delay); | 573 | udelay(gc_psx_delay); |
| 549 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER); /* Deselect, begin command */ | 574 | /* Deselect, begin command */ |
| 575 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER); | ||
| 550 | udelay(gc_psx_delay); | 576 | udelay(gc_psx_delay); |
| 551 | 577 | ||
| 552 | local_irq_save(flags); | 578 | local_irq_save(flags); |
| 553 | 579 | ||
| 554 | gc_psx_command(gc, 0x01, data2); /* Access pad */ | 580 | gc_psx_command(gc, 0x01, data2); /* Access pad */ |
| 555 | gc_psx_command(gc, 0x42, id); /* Get device ids */ | 581 | gc_psx_command(gc, 0x42, id); /* Get device ids */ |
| 556 | gc_psx_command(gc, 0, data2); /* Dump status */ | 582 | gc_psx_command(gc, 0, data2); /* Dump status */ |
| 557 | 583 | ||
| 558 | for (i =0; i < GC_MAX_DEVICES; i++) /* Find the longest pad */ | 584 | /* Find the longest pad */ |
| 559 | if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) | 585 | for (i = 0; i < GC_MAX_DEVICES; i++) |
| 560 | && (GC_PSX_LEN(id[i]) > max_len) | 586 | if ((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) && |
| 561 | && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES)) | 587 | GC_PSX_LEN(id[i]) > max_len && |
| 588 | GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) { | ||
| 562 | max_len = GC_PSX_LEN(id[i]); | 589 | max_len = GC_PSX_LEN(id[i]); |
| 590 | } | ||
| 563 | 591 | ||
| 564 | for (i = 0; i < max_len; i++) { /* Read in all the data */ | 592 | /* Read in all the data */ |
| 593 | for (i = 0; i < max_len; i++) { | ||
| 565 | gc_psx_command(gc, 0, data2); | 594 | gc_psx_command(gc, 0, data2); |
| 566 | for (j = 0; j < GC_MAX_DEVICES; j++) | 595 | for (j = 0; j < GC_MAX_DEVICES; j++) |
| 567 | data[j][i] = data2[j]; | 596 | data[j][i] = data2[j]; |
| @@ -571,86 +600,99 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES] | |||
| 571 | 600 | ||
| 572 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); | 601 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); |
| 573 | 602 | ||
| 574 | for(i = 0; i < GC_MAX_DEVICES; i++) /* Set id's to the real value */ | 603 | /* Set id's to the real value */ |
| 604 | for (i = 0; i < GC_MAX_DEVICES; i++) | ||
| 575 | id[i] = GC_PSX_ID(id[i]); | 605 | id[i] = GC_PSX_ID(id[i]); |
| 576 | } | 606 | } |
| 577 | 607 | ||
| 578 | static void gc_psx_process_packet(struct gc *gc) | 608 | static void gc_psx_report_one(struct gc *gc, struct input_dev *dev, |
| 609 | unsigned char pad_type, unsigned char status_bit, | ||
| 610 | unsigned char *data) | ||
| 579 | { | 611 | { |
| 580 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; | 612 | int i; |
| 581 | unsigned char id[GC_MAX_DEVICES]; | ||
| 582 | struct input_dev *dev; | ||
| 583 | int i, j; | ||
| 584 | 613 | ||
| 585 | gc_psx_read_packet(gc, data, id); | 614 | switch (pad_type) { |
| 586 | 615 | ||
| 587 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 616 | case GC_PSX_RUMBLE: |
| 588 | 617 | ||
| 589 | dev = gc->dev[i]; | 618 | input_report_key(dev, BTN_THUMBL, ~data[0] & 0x04); |
| 590 | if (!dev) | 619 | input_report_key(dev, BTN_THUMBR, ~data[0] & 0x02); |
| 591 | continue; | ||
| 592 | 620 | ||
| 593 | switch (id[i]) { | 621 | case GC_PSX_NEGCON: |
| 622 | case GC_PSX_ANALOG: | ||
| 594 | 623 | ||
| 595 | case GC_PSX_RUMBLE: | 624 | if (gc->pads[GC_DDR] & status_bit) { |
| 625 | for (i = 0; i < 4; i++) | ||
| 626 | input_report_key(dev, gc_psx_ddr_btn[i], | ||
| 627 | ~data[0] & (0x10 << i)); | ||
| 628 | } else { | ||
| 629 | for (i = 0; i < 4; i++) | ||
| 630 | input_report_abs(dev, gc_psx_abs[i + 2], | ||
| 631 | data[i + 2]); | ||
| 596 | 632 | ||
| 597 | input_report_key(dev, BTN_THUMBL, ~data[i][0] & 0x04); | 633 | input_report_abs(dev, ABS_X, 128 + !(data[0] & 0x20) * 127 - !(data[0] & 0x80) * 128); |
| 598 | input_report_key(dev, BTN_THUMBR, ~data[i][0] & 0x02); | 634 | input_report_abs(dev, ABS_Y, 128 + !(data[0] & 0x40) * 127 - !(data[0] & 0x10) * 128); |
| 635 | } | ||
| 599 | 636 | ||
| 600 | case GC_PSX_NEGCON: | 637 | for (i = 0; i < 8; i++) |
| 601 | case GC_PSX_ANALOG: | 638 | input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); |
| 602 | 639 | ||
| 603 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | 640 | input_report_key(dev, BTN_START, ~data[0] & 0x08); |
| 604 | for(j = 0; j < 4; j++) | 641 | input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); |
| 605 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | ||
| 606 | } else { | ||
| 607 | for (j = 0; j < 4; j++) | ||
| 608 | input_report_abs(dev, gc_psx_abs[j + 2], data[i][j + 2]); | ||
| 609 | 642 | ||
| 610 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); | 643 | input_sync(dev); |
| 611 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); | ||
| 612 | } | ||
| 613 | 644 | ||
| 614 | for (j = 0; j < 8; j++) | 645 | break; |
| 615 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); | ||
| 616 | 646 | ||
| 617 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | 647 | case GC_PSX_NORMAL: |
| 618 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | 648 | if (gc->pads[GC_DDR] & status_bit) { |
| 649 | for (i = 0; i < 4; i++) | ||
| 650 | input_report_key(dev, gc_psx_ddr_btn[i], | ||
| 651 | ~data[0] & (0x10 << i)); | ||
| 652 | } else { | ||
| 653 | input_report_abs(dev, ABS_X, 128 + !(data[0] & 0x20) * 127 - !(data[0] & 0x80) * 128); | ||
| 654 | input_report_abs(dev, ABS_Y, 128 + !(data[0] & 0x40) * 127 - !(data[0] & 0x10) * 128); | ||
| 619 | 655 | ||
| 620 | input_sync(dev); | 656 | /* |
| 657 | * For some reason if the extra axes are left unset | ||
| 658 | * they drift. | ||
| 659 | * for (i = 0; i < 4; i++) | ||
| 660 | input_report_abs(dev, gc_psx_abs[i + 2], 128); | ||
| 661 | * This needs to be debugged properly, | ||
| 662 | * maybe fuzz processing needs to be done | ||
| 663 | * in input_sync() | ||
| 664 | * --vojtech | ||
| 665 | */ | ||
| 666 | } | ||
| 621 | 667 | ||
| 622 | break; | 668 | for (i = 0; i < 8; i++) |
| 669 | input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); | ||
| 623 | 670 | ||
| 624 | case GC_PSX_NORMAL: | 671 | input_report_key(dev, BTN_START, ~data[0] & 0x08); |
| 625 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | 672 | input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); |
| 626 | for(j = 0; j < 4; j++) | ||
| 627 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | ||
| 628 | } else { | ||
| 629 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); | ||
| 630 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); | ||
| 631 | 673 | ||
| 632 | /* for some reason if the extra axes are left unset they drift */ | 674 | input_sync(dev); |
| 633 | /* for (j = 0; j < 4; j++) | 675 | |
| 634 | input_report_abs(dev, gc_psx_abs[j + 2], 128); | 676 | break; |
| 635 | * This needs to be debugged properly, | ||
| 636 | * maybe fuzz processing needs to be done in input_sync() | ||
| 637 | * --vojtech | ||
| 638 | */ | ||
| 639 | } | ||
| 640 | 677 | ||
| 641 | for (j = 0; j < 8; j++) | 678 | case 0: /* not a pad, ignore */ |
| 642 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); | 679 | break; |
| 680 | } | ||
| 681 | } | ||
| 643 | 682 | ||
| 644 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | 683 | static void gc_psx_process_packet(struct gc *gc) |
| 645 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | 684 | { |
| 685 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; | ||
| 686 | unsigned char id[GC_MAX_DEVICES]; | ||
| 687 | int i; | ||
| 646 | 688 | ||
| 647 | input_sync(dev); | 689 | gc_psx_read_packet(gc, data, id); |
| 648 | 690 | ||
| 649 | break; | 691 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 650 | 692 | ||
| 651 | case 0: /* not a pad, ignore */ | 693 | if (gc->dev[i]) |
| 652 | break; | 694 | gc_psx_report_one(gc, gc->dev[i], |
| 653 | } | 695 | id[i], gc_status_bit[i], data[i]); |
| 654 | } | 696 | } |
| 655 | } | 697 | } |
| 656 | 698 | ||
| @@ -770,60 +812,61 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
| 770 | 812 | ||
| 771 | switch (pad_type) { | 813 | switch (pad_type) { |
| 772 | 814 | ||
| 773 | case GC_N64: | 815 | case GC_N64: |
| 774 | for (i = 0; i < 10; i++) | 816 | for (i = 0; i < 10; i++) |
| 775 | set_bit(gc_n64_btn[i], input_dev->keybit); | 817 | __set_bit(gc_n64_btn[i], input_dev->keybit); |
| 776 | |||
| 777 | for (i = 0; i < 2; i++) { | ||
| 778 | input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2); | ||
| 779 | input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); | ||
| 780 | } | ||
| 781 | |||
| 782 | err = gc_n64_init_ff(input_dev, idx); | ||
| 783 | if (err) { | ||
| 784 | printk(KERN_WARNING "gamecon.c: Failed to initiate rumble for N64 device %d\n", idx); | ||
| 785 | input_free_device(input_dev); | ||
| 786 | return err; | ||
| 787 | } | ||
| 788 | |||
| 789 | break; | ||
| 790 | |||
| 791 | case GC_SNESMOUSE: | ||
| 792 | set_bit(BTN_LEFT, input_dev->keybit); | ||
| 793 | set_bit(BTN_RIGHT, input_dev->keybit); | ||
| 794 | set_bit(REL_X, input_dev->relbit); | ||
| 795 | set_bit(REL_Y, input_dev->relbit); | ||
| 796 | break; | ||
| 797 | |||
| 798 | case GC_SNES: | ||
| 799 | for (i = 4; i < 8; i++) | ||
| 800 | set_bit(gc_snes_btn[i], input_dev->keybit); | ||
| 801 | case GC_NES: | ||
| 802 | for (i = 0; i < 4; i++) | ||
| 803 | set_bit(gc_snes_btn[i], input_dev->keybit); | ||
| 804 | break; | ||
| 805 | 818 | ||
| 806 | case GC_MULTI2: | 819 | for (i = 0; i < 2; i++) { |
| 807 | set_bit(BTN_THUMB, input_dev->keybit); | 820 | input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2); |
| 808 | case GC_MULTI: | 821 | input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); |
| 809 | set_bit(BTN_TRIGGER, input_dev->keybit); | 822 | } |
| 810 | break; | ||
| 811 | |||
| 812 | case GC_PSX: | ||
| 813 | for (i = 0; i < 6; i++) | ||
| 814 | input_set_abs_params(input_dev, gc_psx_abs[i], 4, 252, 0, 2); | ||
| 815 | for (i = 0; i < 12; i++) | ||
| 816 | set_bit(gc_psx_btn[i], input_dev->keybit); | ||
| 817 | |||
| 818 | break; | ||
| 819 | 823 | ||
| 820 | case GC_DDR: | 824 | err = gc_n64_init_ff(input_dev, idx); |
| 821 | for (i = 0; i < 4; i++) | 825 | if (err) { |
| 822 | set_bit(gc_psx_ddr_btn[i], input_dev->keybit); | 826 | printk(KERN_WARNING "gamecon.c: Failed to initiate rumble for N64 device %d\n", idx); |
| 823 | for (i = 0; i < 12; i++) | 827 | input_free_device(input_dev); |
| 824 | set_bit(gc_psx_btn[i], input_dev->keybit); | 828 | return err; |
| 829 | } | ||
| 825 | 830 | ||
| 826 | break; | 831 | break; |
| 832 | |||
| 833 | case GC_SNESMOUSE: | ||
| 834 | __set_bit(BTN_LEFT, input_dev->keybit); | ||
| 835 | __set_bit(BTN_RIGHT, input_dev->keybit); | ||
| 836 | __set_bit(REL_X, input_dev->relbit); | ||
| 837 | __set_bit(REL_Y, input_dev->relbit); | ||
| 838 | break; | ||
| 839 | |||
| 840 | case GC_SNES: | ||
| 841 | for (i = 4; i < 8; i++) | ||
| 842 | __set_bit(gc_snes_btn[i], input_dev->keybit); | ||
| 843 | case GC_NES: | ||
| 844 | for (i = 0; i < 4; i++) | ||
| 845 | __set_bit(gc_snes_btn[i], input_dev->keybit); | ||
| 846 | break; | ||
| 847 | |||
| 848 | case GC_MULTI2: | ||
| 849 | __set_bit(BTN_THUMB, input_dev->keybit); | ||
| 850 | case GC_MULTI: | ||
| 851 | __set_bit(BTN_TRIGGER, input_dev->keybit); | ||
| 852 | break; | ||
| 853 | |||
| 854 | case GC_PSX: | ||
| 855 | for (i = 0; i < 6; i++) | ||
| 856 | input_set_abs_params(input_dev, | ||
| 857 | gc_psx_abs[i], 4, 252, 0, 2); | ||
| 858 | for (i = 0; i < 12; i++) | ||
| 859 | __set_bit(gc_psx_btn[i], input_dev->keybit); | ||
| 860 | |||
| 861 | break; | ||
| 862 | |||
| 863 | case GC_DDR: | ||
| 864 | for (i = 0; i < 4; i++) | ||
| 865 | __set_bit(gc_psx_ddr_btn[i], input_dev->keybit); | ||
| 866 | for (i = 0; i < 12; i++) | ||
| 867 | __set_bit(gc_psx_btn[i], input_dev->keybit); | ||
| 868 | |||
| 869 | break; | ||
| 827 | } | 870 | } |
| 828 | 871 | ||
| 829 | return 0; | 872 | return 0; |
| @@ -860,9 +903,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
| 860 | 903 | ||
| 861 | mutex_init(&gc->mutex); | 904 | mutex_init(&gc->mutex); |
| 862 | gc->pd = pd; | 905 | gc->pd = pd; |
| 863 | init_timer(&gc->timer); | 906 | setup_timer(&gc->timer, gc_timer, (long) gc); |
| 864 | gc->timer.data = (long) gc; | ||
| 865 | gc->timer.function = gc_timer; | ||
| 866 | 907 | ||
| 867 | for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { | 908 | for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { |
| 868 | if (!pads[i]) | 909 | if (!pads[i]) |
