FreeBSD Bugzilla – Attachment 178947 Details for
Bug 216131
[PATCH] Add snd_uaudio(4) support for S/PDIF output with C-Media CM6206 devices
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
CM6206 spdif out patch (revised)
uaudio_cm6206_r1.diff (text/plain), 2.70 KB, created by
Julien Nadeau
on 2017-01-16 10:51:57 UTC
(
hide
)
Description:
CM6206 spdif out patch (revised)
Filename:
MIME Type:
Creator:
Julien Nadeau
Created:
2017-01-16 10:51:57 UTC
Size:
2.70 KB
patch
obsolete
>--- sys/dev/sound/usb/uaudio.c 2016-12-31 23:04:35.000000000 -0400 >+++ sys/dev/sound/usb/uaudio.c 2017-01-16 02:41:05.088974000 -0400 >@@ -313,6 +313,11 @@ > uint8_t mute_id; > }; > >+#define UAUDIO_SPDIF_OUT 0x01 /* Enable SPDIF output */ >+#define UAUDIO_SPDIF_OUT_48K 0x02 /* Out sample rate = 48K */ >+#define UAUDIO_SPDIF_OUT_96K 0x04 /* Out sample rate = 96K */ >+#define UAUDIO_SPDIF_IN_MIX 0x10 /* Input mix enable */ >+ > struct uaudio_softc { > struct sbuf sc_sndstat; > struct sndcard_func sc_sndcard_func; >@@ -349,6 +354,8 @@ > uint8_t sc_uq_bad_adc:1; > uint8_t sc_uq_au_vendor_class:1; > uint8_t sc_pcm_bitperfect:1; >+ >+ int (*sc_set_spdif_fn)(struct uaudio_softc *, int); > }; > > struct uaudio_terminal_node { >@@ -861,6 +868,40 @@ > return (ENXIO); > } > >+/* >+ * Set Cmedia CM6206 S/PDIF settings >+ * Source: CM6206 Datasheet v2.3. >+ */ >+static int >+uaudio_set_spdif_cm6206(struct uaudio_softc *sc, int flags) >+{ >+ u_int8_t cmd[2][4] = { >+ { 0x20, 0x20,0x00, 0 }, >+ { 0x20, 0x30,0x02, 1 } >+ }; >+ int i; >+ >+ if (flags & UAUDIO_SPDIF_OUT) { >+ cmd[1][1] = 0x00; >+ } else { >+ cmd[1][1] = 0x02; >+ } >+ if (flags & UAUDIO_SPDIF_OUT_96K) >+ cmd[0][1] = 0x60; /* 96K: 3'b110 */ >+ if (flags & UAUDIO_SPDIF_IN_MIX) >+ cmd[1][1] = 0x03; /* SPDIFMIX */ >+ >+ for (i = 0; i < 2; i++) { >+ if (usbd_req_set_report(sc->sc_udev, NULL, >+ cmd[i], sizeof(cmd[i]), >+ sc->sc_mixer_iface_index, UHID_OUTPUT_REPORT, 0) != 0) { >+ return (-1); >+ } >+ } >+ return (0); >+} >+ >+ > static int > uaudio_attach(device_t dev) > { >@@ -1031,6 +1072,18 @@ > /* reload all mixer settings */ > uaudio_mixer_reload_all(sc); > >+ /* Enable SPDIF output */ >+ if (uaa->info.idVendor == USB_VENDOR_CMEDIA && >+ (uaa->info.idProduct == USB_PRODUCT_CMEDIA_CM6206)) { >+ device_printf(dev, "C-Media CM6206\n"); >+ sc->sc_set_spdif_fn = uaudio_set_spdif_cm6206; >+ if (sc->sc_set_spdif_fn(sc, >+ UAUDIO_SPDIF_OUT|UAUDIO_SPDIF_OUT_48K) != 0) >+ device_printf(dev, "Failed to enable S/PDIF at 48K\n"); >+ } else { >+ sc->sc_set_spdif_fn = NULL; >+ } >+ > return (0); /* success */ > > detach: >@@ -1115,6 +1168,8 @@ > struct uaudio_softc *sc = device_get_softc(device_get_parent(dev)); > int error = 0; > >+ if (sc->sc_set_spdif_fn != NULL) >+ sc->sc_set_spdif_fn(sc, 0); > repeat: > if (sc->sc_pcm_registered) { > error = pcm_unregister(dev); >--- sys/dev/usb/usbdevs 2016-12-31 23:03:36.000000000 -0400 >+++ sys/dev/usb/usbdevs 2017-01-14 03:22:22.438497000 -0400 >@@ -3085,6 +3085,9 @@ > product CHICONY2 CAM_1 0x62c0 CAM_1 > product CHICONY2 TEMPER 0x7401 TEMPer sensor > >+/* C-Media products */ >+product CMEDIA CM6206 0x0102 CM106-like sound device >+ > /* Micro Star International products */ > product MSI BT_DONGLE 0x1967 Bluetooth USB dongle > product MSI RT3070_1 0x3820 RT3070
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 216131
:
178945
| 178947