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>
13 #include <linux/wait.h>
14 #include <sound/control.h>
22 #define POD_SYSEX_CODE 3
23 #define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
28 POD_SYSEX_SAVE = 0x24,
29 POD_SYSEX_SYSTEM = 0x56,
30 POD_SYSEX_SYSTEMREQ = 0x57,
31 /* POD_SYSEX_UPDATE = 0x6c, */ /* software update! */
32 POD_SYSEX_STORE = 0x71,
33 POD_SYSEX_FINISH = 0x72,
34 POD_SYSEX_DUMPMEM = 0x73,
35 POD_SYSEX_DUMP = 0x74,
36 POD_SYSEX_DUMPREQ = 0x75
37 /* POD_SYSEX_DUMPMEM2 = 0x76 */ /* dumps entire internal memory of PODxt Pro */
41 POD_monitor_level = 0x04,
42 POD_system_invalid = 0x10000
59 static struct snd_ratden pod_ratden = {
66 static struct line6_pcm_properties pod_pcm_properties = {
67 .snd_line6_playback_hw = {
68 .info = (SNDRV_PCM_INFO_MMAP |
69 SNDRV_PCM_INFO_INTERLEAVED |
70 SNDRV_PCM_INFO_BLOCK_TRANSFER |
71 SNDRV_PCM_INFO_MMAP_VALID |
72 SNDRV_PCM_INFO_PAUSE |
74 SNDRV_PCM_INFO_RESUME |
76 SNDRV_PCM_INFO_SYNC_START),
77 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
78 .rates = SNDRV_PCM_RATE_KNOT,
83 .buffer_bytes_max = 60000,
84 .period_bytes_min = 64,
85 .period_bytes_max = 8192,
88 .snd_line6_capture_hw = {
89 .info = (SNDRV_PCM_INFO_MMAP |
90 SNDRV_PCM_INFO_INTERLEAVED |
91 SNDRV_PCM_INFO_BLOCK_TRANSFER |
92 SNDRV_PCM_INFO_MMAP_VALID |
94 SNDRV_PCM_INFO_RESUME |
96 SNDRV_PCM_INFO_SYNC_START),
97 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
98 .rates = SNDRV_PCM_RATE_KNOT,
103 .buffer_bytes_max = 60000,
104 .period_bytes_min = 64,
105 .period_bytes_max = 8192,
107 .periods_max = 1024},
110 .rats = &pod_ratden},
111 .bytes_per_frame = POD_BYTES_PER_FRAME
114 static const char pod_request_channel[] = {
115 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
118 static const char pod_version_header[] = {
119 0xf2, 0x7e, 0x7f, 0x06, 0x02
122 /* forward declarations: */
123 static void pod_startup2(unsigned long data);
124 static void pod_startup3(struct usb_line6_pod *pod);
125 static void pod_startup4(struct usb_line6_pod *pod);
127 static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
130 return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
135 Store parameter value in driver memory.
137 static void pod_store_parameter(struct usb_line6_pod *pod, int param, int value)
139 pod->prog_data.control[param] = value;
145 static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
148 set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
152 Process a completely received message.
154 void line6_pod_process_message(struct usb_line6_pod *pod)
156 const unsigned char *buf = pod->line6.buffer_message;
158 /* filter messages by type */
159 switch (buf[0] & 0xf0) {
160 case LINE6_PARAM_CHANGE:
161 case LINE6_PROGRAM_CHANGE:
162 case LINE6_SYSEX_BEGIN:
163 break; /* handle these further down */
166 return; /* ignore all others */
169 /* process all remaining messages */
171 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
172 pod_store_parameter(pod, buf[1], buf[2]);
173 /* intentionally no break here! */
175 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
178 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
179 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
180 set_bit(POD_CHANNEL_DIRTY, &pod->atomic_flags);
181 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
185 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
186 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
187 if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
190 if (pod->line6.message_length ==
191 sizeof(pod->prog_data) + 7) {
192 switch (pod->dumpreq.in_progress) {
193 case LINE6_DUMP_CURRENT:
194 memcpy(&pod->prog_data, buf + 7,
195 sizeof(pod->prog_data));
198 case POD_DUMP_MEMORY:
199 memcpy(&pod->prog_data_buf,
202 (pod->prog_data_buf));
206 dev_dbg(pod->line6.ifcdev,
207 "unknown dump code %02X\n",
208 pod->dumpreq.in_progress);
211 line6_dump_finished(&pod->dumpreq);
214 dev_dbg(pod->line6.ifcdev,
215 "wrong size of channel dump message (%d instead of %d)\n",
216 pod->line6.message_length,
217 (int)sizeof(pod->prog_data) +
222 case POD_SYSEX_SYSTEM:{
224 ((int)buf[7] << 12) | ((int)buf[8]
226 ((int)buf[9] << 4) | (int)buf[10];
228 if (buf[6] == POD_monitor_level)
229 pod->monitor_level = value;
233 case POD_SYSEX_FINISH:
234 /* do we need to respond to this? */
238 pod_save_button_pressed(pod, buf[6], buf[7]);
241 case POD_SYSEX_STORE:
242 dev_dbg(pod->line6.ifcdev,
243 "message %02X not yet implemented\n",
248 dev_dbg(pod->line6.ifcdev,
249 "unknown sysex message %02X\n",
254 (buf, pod_version_header,
255 sizeof(pod_version_header)) == 0) {
256 pod->firmware_version =
257 buf[13] * 100 + buf[14] * 10 + buf[15];
259 ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
263 dev_dbg(pod->line6.ifcdev, "unknown sysex header\n");
267 case LINE6_SYSEX_END:
271 dev_dbg(pod->line6.ifcdev, "POD: unknown message %02X\n",
277 Transmit PODxt Pro control parameter.
279 void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
282 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
283 pod_store_parameter(pod, param, value);
287 Send system parameter (from integer).
289 static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
293 static const int size = 5;
295 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
298 sysex[SYSEX_DATA_OFS] = code;
299 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
300 sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
301 sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
302 sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
303 line6_send_sysex_message(&pod->line6, sysex, size);
309 "read" request on "serial_number" special file.
311 static ssize_t pod_get_serial_number(struct device *dev,
312 struct device_attribute *attr, char *buf)
314 struct usb_interface *interface = to_usb_interface(dev);
315 struct usb_line6_pod *pod = usb_get_intfdata(interface);
316 return sprintf(buf, "%d\n", pod->serial_number);
320 "read" request on "firmware_version" special file.
322 static ssize_t pod_get_firmware_version(struct device *dev,
323 struct device_attribute *attr,
326 struct usb_interface *interface = to_usb_interface(dev);
327 struct usb_line6_pod *pod = usb_get_intfdata(interface);
328 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
329 pod->firmware_version % 100);
333 "read" request on "device_id" special file.
335 static ssize_t pod_get_device_id(struct device *dev,
336 struct device_attribute *attr, char *buf)
338 struct usb_interface *interface = to_usb_interface(dev);
339 struct usb_line6_pod *pod = usb_get_intfdata(interface);
340 return sprintf(buf, "%d\n", pod->device_id);
344 POD startup procedure.
345 This is a sequence of functions with special requirements (e.g., must
346 not run immediately after initialization, must not run in interrupt
347 context). After the last one has finished, the device is ready to use.
350 static void pod_startup1(struct usb_line6_pod *pod)
352 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
354 /* delay startup procedure: */
355 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
359 static void pod_startup2(unsigned long data)
361 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
363 /* schedule another startup procedure until startup is complete: */
364 if (pod->startup_progress >= POD_STARTUP_LAST)
367 pod->startup_progress = POD_STARTUP_DUMPREQ;
368 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
371 /* current channel dump: */
372 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
376 static void pod_startup3(struct usb_line6_pod *pod)
378 struct usb_line6 *line6 = &pod->line6;
379 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
381 /* request firmware version: */
382 line6_version_request_async(line6);
385 static void pod_startup4(struct usb_line6_pod *pod)
387 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
389 /* schedule work for global work queue: */
390 schedule_work(&pod->startup_work);
393 static void pod_startup5(struct work_struct *work)
395 struct usb_line6_pod *pod =
396 container_of(work, struct usb_line6_pod, startup_work);
397 struct usb_line6 *line6 = &pod->line6;
399 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
402 line6_read_serial_number(&pod->line6, &pod->serial_number);
404 /* ALSA audio interface: */
405 line6_register_audio(line6);
408 /* POD special files: */
409 static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
410 static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
412 static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
415 /* control info callback */
416 static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
417 struct snd_ctl_elem_info *uinfo)
419 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
421 uinfo->value.integer.min = 0;
422 uinfo->value.integer.max = 65535;
426 /* control get callback */
427 static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
428 struct snd_ctl_elem_value *ucontrol)
430 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
431 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
432 ucontrol->value.integer.value[0] = pod->monitor_level;
436 /* control put callback */
437 static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
438 struct snd_ctl_elem_value *ucontrol)
440 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
441 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
443 if (ucontrol->value.integer.value[0] == pod->monitor_level)
446 pod->monitor_level = ucontrol->value.integer.value[0];
447 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
452 /* control definition */
453 static struct snd_kcontrol_new pod_control_monitor = {
454 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
455 .name = "Monitor Playback Volume",
457 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
458 .info = snd_pod_control_monitor_info,
459 .get = snd_pod_control_monitor_get,
460 .put = snd_pod_control_monitor_put
466 static void pod_destruct(struct usb_interface *interface)
468 struct usb_line6_pod *pod = usb_get_intfdata(interface);
472 line6_cleanup_audio(&pod->line6);
474 del_timer(&pod->startup_timer);
475 cancel_work_sync(&pod->startup_work);
477 /* free dump request data: */
478 line6_dumpreq_destruct(&pod->dumpreq);
482 Create sysfs entries.
484 static int pod_create_files2(struct device *dev)
488 CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
489 CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
490 CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
495 Try to init POD device.
497 static int pod_try_init(struct usb_interface *interface,
498 struct usb_line6_pod *pod)
501 struct usb_line6 *line6 = &pod->line6;
503 init_timer(&pod->startup_timer);
504 INIT_WORK(&pod->startup_work, pod_startup5);
506 if ((interface == NULL) || (pod == NULL))
509 /* initialize USB buffers: */
510 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
511 sizeof(pod_request_channel));
513 dev_err(&interface->dev, "Out of memory\n");
517 /* create sysfs entries: */
518 err = pod_create_files2(&interface->dev);
522 /* initialize audio system: */
523 err = line6_init_audio(line6);
527 /* initialize MIDI subsystem: */
528 err = line6_init_midi(line6);
532 /* initialize PCM subsystem: */
533 err = line6_init_pcm(line6, &pod_pcm_properties);
537 /* register monitor control: */
538 err = snd_ctl_add(line6->card,
539 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
544 When the sound card is registered at this point, the PODxt Live
545 displays "Invalid Code Error 07", so we do it later in the event
549 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
550 pod->monitor_level = POD_system_invalid;
552 /* initiate startup procedure: */
560 Init POD device (and clean up in case of failure).
562 int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
564 int err = pod_try_init(interface, pod);
567 pod_destruct(interface);
573 POD device disconnected.
575 void line6_pod_disconnect(struct usb_interface *interface)
577 struct usb_line6_pod *pod;
579 if (interface == NULL)
581 pod = usb_get_intfdata(interface);
584 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
585 struct device *dev = &interface->dev;
587 if (line6pcm != NULL)
588 line6_pcm_disconnect(line6pcm);
591 /* remove sysfs entries: */
592 device_remove_file(dev, &dev_attr_device_id);
593 device_remove_file(dev, &dev_attr_firmware_version);
594 device_remove_file(dev, &dev_attr_serial_number);
598 pod_destruct(interface);