RK3568平台(音频篇)耳机插拔检测

一.硬件原理图

耳机输出硬件原理图:

耳机实物图:

耳机插入硬件原理:

耳机插入后HP_DET_L会连接耳机的GND,从而实现HP_DET_L叫从高到低的状态。

耳机插入软件原理:

软件需要在驱动里面定时的读取gpio的状态,实现实时检测耳机插入拔出的热插拔功能。

二.设备树DTS修改

目前需求在功放驱动里面添加耳机的插入检测, 功放为ad82584.

插入检测HP_DET_L(GPIO1_D2).

设备树DTS配置:

ad82584f_stereo: ad82584f-stereo@31 {
	compatible = "ad82584f";
	#sound-dai-cells = <0>;
	reg = <0x31>;
	spk-con-gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
  + earphone-det-gpio = <&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>;
	set_state_enable = <1>;
	pinctrl-names = "default";
	pinctrl-0 = <&earphone_det>;
	status = "okay";
};

三.代码修改

在probe函数里面读取gpio:

ad82584f_probe:

data->earphone_det_gpio = devm_gpiod_get_optional(&client->dev,
						     "earphone-det",
						     GPIOD_IN);
if (IS_ERR(data->earphone_det_gpio)) {
	dev_warn(dev, "get earphone_det_gpio failed\n");
	return PTR_ERR(data->earphone_det_gpio);
}

在ad82584f_codec_probe添加定时检测gpio状态函数:

检测函数为:ad82584f_earphone_check_work。

INIT_DELAYED_WORK(&ad82584f->earphone_check_work, ad82584f_earphone_check_work);
schedule_delayed_work(&ad82584f->earphone_check_work,msecs_to_jiffies(5000));

static void ad82584f_earphone_check_work(struct work_struct *work)
{
	struct ad82584f_data *ad82584f = container_of(work, struct ad82584f_data,
			earphone_check_work.work);
	if (ad82584f->earphone_det_gpio) {
		bool curEarphone_plug_in = (gpiod_get_value(ad82584f->earphone_det_gpio)  > 0) ? false:true; //检测耳机插入状态
		if(curEarphone_plug_in != ad82584f->preEarphone_plug_in){
			if(curEarphone_plug_in){
				dev_info(ad82584f->dev, "%s: earphone plug in\n", __func__);
				if(of_property_read_bool(ad82584f->dev->of_node, "set_state_enable")){  //使能耳机功能
					extcon_set_state_sync(ad82584f->extcon, EXTCON_JACK_HEADPHONE, true);  
					extcon_set_state_sync(ad82584f->extcon, EXTCON_JACK_MICROPHONE, true);
				}
				ad82584f_enable_spk(ad82584f,0);
				}else{
				dev_info(ad82584f->dev, "%s: earphone plug out\n", __func__);
				if(of_property_read_bool(ad82584f->dev->of_node, "set_state_enable")){
					extcon_set_state_sync(ad82584f->extcon, EXTCON_JACK_HEADPHONE, false);
					extcon_set_state_sync(ad82584f->extcon, EXTCON_JACK_MICROPHONE, false);
				}
				ad82584f_enable_spk(ad82584f,1);
			    //gpiod_set_value(ad82584f->spk_ctl_gpio, 0);
			}
			ad82584f->preEarphone_plug_in = curEarphone_plug_in;
		}
	}
	schedule_delayed_work(&ad82584f->earphone_check_work,
			      msecs_to_jiffies(1000));
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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配置:rk3568Linux内核需要支持rk817音频芯片,此时需要在内核配置中添加相应的支持。 2. 设备树配置:rk817音频芯片需要在设备树中进行配置,需要配置相应的寄存器地址、时钟、DMA通道等信息。 3. ALSA驱动配置:ALSA(Advanced Linux Sound Architecture)是Linux下的一个音频驱动框架,需要将rk817的驱动配置为ALSA驱动,并进行相应的参数设置。 4. 混音设置:在Linux系统中,可以通过混音的方式将多个音频通道合并成一个输出,需要进行相应的混音设置。 需要注意的是,在进行音频通路设置时,需要根据实际需要进行相应的参数调整,以充分发挥rk817音频芯片的性能。同时,在进行Linux系统的配置时,需要考虑到整个系统的应用场景以及硬件平台的实际情况,以达到最佳的性能与稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值