1. Audio hal层文件所在目录如下蓝色部分,audio使用的配置文件是sdm450auto.conf,怎么知道是这个文件呢?看了编译规则相当复杂,最简单直接的办法是看提交记录,如果不幸是第一个到这里的人,那就只能打印log追踪编译规则了,这里提供一个在make文件中打印log的方法:
输出变量MTK_HALL_SUPPORT的值并停止在该行(echologlog)
$(error errorlogxxxxlog:$(strip $(MTK_HALL_SUPPORT)))
输出变量MTK_HALL_SUPPORT的值继续编译
$(warning xxxxlog:$(strip $(MTK_HALL_SUPPORT)))
LA.UM.7.6.2/LINUX/android/vendor/qcom/opensource/audio-kernel/config/sdm450auto.conf
知道这个配置文件的目的是了解正在调试的项目都开启和配置了那些相关宏,方便从整体上了解audio hal 层的配置情况。
2. 当然对我们耳机检查来说不是主要的,耳机检查主要是以下状态的检测。
enum wcd_mbhc_plug_type {
MBHC_PLUG_TYPE_INVALID = -1, // 无效状态
MBHC_PLUG_TYPE_NONE, // 未插入设备
MBHC_PLUG_TYPE_HEADSET, // 四段耳机
MBHC_PLUG_TYPE_HEADPHONE, // 三段耳机
MBHC_PLUG_TYPE_HIGH_HPH, // 高阻抗设备
MBHC_PLUG_TYPE_GND_MIC_SWAP, // 欧美标标志位
MBHC_PLUG_TYPE_ANC_HEADPHONE, // 主动降噪耳机
};
耳机插入打印出的kernel log中搜索如下显示
wcd_mbhc_find_plug_and_report: enter current_plug(0) new_plug(1) // 1代表了四段耳机插入
下面截图是源代码部分(wcd-hbhc-v2.c中的函数wcd_mbhc_find_plug_and_report)。
wcd_mbhc_find_plug_and_report()完成以下功能
- 发现什么设备插入;
- 向上层汇报input event事件,比如四段耳机插入了。
在耳机识别过程中,有以下参数可以微微调试,可以把检测时间调整的短一点,这样会测量快,但误差概率会上升,比如四段耳机识别为三段耳机,所以是一个权衡值。以下两处可以只修改一处,也可以两处都修改。
Wcd-mbhc-v2.h (la.um.7.6.2\linux\android\vendor\qcom\opensource\audio-kernel\asoc\codecs)
修改一处的办法,把循环次数降低一半,这样检查到的耳机速度比原来快一倍。
#define SPECIAL_HS_DETECT_TIME_MS (2 * 1000)
#define MBHC_BUTTON_PRESS_THRESHOLD_MIN 250
-#define GND_MIC_SWAP_THRESHOLD 4
+#define GND_MIC_SWAP_THRESHOLD 2 // 由4变为2
修改两处的办法,循环次数减半,检测时间减去三分之一。
--#define GND_MIC_SWAP_THRESHOLD 4
++#define GND_MIC_SWAP_THRESHOLD 2 //判断欧美标用
--#define HS_DETECT_PLUG_TIME_MS (3 * 1000)
++#define HS_DETECT_PLUG_TIME_MS (2* 1000) //识别时间用
static void wcd_correct_swch_plug(struct work_struct *work)
{
...
...
pr_debug("%s: US_EU gpio present,flip switch\n" , __func__);
...
}
可以看到应用HS_DETECT_PLUG_TIME_MS的地方起了一个定时器jiffes,先以当前jiffes为基础,再增加一个HS_DETECT_PLUG_TIME_MS的延时,当延时到了后跳出while循环。
此函数wcd_correct_swch_plug里面决定是否开启美标耳机和欧标耳机,如log
pr_debug("%s: US_EU gpio present,flip switch\n" , __func__);
如果打印出此log,说明要进行欧美标切换。