一、 问题描述:
进入factory mode后在进行回路测试项时,第一次测试可以听到声音,但之后再进行测试时无法听到声音。
二、 factory回路测试项代码流程:
主要涉及代码为:
mediatek/factory/src/test/ftm_audio.cpp
mediatek/factory/src/test/ftm_audio_Common.cpp
1. audio_init
在init函数中主要是分配内存空间和注册功能函数
回路测试项目使用的的主要函数是mAudio_reveiverloopback_entry
2. mAudio_reveiverloopback_entry
在这个接口中主要有4个功能
(1) 输出显示信息
staticitem_taudio_items_loopback[]= {
#ifdefMTK_DUAL_MIC_SUPPORT
{ITEM_MIC1,uistr_info_audio_loopback_dualmic_mi1, 0},//选择MIC1
{ITEM_MIC2,uistr_info_audio_loopback_dualmic_mi2, 0},//选择MIC2
#endif
{ITEM_PASS, uistr_pass, 0},//测试通过
{ITEM_FAIL, uistr_fail, 0},//测试失败
{-1, NULL, 0},
};
(2) 初始化audio和headset
这里默认使用MIC1
(3) 监控用户操作
首先获取headset信息
然后做了do{}while(1)循环,用来检测用户的操作
例如选择了MIC1,就会设定需要打开MIC1,即设定g_loopback_item = 1,在Audio_Headset_detect_thread中会使用此项来作为打开MIC 1或者MIC2的判断条件
在退出循环后即退出此项测试后,会根据之前获取的headset信息(headset是否可用等信息)及选择的MIC1或者MIC2来disable 之前的打开项
(4) 创建Audio_Headset_detect_thread线程
3. Audio_Headset_detect_thread
(1) 获取headset信息Audio_headset_update_info(hds, hds->info);
例如目前headset是否可用等信息,这一点在界面上有显示项,也是后续判断是否需要打开MIC的一个判断项
(2) 设定循环检测来判断需要打开哪一个headset MIC (默认打开MIC1)
HeadsetMic_Receiver_Loopback(MIC1_ON, hds->Headset_mic);
这里还有另外一个判断条件是hds->avail即headset此时是否可用,如果测试hds->avail为0时,会打开
PhoneMic_Receiver_Loopback(MIC1_OFF);
在测试完成退出循环检测后,会再进行一次检测,关闭之前打开的MIC
并且结束线程
三、 问题解决
问题出在寄存器上,adb shell cat /proc/audio 命令可以输出audio的寄存器配置
AFE_DL_SRC2_1的bit4:3被写成了1,也就是输出通路被mute所导致的
修改方法为:在mediatek/factory/src/test/ftm_audio_Common.cpp中判断headset是否插入前重新配置此寄存器