Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Presonus Studio 1810c driver for ALSA
  4 * Copyright (C) 2019 Nick Kossifidis <mickflemm@gmail.com>
  5 *
  6 * Based on reverse engineering of the communication protocol
  7 * between the windows driver / Univeral Control (UC) program
  8 * and the device, through usbmon.
  9 *
 10 * For now this bypasses the mixer, with all channels split,
 11 * so that the software can mix with greater flexibility.
 12 * It also adds controls for the 4 buttons on the front of
 13 * the device.
 14 */
 15
 16#include <linux/usb.h>
 17#include <linux/usb/audio-v2.h>
 18#include <linux/slab.h>
 19#include <sound/core.h>
 20#include <sound/control.h>
 21
 22#include "usbaudio.h"
 23#include "mixer.h"
 24#include "mixer_quirks.h"
 25#include "helper.h"
 26#include "mixer_s1810c.h"
 27
 28#define SC1810C_CMD_REQ	160
 29#define SC1810C_CMD_REQTYPE \
 30	(USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT)
 31#define SC1810C_CMD_F1		0x50617269
 32#define SC1810C_CMD_F2		0x14
 33
 34/*
 35 * DISCLAIMER: These are just guesses based on the
 36 * dumps I got.
 37 *
 38 * It seems like a selects between
 39 * device (0), mixer (0x64) and output (0x65)
 40 *
 41 * For mixer (0x64):
 42 *  * b selects an input channel (see below).
 43 *  * c selects an output channel pair (see below).
 44 *  * d selects left (0) or right (1) of that pair.
 45 *  * e 0-> disconnect, 0x01000000-> connect,
 46 *	0x0109-> used for stereo-linking channels,
 47 *	e is also used for setting volume levels
 48 *	in which case b is also set so I guess
 49 *	this way it is possible to set the volume
 50 *	level from the specified input to the
 51 *	specified output.
 52 *
 53 * IN Channels:
 54 * 0  - 7  Mic/Inst/Line (Analog inputs)
 55 * 8  - 9  S/PDIF
 56 * 10 - 17 ADAT
 57 * 18 - 35 DAW (Inputs from the host)
 58 *
 59 * OUT Channels (pairs):
 60 * 0 -> Main out
 61 * 1 -> Line1/2
 62 * 2 -> Line3/4
 63 * 3 -> S/PDIF
 64 * 4 -> ADAT?
 65 *
 66 * For device (0):
 67 *  * b and c are not used, at least not on the
 68 *    dumps I got.
 69 *  * d sets the control id to be modified
 70 *    (see below).
 71 *  * e sets the setting for that control.
 72 *    (so for the switches I was interested
 73 *    in it's 0/1)
 74 *
 75 * For output (0x65):
 76 *   * b is the output channel (see above).
 77 *   * c is zero.
 78 *   * e I guess the same as with mixer except 0x0109
 79 *	 which I didn't see in my dumps.
 80 *
 81 * The two fixed fields have the same values for
 82 * mixer and output but a different set for device.
 83 */
 84struct s1810c_ctl_packet {
 85	u32 a;
 86	u32 b;
 87	u32 fixed1;
 88	u32 fixed2;
 89	u32 c;
 90	u32 d;
 91	u32 e;
 92};
 93
 94#define SC1810C_CTL_LINE_SW	0
 95#define SC1810C_CTL_MUTE_SW	1
 96#define SC1810C_CTL_AB_SW	3
 97#define SC1810C_CTL_48V_SW	4
 98
 99#define SC1810C_SET_STATE_REQ	161
100#define SC1810C_SET_STATE_REQTYPE SC1810C_CMD_REQTYPE
101#define SC1810C_SET_STATE_F1	0x64656D73
102#define SC1810C_SET_STATE_F2	0xF4
103
104#define SC1810C_GET_STATE_REQ	162
105#define SC1810C_GET_STATE_REQTYPE \
106	(USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN)
107#define SC1810C_GET_STATE_F1	SC1810C_SET_STATE_F1
108#define SC1810C_GET_STATE_F2	SC1810C_SET_STATE_F2
109
110#define SC1810C_STATE_F1_IDX	2
111#define SC1810C_STATE_F2_IDX	3
112
113/*
114 * This packet includes mixer volumes and
115 * various other fields, it's an extended
116 * version of ctl_packet, with a and b
117 * being zero and different f1/f2.
118 */
119struct s1810c_state_packet {
120	u32 fields[63];
121};
122
123#define SC1810C_STATE_48V_SW	58
124#define SC1810C_STATE_LINE_SW	59
125#define SC1810C_STATE_MUTE_SW	60
126#define SC1810C_STATE_AB_SW	62
127
128struct s1810_mixer_state {
129	uint16_t seqnum;
130	struct mutex usb_mutex;
131	struct mutex data_mutex;
132};
133
134static int
135snd_s1810c_send_ctl_packet(struct usb_device *dev, u32 a,
136			   u32 b, u32 c, u32 d, u32 e)
137{
138	struct s1810c_ctl_packet pkt = { 0 };
139	int ret = 0;
140
141	pkt.fixed1 = SC1810C_CMD_F1;
142	pkt.fixed2 = SC1810C_CMD_F2;
143
144	pkt.a = a;
145	pkt.b = b;
146	pkt.c = c;
147	pkt.d = d;
148	/*
149	 * Value for settings 0/1 for this
150	 * output channel is always 0 (probably because
151	 * there is no ADAT output on 1810c)
152	 */
153	pkt.e = (c == 4) ? 0 : e;
154
155	ret = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
156			      SC1810C_CMD_REQ,
157			      SC1810C_CMD_REQTYPE, 0, 0, &pkt, sizeof(pkt));
158	if (ret < 0) {
159		dev_warn(&dev->dev, "could not send ctl packet\n");
160		return ret;
161	}
162	return 0;
163}
164
165/*
166 * When opening Universal Control the program periodicaly
167 * sends and receives state packets for syncinc state between
168 * the device and the host.
169 *
170 * Note that if we send only the request to get data back we'll
171 * get an error, we need to first send an empty state packet and
172 * then ask to receive a filled. Their seqnumbers must also match.
173 */
174static int
175snd_sc1810c_get_status_field(struct usb_device *dev,
176			     u32 *field, int field_idx, uint16_t *seqnum)
177{
178	struct s1810c_state_packet pkt_out = { { 0 } };
179	struct s1810c_state_packet pkt_in = { { 0 } };
180	int ret = 0;
181
182	pkt_out.fields[SC1810C_STATE_F1_IDX] = SC1810C_SET_STATE_F1;
183	pkt_out.fields[SC1810C_STATE_F2_IDX] = SC1810C_SET_STATE_F2;
184	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
185			      SC1810C_SET_STATE_REQ,
186			      SC1810C_SET_STATE_REQTYPE,
187			      (*seqnum), 0, &pkt_out, sizeof(pkt_out));
188	if (ret < 0) {
189		dev_warn(&dev->dev, "could not send state packet (%d)\n", ret);
190		return ret;
191	}
192
193	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
194			      SC1810C_GET_STATE_REQ,
195			      SC1810C_GET_STATE_REQTYPE,
196			      (*seqnum), 0, &pkt_in, sizeof(pkt_in));
197	if (ret < 0) {
198		dev_warn(&dev->dev, "could not get state field %u (%d)\n",
199			 field_idx, ret);
200		return ret;
201	}
202
203	(*field) = pkt_in.fields[field_idx];
204	(*seqnum)++;
205	return 0;
206}
207
208/*
209 * This is what I got when bypassing the mixer with
210 * all channels split. I'm not 100% sure of what's going
211 * on, I could probably clean this up based on my observations
212 * but I prefer to keep the same behavior as the windows driver.
213 */
214static int snd_s1810c_init_mixer_maps(struct snd_usb_audio *chip)
215{
216	u32 a, b, c, e, n, off;
217	struct usb_device *dev = chip->dev;
218
219	/* Set initial volume levels ? */
220	a = 0x64;
221	e = 0xbc;
222	for (n = 0; n < 2; n++) {
223		off = n * 18;
224		for (b = off, c = 0; b < 18 + off; b++) {
225			/* This channel to all outputs ? */
226			for (c = 0; c <= 8; c++) {
227				snd_s1810c_send_ctl_packet(dev, a, b, c, 0, e);
228				snd_s1810c_send_ctl_packet(dev, a, b, c, 1, e);
229			}
230			/* This channel to main output (again) */
231			snd_s1810c_send_ctl_packet(dev, a, b, 0, 0, e);
232			snd_s1810c_send_ctl_packet(dev, a, b, 0, 1, e);
233		}
234		/*
235		 * I noticed on UC that DAW channels have different
236		 * initial volumes, so this makes sense.
237		 */
238		e = 0xb53bf0;
239	}
240
241	/* Connect analog outputs ? */
242	a = 0x65;
243	e = 0x01000000;
244	for (b = 1; b < 3; b++) {
245		snd_s1810c_send_ctl_packet(dev, a, b, 0, 0, e);
246		snd_s1810c_send_ctl_packet(dev, a, b, 0, 1, e);
247	}
248	snd_s1810c_send_ctl_packet(dev, a, 0, 0, 0, e);
249	snd_s1810c_send_ctl_packet(dev, a, 0, 0, 1, e);
250
251	/* Set initial volume levels for S/PDIF mappings ? */
252	a = 0x64;
253	e = 0xbc;
254	c = 3;
255	for (n = 0; n < 2; n++) {
256		off = n * 18;
257		for (b = off; b < 18 + off; b++) {
258			snd_s1810c_send_ctl_packet(dev, a, b, c, 0, e);
259			snd_s1810c_send_ctl_packet(dev, a, b, c, 1, e);
260		}
261		e = 0xb53bf0;
262	}
263
264	/* Connect S/PDIF output ? */
265	a = 0x65;
266	e = 0x01000000;
267	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 0, e);
268	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 1, e);
269
270	/* Connect all outputs (again) ? */
271	a = 0x65;
272	e = 0x01000000;
273	for (b = 0; b < 4; b++) {
274		snd_s1810c_send_ctl_packet(dev, a, b, 0, 0, e);
275		snd_s1810c_send_ctl_packet(dev, a, b, 0, 1, e);
276	}
277
278	/* Basic routing to get sound out of the device */
279	a = 0x64;
280	e = 0x01000000;
281	for (c = 0; c < 4; c++) {
282		for (b = 0; b < 36; b++) {
283			if ((c == 0 && b == 18) ||	/* DAW1/2 -> Main */
284			    (c == 1 && b == 20) ||	/* DAW3/4 -> Line3/4 */
285			    (c == 2 && b == 22) ||	/* DAW4/5 -> Line5/6 */
286			    (c == 3 && b == 24)) {	/* DAW5/6 -> S/PDIF */
287				/* Left */
288				snd_s1810c_send_ctl_packet(dev, a, b, c, 0, e);
289				snd_s1810c_send_ctl_packet(dev, a, b, c, 1, 0);
290				b++;
291				/* Right */
292				snd_s1810c_send_ctl_packet(dev, a, b, c, 0, 0);
293				snd_s1810c_send_ctl_packet(dev, a, b, c, 1, e);
294			} else {
295				/* Leave the rest disconnected */
296				snd_s1810c_send_ctl_packet(dev, a, b, c, 0, 0);
297				snd_s1810c_send_ctl_packet(dev, a, b, c, 1, 0);
298			}
299		}
300	}
301
302	/* Set initial volume levels for S/PDIF (again) ? */
303	a = 0x64;
304	e = 0xbc;
305	c = 3;
306	for (n = 0; n < 2; n++) {
307		off = n * 18;
308		for (b = off; b < 18 + off; b++) {
309			snd_s1810c_send_ctl_packet(dev, a, b, c, 0, e);
310			snd_s1810c_send_ctl_packet(dev, a, b, c, 1, e);
311		}
312		e = 0xb53bf0;
313	}
314
315	/* Connect S/PDIF outputs (again) ? */
316	a = 0x65;
317	e = 0x01000000;
318	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 0, e);
319	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 1, e);
320
321	/* Again ? */
322	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 0, e);
323	snd_s1810c_send_ctl_packet(dev, a, 3, 0, 1, e);
324
325	return 0;
326}
327
328/*
329 * Sync state with the device and retrieve the requested field,
330 * whose index is specified in (kctl->private_value & 0xFF),
331 * from the received fields array.
332 */
333static int
334snd_s1810c_get_switch_state(struct usb_mixer_interface *mixer,
335			    struct snd_kcontrol *kctl, u32 *state)
336{
337	struct snd_usb_audio *chip = mixer->chip;
338	struct s1810_mixer_state *private = mixer->private_data;
339	u32 field = 0;
340	u32 ctl_idx = (u32) (kctl->private_value & 0xFF);
341	int ret = 0;
342
343	mutex_lock(&private->usb_mutex);
344	ret = snd_sc1810c_get_status_field(chip->dev, &field,
345					   ctl_idx, &private->seqnum);
346	if (ret < 0)
347		goto unlock;
348
349	*state = field;
350 unlock:
351	mutex_unlock(&private->usb_mutex);
352	return ret ? ret : 0;
353}
354
355/*
356 * Send a control packet to the device for the control id
357 * specified in (kctl->private_value >> 8) with value
358 * specified in (kctl->private_value >> 16).
359 */
360static int
361snd_s1810c_set_switch_state(struct usb_mixer_interface *mixer,
362			    struct snd_kcontrol *kctl)
363{
364	struct snd_usb_audio *chip = mixer->chip;
365	struct s1810_mixer_state *private = mixer->private_data;
366	u32 pval = (u32) kctl->private_value;
367	u32 ctl_id = (pval >> 8) & 0xFF;
368	u32 ctl_val = (pval >> 16) & 0x1;
369	int ret = 0;
370
371	mutex_lock(&private->usb_mutex);
372	ret = snd_s1810c_send_ctl_packet(chip->dev, 0, 0, 0, ctl_id, ctl_val);
373	mutex_unlock(&private->usb_mutex);
374	return ret;
375}
376
377/* Generic get/set/init functions for switch controls */
378
379static int
380snd_s1810c_switch_get(struct snd_kcontrol *kctl,
381		      struct snd_ctl_elem_value *ctl_elem)
382{
383	struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
384	struct usb_mixer_interface *mixer = list->mixer;
385	struct s1810_mixer_state *private = mixer->private_data;
386	u32 pval = (u32) kctl->private_value;
387	u32 ctl_idx = pval & 0xFF;
388	u32 state = 0;
389	int ret = 0;
390
391	mutex_lock(&private->data_mutex);
392	ret = snd_s1810c_get_switch_state(mixer, kctl, &state);
393	if (ret < 0)
394		goto unlock;
395
396	switch (ctl_idx) {
397	case SC1810C_STATE_LINE_SW:
398	case SC1810C_STATE_AB_SW:
399		ctl_elem->value.enumerated.item[0] = (int)state;
400		break;
401	default:
402		ctl_elem->value.integer.value[0] = (long)state;
403	}
404
405 unlock:
406	mutex_unlock(&private->data_mutex);
407	return (ret < 0) ? ret : 0;
408}
409
410static int
411snd_s1810c_switch_set(struct snd_kcontrol *kctl,
412		      struct snd_ctl_elem_value *ctl_elem)
413{
414	struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
415	struct usb_mixer_interface *mixer = list->mixer;
416	struct s1810_mixer_state *private = mixer->private_data;
417	u32 pval = (u32) kctl->private_value;
418	u32 ctl_idx = pval & 0xFF;
419	u32 curval = 0;
420	u32 newval = 0;
421	int ret = 0;
422
423	mutex_lock(&private->data_mutex);
424	ret = snd_s1810c_get_switch_state(mixer, kctl, &curval);
425	if (ret < 0)
426		goto unlock;
427
428	switch (ctl_idx) {
429	case SC1810C_STATE_LINE_SW:
430	case SC1810C_STATE_AB_SW:
431		newval = (u32) ctl_elem->value.enumerated.item[0];
432		break;
433	default:
434		newval = (u32) ctl_elem->value.integer.value[0];
435	}
436
437	if (curval == newval)
438		goto unlock;
439
440	kctl->private_value &= ~(0x1 << 16);
441	kctl->private_value |= (unsigned int)(newval & 0x1) << 16;
442	ret = snd_s1810c_set_switch_state(mixer, kctl);
443
444 unlock:
445	mutex_unlock(&private->data_mutex);
446	return (ret < 0) ? 0 : 1;
447}
448
449static int
450snd_s1810c_switch_init(struct usb_mixer_interface *mixer,
451		       const struct snd_kcontrol_new *new_kctl)
452{
453	struct snd_kcontrol *kctl;
454	struct usb_mixer_elem_info *elem;
455
456	elem = kzalloc(sizeof(struct usb_mixer_elem_info), GFP_KERNEL);
457	if (!elem)
458		return -ENOMEM;
459
460	elem->head.mixer = mixer;
461	elem->control = 0;
462	elem->head.id = 0;
463	elem->channels = 1;
464
465	kctl = snd_ctl_new1(new_kctl, elem);
466	if (!kctl) {
467		kfree(elem);
468		return -ENOMEM;
469	}
470	kctl->private_free = snd_usb_mixer_elem_free;
471
472	return snd_usb_mixer_add_control(&elem->head, kctl);
473}
474
475static int
476snd_s1810c_line_sw_info(struct snd_kcontrol *kctl,
477			struct snd_ctl_elem_info *uinfo)
478{
479	static const char *const texts[2] = {
480		"Preamp On (Mic/Inst)",
481		"Preamp Off (Line in)"
482	};
483
484	return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
485}
486
487static const struct snd_kcontrol_new snd_s1810c_line_sw = {
488	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
489	.name = "Line 1/2 Source Type",
490	.info = snd_s1810c_line_sw_info,
491	.get = snd_s1810c_switch_get,
492	.put = snd_s1810c_switch_set,
493	.private_value = (SC1810C_STATE_LINE_SW | SC1810C_CTL_LINE_SW << 8)
494};
495
496static const struct snd_kcontrol_new snd_s1810c_mute_sw = {
497	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
498	.name = "Mute Main Out Switch",
499	.info = snd_ctl_boolean_mono_info,
500	.get = snd_s1810c_switch_get,
501	.put = snd_s1810c_switch_set,
502	.private_value = (SC1810C_STATE_MUTE_SW | SC1810C_CTL_MUTE_SW << 8)
503};
504
505static const struct snd_kcontrol_new snd_s1810c_48v_sw = {
506	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
507	.name = "48V Phantom Power On Mic Inputs Switch",
508	.info = snd_ctl_boolean_mono_info,
509	.get = snd_s1810c_switch_get,
510	.put = snd_s1810c_switch_set,
511	.private_value = (SC1810C_STATE_48V_SW | SC1810C_CTL_48V_SW << 8)
512};
513
514static int
515snd_s1810c_ab_sw_info(struct snd_kcontrol *kctl,
516		      struct snd_ctl_elem_info *uinfo)
517{
518	static const char *const texts[2] = {
519		"1/2",
520		"3/4"
521	};
522
523	return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
524}
525
526static const struct snd_kcontrol_new snd_s1810c_ab_sw = {
527	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
528	.name = "Headphone 1 Source Route",
529	.info = snd_s1810c_ab_sw_info,
530	.get = snd_s1810c_switch_get,
531	.put = snd_s1810c_switch_set,
532	.private_value = (SC1810C_STATE_AB_SW | SC1810C_CTL_AB_SW << 8)
533};
534
535static void snd_sc1810_mixer_state_free(struct usb_mixer_interface *mixer)
536{
537	struct s1810_mixer_state *private = mixer->private_data;
538	kfree(private);
539	mixer->private_data = NULL;
540}
541
542/* Entry point, called from mixer_quirks.c */
543int snd_sc1810_init_mixer(struct usb_mixer_interface *mixer)
544{
545	struct s1810_mixer_state *private = NULL;
546	struct snd_usb_audio *chip = mixer->chip;
547	struct usb_device *dev = chip->dev;
548	int ret = 0;
549
550	/* Run this only once */
551	if (!list_empty(&chip->mixer_list))
552		return 0;
553
554	dev_info(&dev->dev,
555		 "Presonus Studio 1810c, device_setup: %u\n", chip->setup);
556	if (chip->setup == 1)
557		dev_info(&dev->dev, "(8out/18in @ 48kHz)\n");
558	else if (chip->setup == 2)
559		dev_info(&dev->dev, "(6out/8in @ 192kHz)\n");
560	else
561		dev_info(&dev->dev, "(8out/14in @ 96kHz)\n");
562
563	ret = snd_s1810c_init_mixer_maps(chip);
564	if (ret < 0)
565		return ret;
566
567	private = kzalloc(sizeof(struct s1810_mixer_state), GFP_KERNEL);
568	if (!private)
569		return -ENOMEM;
570
571	mutex_init(&private->usb_mutex);
572	mutex_init(&private->data_mutex);
573
574	mixer->private_data = private;
575	mixer->private_free = snd_sc1810_mixer_state_free;
576
577	private->seqnum = 1;
578
579	ret = snd_s1810c_switch_init(mixer, &snd_s1810c_line_sw);
580	if (ret < 0)
581		return ret;
582
583	ret = snd_s1810c_switch_init(mixer, &snd_s1810c_mute_sw);
584	if (ret < 0)
585		return ret;
586
587	ret = snd_s1810c_switch_init(mixer, &snd_s1810c_48v_sw);
588	if (ret < 0)
589		return ret;
590
591	ret = snd_s1810c_switch_init(mixer, &snd_s1810c_ab_sw);
592	if (ret < 0)
593		return ret;
594	return ret;
595}