Linux驱动--音频耳机
音频驱动
本文档以 es8388 驱动为例。
电路原理
es8388 电路设计:
es8388 支持多种输入模式,可以直通输入也可以差分输入,这个需要针对实际情况对芯片寄存器进行配置。以上LIN1和RLIN1是直通,连接耳机。LIN2和RLIN2是差分输入,连接板载麦克风。
设备树分析
声音卡配置
1 | es8388_sound: es8388-sound { |
label解释:
hp-det-gpio :检测耳机插入状态的GPIO
io-channels :检测耳机插入状态的ADC通道
io-channel-names :检测耳机插入状态的ADC通道名称
keyup-threshold-microvolt :检测耳机插入状态的阈值
poll-interval :检测耳机插入状态的间隔时间
spk-con-gpio :耳机输出控制的GPIO
hp-con-gpio :耳机输入控制的GPIO
rockchip,format :音频数据格式
rockchip,mclk-fs :音频数据采样率
rockchip,codec :音频数据采集的CODEC
rockchip,audio-routing :音频数据采集的路由
pinctrl-0 :检测脚设置
play-pause-key :耳机播放暂停的按键
芯片挂载在I2C7总线上,对应设备树如下:
1 | &i2c7 { |
HiFi.conf中定义声卡名称
1 | # Use case for devices on rockchip,rk809-codec card. |
从配置上可以看出配置了两个 jack , “Headphone” 和 “MainMic” 。
Headphone 是用来区分耳机和喇叭播放,MainMic区分板载麦克风和耳机麦克风
数据手册
调整耳机录音增益寄存器,电路图连接的是左声道in,所以调整左声道增益就行。
寄存器10对应的输入通道选择LIN1或者LIN2.
DSR = 0: 选择LINPUT1 - RINPUT1作为差分输入对(默认)。
DSR = 1: 选择LINPUT2 - RINPUT2作为差分输入对
寄存器11则是使用差分模式输入,DS切换需要设置成1.
驱动代码分析
代码节选:
1 | static int es8323_probe(struct snd_soc_component *component) |
在probe阶段,会设置寄存器默认值,根据手册修改0x09增加录音增益。修改 0x0A和0x0B,设置默认录音路径。
问题
- 切换录音默认路径问题
参考数据手册中寄存器10和11设置,结合代码分析。
es8388 寄存器驱动默认配置LIN1为录音设备,硬件电路板载麦克风为LIN2,如需要调试板载,需要切换以下寄存器配置值。
Left PGA Mux 32
Right PGA Mux 33
Differential Mux 34
测试
1 | # 安装audacity 录音工具 桌面版软件 |
1 | # 查看音频设备状态 |
- 指令录音
1 | # 录音 |
指令错误
1 | 查看参数设置,排查指令错误 |
1 | # 播放 |