因为选择高分辨率进行拍照时,数据量较大,系统处理耗时会更长,如果闪光灯设置的闪光时间较短,可能出现闪光灯闪光已结束但照片还没有拍好的情况,这时就会出现虽然闪光灯闪了光,但拍出来的照片却没有闪光效果的问题。
闪光拍照的流程大致是:闪光灯打开--》写寄存器50ms--》初始化曝光100ms--》获取到第一帧100ms--》前2-3帧曝光值需要调整过滤300ms。所需时间约500ms。
解决此问题的方法也很简单,就是设置增长闪光灯的闪光时间。
比如我们某个项目使用的闪光灯驱动芯片为LM3642,摄像头模组为OV50C40,选择49.5M分辨率拍照时就会出现闪光灯闪不到光的问题。后提升闪光灯闪光时间到700ms以上就可以了。修改代码如下:
--- a/kernel-5.10/drivers/leds/leds-lm3642.c
+++ b/kernel-5.10/drivers/leds/leds-lm3642.c
@@ -172,6 +172,10 @@ static int lm3642_control(struct lm3642_chip_data *chip,
break;
case MODES_FLASH:
+ regmap_update_bits(chip->regmap, REG_FLASH,
+ FLASH_TOUT_TIME_MASK << FLASH_TOUT_TIME_SHIFT,
+ 0x6);
+
ret = regmap_update_bits(chip->regmap, REG_I_CTRL,
FLASH_I_MASK << FLASH_I_SHIFT,
(brightness - 1) << FLASH_I_SHIFT);
LM3642设置闪光时长的寄存器定义如下: