
在 MTK 平台上Camera Flashlight Tuning 的配置路径和关键参数与通用 Android 平台类似但具有其特定的文件位置和配置方式。影响前后摄闪光灯亮度调节的核心部分主要集中在驱动层、HAL 层以及 MTK 特有的配置文件中。MTK 平台闪光灯亮度调节核心配置层级关键文件/模块核心参数/配置对前后摄亮度调节的影响Kernel 驱动层kd_flashlightlist.c(或flashlight_list.c)FLASHLIGHT_DEVICE结构体数组定义并注册系统中所有闪光灯设备如前摄、后摄、补光灯的硬件信息如 I2C 地址、GPIO 引脚和驱动函数指针。这是系统识别和控制特定闪光灯的基础 。constant_flashlight.c/sub_strobe.cstrobe_CMD结构体、FL_Init/FL_Enable/FL_Disable等函数这是与具体闪光灯芯片如 MTK 常用型号通信的实际驱动。通过 I2C/GPIO 发送命令直接控制闪光灯的开关和亮度等级通过设置电流或 PWM 占空比。HAL 硬件抽象层flashlight_drv.cpp(路径通常为vendor/mediatek/proprietary/hardware/mtkcam/)cctFlashEnable、cctFlashDisable、cctFlashSetStep等函数作为 Kernel 驱动的上层接口接收来自 Framework 的亮度等级Step指令并将其转换为驱动层能识别的具体参数如寄存器值。前后摄的设备标识SENSOR_DEV_MAINSENSOR_DEV_SUB在此层被区分 。flash_mgr.cppFlashMgr::setFlashlightValue、FlashMgr::getTorchDuty等函数管理闪光灯的状态和模式TORCH STROBE。根据相机场景预览、拍照、录像和前后摄的切换调用不同的亮度策略表Duty Table。MTK 平台通常在此处为前后摄配置独立的亮度映射表 。MTK 特有配置Project Config文件 (如ProjectConfig.mk)CUSTOM_KERNEL_FLASHLIGHT定义项目所使用的闪光灯驱动类型如constant_flashlightsub_strobe。此配置决定了编译时包含哪个驱动文件直接影响前后摄闪光灯的控制逻辑 。DCT 工具生成的文件 (dct目录)GPIO 配置、I2C 通道配置定义闪光灯控制引脚如 STROBE TORCH FLASH_EN对应的 GPIO 编号以及 I2C 总线号。前后摄闪光灯可能使用不同的 GPIO 或 I2C 通道此处配置是硬件控制的基础 。MTK 平台亮度调节关键代码流程解析亮度调节的核心是将逻辑亮度等级Step通过 HAL 层的映射表Duty Table转换为驱动芯片的寄存器值并通过 I2C 写入。1. 亮度等级表 (Duty Table) 定义 (HAL 层)在 MTK 平台的 HAL 层如flash_mgr.cpp或相关文件中会为前后摄定义独立的亮度映射表。// 示例在 MTK HAL 中定义前后摄的 TORCH 模式亮度表 static FLASH_DUTY_TABLE_T g_mainTorchDutyTable[] { // step, duty(%), register_value {0, 0, 0x00}, // 关闭 {1, 20, 0x33}, // 后摄低亮度等级 {2, 50, 0x7F}, // 后摄中亮度等级 {3, 100, 0xFF}, // 后摄高亮度等级 }; static FLASH_DUTY_TABLE_T g_subTorchDutyTable[] { // step, duty(%), register_value {0, 0, 0x00}, // 关闭 {1, 25, 0x40}, // 前摄低亮度等级 (占空比可能更高以补偿亮度) {2, 60, 0x99}, // 前摄中亮度等级 {3, 100, 0xFF}, // 前摄高亮度等级 };注前后摄的register_value可能不同即使duty百分比相同因为驱动芯片的电流-寄存器映射关系可能因硬件设计而异 。2. HAL 层根据设备选择亮度表并调用驱动当 Framework 请求设置闪光灯亮度时HAL 层会根据摄像头设备 ID 选择对应的亮度表。// 示例flashlight_drv.cpp 中的简化逻辑 int setFlashlightDuty(int sensorDev, int step) { FLASH_DUTY_TABLE_T *pDutyTable NULL; int tableSize 0; // 根据前后摄设备选择不同的亮度表 switch (sensorDev) { case SENSOR_DEV_MAIN: // 主摄后摄 pDutyTable g_mainTorchDutyTable; tableSize sizeof(g_mainTorchDutyTable) / sizeof(FLASH_DUTY_TABLE_T); break; case SENSOR_DEV_SUB: // 副摄前摄 pDutyTable g_subTorchDutyTable; tableSize sizeof(g_subTorchDutyTable) / sizeof(FLASH_DUTY_TABLE_T); break; default: return -1; } // 查找对应 step 的寄存器值 for (int i 0; i tableSize; i) { if (pDutyTable[i].step step) { int regValue pDutyTable[i].register_value; // 调用内核接口传递寄存器值 return kernelSetFlashlightReg(regValue); } } return -1; }3. 驱动层写入寄存器控制亮度驱动层接收 HAL 传递的寄存器值通过 I2C 写入闪光灯控制芯片。// 示例constant_flashlight.c 中的亮度设置函数 (简化) static int fl_set_level(int level, int reg_value) { struct i2c_client *client g_flashlight_i2c_client; char write_data[2]; // 假设亮度控制寄存器地址为 0x01 write_data[0] 0x01; // 寄存器地址 write_data[1] reg_value; // 亮度控制值来自 HAL 层 // 通过 I2C 写入芯片实际控制 LED 电流 int ret i2c_master_send(client, write_data, 2); if (ret 0) { printk(KERN_ERR flashlight: i2c write failed ); return -1; } return 0; }MTK 平台前后摄差异处理要点独立的设备注册在kd_flashlightlist.c中前后摄闪光灯通常被注册为两个独立的FLASHLIGHT_DEVICE拥有不同的name如flashlights_sub和flashlights_main和可能不同的init、set_duty函数指针以区分控制路径 。ProjectConfig 配置在ProjectConfig.mk中CUSTOM_KERNEL_FLASHLIGHT的配置必须与硬件设计匹配。如果前后摄使用不同的闪光灯芯片或控制方式可能需要在此处进行更复杂的配置或启用多个驱动模块。GPIO/I2C 隔离通过 DCT 工具配置确保前后摄闪光灯的使能ENABLE、闪光STROBE、手电筒TORCH等控制信号使用不同的 GPIO 引脚避免硬件冲突。如果使用 I2C 控制则需配置不同的从设备地址Slave Address。校准数据分区MTK 平台通常使用 NVRAM 或特定分区如PRO_INFO来存储闪光灯的校准数据。工厂校准工具通过cct_feature.cpp中的命令会为前后摄分别生成校准参数HAL 层在初始化时会读取这些数据来微调g_mainTorchDutyTable和g_subTorchDutyTable中的register_value以补偿硬件个体差异确保亮度一致性 。总结在 MTK 平台上影响前后摄闪光灯亮度调节的核心 tuning 参数和配置集中在驱动层的设备注册与芯片控制、HAL 层的独立亮度映射表以及项目配置文件ProjectConfig.mk 和 DCT中。通过为前后摄配置独立的硬件控制路径、亮度映射表和校准数据可以实现精确且独立的亮度调节。参考来源mtk平台调试总结MTK平台是什么MTK平台入门MTK平台入门对MTK平台的一些认识