RK3576 ES8390 Codec 调试
文章目录1、环境介绍2、ES8388/8389/8390 Codec 介绍3、原理图查看3.1、es8390 codec3.2、耳机接口3.3、扬声器接口3.4、MIC 接口4、驱动移植5、内核配置6、设备树7、测试7.1、查看声卡7.2、查看声卡配置7.3、查看引脚状态7.4、耳机放音7.5、扬声器放音7.6、咪头录音/放音8、遇到的问题8.1、i2cdetect timeout8.2、es8390 i2c 地址漂移8.3、喇叭放音时底噪大9、参考文章10、总结1、环境介绍硬件RK3576 板卡软件RK3576 原厂 SDKbuildroot 系统6.1 kernel2、ES8388/8389/8390 Codec 介绍es8388 预计 26 年年底停产。于是更换为 es8390。es8388 和 es8390 硬件 p2p。es8390 和 es8389 软件驱动兼容。3、原理图查看3.1、es8390 codec0X11 10PF/50V TOPF /50V NC_25 CO:102 C0402 --0X10 )三L ADDR(CE) DGND VMID ES8388 AGND VMID ADCVREF ES8388 HPGND ADCVREF VREF ES8388 C121 120 C122 QFN28-4XDX0.8-0.45 4.7UFNOV .7UFNOV C0402 C0402 --DVDD/PVDD1.8VAVDD/HPVDD3.3V数字音频接口SAI1电平需与 DVDD/PVDD 一致控制接口I2C3电平需与 DVDD/PVDD 一致HPOUT_L/R扬声器立体声左右声道输出AUD_LINEOUT_L/R耳机立体声左右声道输出L/RIN1_ES8388咪头1差分输入L/RIN2_ES8388咪头2差分输入3.2、耳机接口HP_CTL_H耳机输出控制脚GPIO2_PA6高电平有效HP_DET_L耳机插入检测引脚GPIO2_PB7低电平有效3.3、扬声器接口SPK_CTL_L扬声器控制接口GPIO2_PA7高电平有效3.4、MIC 接口4、驱动移植这里基于主线 Linux 下的 es8389 驱动进行调试https://elixir.bootlin.com/linux/v7.0.3/source/sound/soc/codecs/es8389.chttps://elixir.bootlin.com/linux/v7.0.3/source/sound/soc/codecs/es8389.h调试后的驱动已上传至 githubhttps://github.com/Cohen0415/es8389-driver5、内核配置CONFIG_SND_SOC_ES8389y6、设备树/{...es8389_sound:es8389-sound{statusokay;compatiblerockchip,multicodecs-card;rockchip,card-namerockchip-es8389;hp-det-gpiogpio2 RK_PB7 GPIO_ACTIVE_LOW;io-channelssaradc3;io-channel-namesadc-detect;keyup-threshold-microvolt1800000;poll-interval100;spk-con-gpiogpio2 RK_PA7 GPIO_ACTIVE_HIGH;hp-con-gpiogpio2 RK_PA6 GPIO_ACTIVE_HIGH;rockchip,pre-power-on-delay-ms30;rockchip,post-power-down-delay-ms40;rockchip,formati2s;rockchip,mclk-fs256;rockchip,cpusai1;rockchip,codeces8389;rockchip,audio-routingHeadphone,HPOL,Headphone,HPOR,Speaker,HPOL,Speaker,HPOR,Headphone,Headphone Power,Headphone,Headphone Power,Speaker,Speaker Power,Speaker,Speaker Power,INPUT2,Main Mic,INPUT2,Main Mic,INPUT1,Headset Mic,INPUT1,Headset Mic;pinctrl-namesdefault;pinctrl-0hp_det;play-pause-key{labelplaypause;linux,codeKEY_PLAYPAUSE;press-threshold-microvolt2000;};};...};i2c3{statusokay;es8389:es838910{statusokay;#sound-dai-cells0;compatibleeverest,es8389;reg0x10;clocksmclkout_sai1;clock-namesmclk;assigned-clocksmclkout_sai1;assigned-clock-rates12288000;pinctrl-namesdefault;pinctrl-0sai1m0_mclk;};};sai1{statusokay;rockchip,sai-tx-route2103;pinctrl-namesdefault;pinctrl-0sai1m0_lrcksai1m0_sclksai1m0_sdi0sai1m0_sdo2;};pinctrl{...headphone{hp_det:hp-det{rockchip,pins2RK_PB7 RK_FUNC_GPIOpcfg_pull_up;};};...}7、测试7.1、查看声卡cat/proc/asound/cardsrootrk3576-buildroot:/# cat /proc/asound/cards0[rockchipes8389]: rockchip-es8389 - rockchip-es8389 rockchip-es83891[rockchipdp0]: rockchip-dp0 - rockchip-dp0 rockchip-dp02[rockchiphdmi]: rockchip-hdmi - rockchip-hdmi rockchip-hdmi7.2、查看声卡配置amixer controls-c0numid55,ifaceCARD,nameHeadphone Jacknumid56,ifaceCARD,nameHeadset Mic Jacknumid59,ifaceMIXER,nameHeadphone Switchnumid69,ifaceMIXER,nameADC MUXnumid67,ifaceMIXER,nameADC Mixer DACL ADCL Mixernumid68,ifaceMIXER,nameADC Mixer DACR ADCR Mixernumid49,ifaceMIXER,nameADC OSR Volumenumid48,ifaceMIXER,nameADC OSR Volume ON Switchnumid50,ifaceMIXER,nameADC OUTPUT Invert Switchnumid46,ifaceMIXER,nameADC Ramp Ratenumid54,ifaceMIXER,nameADC2DAC Mixer Volumenumid37,ifaceMIXER,nameADCL Capture Volumenumid39,ifaceMIXER,nameADCL PGA Volumenumid38,ifaceMIXER,nameADCR Capture Volumenumid40,ifaceMIXER,nameADCR PGA Volumenumid45,ifaceMIXER,nameALC Capture Max Gainnumid43,ifaceMIXER,nameALC Capture Switchnumid44,ifaceMIXER,nameALC Capture Target Levelnumid47,ifaceMIXER,nameALC Capture Winsizenumid53,ifaceMIXER,nameDAC OUTPUT Invert Switchnumid51,ifaceMIXER,nameDACL Playback Volumenumid52,ifaceMIXER,nameDACR Playback Volumenumid62,ifaceMIXER,nameHeadset Mic Switchnumid65,ifaceMIXER,nameIF ADCDACL Mixer ADCL DACL Mixernumid66,ifaceMIXER,nameIF ADCDACR Mixer ADCR DACR Mixernumid63,ifaceMIXER,nameIF DACL Mixer DACR DACL Mixernumid64,ifaceMIXER,nameIF DACR Mixer DACL DACR Mixernumid61,ifaceMIXER,nameMain Mic Switchnumid70,ifaceMIXER,nameOUTL MUXnumid71,ifaceMIXER,nameOUTR MUXnumid41,ifaceMIXER,namePGAL Selectnumid42,ifaceMIXER,namePGAR Selectnumid34,ifaceMIXER,nameSAI1 Clk Auto Switchnumid5,ifaceMIXER,nameSAI1 Receive Mono Slot Selectnumid6,ifaceMIXER,nameSAI1 Receive Mono Switchnumid29,ifaceMIXER,nameSAI1 Receive PATH0 Source Selectnumid28,ifaceMIXER,nameSAI1 Receive PATH1 Source Selectnumid27,ifaceMIXER,nameSAI1 Receive PATH2 Source Selectnumid26,ifaceMIXER,nameSAI1 Receive PATH3 Source Selectnumid4,ifaceMIXER,nameSAI1 Receive SDIx Selectnumid2,ifaceMIXER,nameSAI1 Receive Start Mode Selnumid11,ifaceMIXER,nameSAI1 SDI0 Loopback I2S LR Channel Selnumid15,ifaceMIXER,nameSAI1 SDI0 Loopback I2S LR Switchnumid19,ifaceMIXER,nameSAI1 SDI0 Loopback Src Selectnumid23,ifaceMIXER,nameSAI1 SDI0 Loopback Switchnumid10,ifaceMIXER,nameSAI1 SDI1 Loopback I2S LR Channel Selnumid14,ifaceMIXER,nameSAI1 SDI1 Loopback I2S LR Switchnumid18,ifaceMIXER,nameSAI1 SDI1 Loopback Src Selectnumid22,ifaceMIXER,nameSAI1 SDI1 Loopback Switchnumid9,ifaceMIXER,nameSAI1 SDI2 Loopback I2S LR Channel Selnumid13,ifaceMIXER,nameSAI1 SDI2 Loopback I2S LR Switchnumid17,ifaceMIXER,nameSAI1 SDI2 Loopback Src Selectnumid21,ifaceMIXER,nameSAI1 SDI2 Loopback Switchnumid8,ifaceMIXER,nameSAI1 SDI3 Loopback I2S LR Channel Selnumid12,ifaceMIXER,nameSAI1 SDI3 Loopback I2S LR Switchnumid16,ifaceMIXER,nameSAI1 SDI3 Loopback Src Selectnumid20,ifaceMIXER,nameSAI1 SDI3 Loopback Switchnumid25,ifaceMIXER,nameSAI1 Sync In Switchnumid24,ifaceMIXER,nameSAI1 Sync Out Switchnumid7,ifaceMIXER,nameSAI1 Transmit Mono Switchnumid33,ifaceMIXER,nameSAI1 Transmit SDO0 Source Selectnumid32,ifaceMIXER,nameSAI1 Transmit SDO1 Source Selectnumid31,ifaceMIXER,nameSAI1 Transmit SDO2 Source Selectnumid30,ifaceMIXER,nameSAI1 Transmit SDO3 Source Selectnumid3,ifaceMIXER,nameSAI1 Transmit SDOx Selectnumid1,ifaceMIXER,nameSAI1 Transmit Start Mode Selnumid60,ifaceMIXER,nameSpeaker Switchnumid58,ifaceMIXER,namehp switchnumid57,ifaceMIXER,namespk switchnumid35,ifacePCM,nameSAI1 PCM Read Wait Time MSnumid36,ifacePCM,nameSAI1 PCM Write Wait Time MS7.3、查看引脚状态可以在播放过程中查看相关控制引脚的状态cat/sys/kernel/debug/gpio|grep-Ehp|spkrootrk3576-buildroot:/# cat /sys/kernel/debug/gpio | grep -E hp|spkgpio-70(|hp-con)out lo gpio-71(|spk-con)out lo gpio-79(|hp-det)inhi IRQ ACTIVE LOW7.4、耳机放音# 关喇叭只开耳机amixer-c0csetnumid57off amixer-c0csetnumid60off amixer-c0csetnumid58on amixer-c0csetnumid59on# 关掉 ADC/旁路/回环混音先只走纯 DAC 播放amixer-c0csetnumid63off amixer-c0csetnumid64off amixer-c0csetnumid65off amixer-c0csetnumid66off amixer-c0csetnumid67off amixer-c0csetnumid68off# DAC 输出不反相音量先用温和值别直接 255amixer-c0csetnumid53off amixer-c0csetnumid51150amixer-c0csetnumid52150# OUT MUX 走 normalamixer-c0csetnumid700amixer-c0csetnumid710# SAI1 使用 SDO2 输出 PATH0amixer-c0csetnumid310# 播放音频aplay-Dhw:0,0 sound_test.wav7.5、扬声器放音# 关耳机只开喇叭amixer-c0csetnumid58off amixer-c0csetnumid59off amixer-c0csetnumid57on amixer-c0csetnumid60on# 关 ADC/旁路/回环混音amixer-c0csetnumid63off amixer-c0csetnumid64off amixer-c0csetnumid65off amixer-c0csetnumid66off amixer-c0csetnumid67off amixer-c0csetnumid68off# DAC 音量先别太高amixer-c0csetnumid53off amixer-c0csetnumid51210amixer-c0csetnumid52210# 输出走 normalSAI1 SDO2 - PATH0amixer-c0csetnumid700amixer-c0csetnumid710amixer-c0csetnumid310# 播放音频aplay-Dhw:0,0 sound_test.wav7.6、咪头录音/放音# 关播放输出避免啸叫amixer-c0csetnumid57off amixer-c0csetnumid58off amixer-c0csetnumid59off amixer-c0csetnumid60off# 开主麦关耳麦amixer-c0csetnumid61on amixer-c0csetnumid62off# 输入选择先用 PGAL/PGAR 默认项amixer-c0csetnumid410amixer-c0csetnumid420# ADC 音量和 PGA 增益先别太大amixer-c0csetnumid37191amixer-c0csetnumid38191amixer-c0csetnumid398amixer-c0csetnumid408# 关 ALC先用固定增益测amixer-c0csetnumid43off# ADC MUX 选模拟麦 AMIC通常是 0amixer-c0csetnumid690# 录音arecord-Dhw:0,0-fS16_LE-r48000-c2-d10mic.wav# 放音。放音的设置可以参考上面的耳机或喇叭aplay-Dhw:0,0 mic.wav8、遇到的问题8.1、i2cdetect timeout经排查是 ES8390 供电问题。VCC_1V8_S0 没有电压输出原因是 ETA6280S2F 功率开关的输入电压范围在 2.1v ~ 6v。原理图上是 1.8v 输入。8.2、es8390 i2c 地址漂移该问题表现为 i2cdetect 时有时会出现两个地址10:UU--12--...其中0x10 是驱动绑定的 ES8390 地址0x12 是异常多出来的地址同时导致驱动报错ASoC:error at soc_component_read_no_lock on es8389.3-0010forregister:[0x00000073]-6ASoC:error at soc_component_read_no_lock on es8389.3-0010forregister:[0x00000044]-6原因是es8390 相比于 es8388 而言多了一根 i2c 地址线分别是 pin8 和 pin26。而原理图的 pin8 没有下拉导致 i2c 地址不稳定。0X10 ADDR(CE) DGND 18 AGND 13 HPGND 29 EPAD ES8388 QFN28-4X4X0_8-0_45 --解决方案有两种硬件加下拉电阻。软件将 SAI1_SDI0_M0 配置成内部下拉sai1{statusokay;rockchip,sai-tx-route2103;pinctrl-namesdefault;pinctrl-0sai1m0_lrcksai1m0_sclksai1m0_sdi0_pull_downsai1m0_sdo2;};pinctrl{...audio{sai1m0_sdi0_pull_down:sai1m0-sdi0-pull-down{rockchip,pins4RK_PB31pcfg_pull_down;};};...};8.3、喇叭放音时底噪大待完善。9、参考文章《ES8390 DS.pdf》10、总结无。