A bit more followup on the I2S situation. One of the big issues getting in the way of using ordinary I2S codecs is that there didn’t seem to be an MCLK output for the codec to run off of. That forced me to look at some offbeat codecs that included a PLL to regenerate MCLK from the BCLK input and the only reasonably priced one I found also had pretty bad audio performance. This encouraged me to think harder and in the process I discovered that pin 25 on the CV1800B SoC (labeled AUX0) can actually be muxed to provide an MCLK output from I2S channel 1. I tweaked the pin setup code in a few places and was pleased to learn that this works. Details are here:
This MCLK output runs at the 3.3V levels while the other I2S bus runs at 1.8V so there will be some level translation required, but once that’s done you can use more conventional codecs with good audio characteristics.
Note also that the AUX0 pin is not brought out to headers - it’s only available on a tiny 0402 resistor (R17) so it’s difficult to wire up. But if you’re building your own system with bare CV1800B parts that’s no big deal.
Note also that the AUX0 pin may be used as a boot option selector in some systems. This doesn’t appear to be the case with the Milk-V Duo, but resistor R17 is pulled down to 0V nevertheless to keep the bootup consistent. Once the system is booted though that pin can be reused for other things, and having it as an MCLK output will not affect it at boot time.