Re: [PATCH 3/4] arm64: dts: rockchip: add analog audio to ROCK 4D
From: Cristian Ciocaltea <hidden>
Date: 2025-07-02 09:49:32
Also in:
linux-arm-kernel, linux-devicetree, linux-rockchip, lkml
On 6/30/25 1:19 PM, Nicolas Frattaroli wrote:
The RADXA ROCK 4D, like many other Rockchip-based boards, uses an ES8388 analog audio codec. On the production version of the board, the codec's LOUT1 and ROUT1 pins are tied to the headphone jack, whereas pins LOUT2 and ROUT2 lead to a non-populated speaker amplifier that itself leads to a non-populated speaker jack. The schematic is still haunted by the ghosts of those symbols, but it clearly marks them as "NC". The 3.5mm TRRS jack has its microphone ring (and ground ring) wired to the codec's LINPUT1 and RINPUT1 pins for differential signalling. Furthermore, it uses the SoCs ADC to detect whether the inserted cable is of headphones (i.e., no microphone), or a headset (i.e., with microphone). The way this is done is that the ADC input taps the output of a 100K/100K resistor divider that divides the microphone ring pin that's pulled up to 3.3V. There is no ADC level difference between a completely empty jack and one with a set of headphones (i.e., ones that don't have a microphone) connected. Consequently headphone insertion detection isn't something that can be done. Add the necessary codec and audio card nodes. The non-populated parts, i.e. LOUT2 and ROUT2, are not modeled at all, as they are not present on the hardware. Also, add an adc-keys node for the headset detection, which uses an input type of EV_SW with the SW_MICROPHONE_INSERT keycode. Below the 220mV pressed voltage level of our SW_MICROPHONE_INSERT switch, we also define a button that emits a KEY_RESERVED code, which is there to model this part of the voltage range as not just being extra legroom for the button above it, but actually a state that is encountered in the real world, and should be recognised as a valid state for the ADC range to be in so that no "closer" ADC button is chosen. Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Enabled CONFIG_SND_SOC_ES8328_I2C and confirm playback works fine:
$ speaker-test -D hw:ES8388,0 -F S16_LE -c 2 -t wav
Unfortunately the recording doesn't seem to be functional:
$ arecord -D hw:ES8388,0 -f S16_LE -c 2 -r 48000 -d 5 -V stereo /tmp/test.wav
Recording WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
+00%|00%+
$ aplay -D hw:ES8388,0 /tmp/test.wav
However, the headset plug detection works correctly:
$ evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: Logitech USB Receiver
/dev/input/event1: Logitech USB Receiver Mouse
/dev/input/event2: Logitech USB Receiver Consumer Control
/dev/input/event3: Logitech USB Receiver System Control
/dev/input/event4: adc-keys
Select the device event number [0-4]: 4
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "adc-keys"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event type 5 (EV_SW)
Event code 4 (SW_MICROPHONE_INSERT) state 0
Properties:
Testing ... (interrupt to exit)
Event: time 1751449448.185340, type 5 (EV_SW), code 4 (SW_MICROPHONE_INSERT), value 1
Event: time 1751449448.185340, -------------- SYN_REPORT ------------
Event: time 1751449448.289477, type 5 (EV_SW), code 4 (SW_MICROPHONE_INSERT), value 0
Event: time 1751449448.289477, -------------- SYN_REPORT ------------
Event: time 1751449449.329482, type 5 (EV_SW), code 4 (SW_MICROPHONE_INSERT), value 1
Event: time 1751449449.329482, -------------- SYN_REPORT ------------
Tested-by: Cristian Ciocaltea <redacted>