x703项目扩接板有接喇叭音频,硬件如下:
喇叭SPK播放无声的时候,首先要测R43贴片电压正常。
需要dts中正确配置SPK_CTL_H的GPIO脚:
es8316_sound: es8316-sound { status = "okay"; compatible = "rockchip,multicodecs-card"; rockchip,card-name = "rockchip-es8316"; hp-det-gpio = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>; // HP_DET_L io-channels = <&saradc 3>; io-channel-names = "adc-detect"; keyup-threshold-microvolt = <1800000>; poll-interval = <100>; spk-con-gpio = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>; // SPK_CTL_H hp-con-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; // HP_CTL_L rockchip,format = "i2s"; rockchip,mclk-fs = <256>; rockchip,cpu = <&i2s0_8ch>; rockchip,codec = <&es8316>; rockchip,audio-routing = "Headphone", "HPOL", "Headphone", "HPOR", "Speaker", "HPOL", "Speaker", "HPOR", "Headphone", "Headphone Power", "Headphone", "Headphone Power", "Speaker", "Speaker Power", "Speaker", "Speaker Power", "MIC1", "Main Mic", "MIC2", "Headset Mic"; pinctrl-names = "default"; pinctrl-0 = <&hp_det>; play-pause-key { label = "playpause"; linux,code = <KEY_PLAYPAUSE>; press-threshold-microvolt = <2000>; }; };
这里GPIO_ACTIVE_LOW(低有效) 和 GPIO_ACTIVE_HIGH(高有效): GPIO_ACTIVE_LOW :那么 1 有效(灯亮) 就是低电平; 0 无效(灯灭) 就是高电平 (物理电平) GPIO_ACTIVE_HIGH :那么 1 有效(灯亮) 就是高电平; 0 无效(灯灭) 就是低电平 (物理电平)
可以这样理解:例如一个LED,拉低点亮。那么在配置设备树的时候这个GPIO就应该设置GPIO_ACTIVE_LOW。
这里SPK_CTL_H配置拉高有效,有效为高电平。
正产情况下,播放音乐,这里SPK_CTL_H能够用万用表测到电压。(高电平)
hp_det:引脚配置:
headphone { hp_det: hp-det { rockchip,pins = <1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>, <4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; }; };
这里配置耳机检测脚pin内部拉高。如上的pcfg_pull_up。
H:高电平没插入耳机。
L:低电平插入耳机。
因为X703硬件没有耳机接口,不需要耳机功能。
并且配置hp-det-gpio脚为GPIO_ACTIVE_HIGH(高有效),不然耳机插入节点会被上层读取到。上层一直按照耳机插入的流程处理。
hp-con-gpio耳机控制脚硬件没有,可以用一个没用的脚位配置。
hp-con-gpio、hp-det-gpio和spk-con-gpio三个脚位在代码中sound/soc/rockchip/rockchip_multicodecs.c中rk_multicodecs_probe函数是需要配置,硬件没有可以的,可以用没有使用的GPIO口配置。