Lines Matching full:analog
6 * Analog joystick and gamepad driver for Linux
37 #define DRIVER_DESC "Analog joystick and gamepad driver"
57 MODULE_PARM_DESC(map, "Describes analog joysticks type/capabilities");
109 struct analog { struct
119 struct analog analog[2]; argument
195 * analog_decode() decodes analog joystick data and reports input events.
198 static void analog_decode(struct analog *analog, int *axes, int *initial, int buttons) in analog_decode() argument
200 struct input_dev *dev = analog->dev; in analog_decode()
203 if (analog->mask & ANALOG_HAT_FCS) in analog_decode()
211 if (analog->mask & (0x10 << i)) in analog_decode()
212 input_report_key(dev, analog->buttons[j++], (buttons >> i) & 1); in analog_decode()
214 if (analog->mask & ANALOG_HBTN_CHF) in analog_decode()
216 input_report_key(dev, analog->buttons[j++], (buttons >> (i + 10)) & 1); in analog_decode()
218 if (analog->mask & ANALOG_BTN_TL) in analog_decode()
220 if (analog->mask & ANALOG_BTN_TR) in analog_decode()
222 if (analog->mask & ANALOG_BTN_TL2) in analog_decode()
224 if (analog->mask & ANALOG_BTN_TR2) in analog_decode()
228 if (analog->mask & (1 << i)) in analog_decode()
232 if (analog->mask & analog_exts[i]) { in analog_decode()
243 * analog_cooked_read() reads analog joystick data.
325 * analog_poll() repeatedly polls the Analog joysticks.
333 char saitek = !!(port->analog[0].mask & ANALOG_SAITEK); in analog_poll()
334 char chf = !!(port->analog[0].mask & ANALOG_ANY_CHF); in analog_poll()
354 if (port->analog[i].mask) in analog_poll()
355 analog_decode(port->analog + i, port->axes, port->initial, port->buttons); in analog_poll()
429 * analog_name() constructs a name for an analog joystick.
432 static void analog_name(struct analog *analog) in analog_name() argument
434 snprintf(analog->name, sizeof(analog->name), "Analog %d-axis %d-button", in analog_name()
435 hweight8(analog->mask & ANALOG_AXES_STD), in analog_name()
436 hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & ANALOG_BTNS_CHF) * 2 + in analog_name()
437 hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + !!(analog->mask & ANALOG_HBTN_CHF) * 4); in analog_name()
439 if (analog->mask & ANALOG_HATS_ALL) in analog_name()
440 snprintf(analog->name, sizeof(analog->name), "%s %d-hat", in analog_name()
441 analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); in analog_name()
443 if (analog->mask & ANALOG_HAT_FCS) in analog_name()
444 strlcat(analog->name, " FCS", sizeof(analog->name)); in analog_name()
445 if (analog->mask & ANALOG_ANY_CHF) in analog_name()
446 strlcat(analog->name, (analog->mask & ANALOG_SAITEK) ? " Saitek" : " CHF", in analog_name()
447 sizeof(analog->name)); in analog_name()
449 strlcat(analog->name, (analog->mask & ANALOG_GAMEPAD) ? " gamepad": " joystick", in analog_name()
450 sizeof(analog->name)); in analog_name()
457 static int analog_init_device(struct analog_port *port, struct analog *analog, int index) in analog_init_device() argument
463 analog_name(analog); in analog_init_device()
464 snprintf(analog->phys, sizeof(analog->phys), in analog_init_device()
466 analog->buttons = (analog->mask & ANALOG_GAMEPAD) ? analog_pad_btn : analog_joy_btn; in analog_init_device()
468 analog->dev = input_dev = input_allocate_device(); in analog_init_device()
472 input_dev->name = analog->name; in analog_init_device()
473 input_dev->phys = analog->phys; in analog_init_device()
476 input_dev->id.product = analog->mask >> 4; in analog_init_device()
488 if (analog->mask & (1 << i)) { in analog_init_device()
501 if (analog->mask & ANALOG_SAITEK) { in analog_init_device()
512 if (analog->mask & analog_exts[i]) in analog_init_device()
519 if (analog->mask & (0x10 << i)) in analog_init_device()
520 set_bit(analog->buttons[j++], input_dev->keybit); in analog_init_device()
522 if (analog->mask & ANALOG_BTNS_CHF) in analog_init_device()
524 set_bit(analog->buttons[j++], input_dev->keybit); in analog_init_device()
526 if (analog->mask & ANALOG_HBTN_CHF) in analog_init_device()
528 set_bit(analog->buttons[j++], input_dev->keybit); in analog_init_device()
531 if (analog->mask & (ANALOG_BTN_TL << i)) in analog_init_device()
534 analog_decode(analog, port->axes, port->initial, port->buttons); in analog_init_device()
536 error = input_register_device(analog->dev); in analog_init_device()
538 input_free_device(analog->dev); in analog_init_device()
552 struct analog *analog = port->analog; in analog_init_masks() local
559 printk(KERN_WARNING "analog.c: Unknown joystick device found " in analog_init_masks()
560 "(data=%#x, %s), probably not analog joystick.\n", in analog_init_masks()
568 analog[0].mask = i & 0xfffff; in analog_init_masks()
570 analog[0].mask &= ~(ANALOG_AXES_STD | ANALOG_HAT_FCS | ANALOG_BTNS_GAMEPAD) in analog_init_masks()
574 analog[0].mask &= ~(ANALOG_HAT2_CHF) in analog_init_masks()
575 | ((analog[0].mask & ANALOG_HBTN_CHF) ? 0 : ANALOG_HAT2_CHF); in analog_init_masks()
577 analog[0].mask &= ~(ANALOG_THROTTLE | ANALOG_BTN_TR | ANALOG_BTN_TR2) in analog_init_masks()
578 | ((~analog[0].mask & ANALOG_HAT_FCS) >> 8) in analog_init_masks()
579 | ((~analog[0].mask & ANALOG_HAT_FCS) << 2) in analog_init_masks()
580 | ((~analog[0].mask & ANALOG_HAT_FCS) << 4); in analog_init_masks()
582 analog[0].mask &= ~(ANALOG_THROTTLE | ANALOG_RUDDER) in analog_init_masks()
583 | (((~analog[0].mask & ANALOG_BTNS_TLR ) >> 10) in analog_init_masks()
584 & ((~analog[0].mask & ANALOG_BTNS_TLR2) >> 12)); in analog_init_masks()
586 analog[1].mask = ((i >> 20) & 0xff) | ((i >> 12) & 0xf0000); in analog_init_masks()
588 analog[1].mask &= (analog[0].mask & ANALOG_EXTENSIONS) ? ANALOG_GAMEPAD in analog_init_masks()
589 : (((ANALOG_BTNS_STD | port->mask) & ~analog[0].mask) | ANALOG_GAMEPAD); in analog_init_masks()
595 if ((analog[0].mask & 0x7) == 0x7) max[2] = (max[0] + max[1]) >> 1; in analog_init_masks()
596 if ((analog[0].mask & 0xb) == 0xb) max[3] = (max[0] + max[1]) >> 1; in analog_init_masks()
597 if ((analog[0].mask & ANALOG_BTN_TL) && !(analog[0].mask & ANALOG_BTN_TL2)) max[2] >>= 1; in analog_init_masks()
598 if ((analog[0].mask & ANALOG_BTN_TR) && !(analog[0].mask & ANALOG_BTN_TR2)) max[3] >>= 1; in analog_init_masks()
599 if ((analog[0].mask & ANALOG_HAT_FCS)) max[3] >>= 1; in analog_init_masks()
607 return -!(analog[0].mask || analog[1].mask); in analog_init_masks()
694 if (port->analog[i].mask) { in analog_connect()
695 err = analog_init_device(port, port->analog + i, i); in analog_connect()
703 if (port->analog[i].mask) in analog_connect()
704 input_unregister_device(port->analog[i].dev); in analog_connect()
717 if (port->analog[i].mask) in analog_disconnect()
718 input_unregister_device(port->analog[i].dev); in analog_disconnect()
721 printk(KERN_INFO "analog.c: %d out of %d reads (%d%%) on %s failed\n", in analog_disconnect()
766 printk(KERN_WARNING "analog.c: Bad config for port %d - \"%s\"\n", i, js[i]); in analog_parse_options()
779 .name = "analog",