1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2006,2007 Daniel Mack, Tim Ruetz
6 #include <linux/device.h>
8 #include <linux/init.h>
10 #include <linux/usb/input.h>
11 #include <sound/core.h>
12 #include <sound/pcm.h>
17 static const unsigned short keycode_ak1
[] = { KEY_C
, KEY_B
, KEY_A
};
18 static const unsigned short keycode_rk2
[] = { KEY_1
, KEY_2
, KEY_3
, KEY_4
,
19 KEY_5
, KEY_6
, KEY_7
};
20 static const unsigned short keycode_rk3
[] = { KEY_1
, KEY_2
, KEY_3
, KEY_4
,
21 KEY_5
, KEY_6
, KEY_7
, KEY_8
, KEY_9
};
23 static const unsigned short keycode_kore
[] = {
24 KEY_FN_F1
, /* "menu" */
25 KEY_FN_F7
, /* "lcd backlight */
26 KEY_FN_F2
, /* "control" */
27 KEY_FN_F3
, /* "enter" */
28 KEY_FN_F4
, /* "view" */
29 KEY_FN_F5
, /* "esc" */
30 KEY_FN_F6
, /* "sound" */
31 KEY_FN_F8
, /* array spacer, never triggered. */
36 KEY_SOUND
, /* "listen" */
40 BTN_4
, /* 8 softkeys */
48 KEY_BRL_DOT4
, /* touch sensitive knobs */
58 #define MASCHINE_BUTTONS (42)
59 #define MASCHINE_BUTTON(X) ((X) + BTN_MISC)
60 #define MASCHINE_PADS (16)
61 #define MASCHINE_PAD(X) ((X) + ABS_PRESSURE)
63 static const unsigned short keycode_maschine
[] = {
64 MASCHINE_BUTTON(40), /* mute */
65 MASCHINE_BUTTON(39), /* solo */
66 MASCHINE_BUTTON(38), /* select */
67 MASCHINE_BUTTON(37), /* duplicate */
68 MASCHINE_BUTTON(36), /* navigate */
69 MASCHINE_BUTTON(35), /* pad mode */
70 MASCHINE_BUTTON(34), /* pattern */
71 MASCHINE_BUTTON(33), /* scene */
72 KEY_RESERVED
, /* spacer */
74 MASCHINE_BUTTON(30), /* rec */
75 MASCHINE_BUTTON(31), /* erase */
76 MASCHINE_BUTTON(32), /* shift */
77 MASCHINE_BUTTON(28), /* grid */
78 MASCHINE_BUTTON(27), /* > */
79 MASCHINE_BUTTON(26), /* < */
80 MASCHINE_BUTTON(25), /* restart */
82 MASCHINE_BUTTON(21), /* E */
83 MASCHINE_BUTTON(22), /* F */
84 MASCHINE_BUTTON(23), /* G */
85 MASCHINE_BUTTON(24), /* H */
86 MASCHINE_BUTTON(20), /* D */
87 MASCHINE_BUTTON(19), /* C */
88 MASCHINE_BUTTON(18), /* B */
89 MASCHINE_BUTTON(17), /* A */
91 MASCHINE_BUTTON(0), /* control */
92 MASCHINE_BUTTON(2), /* browse */
93 MASCHINE_BUTTON(4), /* < */
94 MASCHINE_BUTTON(6), /* snap */
95 MASCHINE_BUTTON(7), /* autowrite */
96 MASCHINE_BUTTON(5), /* > */
97 MASCHINE_BUTTON(3), /* sampling */
98 MASCHINE_BUTTON(1), /* step */
100 MASCHINE_BUTTON(15), /* 8 softkeys */
109 MASCHINE_BUTTON(16), /* note repeat */
110 MASCHINE_BUTTON(29) /* play */
113 #define KONTROLX1_INPUTS (40)
114 #define KONTROLS4_BUTTONS (12 * 8)
115 #define KONTROLS4_AXIS (46)
117 #define KONTROLS4_BUTTON(X) ((X) + BTN_MISC)
118 #define KONTROLS4_ABS(X) ((X) + ABS_HAT0X)
120 #define DEG90 (range / 2)
121 #define DEG180 (range)
122 #define DEG270 (DEG90 + DEG180)
123 #define DEG360 (DEG180 * 2)
124 #define HIGH_PEAK (268)
125 #define LOW_PEAK (-7)
127 /* some of these devices have endless rotation potentiometers
128 * built in which use two tapers, 90 degrees phase shifted.
129 * this algorithm decodes them to one single value, ranging
131 static unsigned int decode_erp(unsigned char a
, unsigned char b
)
133 int weight_a
, weight_b
;
136 int range
= HIGH_PEAK
- LOW_PEAK
;
137 int mid_value
= (HIGH_PEAK
+ LOW_PEAK
) / 2;
139 weight_b
= abs(mid_value
- a
) - (range
/ 2 - 100) / 2;
147 weight_a
= 100 - weight_b
;
150 /* 0..90 and 270..360 degrees */
151 pos_b
= b
- LOW_PEAK
+ DEG270
;
155 /* 90..270 degrees */
156 pos_b
= HIGH_PEAK
- b
+ DEG90
;
161 pos_a
= a
- LOW_PEAK
;
163 /* 180..360 degrees */
164 pos_a
= HIGH_PEAK
- a
+ DEG180
;
166 /* interpolate both slider values, depending on weight factors */
168 ret
= pos_a
* weight_a
+ pos_b
* weight_b
;
170 /* normalize to 0..999 */
190 static inline void snd_caiaq_input_report_abs(struct snd_usb_caiaqdev
*cdev
,
191 int axis
, const unsigned char *buf
,
194 input_report_abs(cdev
->input_dev
, axis
,
195 (buf
[offset
* 2] << 8) | buf
[offset
* 2 + 1]);
198 static void snd_caiaq_input_read_analog(struct snd_usb_caiaqdev
*cdev
,
199 const unsigned char *buf
,
202 struct input_dev
*input_dev
= cdev
->input_dev
;
204 switch (cdev
->chip
.usb_id
) {
205 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_RIGKONTROL2
):
206 snd_caiaq_input_report_abs(cdev
, ABS_X
, buf
, 2);
207 snd_caiaq_input_report_abs(cdev
, ABS_Y
, buf
, 0);
208 snd_caiaq_input_report_abs(cdev
, ABS_Z
, buf
, 1);
210 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_RIGKONTROL3
):
211 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER
):
212 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER2
):
213 snd_caiaq_input_report_abs(cdev
, ABS_X
, buf
, 0);
214 snd_caiaq_input_report_abs(cdev
, ABS_Y
, buf
, 1);
215 snd_caiaq_input_report_abs(cdev
, ABS_Z
, buf
, 2);
217 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
218 snd_caiaq_input_report_abs(cdev
, ABS_HAT0X
, buf
, 4);
219 snd_caiaq_input_report_abs(cdev
, ABS_HAT0Y
, buf
, 2);
220 snd_caiaq_input_report_abs(cdev
, ABS_HAT1X
, buf
, 6);
221 snd_caiaq_input_report_abs(cdev
, ABS_HAT1Y
, buf
, 1);
222 snd_caiaq_input_report_abs(cdev
, ABS_HAT2X
, buf
, 7);
223 snd_caiaq_input_report_abs(cdev
, ABS_HAT2Y
, buf
, 0);
224 snd_caiaq_input_report_abs(cdev
, ABS_HAT3X
, buf
, 5);
225 snd_caiaq_input_report_abs(cdev
, ABS_HAT3Y
, buf
, 3);
229 input_sync(input_dev
);
232 static void snd_caiaq_input_read_erp(struct snd_usb_caiaqdev
*cdev
,
233 const char *buf
, unsigned int len
)
235 struct input_dev
*input_dev
= cdev
->input_dev
;
238 switch (cdev
->chip
.usb_id
) {
239 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_AK1
):
240 i
= decode_erp(buf
[0], buf
[1]);
241 input_report_abs(input_dev
, ABS_X
, i
);
242 input_sync(input_dev
);
244 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER
):
245 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER2
):
246 i
= decode_erp(buf
[7], buf
[5]);
247 input_report_abs(input_dev
, ABS_HAT0X
, i
);
248 i
= decode_erp(buf
[12], buf
[14]);
249 input_report_abs(input_dev
, ABS_HAT0Y
, i
);
250 i
= decode_erp(buf
[15], buf
[13]);
251 input_report_abs(input_dev
, ABS_HAT1X
, i
);
252 i
= decode_erp(buf
[0], buf
[2]);
253 input_report_abs(input_dev
, ABS_HAT1Y
, i
);
254 i
= decode_erp(buf
[3], buf
[1]);
255 input_report_abs(input_dev
, ABS_HAT2X
, i
);
256 i
= decode_erp(buf
[8], buf
[10]);
257 input_report_abs(input_dev
, ABS_HAT2Y
, i
);
258 i
= decode_erp(buf
[11], buf
[9]);
259 input_report_abs(input_dev
, ABS_HAT3X
, i
);
260 i
= decode_erp(buf
[4], buf
[6]);
261 input_report_abs(input_dev
, ABS_HAT3Y
, i
);
262 input_sync(input_dev
);
265 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_MASCHINECONTROLLER
):
266 /* 4 under the left screen */
267 input_report_abs(input_dev
, ABS_HAT0X
, decode_erp(buf
[21], buf
[20]));
268 input_report_abs(input_dev
, ABS_HAT0Y
, decode_erp(buf
[15], buf
[14]));
269 input_report_abs(input_dev
, ABS_HAT1X
, decode_erp(buf
[9], buf
[8]));
270 input_report_abs(input_dev
, ABS_HAT1Y
, decode_erp(buf
[3], buf
[2]));
272 /* 4 under the right screen */
273 input_report_abs(input_dev
, ABS_HAT2X
, decode_erp(buf
[19], buf
[18]));
274 input_report_abs(input_dev
, ABS_HAT2Y
, decode_erp(buf
[13], buf
[12]));
275 input_report_abs(input_dev
, ABS_HAT3X
, decode_erp(buf
[7], buf
[6]));
276 input_report_abs(input_dev
, ABS_HAT3Y
, decode_erp(buf
[1], buf
[0]));
279 input_report_abs(input_dev
, ABS_RX
, decode_erp(buf
[17], buf
[16]));
281 input_report_abs(input_dev
, ABS_RY
, decode_erp(buf
[11], buf
[10]));
283 input_report_abs(input_dev
, ABS_RZ
, decode_erp(buf
[5], buf
[4]));
285 input_sync(input_dev
);
290 static void snd_caiaq_input_read_io(struct snd_usb_caiaqdev
*cdev
,
291 unsigned char *buf
, unsigned int len
)
293 struct input_dev
*input_dev
= cdev
->input_dev
;
294 unsigned short *keycode
= input_dev
->keycode
;
300 if (input_dev
->id
.product
== USB_PID_RIGKONTROL2
)
301 for (i
= 0; i
< len
; i
++)
304 for (i
= 0; i
< input_dev
->keycodemax
&& i
< len
* 8; i
++)
305 input_report_key(input_dev
, keycode
[i
],
306 buf
[i
/ 8] & (1 << (i
% 8)));
308 switch (cdev
->chip
.usb_id
) {
309 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER
):
310 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER2
):
311 input_report_abs(cdev
->input_dev
, ABS_MISC
, 255 - buf
[4]);
313 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
314 /* rotary encoders */
315 input_report_abs(cdev
->input_dev
, ABS_X
, buf
[5] & 0xf);
316 input_report_abs(cdev
->input_dev
, ABS_Y
, buf
[5] >> 4);
317 input_report_abs(cdev
->input_dev
, ABS_Z
, buf
[6] & 0xf);
318 input_report_abs(cdev
->input_dev
, ABS_MISC
, buf
[6] >> 4);
322 input_sync(input_dev
);
325 #define TKS4_MSGBLOCK_SIZE 16
327 static void snd_usb_caiaq_tks4_dispatch(struct snd_usb_caiaqdev
*cdev
,
328 const unsigned char *buf
,
331 struct device
*dev
= caiaqdev_to_dev(cdev
);
334 unsigned int i
, block_id
= (buf
[0] << 8) | buf
[1];
339 for (i
= 0; i
< KONTROLS4_BUTTONS
; i
++)
340 input_report_key(cdev
->input_dev
, KONTROLS4_BUTTON(i
),
341 (buf
[4 + (i
/ 8)] >> (i
% 8)) & 1);
346 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(36), buf
[9] | ((buf
[8] & 0x3) << 8));
348 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(37), buf
[13] | ((buf
[12] & 0x3) << 8));
350 /* rotary encoders */
351 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(38), buf
[3] & 0xf);
352 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(39), buf
[4] >> 4);
353 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(40), buf
[4] & 0xf);
354 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(41), buf
[5] >> 4);
355 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(42), buf
[5] & 0xf);
356 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(43), buf
[6] >> 4);
357 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(44), buf
[6] & 0xf);
358 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(45), buf
[7] >> 4);
359 input_report_abs(cdev
->input_dev
, KONTROLS4_ABS(46), buf
[7] & 0xf);
363 /* Volume Fader Channel D */
364 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(0), buf
, 1);
365 /* Volume Fader Channel B */
366 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(1), buf
, 2);
367 /* Volume Fader Channel A */
368 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(2), buf
, 3);
369 /* Volume Fader Channel C */
370 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(3), buf
, 4);
372 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(4), buf
, 6);
374 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(7), buf
, 7);
380 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(6), buf
, 3);
382 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(5), buf
, 4);
384 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(8), buf
, 6);
386 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(9), buf
, 7);
391 /* Wheel distance sensor L */
392 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(10), buf
, 1);
393 /* Wheel distance sensor R */
394 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(11), buf
, 2);
395 /* Channel D EQ - Filter */
396 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(12), buf
, 3);
397 /* Channel D EQ - Low */
398 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(13), buf
, 4);
399 /* Channel D EQ - Mid */
400 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(14), buf
, 5);
401 /* Channel D EQ - Hi */
402 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(15), buf
, 6);
404 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(16), buf
, 7);
410 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(17), buf
, 1);
412 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(18), buf
, 2);
414 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(19), buf
, 3);
415 /* Channel B EQ - Filter */
416 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(20), buf
, 4);
417 /* Channel B EQ - Low */
418 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(21), buf
, 5);
419 /* Channel B EQ - Mid */
420 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(22), buf
, 6);
421 /* Channel B EQ - Hi */
422 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(23), buf
, 7);
427 /* Channel A EQ - Filter */
428 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(24), buf
, 1);
429 /* Channel A EQ - Low */
430 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(25), buf
, 2);
431 /* Channel A EQ - Mid */
432 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(26), buf
, 3);
433 /* Channel A EQ - Hi */
434 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(27), buf
, 4);
435 /* Channel C EQ - Filter */
436 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(28), buf
, 5);
437 /* Channel C EQ - Low */
438 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(29), buf
, 6);
439 /* Channel C EQ - Mid */
440 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(30), buf
, 7);
445 /* Channel C EQ - Hi */
446 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(31), buf
, 1);
448 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(32), buf
, 2);
450 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(33), buf
, 3);
452 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(34), buf
, 4);
454 snd_caiaq_input_report_abs(cdev
, KONTROLS4_ABS(35), buf
, 5);
459 dev_dbg(dev
, "%s(): bogus block (id %d)\n",
464 len
-= TKS4_MSGBLOCK_SIZE
;
465 buf
+= TKS4_MSGBLOCK_SIZE
;
468 input_sync(cdev
->input_dev
);
471 #define MASCHINE_MSGBLOCK_SIZE 2
473 static void snd_usb_caiaq_maschine_dispatch(struct snd_usb_caiaqdev
*cdev
,
474 const unsigned char *buf
,
477 unsigned int i
, pad_id
;
478 __le16
*pressure
= (__le16
*) buf
;
480 for (i
= 0; i
< MASCHINE_PADS
; i
++) {
481 pad_id
= le16_to_cpu(*pressure
) >> 12;
482 input_report_abs(cdev
->input_dev
, MASCHINE_PAD(pad_id
),
483 le16_to_cpu(*pressure
) & 0xfff);
487 input_sync(cdev
->input_dev
);
490 static void snd_usb_caiaq_ep4_reply_dispatch(struct urb
*urb
)
492 struct snd_usb_caiaqdev
*cdev
= urb
->context
;
493 unsigned char *buf
= urb
->transfer_buffer
;
494 struct device
*dev
= &urb
->dev
->dev
;
497 if (urb
->status
|| !cdev
|| urb
!= cdev
->ep4_in_urb
)
500 switch (cdev
->chip
.usb_id
) {
501 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
502 if (urb
->actual_length
< 24)
506 snd_caiaq_input_read_io(cdev
, buf
+ 1, 7);
509 snd_caiaq_input_read_analog(cdev
, buf
+ 8, 16);
513 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLS4
):
514 snd_usb_caiaq_tks4_dispatch(cdev
, buf
, urb
->actual_length
);
517 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_MASCHINECONTROLLER
):
518 if (urb
->actual_length
< (MASCHINE_PADS
* MASCHINE_MSGBLOCK_SIZE
))
521 snd_usb_caiaq_maschine_dispatch(cdev
, buf
, urb
->actual_length
);
526 cdev
->ep4_in_urb
->actual_length
= 0;
527 ret
= usb_submit_urb(cdev
->ep4_in_urb
, GFP_ATOMIC
);
529 dev_err(dev
, "unable to submit urb. OOM!?\n");
532 static int snd_usb_caiaq_input_open(struct input_dev
*idev
)
534 struct snd_usb_caiaqdev
*cdev
= input_get_drvdata(idev
);
539 switch (cdev
->chip
.usb_id
) {
540 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
541 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLS4
):
542 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_MASCHINECONTROLLER
):
543 if (usb_submit_urb(cdev
->ep4_in_urb
, GFP_KERNEL
) != 0)
551 static void snd_usb_caiaq_input_close(struct input_dev
*idev
)
553 struct snd_usb_caiaqdev
*cdev
= input_get_drvdata(idev
);
558 switch (cdev
->chip
.usb_id
) {
559 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
560 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLS4
):
561 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_MASCHINECONTROLLER
):
562 usb_kill_urb(cdev
->ep4_in_urb
);
567 void snd_usb_caiaq_input_dispatch(struct snd_usb_caiaqdev
*cdev
,
571 if (!cdev
->input_dev
|| len
< 1)
575 case EP1_CMD_READ_ANALOG
:
576 snd_caiaq_input_read_analog(cdev
, buf
+ 1, len
- 1);
578 case EP1_CMD_READ_ERP
:
579 snd_caiaq_input_read_erp(cdev
, buf
+ 1, len
- 1);
581 case EP1_CMD_READ_IO
:
582 snd_caiaq_input_read_io(cdev
, buf
+ 1, len
- 1);
587 int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev
*cdev
)
589 struct usb_device
*usb_dev
= cdev
->chip
.dev
;
590 struct input_dev
*input
;
593 input
= input_allocate_device();
597 usb_make_path(usb_dev
, cdev
->phys
, sizeof(cdev
->phys
));
598 strlcat(cdev
->phys
, "/input0", sizeof(cdev
->phys
));
600 input
->name
= cdev
->product_name
;
601 input
->phys
= cdev
->phys
;
602 usb_to_input_id(usb_dev
, &input
->id
);
603 input
->dev
.parent
= &usb_dev
->dev
;
605 input_set_drvdata(input
, cdev
);
607 switch (cdev
->chip
.usb_id
) {
608 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_RIGKONTROL2
):
609 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
610 input
->absbit
[0] = BIT_MASK(ABS_X
) | BIT_MASK(ABS_Y
) |
612 BUILD_BUG_ON(sizeof(cdev
->keycode
) < sizeof(keycode_rk2
));
613 memcpy(cdev
->keycode
, keycode_rk2
, sizeof(keycode_rk2
));
614 input
->keycodemax
= ARRAY_SIZE(keycode_rk2
);
615 input_set_abs_params(input
, ABS_X
, 0, 4096, 0, 10);
616 input_set_abs_params(input
, ABS_Y
, 0, 4096, 0, 10);
617 input_set_abs_params(input
, ABS_Z
, 0, 4096, 0, 10);
618 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 0);
620 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_RIGKONTROL3
):
621 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
622 input
->absbit
[0] = BIT_MASK(ABS_X
) | BIT_MASK(ABS_Y
) |
624 BUILD_BUG_ON(sizeof(cdev
->keycode
) < sizeof(keycode_rk3
));
625 memcpy(cdev
->keycode
, keycode_rk3
, sizeof(keycode_rk3
));
626 input
->keycodemax
= ARRAY_SIZE(keycode_rk3
);
627 input_set_abs_params(input
, ABS_X
, 0, 1024, 0, 10);
628 input_set_abs_params(input
, ABS_Y
, 0, 1024, 0, 10);
629 input_set_abs_params(input
, ABS_Z
, 0, 1024, 0, 10);
630 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 0);
632 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_AK1
):
633 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
634 input
->absbit
[0] = BIT_MASK(ABS_X
);
635 BUILD_BUG_ON(sizeof(cdev
->keycode
) < sizeof(keycode_ak1
));
636 memcpy(cdev
->keycode
, keycode_ak1
, sizeof(keycode_ak1
));
637 input
->keycodemax
= ARRAY_SIZE(keycode_ak1
);
638 input_set_abs_params(input
, ABS_X
, 0, 999, 0, 10);
639 snd_usb_caiaq_set_auto_msg(cdev
, 1, 0, 5);
641 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER
):
642 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_KORECONTROLLER2
):
643 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
644 input
->absbit
[0] = BIT_MASK(ABS_HAT0X
) | BIT_MASK(ABS_HAT0Y
) |
645 BIT_MASK(ABS_HAT1X
) | BIT_MASK(ABS_HAT1Y
) |
646 BIT_MASK(ABS_HAT2X
) | BIT_MASK(ABS_HAT2Y
) |
647 BIT_MASK(ABS_HAT3X
) | BIT_MASK(ABS_HAT3Y
) |
648 BIT_MASK(ABS_X
) | BIT_MASK(ABS_Y
) |
650 input
->absbit
[BIT_WORD(ABS_MISC
)] |= BIT_MASK(ABS_MISC
);
651 BUILD_BUG_ON(sizeof(cdev
->keycode
) < sizeof(keycode_kore
));
652 memcpy(cdev
->keycode
, keycode_kore
, sizeof(keycode_kore
));
653 input
->keycodemax
= ARRAY_SIZE(keycode_kore
);
654 input_set_abs_params(input
, ABS_HAT0X
, 0, 999, 0, 10);
655 input_set_abs_params(input
, ABS_HAT0Y
, 0, 999, 0, 10);
656 input_set_abs_params(input
, ABS_HAT1X
, 0, 999, 0, 10);
657 input_set_abs_params(input
, ABS_HAT1Y
, 0, 999, 0, 10);
658 input_set_abs_params(input
, ABS_HAT2X
, 0, 999, 0, 10);
659 input_set_abs_params(input
, ABS_HAT2Y
, 0, 999, 0, 10);
660 input_set_abs_params(input
, ABS_HAT3X
, 0, 999, 0, 10);
661 input_set_abs_params(input
, ABS_HAT3Y
, 0, 999, 0, 10);
662 input_set_abs_params(input
, ABS_X
, 0, 4096, 0, 10);
663 input_set_abs_params(input
, ABS_Y
, 0, 4096, 0, 10);
664 input_set_abs_params(input
, ABS_Z
, 0, 4096, 0, 10);
665 input_set_abs_params(input
, ABS_MISC
, 0, 255, 0, 1);
666 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 5);
668 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLX1
):
669 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
670 input
->absbit
[0] = BIT_MASK(ABS_HAT0X
) | BIT_MASK(ABS_HAT0Y
) |
671 BIT_MASK(ABS_HAT1X
) | BIT_MASK(ABS_HAT1Y
) |
672 BIT_MASK(ABS_HAT2X
) | BIT_MASK(ABS_HAT2Y
) |
673 BIT_MASK(ABS_HAT3X
) | BIT_MASK(ABS_HAT3Y
) |
674 BIT_MASK(ABS_X
) | BIT_MASK(ABS_Y
) |
676 input
->absbit
[BIT_WORD(ABS_MISC
)] |= BIT_MASK(ABS_MISC
);
677 BUILD_BUG_ON(sizeof(cdev
->keycode
) < KONTROLX1_INPUTS
);
678 for (i
= 0; i
< KONTROLX1_INPUTS
; i
++)
679 cdev
->keycode
[i
] = BTN_MISC
+ i
;
680 input
->keycodemax
= KONTROLX1_INPUTS
;
682 /* analog potentiometers */
683 input_set_abs_params(input
, ABS_HAT0X
, 0, 4096, 0, 10);
684 input_set_abs_params(input
, ABS_HAT0Y
, 0, 4096, 0, 10);
685 input_set_abs_params(input
, ABS_HAT1X
, 0, 4096, 0, 10);
686 input_set_abs_params(input
, ABS_HAT1Y
, 0, 4096, 0, 10);
687 input_set_abs_params(input
, ABS_HAT2X
, 0, 4096, 0, 10);
688 input_set_abs_params(input
, ABS_HAT2Y
, 0, 4096, 0, 10);
689 input_set_abs_params(input
, ABS_HAT3X
, 0, 4096, 0, 10);
690 input_set_abs_params(input
, ABS_HAT3Y
, 0, 4096, 0, 10);
692 /* rotary encoders */
693 input_set_abs_params(input
, ABS_X
, 0, 0xf, 0, 1);
694 input_set_abs_params(input
, ABS_Y
, 0, 0xf, 0, 1);
695 input_set_abs_params(input
, ABS_Z
, 0, 0xf, 0, 1);
696 input_set_abs_params(input
, ABS_MISC
, 0, 0xf, 0, 1);
698 cdev
->ep4_in_urb
= usb_alloc_urb(0, GFP_KERNEL
);
699 if (!cdev
->ep4_in_urb
) {
704 usb_fill_bulk_urb(cdev
->ep4_in_urb
, usb_dev
,
705 usb_rcvbulkpipe(usb_dev
, 0x4),
706 cdev
->ep4_in_buf
, EP4_BUFSIZE
,
707 snd_usb_caiaq_ep4_reply_dispatch
, cdev
);
708 ret
= usb_urb_ep_type_check(cdev
->ep4_in_urb
);
712 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 5);
716 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_TRAKTORKONTROLS4
):
717 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
718 BUILD_BUG_ON(sizeof(cdev
->keycode
) < KONTROLS4_BUTTONS
);
719 for (i
= 0; i
< KONTROLS4_BUTTONS
; i
++)
720 cdev
->keycode
[i
] = KONTROLS4_BUTTON(i
);
721 input
->keycodemax
= KONTROLS4_BUTTONS
;
723 for (i
= 0; i
< KONTROLS4_AXIS
; i
++) {
724 int axis
= KONTROLS4_ABS(i
);
725 input
->absbit
[BIT_WORD(axis
)] |= BIT_MASK(axis
);
728 /* 36 analog potentiometers and faders */
729 for (i
= 0; i
< 36; i
++)
730 input_set_abs_params(input
, KONTROLS4_ABS(i
), 0, 0xfff, 0, 10);
732 /* 2 encoder wheels */
733 input_set_abs_params(input
, KONTROLS4_ABS(36), 0, 0x3ff, 0, 1);
734 input_set_abs_params(input
, KONTROLS4_ABS(37), 0, 0x3ff, 0, 1);
736 /* 9 rotary encoders */
737 for (i
= 0; i
< 9; i
++)
738 input_set_abs_params(input
, KONTROLS4_ABS(38+i
), 0, 0xf, 0, 1);
740 cdev
->ep4_in_urb
= usb_alloc_urb(0, GFP_KERNEL
);
741 if (!cdev
->ep4_in_urb
) {
746 usb_fill_bulk_urb(cdev
->ep4_in_urb
, usb_dev
,
747 usb_rcvbulkpipe(usb_dev
, 0x4),
748 cdev
->ep4_in_buf
, EP4_BUFSIZE
,
749 snd_usb_caiaq_ep4_reply_dispatch
, cdev
);
750 ret
= usb_urb_ep_type_check(cdev
->ep4_in_urb
);
754 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 5);
758 case USB_ID(USB_VID_NATIVEINSTRUMENTS
, USB_PID_MASCHINECONTROLLER
):
759 input
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
760 input
->absbit
[0] = BIT_MASK(ABS_HAT0X
) | BIT_MASK(ABS_HAT0Y
) |
761 BIT_MASK(ABS_HAT1X
) | BIT_MASK(ABS_HAT1Y
) |
762 BIT_MASK(ABS_HAT2X
) | BIT_MASK(ABS_HAT2Y
) |
763 BIT_MASK(ABS_HAT3X
) | BIT_MASK(ABS_HAT3Y
) |
764 BIT_MASK(ABS_RX
) | BIT_MASK(ABS_RY
) |
767 BUILD_BUG_ON(sizeof(cdev
->keycode
) < sizeof(keycode_maschine
));
768 memcpy(cdev
->keycode
, keycode_maschine
, sizeof(keycode_maschine
));
769 input
->keycodemax
= ARRAY_SIZE(keycode_maschine
);
771 for (i
= 0; i
< MASCHINE_PADS
; i
++) {
772 input
->absbit
[0] |= MASCHINE_PAD(i
);
773 input_set_abs_params(input
, MASCHINE_PAD(i
), 0, 0xfff, 5, 10);
776 input_set_abs_params(input
, ABS_HAT0X
, 0, 999, 0, 10);
777 input_set_abs_params(input
, ABS_HAT0Y
, 0, 999, 0, 10);
778 input_set_abs_params(input
, ABS_HAT1X
, 0, 999, 0, 10);
779 input_set_abs_params(input
, ABS_HAT1Y
, 0, 999, 0, 10);
780 input_set_abs_params(input
, ABS_HAT2X
, 0, 999, 0, 10);
781 input_set_abs_params(input
, ABS_HAT2Y
, 0, 999, 0, 10);
782 input_set_abs_params(input
, ABS_HAT3X
, 0, 999, 0, 10);
783 input_set_abs_params(input
, ABS_HAT3Y
, 0, 999, 0, 10);
784 input_set_abs_params(input
, ABS_RX
, 0, 999, 0, 10);
785 input_set_abs_params(input
, ABS_RY
, 0, 999, 0, 10);
786 input_set_abs_params(input
, ABS_RZ
, 0, 999, 0, 10);
788 cdev
->ep4_in_urb
= usb_alloc_urb(0, GFP_KERNEL
);
789 if (!cdev
->ep4_in_urb
) {
794 usb_fill_bulk_urb(cdev
->ep4_in_urb
, usb_dev
,
795 usb_rcvbulkpipe(usb_dev
, 0x4),
796 cdev
->ep4_in_buf
, EP4_BUFSIZE
,
797 snd_usb_caiaq_ep4_reply_dispatch
, cdev
);
798 ret
= usb_urb_ep_type_check(cdev
->ep4_in_urb
);
802 snd_usb_caiaq_set_auto_msg(cdev
, 1, 10, 5);
806 /* no input methods supported on this device */
811 input
->open
= snd_usb_caiaq_input_open
;
812 input
->close
= snd_usb_caiaq_input_close
;
813 input
->keycode
= cdev
->keycode
;
814 input
->keycodesize
= sizeof(unsigned short);
815 for (i
= 0; i
< input
->keycodemax
; i
++)
816 __set_bit(cdev
->keycode
[i
], input
->keybit
);
818 cdev
->input_dev
= input
;
820 ret
= input_register_device(input
);
827 input_free_device(input
);
828 cdev
->input_dev
= NULL
;
832 void snd_usb_caiaq_input_disconnect(struct snd_usb_caiaqdev
*cdev
)
834 if (!cdev
|| !cdev
->input_dev
)
837 usb_kill_urb(cdev
->ep4_in_urb
);
838 input_unregister_device(cdev
->input_dev
);
841 void snd_usb_caiaq_input_free(struct snd_usb_caiaqdev
*cdev
)
843 if (!cdev
|| !cdev
->input_dev
)
846 usb_free_urb(cdev
->ep4_in_urb
);
847 cdev
->ep4_in_urb
= NULL
;
848 cdev
->input_dev
= NULL
;