MTK 平台如何配置喇叭和听筒二合一


[DESCRIPTION]

有客户会使用听筒喇叭二合一的方式来节省成本,因此需要进行相关的配置

[SOLUTION]

一. 开启通路

1. ProjectConfig.mk

MTK_2IN1_SPK_SUPPORT = yes

2. audio_device.xml
two_in_one_speaker_output下面的配置修改成和speaker打开时的配置一致
例如:
使用外部PA,接在lineout上,打开speaker的时候需要同时调用Speaker_Amp_Switch和Ext_Speaker_Amp_Switch这两个kctl,打开MTK_2IN1_SPK_SUPPORT这个宏之后,打开听筒的时候也应该调用这两个kctl

    <!-- 2-in-1 speaker output-->
    <path name="two_in_one_speaker_output" value="turnon">
        <kctl name="Speaker_Amp_Switch" value="On" />
        <kctl name="Audio_Speaker_class_Switch" value="CLASSAB" />
    </path>
    <path name="two_in_one_speaker_output" value="turnoff">
        <kctl name="Audio_Speaker_class_Switch" value="RECEIVER" />
        <kctl name="Speaker_Amp_Switch" value="Off" />

改为

    <!-- 2-in-1 speaker output-->
    <path name="two_in_one_speaker_output" value="turnon">
	    <kctl name="Speaker_Amp_Switch" value="On" />
	    <kctl name="Ext_Speaker_Amp_Switch" value="On" />
    </path>
    <path name="two_in_one_speaker_output" value="turnoff">
            <kctl name="Ext_Speaker_Amp_Switch" value="Off" />
	    <kctl name="Speaker_Amp_Switch" value="Off" />

二. 外部PA的模式切换

通常听筒模式和喇叭模式的声音大小是不一样的,所以需要调整喇叭模式和听筒模式的外部PA的工作的mode

1./vendor/mediatek/proprietary/custom/proj/hal/audioflinger/audio/audio_custom_exp.h 增加

 
 #define HAVING_RCV_SPK_SWITCH

2./vendor/mediatek/proprietary/hardware/audio/common/V3/aud_drv/AudioALSAHardwareResourceManager.cpp

status_t AudioALSAHardwareResourceManager::OpenReceiverPath(const uint32_t SampleRate __unused) {
//AudioALSACodecDeviceOutReceiverPMIC::getInstance()->open();
    IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER)) {
    mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_2IN1_SPEAKER);
} else {
    mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_RECEIVER);
}
   #ifdef HAVING_RCV_SPK_SWITCH
     AudioALSACodecDeviceOutReceiverSpeakerSwitch::getInstance()->open();
   #endif

    return NO_ERROR;
   }

修改成:

status_t AudioALSAHardwareResourceManager::OpenReceiverPath(const uint32_t SampleRate __unused) {
    #ifdef HAVING_RCV_SPK_SWITCH
    AudioALSACodecDeviceOutReceiverSpeakerSwitch::getInstance()->open();
    #endif
    //AudioALSACodecDeviceOutReceiverPMIC::getInstance()->open();
    if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER)) {
    mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_2IN1_SPEAKER);
} 
  else {
   mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_RECEIVER);
 }

3. /kernel-4.4/sound/soc/mediatek/codec/mt6357/mtk-soc-codec-6357.c

static void Ext_Speaker_Amp_Change(bool enable)
{
enable的时候加一下判断,receiver有开,就设置mode 8,如果没有开就设置mode 3
disable的时候也是,receiver有开,就按mode 8 去关闭,如果没有,就按mode 3去关闭
例子如下
//modify here 
if (pin_extspkamp != 54)
if(mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_RECEIVER_SPEAKER_SWITCH] == true) 
AudDrv_GPIO_EXTAMP_Select(false, 8);
else
AudDrv_GPIO_EXTAMP_Select(false, 3); 
else
if(mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_RECEIVER_SPEAKER_SWITCH] == true) 
AudDrv_GPIO_EXTAMP2_Select(false, 8);
else
AudDrv_GPIO_EXTAMP2_Select(false, 3);
////////
#endif 
......

后续mode的改动也按照上述方式修改

}

三. 正确加载听筒的参数,需要如下修改/device/mediatek/proj/audio_param/VolumeGainMap_AudioParam.xml
RCV_NO_ANA对应的param_id下面的

<Param name="dl_analog_type" value="0"/>

改为

<Param name="dl_analog_type" value="3"/>

MTK摄像头Android驱动新版本升级指南


MTK摄像头的驱动包含有kernel部分和hal层2个部分,在Android版本升级之后,内核版本也进行了升级,在旧版本往新版本移植的过程中,要注意以下几个部分:

继续阅读“MTK摄像头Android驱动新版本升级指南”

MTK 平台如何在 user 版本打开串口打印信息



串口打印作为常用的调试方法,在解决系统死机和各种设备问题时十分有效,通常是在eng版本的时候才有完整的打印信息,若是在量产阶段或者 user 版本时没有串口通常无法有效分析问题。
因此,在user版本中打开打印,作为分析问题的方法十分有效,下面记录一下 MTK 平台在 user 版本打开串口打印信息的2种方法:
继续阅读“MTK 平台如何在 user 版本打开串口打印信息”

MTK平台新增摄像头指南 — 已更新android 7.0路径的更改。


增加驱动及配置到Kernel 层:

  • 增加驱动文件夹到如下目录:
mediatek\custom\common\kernel\imgsensor\
mediatek\custom\mt6582[mt8127]\kernel\imgsensor\
mediatek\custom\[project]\kernel\imgsensor\
//说明:
//优先级:[project]/mt6582/mt8127 /common
//建议增加时:yuv 放到 common ,raw 放到:mt6582/mt8127.
//驱动文件夹命名规则为:品牌+型号+ _ +yuv/raw
  • 增加可选摄像头到mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h,修改内容如下:

a. 申明摄像头初始化函数, 注意此函数在摄像头驱动文件中实现,注意检查是否一致,如下增加gc0312摄像头为例。

UINT32 GC0312_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);

b. 增加摄像头到 camera List(此处宏定义可在 ProjectConfig.mk 文件中找到并对应即可编译此摄像头)

#if defined(GC0312_YUV)
    {GC0312_SENSOR_ID, SENSOR_DRVNAME_GC0312_YUV, GC0312_YUV_SensorInit},
#endif
  • 配置摄像的检测的参数,修改 mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h增加sensor name 和sensor id的定义
#define GC0312_SENSOR_ID                        0xb310
#define SENSOR_DRVNAME_GC0312_YUV               "gc0312yuv"
  • 修改上电文件保证摄像头上电:mediatek\custom\[project]\kernel\camera\camera\kd_camera_hw.c
    根据实际情况调节上电电压和方式。


增加驱动及配置到HAL 层:

  • 增加驱动文件夹到目录:
mediatek\custom\common\hal\imgsensor\
mediatek\custom\mt6582[mt8127]\hal\imgsensor\
mediatek\custom\[project]\hal\imgsensor\
//优先级:[project] &gt; mt6582/mt8127 &gt; common
//建议增加时:yuv 放到 common ,raw 放到:mt6582/mt8127.
//驱动文件夹命名规则为:品牌+型号+ _ +yuv/raw
  • 增加可选摄像头到文件:mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
#if defined(GC0312_YUV)
    YUV_INFO(GC0312_SENSOR_ID, SENSOR_DRVNAME_GC0312_YUV, NULL),
#endif

注:在 kdSensorList 和 SensorList 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。


到此添加设备到系统已经内容完毕,但编译测试之前需要对 ProjectConfig.mk 进行配置,

打开对应工程的 ProjectConfig.mk 文件,具体路径为:mediatek\config\[project]\ProjectConfig.mk
将对应的文件夹的名字拷贝到等号后面。

Kernel 部分:
CUSTOM_KERNEL_IMGSENSOR =
后置摄像头: CUSTOM_KERNEL_MAIN_IMGSENSOR =
前置摄像头: CUSTOM_KERNEL_SUB_IMGSENSOR =

HAL 部分:
CUSTOM_HAL_IMGSENSOR =
后置摄像头: CUSTOM_HAL_MAIN_IMGSENSOR =
前置摄像头: CUSTOM_HAL_SUB_IMGSENSOR =

注:摄像头的数量不超过 16 个,否则多余的不可识别。

关于编译:

增加或者修改内核部分,编译时:
./mk -o=TARGET_BUILD_VARIANT=user [project] n k bootimg

修改 HAL 层,编译时:
./mk -o=TARGET_BUILD_VARIANT=user [project] mm mediatek/platform/mt6582[mt8127]/hardware/mtkcam/

注,为保证编译有效,编译前需要删除如下文件夹的内容:
out\target\product\[project]\obj\CUSTGEN\custom\hal\imgsensor
out\target\product\[project]\obj\CUSTGEN\custom\kernel\imgsensor


android 7.0 路径的变化

# 增加了kernel和hal同步的kd_imgsensor.h
device/mediatek/common/kernel-headers/kd_imgsensor.h

# kernel 驱动文件位置的更新
kernel-3.18/drivers/misc/mediatek/imgsensor/

#kernel上电文件位置的更新
kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt8163/camera_hw/

# hal 驱动文件的位置的更新
vendor/mediatek/proprietary/custom/mt8163/hal/imgsensor/

# hal层调整摄像头方向等参数文件的更新
vendor/mediatek/proprietary/custom/mt8163/hal/sendepfeature/