diff -urN oldtree/drivers/input/Kconfig newtree/drivers/input/Kconfig --- oldtree/drivers/input/Kconfig 2006-10-05 15:26:55.000000000 -0400 +++ newtree/drivers/input/Kconfig 2006-10-06 18:04:20.000000000 -0400 @@ -100,6 +100,21 @@ To compile this driver as a module, choose M here: the module will be called joydev. +config INPUT_JOYDEV_ANALOGTODIGITAL + bool "Analog to Digital [fix for the Joy Axis Problem]" + depends on INPUT_JOYDEV + default "n" + ---help--- + Say Y here if you want the moves of analog axis to be transferred + into digital presses. It it useful when you own an USB + GameConsole->PC converter suffering from the Joy Axis problem. This + is a mainly fix for dancing mats, if they are detected as analogs + the opposite directional buttons cannot be pressed, this fixes + the problem by simulating the digital behaviour aside from the + standard one. + + If unsure, say N. + config INPUT_TSDEV tristate "Touchscreen interface" ---help--- diff -urN oldtree/drivers/input/joydev.c newtree/drivers/input/joydev.c --- oldtree/drivers/input/joydev.c 2006-10-05 15:26:55.000000000 -0400 +++ newtree/drivers/input/joydev.c 2006-10-06 18:06:31.000000000 -0400 @@ -88,6 +88,28 @@ static void joydev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) { +#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL + + #define JOYDEV_LOW 0 + #define JOYDEV_MID 127 + #define JOYDEV_BOTH 128 + #define JOYDEV_HIGH 255 + #define JOYDEV_UP 24 + #define JOYDEV_RIGHT 25 + #define JOYDEV_DOWN 26 + #define JOYDEV_LEFT 27 + + /* for converters supporting 2 pads at a time */ + #define JOYDEV2_UP 28 + #define JOYDEV2_RIGHT 29 + #define JOYDEV2_DOWN 30 + #define JOYDEV2_LEFT 31 + + static int lastLeftRight = JOYDEV_MID, lastLeftRight2 = JOYDEV_MID; + static int lastUpDown = JOYDEV_MID, lastUpDown2 = JOYDEV_MID; + struct js_event event2, event3; + char omitanalog = 0; +#endif struct joydev *joydev = handle->private; struct joydev_list *list; struct js_event event; @@ -101,34 +123,368 @@ event.number = joydev->keymap[code - BTN_MISC]; event.value = value; break; - case EV_ABS: event.type = JS_EVENT_AXIS; event.number = joydev->absmap[code]; event.value = joydev_correct(value, joydev->corr + event.number); if (event.value == joydev->abs[event.number]) +#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL + omitanalog = 1; +#else return; +#endif joydev->abs[event.number] = event.value; - break; +#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL + event2.type = JS_EVENT_BUTTON; + event3.type = JS_EVENT_BUTTON; + event3.number = 0; + + event2.number = joydev->absmap[code]; + + if(event2.number == 0) { // Left-Right + if(value == JOYDEV_LOW) { + if(lastLeftRight == JOYDEV_MID) { + event2.number = JOYDEV_LEFT; + event2.value = 1; + } + else if(lastLeftRight == JOYDEV_BOTH) { + event2.number = JOYDEV_RIGHT; + event2.value = 0; + } + else if(lastLeftRight == JOYDEV_HIGH) { + event2.number = JOYDEV_LEFT; + event2.value = 1; + event3.number = JOYDEV_RIGHT; + event3.value = 0; + } + } + else if(value == JOYDEV_MID) { + if(lastLeftRight == JOYDEV_LOW) { + event2.number = JOYDEV_LEFT; + event2.value = 0; + } + else if(lastLeftRight == JOYDEV_HIGH) { + event2.number = JOYDEV_RIGHT; + event2.value = 0; + } + else if(lastLeftRight == JOYDEV_BOTH) { + event2.number = JOYDEV_LEFT; + event2.value = 0; + event3.number = JOYDEV_RIGHT; + event3.value = 0; + } + } + else if(value == JOYDEV_BOTH) { + if(lastLeftRight == JOYDEV_LOW) { + event2.number = JOYDEV_RIGHT; + event2.value = 1; + } + else if(lastLeftRight == JOYDEV_HIGH) { + event2.number = JOYDEV_LEFT; + event2.value = 1; + } + else if(lastLeftRight == JOYDEV_MID) { + event2.number = JOYDEV_LEFT; + event2.value = 1; + event3.number = JOYDEV_RIGHT; + event3.value = 1; + } + } + else if(value == JOYDEV_HIGH) { + if(lastLeftRight == JOYDEV_MID) { + event2.number = JOYDEV_RIGHT; + event2.value = 1; + } + else if(lastLeftRight == JOYDEV_BOTH) { + event2.number = JOYDEV_LEFT; + event2.value = 0; + } + else if(lastLeftRight == JOYDEV_LOW) { + event2.number = JOYDEV_LEFT; + event2.value = 0; + event3.number = JOYDEV_RIGHT; + event3.value = 1; + } + } + else { + printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value); + } + lastLeftRight = value; + } + else if(event2.number == 4) { // Left-Right for 2nd pad + if(value == JOYDEV_LOW) { + if(lastLeftRight2 == JOYDEV_MID) { + event2.number = JOYDEV2_LEFT; + event2.value = 1; + } + else if(lastLeftRight2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_RIGHT; + event2.value = 0; + } + else if(lastLeftRight2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_LEFT; + event2.value = 1; + event3.number = JOYDEV2_RIGHT; + event3.value = 0; + } + } + else if(value == JOYDEV_MID) { + if(lastLeftRight2 == JOYDEV_LOW) { + event2.number = JOYDEV2_LEFT; + event2.value = 0; + } + else if(lastLeftRight2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_RIGHT; + event2.value = 0; + } + else if(lastLeftRight2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_LEFT; + event2.value = 0; + event3.number = JOYDEV2_RIGHT; + event3.value = 0; + } + } + else if(value == JOYDEV_BOTH) { + if(lastLeftRight2 == JOYDEV_LOW) { + event2.number = JOYDEV2_RIGHT; + event2.value = 1; + } + else if(lastLeftRight2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_LEFT; + event2.value = 1; + } + else if(lastLeftRight2 == JOYDEV_MID) { + event2.number = JOYDEV2_LEFT; + event2.value = 1; + event3.number = JOYDEV2_RIGHT; + event3.value = 1; + } + } + else if(value == JOYDEV_HIGH) { + if(lastLeftRight2 == JOYDEV_MID) { + event2.number = JOYDEV2_RIGHT; + event2.value = 1; + } + else if(lastLeftRight2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_LEFT; + event2.value = 0; + } + else if(lastLeftRight2 == JOYDEV_LOW) { + event2.number = JOYDEV2_LEFT; + event2.value = 0; + event3.number = JOYDEV2_RIGHT; + event3.value = 1; + } + } + else { + printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value); + } + lastLeftRight2 = value; + } + else if(event2.number == 1) { // Up-Down + if(value == JOYDEV_LOW) { + if(lastUpDown == JOYDEV_MID) { + event2.number = JOYDEV_DOWN; + event2.value = 1; + } + else if(lastUpDown == JOYDEV_BOTH) { + event2.number = JOYDEV_UP; + event2.value = 0; + } + else if(lastUpDown == JOYDEV_HIGH) { + event2.number = JOYDEV_DOWN; + event2.value = 1; + event3.number = JOYDEV_UP; + event3.value = 0; + } + } + else if(value == JOYDEV_MID) { + if(lastUpDown == JOYDEV_LOW) { + event2.number = JOYDEV_DOWN; + event2.value = 0; + } + else if(lastUpDown == JOYDEV_HIGH) { + event2.number = JOYDEV_UP; + event2.value = 0; + } + else if(lastUpDown == JOYDEV_BOTH) { + event2.number = JOYDEV_DOWN; + event2.value = 0; + event3.number = JOYDEV_UP; + event3.value = 0; + } + } + else if(value == JOYDEV_BOTH) { + if(lastUpDown == JOYDEV_LOW) { + event2.number = JOYDEV_UP; + event2.value = 1; + } + else if(lastUpDown == JOYDEV_HIGH) { + event2.number = JOYDEV_DOWN; + event2.value = 1; + } + else if(lastUpDown == JOYDEV_MID) { + event2.number = JOYDEV_DOWN; + event2.value = 1; + event3.number = JOYDEV_UP; + event3.value = 1; + } + } + else if(value == JOYDEV_HIGH) { + if(lastUpDown == JOYDEV_MID) { + event2.number = JOYDEV_UP; + event2.value = 1; + } + else if(lastUpDown == JOYDEV_BOTH) { + event2.number = JOYDEV_DOWN; + event2.value = 0; + } + else if(lastUpDown == JOYDEV_LOW) { + event2.number = JOYDEV_DOWN; + event2.value = 0; + event3.number = JOYDEV_UP; + event3.value = 1; + } + } + else { + printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value); + } + lastUpDown = value; + } + else if(event2.number == 7) { // Up-Down for 2nd pad + if(value == JOYDEV_LOW) { + if(lastUpDown2 == JOYDEV_MID) { + event2.number = JOYDEV2_DOWN; + event2.value = 1; + } + else if(lastUpDown2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_UP; + event2.value = 0; + } + else if(lastUpDown2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_DOWN; + event2.value = 1; + event3.number = JOYDEV2_UP; + event3.value = 0; + } + } + else if(value == JOYDEV_MID) { + if(lastUpDown2 == JOYDEV_LOW) { + event2.number = JOYDEV2_DOWN; + event2.value = 0; + } + else if(lastUpDown2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_UP; + event2.value = 0; + } + else if(lastUpDown2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_DOWN; + event2.value = 0; + event3.number = JOYDEV2_UP; + event3.value = 0; + } + } + else if(value == JOYDEV_BOTH) { + if(lastUpDown2 == JOYDEV_LOW) { + event2.number = JOYDEV2_UP; + event2.value = 1; + } + else if(lastUpDown2 == JOYDEV_HIGH) { + event2.number = JOYDEV2_DOWN; + event2.value = 1; + } + else if(lastUpDown2 == JOYDEV_MID) { + event2.number = JOYDEV2_DOWN; + event2.value = 1; + event3.number = JOYDEV2_UP; + event3.value = 1; + } + } + else if(value == JOYDEV_HIGH) { + if(lastUpDown2 == JOYDEV_MID) { + event2.number = JOYDEV2_UP; + event2.value = 1; + } + else if(lastUpDown2 == JOYDEV_BOTH) { + event2.number = JOYDEV2_DOWN; + event2.value = 0; + } + else if(lastUpDown2 == JOYDEV_LOW) { + event2.number = JOYDEV2_DOWN; + event2.value = 0; + event3.number = JOYDEV2_UP; + event3.value = 1; + } + } + else { + printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value); + } + lastUpDown2 = value; + } + else { + printk("joydev: not standard axis %i - controller not supported\n", event.number); + break; + } + event2.time = jiffies_to_msecs(jiffies); + list_for_each_entry(list, &joydev->list, node) { + memcpy(list->buffer + list->head, &event2, sizeof(struct js_event)); + + if (list->startup == joydev->nabs + joydev->nkey) + if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1))) + list->startup = 0; + kill_fasync(&list->fasync, SIGIO, POLL_IN); + } + + if(event3.number != 0) + { + event3.time = event2.time; + list_for_each_entry(list, &joydev->list, node) { + memcpy(list->buffer + list->head, &event3, sizeof(struct js_event)); + + if (list->startup == joydev->nabs + joydev->nkey) + if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1))) + list->startup = 0; + kill_fasync(&list->fasync, SIGIO, POLL_IN); + } + } +#endif + break; default: return; } +#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL + if(!omitanalog) + { + event.time = jiffies_to_msecs(jiffies); + list_for_each_entry(list, &joydev->list, node) { - event.time = jiffies_to_msecs(jiffies); + memcpy(list->buffer + list->head, &event, sizeof(struct js_event)); - list_for_each_entry(list, &joydev->list, node) { + if (list->startup == joydev->nabs + joydev->nkey) + if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1))) + list->startup = 0; + kill_fasync(&list->fasync, SIGIO, POLL_IN); + } + } + wake_up_interruptible(&joydev->wait); +#endif +#ifndef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL + event.time = jiffies_to_msecs(jiffies); - memcpy(list->buffer + list->head, &event, sizeof(struct js_event)); + list_for_each_entry(list, &joydev->list, node) { - if (list->startup == joydev->nabs + joydev->nkey) - if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1))) - list->startup = 0; + memcpy(list->buffer + list->head, &event, sizeof(struct js_event)); - kill_fasync(&list->fasync, SIGIO, POLL_IN); - } + if (list->startup == joydev->nabs + joydev->nkey) + if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1))) + list->startup = 0; - wake_up_interruptible(&joydev->wait); + kill_fasync(&list->fasync, SIGIO, POLL_IN); + } + + wake_up_interruptible(&joydev->wait); +#endif } static int joydev_fasync(int fd, struct file *file, int on) @@ -567,6 +923,10 @@ joydev_table[minor] = joydev; + printk("Podlaczamy joya: %i klawiszy\n", joydev->nkey); + + joydev->nkey = 32; // hack for broken psx adaptors to work properly with dance mats + return 0; err_remove_link: