RK3568平台 在alsa框架中添加音频功放芯片_alsa音频打开功放

三.在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)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: rk3568和rk817是开源社区非常受欢迎的一组ARM芯片方案,其rk3568是一款64位六核心处理器,rk817是一款标准I2S接口音频CODEC芯片。这两个芯片的结合在嵌入式领域有着广阔的应用前景。 在rk3568上使用Linux操作系统时,需要对rk817音频通路进行设置。通常情况下,RK817芯片需要与RK3568的I2S接口进行连接,并设置正确的采样率和其他参数,以确保音频传输的质量和稳定性。以下是一些具体的设置步骤: 1. 在设备树添加RK817的节点,并设置其与RK3568的I2S接口的连接。 2. 设置RK3568的I2S接口的采样频率和格式,确保其与RK817芯片相匹配。 3. 在Linux驱动添加RK817芯片的支持,以便操作系统能够正确识别和控制音频设备。 4. 按照需要配置RK817芯片音频参数,包括音量、EQ、通道等。 5. 进行音频功能测试,确保音频输入输出的质量和稳定性。 需要注意的是,以上设置过程可能因具体的系统环境和应用场景而有所不同,需要根据实际情况进行调整和定制。同时,也需要对rk3568和rk817芯片的规格和性能进行了解和熟悉,以便更好地进行设计和开发工作。 ### 回答2: rk3568和rk817是两款常用于嵌入式设备芯片,其rk3568是一个多媒体处理器,而rk817是一个音频芯片。在Linux系统,设置rk817音频通路通常涉及到以下几个方面: 1. kernel配置:rk3568的Linux内核需要支持rk817音频芯片,此时需要在内核配置添加相应的支持。 2. 设备树配置:rk817音频芯片需要在设备树进行配置,需要配置相应的寄存器地址、时钟、DMA通道等信息。 3. ALSA驱动配置:ALSA(Advanced Linux Sound Architecture)是Linux下的一个音频驱动框架,需要将rk817的驱动配置为ALSA驱动,并进行相应的参数设置。 4. 混音设置:在Linux系统,可以通过混音的方式将多个音频通道合并成一个输出,需要进行相应的混音设置。 需要注意的是,在进行音频通路设置时,需要根据实际需要进行相应的参数调整,以充分发挥rk817音频芯片的性能。同时,在进行Linux系统的配置时,需要考虑到整个系统的应用场景以及硬件平台的实际情况,以达到最佳的性能与稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值