设为首页 加入收藏

TOP

Alsa音频子系统Codec---al5623.c内核代码框架分析(二)
2017-06-22 10:24:00 】 浏览:512
Tags:Alsa 音频 子系统 Codec---al5623.c 内核 代码 框架 分析
ata->jack_det_ctrl;
 }
 //这里就获取到了我们要操作的芯片的id
 alc5623->id = vid2;
 
 //根据id号会给alc5623_dai.name赋值,dai就是一些音频组建相关的一些操作
 switch (alc5623->id) {
 case 0x21:
  alc5623_dai.name = "alc5621-hifi";
  break;
 case 0x22:
  alc5623_dai.name = "alc5622-hifi";
  break;
 case 0x23:
  alc5623_dai.name = "alc5623-hifi";
  break;
 default:
  kfree(alc5623);
  return -EINVAL;
 }
 //设置客户端数据,设置对应的芯片设备
 i2c_set_clientdata(client, alc5623);
 //设置控制数据
 alc5623->control_data = client;
 //设置控制类型
 alc5623->control_type = SND_SOC_I2C;
 mutex_init(&alc5623->mutex);
 //将设备注册到codec平台
 //到这里,芯片平台的注册工作就完成了,我们可以根据相关注册的soc_codec_device_alc5623和alc5623_dai(数字音频接口)提供的函数通过上层的系统调用来操作音频设备
 //接下来看第三部分,我们来分析&soc_codec_device_alc5623, &alc5623_dai这两个究竟做了什么操作。
 ret =  snd_soc_register_codec(&client->dev,
  &soc_codec_device_alc5623, &alc5623_dai, 1);
 if (ret != 0) {
  dev_err(&client->dev, "Failed to register codec: %d\n", ret);
  kfree(alc5623);
 }
 return ret;
}


3、soc_codec_device_alc5623和alc5623_dai
(1)alc5623_dai


我们先来看看数字音频接口做了什么?
以下具体的就是就是音频接口的操作,根据PCM音频和playback来进行设置
同时,也加载了alc5623_dai_ops这个操作集合


static struct snd_soc_dai_driver alc5623_dai = {
 .name = "alc5623-hifi",
 .playback = {
  .stream_name = "Playback",
  .channels_min = 1,
  .channels_max = 2,
  .rate_min = 8000,
  .rate_max = 48000,
  .rates = SNDRV_PCM_RATE_8000_48000,
  .formats = ALC5623_FORMATS,},
 .capture = {
  .stream_name = "Capture",
  .channels_min = 1,
  .channels_max = 2,
  .rate_min = 8000,
  .rate_max = 48000,
  .rates = SNDRV_PCM_RATE_8000_48000,
  .formats = ALC5623_FORMATS,},


 .ops = &alc5623_dai_ops,
};


(1)alc5623_dai_ops操作集合的实现
以下这些得找具体的调音频的工程师才知道怎么设置相应的操作,具体我也不是特别懂,有兴趣可以看看函数的实现,对着数据手册的寄存器一个个看


static struct snd_soc_dai_ops alc5623_dai_ops = {
  .hw_params = alc5623_pcm_hw_params,
  .digital_mute = alc5623_mute,
  .set_fmt = alc5623_set_dai_fmt,
  .set_sysclk = alc5623_set_dai_sysclk,
  .set_pll = alc5623_set_dai_pll,
};


(2)soc_codec_device_alc5623


static struct snd_soc_codec_driver soc_codec_device_alc5623 = {
 .probe = alc5623_probe,
 .remove = alc5623_remove,
 .suspend = alc5623_suspend,  //  1
 .resume = alc5623_resume,    //  2  1和2是电源管理的回调函数,分别在声卡加载和卸载的时候被调用
 .set_bias_level = alc5623_set_bias_level, //设置偏置电压配置函数
 .reg_cache_size = ALC5623_VENDOR_ID2+2,
 .reg_word_size = sizeof(u16),
 .reg_cache_step = 2,
};


<1> alc5623_probe函数分析


//这部分我们不详细进行分析,拿出最主要的东西来讲,比如后面的snd_soc_add_codec_controls,主要说说它的作用
static int alc5623_probe(struct snd_soc_codec *codec)
{
 struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); //获取数据
 struct snd_soc_dapm_context *dapm = &codec->dapm;                //dapm相当于音频的一个组件
 int ret;
 
 ret = snd_soc_codec_set_cache_io(codec, 8, 16, alc5623->c

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android系统shell中的df命令实现 下一篇Android系统shell中的clear命令实..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目