2025年ALSA驱动asoc框架之Codec

ALSA驱动asoc框架之Codec一 Nau8810 芯片系统框架图 由系统框架图可以看出 输入端为差分 MIC 输入 输出端可以为 MOUT 或 Speaker Codec 对外硬件接口通过 Audio I O 和 Digital I O 其中 Audio I O 一般传输的是音频信号为 I2S 或 PCM Digital I O 为控制信号一般为 I2C 芯片引脚分布如下

大家好,我是讯享网,很高兴认识大家。

一、Nau8810芯片系统框架图

系统描述
讯享网
由系统框架图可以看出,输入端为差分MIC输入,输出端可以为MOUT或Speaker。Codec对外硬件接口通过Audio I/O和Digital I/O,其中Audio I/O一般传输的是音频信号为I2S或PCM,Digital I/O为控制信号一般为I2C。
芯片引脚分布如下:
在这里插入图片描述

二、Codec注册

static struct i2c_driver nau8810_i2c_driver = { 
    .driver = { 
    .name = "nau8810", .of_match_table = of_match_ptr(nau8810_of_match), }, .probe = nau8810_i2c_probe, .remove = nau8810_i2c_remove, .id_table = nau8810_i2c_id, }; 

讯享网

前面我们讲了nau8810控制信号为I2C总线连接到平台主芯片上,主系统启动之后会探测I2C总线上面注册的设备是否存在,如果设备存在并且与对应驱动相匹配,则驱动probe函数被调用,如下:

讯享网static int nau8810_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { 
    struct device *dev = &i2c->dev; struct nau8810 *nau8810 = dev_get_platdata(dev); if (!nau8810) { 
    nau8810 = devm_kzalloc(dev, sizeof(*nau8810), GFP_KERNEL); if (!nau8810) return -ENOMEM; } i2c_set_clientdata(i2c, nau8810); nau8810->dev = dev; nau8810->control_data = i2c; return snd_soc_register_codec(dev, &nau8810_codec_driver, &nau8810_dai, 1); } 

Probe函数:
1、通过dev_get_platdata获取dev->platform_data;
2、调用标准snd_soc_register_codec注册Codec。

三、初始化Codec与dai

这里重点关注上面注册Codec的snd_soc_register_codec(dev, &nau8810_codec_driver, &nau8810_dai, 1)中的snd_soc_codec_driver和snd_soc_dai_driver结构体。
snd_soc_codec_driver nau8810_codec_driver如下:

static struct snd_soc_codec_driver nau8810_codec_driver = { 
    .probe = nau8810_codec_probe, .remove = nau8810_codec_remove, .set_bias_level = nau8810_set_bias_level, .read = nau8810_read, .write = nau8810_write, .reg_cache_size = ARRAY_SIZE(nau8810_reg_defaults), .reg_word_size = sizeof(u16), .reg_cache_default = nau8810_reg_defaults, .reg_cache_step = 1, .controls = nau8810_snd_controls, .num_controls = ARRAY_SIZE(nau8810_snd_controls), .dapm_widgets = nau8810_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(nau8810_dapm_widgets), .dapm_routes = nau8810_dapm_routes, .num_dapm_routes = ARRAY_SIZE(nau8810_dapm_routes), }; 

snd_soc_dai_driver nau8810_dai,如下:

讯享网 static struct snd_soc_dai_driver nau8810_dai = { 
    .name = "nau8810-hifi", .playback = { 
    .stream_name = "Playback", .channels_min = 1, .channels_max = 2, /* Only 1 channel of data */ .rates = NAU8810_RATES, .formats = NAU8810_FORMATS, }, .capture = { 
    .stream_name = "Capture", .channels_min = 1, .channels_max = 2, /* Only 1 channel of data */ .rates = NAU8810_RATES, .formats = NAU8810_FORMATS, }, .ops = &nau8810_ops, .symmetric_rates = 1, }; 

snd_soc_dai_driver结构体这个名字对应的是snd_soc_card结构体里面的dai_link里的名字成员,具有录音和播放功能,还有一个operation结构体,即其中.ops 字段,它指向codec_dai的操作函数集,定义了dai的时钟配置、格式配置、硬件参数配置等回调,如下:

static const struct snd_soc_dai_ops nau8810_ops = { 
    .hw_params = nau8810_pcm_hw_params, .set_fmt = nau8810_set_dai_fmt, .set_sysclk = nau8810_set_sysclk, .set_pll = nau8810_set_pll, }; 
小讯
上一篇 2025-03-20 12:33
下一篇 2025-01-17 18:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73607.html