2 * Line6 Linux USB driver - 0.9.1beta
4 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
12 #include <linux/slab.h>
19 #define VARIAX_SYSEX_CODE 7
20 #define VARIAX_SYSEX_PARAM 0x3b
21 #define VARIAX_SYSEX_ACTIVATE 0x2a
22 #define VARIAX_MODEL_HEADER_LENGTH 7
23 #define VARIAX_MODEL_MESSAGE_LENGTH 199
24 #define VARIAX_OFFSET_ACTIVATE 7
27 This message is sent by the device during initialization and identifies
28 the connected guitar model.
30 static const char variax_init_model[] = {
31 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x69, 0x02,
36 This message is sent by the device during initialization and identifies
37 the connected guitar version.
39 static const char variax_init_version[] = {
40 0xf0, 0x7e, 0x7f, 0x06, 0x02, 0x00, 0x01, 0x0c,
41 0x07, 0x00, 0x00, 0x00
45 This message is the last one sent by the device during initialization.
47 static const char variax_init_done[] = {
48 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x6b
51 static const char variax_activate[] = {
52 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x2a, 0x01,
56 static const char variax_request_bank[] = {
57 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x6d, 0xf7
60 static const char variax_request_model1[] = {
61 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x3c, 0x00,
62 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03,
63 0x00, 0x00, 0x00, 0xf7
66 static const char variax_request_model2[] = {
67 0xf0, 0x00, 0x01, 0x0c, 0x07, 0x00, 0x3c, 0x00,
68 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x03,
69 0x00, 0x00, 0x00, 0xf7
72 /* forward declarations: */
73 static int variax_create_files2(struct device *dev);
74 static void variax_startup2(unsigned long data);
75 static void variax_startup4(unsigned long data);
76 static void variax_startup5(unsigned long data);
79 Decode data transmitted by workbench.
81 static void variax_decode(const unsigned char *raw_data, unsigned char *data,
84 for (; raw_size > 0; raw_size -= 6) {
85 data[2] = raw_data[0] | (raw_data[1] << 4);
86 data[1] = raw_data[2] | (raw_data[3] << 4);
87 data[0] = raw_data[4] | (raw_data[5] << 4);
93 static void variax_activate_async(struct usb_line6_variax *variax, int a)
95 variax->buffer_activate[VARIAX_OFFSET_ACTIVATE] = a;
96 line6_send_raw_message_async(&variax->line6, variax->buffer_activate,
97 sizeof(variax_activate));
101 Variax startup procedure.
102 This is a sequence of functions with special requirements (e.g., must
103 not run immediately after initialization, must not run in interrupt
104 context). After the last one has finished, the device is ready to use.
107 static void variax_startup1(struct usb_line6_variax *variax)
109 CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_INIT);
111 /* delay startup procedure: */
112 line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
113 variax_startup2, (unsigned long)variax);
116 static void variax_startup2(unsigned long data)
118 struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
119 struct usb_line6 *line6 = &variax->line6;
121 /* schedule another startup procedure until startup is complete: */
122 if (variax->startup_progress >= VARIAX_STARTUP_LAST)
125 variax->startup_progress = VARIAX_STARTUP_VERSIONREQ;
126 line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
127 variax_startup2, (unsigned long)variax);
129 /* request firmware version: */
130 line6_version_request_async(line6);
133 static void variax_startup3(struct usb_line6_variax *variax)
135 CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_WAIT);
137 /* delay startup procedure: */
138 line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY3,
139 variax_startup4, (unsigned long)variax);
142 static void variax_startup4(unsigned long data)
144 struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
145 CHECK_STARTUP_PROGRESS(variax->startup_progress,
146 VARIAX_STARTUP_ACTIVATE);
148 /* activate device: */
149 variax_activate_async(variax, 1);
150 line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY4,
151 variax_startup5, (unsigned long)variax);
154 static void variax_startup5(unsigned long data)
156 struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
157 CHECK_STARTUP_PROGRESS(variax->startup_progress,
158 VARIAX_STARTUP_DUMPREQ);
160 /* current model dump: */
161 line6_dump_request_async(&variax->dumpreq, &variax->line6, 0,
163 /* passes 2 and 3 are performed implicitly before entering
168 static void variax_startup6(struct usb_line6_variax *variax)
170 CHECK_STARTUP_PROGRESS(variax->startup_progress,
171 VARIAX_STARTUP_WORKQUEUE);
173 /* schedule work for global work queue: */
174 schedule_work(&variax->startup_work);
177 static void variax_startup7(struct work_struct *work)
179 struct usb_line6_variax *variax =
180 container_of(work, struct usb_line6_variax, startup_work);
181 struct usb_line6 *line6 = &variax->line6;
183 CHECK_STARTUP_PROGRESS(variax->startup_progress, VARIAX_STARTUP_SETUP);
185 /* ALSA audio interface: */
186 line6_register_audio(&variax->line6);
189 line6_variax_create_files(0, 0, line6->ifcdev);
190 variax_create_files2(line6->ifcdev);
194 Process a completely received message.
196 void line6_variax_process_message(struct usb_line6_variax *variax)
198 const unsigned char *buf = variax->line6.buffer_message;
201 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
203 case VARIAXMIDI_volume:
204 variax->volume = buf[2];
207 case VARIAXMIDI_tone:
208 variax->tone = buf[2];
213 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
214 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
215 variax->model = buf[1];
216 line6_dump_request_async(&variax->dumpreq, &variax->line6, 0,
221 dev_info(variax->line6.ifcdev, "VARIAX reset\n");
224 case LINE6_SYSEX_BEGIN:
225 if (memcmp(buf + 1, variax_request_model1 + 1,
226 VARIAX_MODEL_HEADER_LENGTH - 1) == 0) {
227 if (variax->line6.message_length ==
228 VARIAX_MODEL_MESSAGE_LENGTH) {
229 switch (variax->dumpreq.in_progress) {
230 case VARIAX_DUMP_PASS1:
232 VARIAX_MODEL_HEADER_LENGTH,
242 line6_dump_request_async
243 (&variax->dumpreq, &variax->line6,
244 1, VARIAX_DUMP_PASS2);
247 case VARIAX_DUMP_PASS2:
248 /* model name is transmitted twice, so skip it here: */
250 VARIAX_MODEL_HEADER_LENGTH,
254 sizeof(variax->model_data.
257 sizeof(variax->model_data.
260 line6_dump_request_async
261 (&variax->dumpreq, &variax->line6,
262 2, VARIAX_DUMP_PASS3);
265 DEBUG_MESSAGES(dev_err
266 (variax->line6.ifcdev,
267 "illegal length %d of model data\n",
268 variax->line6.message_length));
269 line6_dump_finished(&variax->dumpreq);
271 } else if (memcmp(buf + 1, variax_request_bank + 1,
272 sizeof(variax_request_bank) - 2) == 0) {
274 buf + sizeof(variax_request_bank) - 1,
275 sizeof(variax->bank));
276 line6_dump_finished(&variax->dumpreq);
277 variax_startup6(variax);
278 } else if (memcmp(buf + 1, variax_init_model + 1,
279 sizeof(variax_init_model) - 1) == 0) {
280 memcpy(variax->guitar,
281 buf + sizeof(variax_init_model),
282 sizeof(variax->guitar));
283 } else if (memcmp(buf + 1, variax_init_version + 1,
284 sizeof(variax_init_version) - 1) == 0) {
285 variax_startup3(variax);
286 } else if (memcmp(buf + 1, variax_init_done + 1,
287 sizeof(variax_init_done) - 1) == 0) {
288 /* notify of complete initialization: */
289 variax_startup4((unsigned long)variax);
294 case LINE6_SYSEX_END:
298 DEBUG_MESSAGES(dev_err
299 (variax->line6.ifcdev,
300 "Variax: unknown message %02X\n", buf[0]));
305 "read" request on "volume" special file.
307 static ssize_t variax_get_volume(struct device *dev,
308 struct device_attribute *attr, char *buf)
310 struct usb_line6_variax *variax =
311 usb_get_intfdata(to_usb_interface(dev));
312 return sprintf(buf, "%d\n", variax->volume);
316 "write" request on "volume" special file.
318 static ssize_t variax_set_volume(struct device *dev,
319 struct device_attribute *attr,
320 const char *buf, size_t count)
322 struct usb_line6_variax *variax =
323 usb_get_intfdata(to_usb_interface(dev));
327 ret = kstrtou8(buf, 10, &value);
331 if (line6_transmit_parameter(&variax->line6, VARIAXMIDI_volume,
333 variax->volume = value;
339 "read" request on "model" special file.
341 static ssize_t variax_get_model(struct device *dev,
342 struct device_attribute *attr, char *buf)
344 struct usb_line6_variax *variax =
345 usb_get_intfdata(to_usb_interface(dev));
346 return sprintf(buf, "%d\n", variax->model);
350 "write" request on "model" special file.
352 static ssize_t variax_set_model(struct device *dev,
353 struct device_attribute *attr,
354 const char *buf, size_t count)
356 struct usb_line6_variax *variax =
357 usb_get_intfdata(to_usb_interface(dev));
361 ret = kstrtou8(buf, 10, &value);
365 if (line6_send_program(&variax->line6, value) == 0)
366 variax->model = value;
372 "read" request on "active" special file.
374 static ssize_t variax_get_active(struct device *dev,
375 struct device_attribute *attr, char *buf)
377 struct usb_line6_variax *variax =
378 usb_get_intfdata(to_usb_interface(dev));
379 return sprintf(buf, "%d\n",
380 variax->buffer_activate[VARIAX_OFFSET_ACTIVATE]);
384 "write" request on "active" special file.
386 static ssize_t variax_set_active(struct device *dev,
387 struct device_attribute *attr,
388 const char *buf, size_t count)
390 struct usb_line6_variax *variax =
391 usb_get_intfdata(to_usb_interface(dev));
395 ret = kstrtou8(buf, 10, &value);
399 variax_activate_async(variax, value ? 1 : 0);
404 "read" request on "tone" special file.
406 static ssize_t variax_get_tone(struct device *dev,
407 struct device_attribute *attr, char *buf)
409 struct usb_line6_variax *variax =
410 usb_get_intfdata(to_usb_interface(dev));
411 return sprintf(buf, "%d\n", variax->tone);
415 "write" request on "tone" special file.
417 static ssize_t variax_set_tone(struct device *dev,
418 struct device_attribute *attr,
419 const char *buf, size_t count)
421 struct usb_line6_variax *variax =
422 usb_get_intfdata(to_usb_interface(dev));
426 ret = kstrtou8(buf, 10, &value);
430 if (line6_transmit_parameter(&variax->line6, VARIAXMIDI_tone,
432 variax->tone = value;
437 static ssize_t get_string(char *buf, const char *data, int length)
440 memcpy(buf, data, length);
442 for (i = length; i--;) {
445 if ((c != 0) && (c != ' '))
454 "read" request on "name" special file.
456 static ssize_t variax_get_name(struct device *dev,
457 struct device_attribute *attr, char *buf)
459 struct usb_line6_variax *variax =
460 usb_get_intfdata(to_usb_interface(dev));
461 line6_dump_wait_interruptible(&variax->dumpreq);
462 return get_string(buf, variax->model_data.name,
463 sizeof(variax->model_data.name));
467 "read" request on "bank" special file.
469 static ssize_t variax_get_bank(struct device *dev,
470 struct device_attribute *attr, char *buf)
472 struct usb_line6_variax *variax =
473 usb_get_intfdata(to_usb_interface(dev));
474 line6_dump_wait_interruptible(&variax->dumpreq);
475 return get_string(buf, variax->bank, sizeof(variax->bank));
479 "read" request on "dump" special file.
481 static ssize_t variax_get_dump(struct device *dev,
482 struct device_attribute *attr, char *buf)
484 struct usb_line6_variax *variax =
485 usb_get_intfdata(to_usb_interface(dev));
487 retval = line6_dump_wait_interruptible(&variax->dumpreq);
490 memcpy(buf, &variax->model_data.control,
491 sizeof(variax->model_data.control));
492 return sizeof(variax->model_data.control);
496 "read" request on "guitar" special file.
498 static ssize_t variax_get_guitar(struct device *dev,
499 struct device_attribute *attr, char *buf)
501 struct usb_line6_variax *variax =
502 usb_get_intfdata(to_usb_interface(dev));
503 return sprintf(buf, "%s\n", variax->guitar);
506 #ifdef CONFIG_LINE6_USB_RAW
508 static char *variax_alloc_sysex_buffer(struct usb_line6_variax *variax,
511 return line6_alloc_sysex_buffer(&variax->line6, VARIAX_SYSEX_CODE, code,
516 "write" request on "raw" special file.
518 static ssize_t variax_set_raw2(struct device *dev,
519 struct device_attribute *attr,
520 const char *buf, size_t count)
522 struct usb_line6_variax *variax =
523 usb_get_intfdata(to_usb_interface(dev));
530 sysex = variax_alloc_sysex_buffer(variax, VARIAX_SYSEX_PARAM, size);
535 for (i = 0; i < count; i += 3) {
536 const unsigned char *p1 = buf + i;
537 char *p2 = sysex + SYSEX_DATA_OFS + i * 2;
538 p2[0] = p1[2] & 0x0f;
540 p2[2] = p1[1] & 0x0f;
542 p2[4] = p1[0] & 0x0f;
546 line6_send_sysex_message(&variax->line6, sysex, size);
553 /* Variax workbench special files: */
554 static DEVICE_ATTR(model, S_IWUSR | S_IRUGO, variax_get_model,
556 static DEVICE_ATTR(volume, S_IWUSR | S_IRUGO, variax_get_volume,
558 static DEVICE_ATTR(tone, S_IWUSR | S_IRUGO, variax_get_tone, variax_set_tone);
559 static DEVICE_ATTR(name, S_IRUGO, variax_get_name, line6_nop_write);
560 static DEVICE_ATTR(bank, S_IRUGO, variax_get_bank, line6_nop_write);
561 static DEVICE_ATTR(dump, S_IRUGO, variax_get_dump, line6_nop_write);
562 static DEVICE_ATTR(active, S_IWUSR | S_IRUGO, variax_get_active,
564 static DEVICE_ATTR(guitar, S_IRUGO, variax_get_guitar, line6_nop_write);
566 #ifdef CONFIG_LINE6_USB_RAW
567 static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
568 static DEVICE_ATTR(raw2, S_IWUSR, line6_nop_read, variax_set_raw2);
574 static void variax_destruct(struct usb_interface *interface)
576 struct usb_line6_variax *variax = usb_get_intfdata(interface);
580 line6_cleanup_audio(&variax->line6);
582 del_timer(&variax->startup_timer1);
583 del_timer(&variax->startup_timer2);
584 cancel_work_sync(&variax->startup_work);
586 /* free dump request data: */
587 line6_dumpreq_destructbuf(&variax->dumpreq, 2);
588 line6_dumpreq_destructbuf(&variax->dumpreq, 1);
589 line6_dumpreq_destruct(&variax->dumpreq);
591 kfree(variax->buffer_activate);
595 Create sysfs entries.
597 static int variax_create_files2(struct device *dev)
600 CHECK_RETURN(device_create_file(dev, &dev_attr_model));
601 CHECK_RETURN(device_create_file(dev, &dev_attr_volume));
602 CHECK_RETURN(device_create_file(dev, &dev_attr_tone));
603 CHECK_RETURN(device_create_file(dev, &dev_attr_name));
604 CHECK_RETURN(device_create_file(dev, &dev_attr_bank));
605 CHECK_RETURN(device_create_file(dev, &dev_attr_dump));
606 CHECK_RETURN(device_create_file(dev, &dev_attr_active));
607 CHECK_RETURN(device_create_file(dev, &dev_attr_guitar));
608 #ifdef CONFIG_LINE6_USB_RAW
609 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
610 CHECK_RETURN(device_create_file(dev, &dev_attr_raw2));
616 Try to init workbench device.
618 static int variax_try_init(struct usb_interface *interface,
619 struct usb_line6_variax *variax)
623 init_timer(&variax->startup_timer1);
624 init_timer(&variax->startup_timer2);
625 INIT_WORK(&variax->startup_work, variax_startup7);
627 if ((interface == NULL) || (variax == NULL))
630 /* initialize USB buffers: */
631 err = line6_dumpreq_init(&variax->dumpreq, variax_request_model1,
632 sizeof(variax_request_model1));
635 dev_err(&interface->dev, "Out of memory\n");
639 err = line6_dumpreq_initbuf(&variax->dumpreq, variax_request_model2,
640 sizeof(variax_request_model2), 1);
643 dev_err(&interface->dev, "Out of memory\n");
647 err = line6_dumpreq_initbuf(&variax->dumpreq, variax_request_bank,
648 sizeof(variax_request_bank), 2);
651 dev_err(&interface->dev, "Out of memory\n");
655 variax->buffer_activate = kmemdup(variax_activate,
656 sizeof(variax_activate), GFP_KERNEL);
658 if (variax->buffer_activate == NULL) {
659 dev_err(&interface->dev, "Out of memory\n");
663 /* initialize audio system: */
664 err = line6_init_audio(&variax->line6);
668 /* initialize MIDI subsystem: */
669 err = line6_init_midi(&variax->line6);
673 /* initiate startup procedure: */
674 variax_startup1(variax);
679 Init workbench device (and clean up in case of failure).
681 int line6_variax_init(struct usb_interface *interface,
682 struct usb_line6_variax *variax)
684 int err = variax_try_init(interface, variax);
687 variax_destruct(interface);
693 Workbench device disconnected.
695 void line6_variax_disconnect(struct usb_interface *interface)
699 if (interface == NULL)
701 dev = &interface->dev;
704 /* remove sysfs entries: */
705 line6_variax_remove_files(0, 0, dev);
706 device_remove_file(dev, &dev_attr_model);
707 device_remove_file(dev, &dev_attr_volume);
708 device_remove_file(dev, &dev_attr_tone);
709 device_remove_file(dev, &dev_attr_name);
710 device_remove_file(dev, &dev_attr_bank);
711 device_remove_file(dev, &dev_attr_dump);
712 device_remove_file(dev, &dev_attr_active);
713 device_remove_file(dev, &dev_attr_guitar);
714 #ifdef CONFIG_LINE6_USB_RAW
715 device_remove_file(dev, &dev_attr_raw);
716 device_remove_file(dev, &dev_attr_raw2);
720 variax_destruct(interface);