SkylarkOS codec 开发指南

优质
小牛编辑
129浏览
2023-12-01

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