三.在alsa框架中添加音频芯片add2012
音频芯片Codec注册:
static struct i2c_driver add2012_i2c_driver = {
.driver = {
.name = "add2012",
.of_match_table = of_match_ptr(add2012_of_match),
},
.probe = add2012_probe,
.id_table = add2012_id,
};
add2012控制信号为I2C总线连接到平台主芯片上,主系统启动之后会探测I2C总线上面注册的设备是否存在,如果设备存在并且与对应驱动相匹配,则驱动probe函数被调用,如下:
static int add2012_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct device *dev = &client->dev;
struct add2012_data *data;
const struct regmap_config *regmap_config;
int ret;
int i;
static int step = 0;
printk("zqh goin add2012_probe step=%d start\n", step); //add
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
data->add2012_client = client;
data->devtype = id->driver_data;
switch (id->driver_data) {
case ADD2012:
regmap_config = &add2012_regmap_config;
break;
default:
dev_err(dev, "unexpected private driver data\n");
return -EINVAL;
}
data->regmap = devm_regmap_init_i2c(client, regmap_config);
if (IS_ERR(data->regmap)) {
ret = PTR_ERR(data->regmap);
dev_err(dev, "failed to allocate register map: %d\n", ret);
return ret;
}
for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
data->supplies[i].supply = add2012_supply_names[i];
ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
data->supplies);
if (ret != 0) {
dev_err(dev, "failed to request supplies: %d\n", ret);
return ret;
}
dev_set_drvdata(dev, data);
printk("--set add2012 ad_codec_num 0---zqh---\n");
if (step == 0) {
ret = devm_snd_soc_register_component(&client->dev,
&soc_component_dev_add2012_amp0,
add2012_dai, ARRAY_SIZE(add2012_dai));
printk("--add2012-register amp 0-----zqh---\n");
}
if (step == 1) {
ret = devm_snd_soc_register_component(&client->dev,
&soc_component_dev_add2012_amp1,
add2012_dai, ARRAY_SIZE(add2012_dai));
printk("--add2012-register amp 1-----zqh---\n");
}
if (step == 2) {
ret = devm_snd_soc_register_component(&client->dev,
&soc_component_dev_add2012_amp2,
add2012_dai, ARRAY_SIZE(add2012_dai));
printk("--add2012-register amp 2-----zqh---\n");
}
if (step < 3)
step++;
if (ret < 0) {
dev_err(dev, "failed to register component: %d\n", ret);
return ret;
}
printk("zqh goin add2012_probe step=%d end\n", step); //add
return 0;
}
Probe函数:
通过devm_snd_soc_register_component注册Codec。
初始化Codec与dai:
这里重点关注上面注册Codec的
devm_snd_soc_register_component(&client->dev,&soc_component_dev_add2012_amp0,
add2012_dai, ARRAY_SIZE(add2012_dai));
结构体soc_component_dev_add2012_amp0如下:
static const struct snd_soc_component_driver soc_component_dev_add2012_amp0 = {
.probe = add2012_amp0_codec_probe,
.remove = add2012_codec_remove,
.suspend = add2012_suspend,
.resume = add2012_resume,
.controls = add2012_amp0_snd_controls,
.num_controls = ARRAY_SIZE(add2012_amp0_snd_controls),
.dapm_widgets = add2012_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(add2012_dapm_widgets),
.dapm_routes = add2012_audio_map,
.num_dapm_routes = ARRAY_SIZE(add2012_audio_map),
.idle_bias_on = 1,
.use_pmdown_time = 1,
.endianness = 1,
.non_legacy_dai_naming = 1,
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/d36fb9a9523f47dffe6bcf0ff34a158f.png)
![img](https://img-blog.csdnimg.cn/img_convert/44fb7ca2101ff8fe03f4674a4792a176.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/d553a9e8559b9a1e72fcde2947a0e2d3.png)
![img](https://img-blog.csdnimg.cn/img_convert/3b1715cc2a4bdf51761a379e1e62355e.png)
![img](https://img-blog.csdnimg.cn/img_convert/e7a4106d2507c3af078b03a710f7b8e4.png)
![img](https://img-blog.csdnimg.cn/img_convert/ae37d6220bc9be0245ba90d8f238f369.png)
![](https://img-blog.csdnimg.cn/img_convert/159909fe3a7a88e519a3657f21f178c9.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!