SkylarkOS codec 开发指南
GX8009/GX8010启动时,DAC先由ck驱动,ck拉起arm后,DAC会挂载到kernel上,即之后ck不再驱动DAC。
所以,GX8009/GX8010上codec驱动分vsp和kernel两部分。
vsp驱动开发
vsp代码驱动目录:vsp/mcu/drivers/codec/
驱动实现可以参考目录下已实现的驱动代码。
然后,需初始化外部codec,相关操作在以下函数中实现(gx8009b lp示例):
vsp/mcu/boards/nationalchip/leo_gx8009b_ssd_lp_1v/audio_board.c
int AudioOutExternCodecInit(void)
{
return 0;
}
kernel驱动开发
修改dts
dts路径(gx8009b lp示例):
kernel/arch/arm/boot/dts/leo_gx8009b_ssd_lp_v1_4.dts
添加codec i2c设备:
&ck_i2c1{
status = "okay";
tas5805m@2c{
compatible = "ti,tas5805m";
dev-name = "tas5805m";
reg = <0x2c>;
dsp_reset_pin = <&ck_gpa0 32 GPIO_ACTIVE_HIGH>;
};
};
注意:
ck_i2c1 在kernel/arch/arm/boot/dts/leo.dtsi下定义,即表示该i2c设备连接在ck的i2c总线上。
2c即i2c设备地址,一般在codec的datasheet上查询。
compatible定义了设备名称,在设备驱动中会使用。
修改codec-name和codec-dai-name,需要和codec驱动代码里一致:
gxasoc-machine {
name = "gxasoc-machine";
compatible = "NationalChip,ASoc-Machine";
num_links = <3>;
num_codecs = <1>;
codec-name = "tas5805m";
codec-dai-name = "tas5805m-amplifier";
platform-name = "gxasoc-platform";
cpu-dai-name = "gxasoc-platform-dai";
status = "okay";
};
驱动代码实现
codec驱动代码目录:kernel/sound/soc/codecs/
参考驱动代码路径:kernel/sound/soc/codecs/tas5805m.c
修改 Makefile
修改kernel/sound/soc/codecs/Kconfig
config SND_SOC_TAS5805M
tristate "Ti TAS5805M Audio Amplifier"
depends on I2C
修改kernel/sound/soc/codecs/Makefile,加入驱动编译
...
snd-soc-tas5805m-objs := tas5805m.o
...
obj-$(CONFIG_SND_SOC_TAS5805M)→ += snd-soc-tas5805m.o
...
openwrt项目板级里enable驱动项(gx8009b lp示例):
修改openwrt/target/linux/leo/gx8009b-ssd-lp-v1-4/config-default
CONFIG_SND_SOC_TAS5805M=m