Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added I2S support for Ralink/Mediatek
Only 16-bit width LRCLK is supported. Used SoC audio framework https://reviews.freebsd.org/D27830 DMA is not supported SoC audio framework. I have to patch it. It is not very good patch but it work for me. --- sys/dev/sound/fdt/audio_dai_if.m.org 2021-04-28 19:22:24.682040000 +0000 +++ sys/dev/sound/fdt/audio_dai_if.m 2021-05-17 20:38:38.701918000 +0000 @@ -93,3 +93,15 @@ struct snd_dbuf *play_buf; struct snd_dbuf *rec_buf; } + +METHOD void * chan_init { + device_t dev; + struct snd_dbuf *buf; + struct pcm_channel *channel; + int pcm_dir; +} + +METHOD int chan_free { + device_t dev; + int pcm_dir; +} --- sys/dev/sound/fdt/audio_soc.c.org 2021-04-28 19:23:30.177185000 +0000 +++ sys/dev/sound/fdt/audio_soc.c 2021-05-17 20:12:32.722736000 +0000 @@ -44,7 +44,8 @@ #include <dev/sound/pcm/sound.h> #include "audio_dai_if.h" -#define AUDIO_BUFFER_SIZE 48000 * 4 +// #define AUDIO_BUFFER_SIZE 48000 * 4 +#define AUDIO_BUFFER_SIZE 131072 struct audio_soc_aux_node { SLIST_ENTRY(audio_soc_aux_node) link; @@ -213,17 +214,22 @@ ausoc_chan = devinfo; sc = ausoc_chan->sc; - buffer = malloc(AUDIO_BUFFER_SIZE, M_DEVBUF, M_WAITOK | M_ZERO); - - if (sndbuf_setup(b, buffer, AUDIO_BUFFER_SIZE) != 0) { - free(buffer, M_DEVBUF); - return NULL; - } + // buffer = malloc(AUDIO_BUFFER_SIZE, M_DEVBUF, M_WAITOK | M_ZERO); + // if (sndbuf_setup(b, buffer, AUDIO_BUFFER_SIZE) != 0) { + // free(buffer, M_DEVBUF); + // return NULL; + // } ausoc_chan->dir = dir; ausoc_chan->buf = b; ausoc_chan->pcm = c; + buffer = AUDIO_DAI_CHAN_INIT(sc->cpu_dev, b, c, dir); + if(buffer == NULL) { + AUDIO_DAI_CHAN_FREE(sc->cpu_dev, dir); + return NULL; + } + return (devinfo); } @@ -250,15 +256,16 @@ struct audio_soc_softc *sc; struct audio_soc_channel *ausoc_chan; - void *buffer; + // void *buffer; ausoc_chan = (struct audio_soc_channel *)data; sc = ausoc_chan->sc; - buffer = sndbuf_getbuf(ausoc_chan->buf); - if (buffer) - free(buffer, M_DEVBUF); + // buffer = sndbuf_getbuf(ausoc_chan->buf); + // if (buffer) + // free(buffer, M_DEVBUF); + AUDIO_DAI_CHAN_FREE(sc->cpu_dev, ausoc_chan->dir); return (0); } Tested with BOJINGnet board with wm8960_codec and RT5350F-OLinuXino with dummy_codec.
- Loading branch information