MTK 底层耳机中断上报流程

前言

更新,加量不加价。。。

框架

在这里插入图片描述

硬件

【背景知识】:

国标耳机插头信号定义:				<<<【左声道】【右声道】【麦克】【地】
美标耳机插入信号定义:				<<<【左声道】【右声道】【地】【麦克】	

【micbias】: 是用来在耳机有 Mic 的情况下,给 Mic 提供直流偏置,让其正常工作的。他使用 PWM 控制,用于降低麦克的功耗, 在不用麦克的情况下,可以降低轮询检测按键的功耗。
【PMCI ACCDET 模块】:是用来检测耳机类型及按键类型的。

【线控耳机原理图】:

这里写图片描述
图片盗自百度,见谅。

解释下大概原理吧,首先这是个美标耳机,从左至右四段依次为
【左声道】【右声道】【地】【麦克】
左、右声道与麦克共地,重点看麦克与地之间,他在地之间并了 4 个元件,CPU 判断哪个按键的原理就是依靠麦克与地之间的按下按键时的不同的电阻值,导致麦克与地之间电压变化:
  MIC: 电阻很高(600Ω至10kΩ)
  接听/播放按键,按下时电阻为 0
  上一曲:按下时电阻为 600
  下一曲:按下时电阻为 220
在麦克线路上,上面会连接到 PMIC 的 Accdet 引脚,以及 micbias 引脚,micbias 会产生一个 PWM 波形,波峰时会进行录音,检查【麦克脚与地】之间的电压,从而判断现在是接上 MIC 还是按下按键了。

【检测电路解释】

MTK 检测耳机有两种方式:

  1. Accdet only
    此方式是让耳机 micbias 常开下,依靠 PMIC 内部中断来检测耳机处于的状态的。但此方式会带来耳机插入瞬间有 pop 杂音的出现。
  1. Accdet+EINT 方式
    此方式在耳机为插入时,micbias 是被 disable 的。利用中断让 AP 检测到有耳机插入后,在中断中打开 micbias,从而达到省功耗和减小杂音的效果的。待插入后,再检测耳机类型,检测走的路线还是通过 PMIC 的 accdet 内部中断。
    摘自 FAQ13724

正文开始

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

软件

Linux

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

【驱动代码流程】

	//Accdet_drv.c (mediatek\kernel\drivers\accdet)
	module_init(accdet_mod_init);
	platform_driver_register(&accdet_driver);
	        // static struct platform_driver accdet_driver = {
	        //     .probe      = accdet_probe, 
	        //     //.suspend  = accdet_suspend,
	        //     //.resume       = accdet_resume,
	        //     .remove   = accdet_remove,
	        //     .driver     = {
	        //     .name       = "Accdet_Driver",
	        // #ifdef CONFIG_PM
	        //     .pm         = &accdet_pm_ops,
	        // #endif
	        //     },
	
	//
	// 匹配后执行
	accdet_probe(struct platform_device *dev)  
	    >//
	// Accdet.c ediatek\platform\mt6582\kernel\drivers\accdet)
	  mt_accdet_probe();
	>>/
	 // 0. 设置长按判断的时长
	 press_key_time = get_headset_key_custom_setting();
	>>/
	>     // 1,注册一个 switch 设备, /sys/class/swithc/h2w/state
	>主要是供安卓层调用,判断耳机状态
	>accdet_data.name = "h2w";
	accdet_data.index = 0;
	accdet_data.state = NO_DEVICE;
	// 获得耳机的 micbias 的 PWM 波形,这个波形用来采样,可以节约功耗
	cust_headset_settings = get_cust_headset_settings();
	// 注册一个 switch 设备,表示耳机状态
	ret = switch_dev_register(&accdet_data);
	 >/
	// 2. 创建一个字符设备节点 
	ret = alloc_chrdev_region(&accdet_devno, 0, 1, CCDET_DEVNAME);
	accdet_cdev = cdev_alloc();
	accdet_cdev->owner = THIS_MODULE;
	accdet_cdev->ops = accdet_get_fops();
	ret = cdev_add(accdet_cdev, accdet_devno, 1);
	>/
	// 3. 创建 /sys 目录下的文件节点
	accdet_class = class_create(THIS_MODULE, ACCDET_DEVNAME);
	// if we want auto creat device node, we must call this
	accdet_nor_device = device_create(accdet_class, NULL, accdet_devno, NULL, ACCDET_DEVNAME); 
	>/
	// 4. 创建一个 input 输入设备, 用于上报耳机按键事件,创建一个定时器
	//      每 6s 自动关闭 micbias,达到省电目的。同时设置 input 输入设备上 
	//      报的键值类型,并注册输入设备。
	kpd_accdet_dev = input_allocate_device();
	// 通过定时器每 6s 自动关闭 MICBIAS,达到省电目的,因为中断会唤醒使能 micbias 检测耳机类型与 mic 及按键,如果没有 mic, 且不需要检测按键,则可以直接关闭 micbias 偏置
	init_timer(&micbias_timer);
	micbias_timer.expires = jiffies + MICBIAS_DISABLE_TIMER;
	micbias_timer.function = &disable_micbias;
	//define multi-key keycode
	// 设置 input 输入设备上报的键值类型
	__set_bit(EV_KEY, kpd_accdet_dev->evbit);
	__set_bit(KEY_CALL, kpd_accdet_dev->keybit);
	。。。 
	// 注册 input 输入设备
	input_register_device(kpd_accdet_dev)
	>/
	// 5. 注册工作队列,用于处理 ACCDET 模块识别按键流程 , 他会根据 PMIC 的状态,判断是否有耳机插入,及耳机类型和按键类型,如果有按键,通过 input 上报处理完后,同步更新 switch 模块的状态
	accdet_workqueue = create_singlethread_workqueue("accdet");
	INIT_WORK(&accdet_work, accdet_work_callback);
	>/
	// 6. 创建一个按键上报线程,用于按键上报
	init_waitqueue_head(&send_event_wq);
	//start send key event thread
	keyEvent_thread = kthread_run(sendKeyEvent, 0, "keyEvent_send");
	>/
	// 7. 针对第一次启动,初始化 accdet 模块硬件,及注册 ap 的耳机中断函数,在 ap 耳机中断函数中
	     0.  变更耳机中断电平,保证插入/拔出都有中断
	    1. 如果是耳机插入,则创建一个定时器,用于耳机插入 6s 后,检测耳机是否有 mic 及按键,没有则关闭 micbias。
	    2. 调用 accdet_eint_work_callback() 函数,用于打开/关闭 accdet 模块。
	if (g_accdet_first == 1)
		。。。

Android

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

##【相关源码】
一如既往,需要分析的同志可以下载注释的原码分析,地址如下:
链接: http://pan.baidu.com/s/1c1Fhg3I 密码: mvkx
觉得有帮助请点赞[笑脸]

### 回答1: MTK双mic录音驱动调试是指在使用MTK芯片的设备上对双麦克风录音功能进行调试优化的过程。 首先,调试前需要明确录音功能的需求和规格。我们需要确定录音的采样率、位深、声道数等参数以及录音场景(单向还是双向录音),这些都会对录音效果产生影响。 接下来,我们可以使用专门的录音调试工具,在合适的测试场景下进行调试。调试工具可以提供录音音频数据的采集和分析功能。我们可通过对比不同参数的录音效果,来寻找最佳的录音配置。 在调试中,我们可能需要调整麦克风的位置和方向,以获得最佳的录音效果。同时,我们也可以通过修改硬件和软件设置来进一步优化录音效果,例如增加麦克风阵列的数量或改进降噪算法。 在录音调试过程中,我们还需要注意一些常见问题,例如杂音、失真、回声等。这些问题可能由于麦克风位置错误、麦克风质量低劣或者算法设置不当等原因导致。我们可以通过分析录音数据和调整参数来解决这些问题。 最后,一旦调试完成,我们需要进行全面的测试和验证,确保录音功能达到预期效果。这可以包括对各种录音场景的测试,以及与其他系统模块的兼容性测试。 总之,MTK双mic录音驱动调试是一个综合性的工作,需要结合硬件和软件的优化,通过合适的调试工具和方法,来实现最佳的录音效果。 ### 回答2: MTK双麦克风录音驱动调试是指对基于MTK芯片的设备中的双麦克风录音驱动进行调试和优化的过程。 首先,双麦克风录音驱动是指设备同时使用两个麦克风进行录音,可以实现立体声录音效果。调试这个驱动的目的是为了确保录音质量的稳定和提升录音性能。 调试的第一步是检查硬件连接。确保两个麦克风都正确连接到MTK芯片,并且麦克风的灵敏度和音频输入都调整到合适的水平。 接下来是软件层面的调试。可以使用一些录音软件或者提供的调试工具,对录音驱动进行设置和测试。一般会调整一些参数,如录音灵敏度、降噪算法等,根据实际情况进行优化。同时,还要测试不同环境下的录音效果,例如室内、室外、噪声环境等。 在调试过程中,还要注意跟踪录音数据的流向和处理流程,确保数据正确传输和处理。如果出现问题,需要进行调试并解决。 最后,为了确保录音质量的稳定性,需要进行长时间的稳定性测试。通过持续录音并监测录音质量,可以发现潜在的问题并进行修复。 总结而言,MTK双麦克风录音驱动调试是一个多方位的过程,包括硬件连接、软件设置和测试、数据流追踪和稳定性测试等。通过这个过程,可以使MTK芯片设备的录音性能达到最佳状态。 ### 回答3: MTK双麦克风录音驱动调试需要几个关键步骤来确保其正常运行。 首先,需要确保驱动程序已正确安装。我们可以从MTK官方网站上找到最新的驱动程序,并按照其提供的指南进行安装。安装完成后,需要重启计算机以使驱动程序生效。 其次,我们需要确保电脑的麦克风设置正确。在声音设置中,选择麦克风选项卡,确保双麦克风已正确识别并选中。同时,调整麦克风的音量和增益参数,以获得最佳录音效果。 第三,我们需要测试双麦克风的录音功能。打开声音录制软件,例如Windows自带的“声音录制器”,在其中选择双麦克风作为录音设备。然后,进行录音测试,说话或者唱歌,观察录音是否正常,同时可以通过耳机或扬声器来听取录音效果。 如果录音效果不理想,可能需要进行进一步的调试。可以尝试调整麦克风的摆放位置,确保其与录音对象的距离和角度适当。还可以尝试调整音频设置中的降噪功能或增强效果,以改善录音质量。 此外,如果MTK双麦克风录音驱动在特定软件中无法正常工作,可能需要检查该软件的设置,确保其已正确配置为使用双麦克风。有时候,需要更新软件版本或与软件供应商联系以获得支持。 总之,MTK双麦克风录音驱动调试需要注意驱动程序安装、麦克风设置、录音测试等关键步骤。通过逐步测试和调整,可以获得高质量、清晰的双麦克风录音效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值