MTK camera flashlight bring up


  • MTK camera flashlight bring up

    • 一查看硬件原理图

      • front camera
      • rear camera
      • key note
    • 二kernel层
      • front camera 添加驱动文件
      • rear camera 添加驱动文件
    • 二hal层
      • front camera 打开flashlight宏控制

一、查看硬件原理图:

1.front camera:

2.rear camera:

3.key note:

(1)注意第一个前摄flashlight:default is powered by ISINK。这里走的是PMIC,没有使用GPIO。
(2)第二个后摄flashlight使用的是GPIO控制。

二、kernel层:

1.front camera 添加驱动文件:

file path:alps/kernel-3.18/drivers/misc/mediatek/flashlight/src/mt6580/sub_strobe.c

example

/** Copyright (C) 2015 MediaTek Inc.** This program is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.*/#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/errno.h>
#include <linux/time.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include "kd_camera_typedef.h"
#include <linux/hrtimer.h>
#include <linux/ktime.h>
#include <linux/version.h>
#include <mt-plat/mt_gpio.h>
#ifdef CONFIG_COMPAT
#include <linux/fs.h>
#include <linux/compat.h>
#endif
#include "kd_flashlight.h"
/******************************************************************************* Debug configuration
******************************************************************************/
/* availible parameter */
/* ANDROID_LOG_ASSERT */
/* ANDROID_LOG_ERROR */
/* ANDROID_LOG_WARNING */
/* ANDROID_LOG_INFO */
/* ANDROID_LOG_DEBUG */
/* ANDROID_LOG_VERBOSE */
#define TAG_NAME "[sub_strobe.c]"
#define PK_DBG_NONE(fmt, arg...)    do {} while (0)
#define PK_DBG_FUNC(fmt, arg...)    pr_debug(TAG_NAME "%s: " fmt, __func__ , ##arg)
#define PK_WARN(fmt, arg...)        pr_warn(TAG_NAME "%s: " fmt, __func__ , ##arg)
#define PK_NOTICE(fmt, arg...)      pr_notice(TAG_NAME "%s: " fmt, __func__ , ##arg)
#define PK_INFO(fmt, arg...)        pr_info(TAG_NAME "%s: " fmt, __func__ , ##arg)
#define PK_TRC_FUNC(f)              pr_debug(TAG_NAME "<%s>\n", __func__)
#define PK_TRC_VERBOSE(fmt, arg...) pr_debug(TAG_NAME fmt, ##arg)
#define PK_ERROR(fmt, arg...)       pr_err(TAG_NAME "%s: " fmt, __func__ , ##arg)#define DEBUG_LEDS_STROBE
#ifdef DEBUG_LEDS_STROBE
#define PK_DBG PK_DBG_FUNC
#define PK_VER PK_TRC_VERBOSE
#define PK_ERR PK_ERROR
#else
#define PK_DBG(a, ...)
#define PK_VER(a, ...)
#define PK_ERR(a, ...)
#endif#define CONFIG_FLASHLIGHT_EN_BY_ISINK
#if defined (CONFIG_FLASHLIGHT_EN_BY_ISINK)
#include <upmu_common.h>
enum{C_ISINK_0 = 0, //4mAC_ISINK_1 = 1, //8mAC_ISINK_2 = 2, //12mAC_ISINK_3 = 3, //16mAC_ISINK_4 = 4, //20mAC_ISINK_5 = 5 //24mA
};
enum{C_PMIC_PWM_0 = 0,C_PMIC_PWM_1 = 1,C_PMIC_PWM_2 = 2
};enum{//32K clockC_ISINK_1KHZ = 0,C_ISINK_200HZ = 4,C_ISINK_5HZ = 199,C_ISINK_2HZ = 499,C_ISINK_1HZ = 999,C_ISINK_05HZ = 1999,C_ISINK_02HZ = 4999,C_ISINK_01HZ = 9999,//2M clockC_ISINK_2M_20KHZ = 2,C_ISINK_2M_1KHZ = 61,C_ISINK_2M_200HZ = 311,C_ISINK_2M_5HZ = 12499,C_ISINK_2M_2HZ = 31249,C_ISINK_2M_1HZ = 62499
};#define C_NLED_OFF 0
#define C_NLED_ON 1
#endifstatic DEFINE_SPINLOCK(g_sub_strobeSMPLock);    /* cotta-- SMP proection */static u32 strobe_Res;
static u32 strobe_Timeus;
static BOOL g_strobe_On;static int g_duty = -1;
static int g_timeOutTimeMs;static struct work_struct workTimeOut;static int FL_Enable(void)
{
#if defined (CONFIG_FLASHLIGHT_EN_BY_ISINK) //internal FL and extennal FL add by zhaoliangming 20160429pmic_set_register_value(PMIC_ISINK_CH1_EN,C_NLED_ON); // Turn on ISINK Channel 1pmic_set_register_value(PMIC_ISINK_CH2_EN,C_NLED_ON); // Turn on ISINK Channel 2pmic_set_register_value(PMIC_ISINK_CH3_EN,C_NLED_ON); // Turn on ISINK Channel 3
#endifreturn 0;
}static int FL_Disable(void)
{
#if defined (CONFIG_FLASHLIGHT_EN_BY_ISINK) //internal FL and external FL add by zhaoliangming 20160429pmic_set_register_value(PMIC_ISINK_CH1_EN,C_NLED_OFF); // Turn off ISINK Channel 1pmic_set_register_value(PMIC_ISINK_CH2_EN,C_NLED_OFF); // Turn off ISINK Channel 2pmic_set_register_value(PMIC_ISINK_CH3_EN,C_NLED_OFF); // Turn off ISINK Channel 3
#endifreturn 0;
}static int FL_dim_duty(kal_uint32 duty)
{PK_DBG(" FL_dim_duty line=%d\n", __LINE__);g_duty = duty;if(duty <32 ){pmic_set_register_value(PMIC_ISINK_DIM1_DUTY,duty);pmic_set_register_value(PMIC_ISINK_DIM2_DUTY,duty);pmic_set_register_value(PMIC_ISINK_DIM3_DUTY,duty);}return 0;
}static int FL_Init(void)
{
#if defined (CONFIG_FLASHLIGHT_EN_BY_ISINK)pmic_set_register_value(PMIC_RG_DRV_32K_CK_PDN,0x0); // Disable power downpmic_set_register_value(PMIC_RG_ISINK1_CK_PDN,0);pmic_set_register_value(PMIC_RG_ISINK1_CK_SEL,0);pmic_set_register_value(PMIC_ISINK_CH1_MODE,C_PMIC_PWM_2);//register modepmic_set_register_value(PMIC_ISINK_CH1_STEP,C_ISINK_5);//24mApmic_set_register_value(PMIC_ISINK_DIM1_DUTY,31);pmic_set_register_value(PMIC_ISINK_DIM1_FSEL,C_ISINK_1KHZ);//1KHzpmic_set_register_value(PMIC_RG_ISINK1_DOUBLE_EN,0x1); // Enable double currentpmic_set_register_value(PMIC_RG_DRV_32K_CK_PDN,0x0); // Disable power downpmic_set_register_value(PMIC_RG_ISINK2_CK_PDN,0);pmic_set_register_value(PMIC_RG_ISINK2_CK_SEL,0);pmic_set_register_value(PMIC_ISINK_CH2_MODE,C_PMIC_PWM_2);//register modepmic_set_register_value(PMIC_ISINK_CH2_STEP,C_ISINK_5);//24mApmic_set_register_value(PMIC_ISINK_DIM2_DUTY,31);pmic_set_register_value(PMIC_ISINK_DIM2_FSEL,C_ISINK_1KHZ);//1KHzpmic_set_register_value(PMIC_RG_ISINK2_DOUBLE_EN,0x1); // Enable double currentpmic_set_register_value(PMIC_RG_DRV_32K_CK_PDN,0x0); // Disable power downpmic_set_register_value(PMIC_RG_ISINK3_CK_PDN,0);pmic_set_register_value(PMIC_RG_ISINK3_CK_SEL,0);pmic_set_register_value(PMIC_ISINK_CH3_MODE,C_PMIC_PWM_2);//register modepmic_set_register_value(PMIC_ISINK_CH3_STEP,C_ISINK_5);//24mApmic_set_register_value(PMIC_ISINK_DIM3_DUTY,31);pmic_set_register_value(PMIC_ISINK_DIM3_FSEL,C_ISINK_1KHZ);//1KHzpmic_set_register_value(PMIC_RG_ISINK3_DOUBLE_EN,0x1); // Enable double current
#endifreturn 0;
}static int FL_Uninit(void)
{return 0;
}/*****************************************************************************
User interface
*****************************************************************************/static void work_timeOutFunc(struct work_struct *data)
{FL_Disable();PK_DBG("ledTimeOut_callback\n");
}static enum hrtimer_restart ledTimeOutCallback(struct hrtimer *timer)
{schedule_work(&workTimeOut);return HRTIMER_NORESTART;
}static struct hrtimer g_timeOutTimer;
static void timerInit(void)
{static int init_flag;if (init_flag == 0) {init_flag = 1;INIT_WORK(&workTimeOut, work_timeOutFunc);g_timeOutTimeMs = 1000;hrtimer_init(&g_timeOutTimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);g_timeOutTimer.function = ledTimeOutCallback;}
}static int sub_strobe_ioctl(unsigned int cmd, unsigned long arg)
{int i4RetValue = 0;int ior_shift;int iow_shift;int iowr_shift;ior_shift = cmd - (_IOR(FLASHLIGHT_MAGIC, 0, int));iow_shift = cmd - (_IOW(FLASHLIGHT_MAGIC, 0, int));iowr_shift = cmd - (_IOWR(FLASHLIGHT_MAGIC, 0, int));printk(KERN_ERR "koson!!!!! %s:%d  cmd=%d   arg=%ld\n", __func__, __LINE__, cmd, arg);/*  PK_DBG("LM3642 constant_flashlight_ioctl() line=%d ior_shift=%d, iow_shift=%d iowr_shift=%d arg=%d\n",__LINE__, ior_shift, iow_shift, iowr_shift, (int)arg);
*/switch (cmd) {case FLASH_IOC_SET_TIME_OUT_TIME_MS:PK_DBG("FLASH_IOC_SET_TIME_OUT_TIME_MS: %d\n", (int)arg);g_timeOutTimeMs = arg;break;case FLASH_IOC_SET_DUTY:PK_DBG("FLASHLIGHT_DUTY: %d\n", (int)arg);FL_dim_duty(arg);break;case FLASH_IOC_SET_STEP:PK_DBG("FLASH_IOC_SET_STEP: %d\n", (int)arg);break;case FLASH_IOC_SET_ONOFF:PK_DBG("FLASHLIGHT_ONOFF: %d\n", (int)arg);if (arg == 1) {int s;int ms;if (g_timeOutTimeMs > 1000) {s = g_timeOutTimeMs / 1000;ms = g_timeOutTimeMs - s * 1000;} else {s = 0;ms = g_timeOutTimeMs;}if (g_timeOutTimeMs != 0) {ktime_t ktime;ktime = ktime_set(s, ms * 1000000);hrtimer_start(&g_timeOutTimer, ktime, HRTIMER_MODE_REL);}FL_Enable();} else {FL_Disable();hrtimer_cancel(&g_timeOutTimer);}break;default:PK_DBG(" No such command\n");i4RetValue = -EPERM;break;}return i4RetValue;
}static int sub_strobe_open(void *pArg)
{int i4RetValue = 0;PK_DBG("constant_flashlight_open line=%d\n", __LINE__);if (0 == strobe_Res) {FL_Init();timerInit();}PK_DBG("constant_flashlight_open line=%d\n", __LINE__);spin_lock_irq(&g_sub_strobeSMPLock);if (strobe_Res) {PK_DBG(" busy!\n");i4RetValue = -EBUSY;} else {strobe_Res += 1;}spin_unlock_irq(&g_sub_strobeSMPLock);PK_DBG("constant_flashlight_open line=%d\n", __LINE__);return i4RetValue;
}static int sub_strobe_release(void *pArg)
{PK_DBG(" constant_flashlight_release\n");if (strobe_Res) {spin_lock_irq(&g_sub_strobeSMPLock);strobe_Res = 0;strobe_Timeus = 0;/* LED On Status */g_strobe_On = FALSE;spin_unlock_irq(&g_sub_strobeSMPLock);FL_Uninit();}PK_DBG(" Done\n");return 0;
}FLASHLIGHT_FUNCTION_STRUCT subStrobeFunc = {sub_strobe_open,sub_strobe_release,sub_strobe_ioctl
};MUINT32 subStrobeInit(PFLASHLIGHT_FUNCTION_STRUCT *pfFunc)
{if (pfFunc != NULL)*pfFunc = &subStrobeFunc;return 0;
}

key note:此处前摄是PMU ISINK控制,虽然原理图上标号为ISINK1,但是它是由ISINK1,2,3组合而成的。

2.rear camera 添加驱动文件:

file path:alps/kernel-3.18/drivers/misc/mediatek/flashlight/src/mt6580/constant_flashlight/leds_strobe.c

example

/** Copyright (C) 2015 MediaTek Inc.** This program is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.*/#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/errno.h>
#include <linux/time.h>
#include <linux/gpio.h>
#include "kd_flashlight.h"
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mt-plat/mt_gpio.h>
#include "kd_camera_typedef.h"
#include <linux/hrtimer.h>
#include <linux/ktime.h>
#include <linux/version.h>
#include <linux/mutex.h>
#include <linux/i2c.h>
#include <linux/leds.h>
#include <mt-plat/mt_pwm.h>#include "../../../../imgsensor/src/mt6580/camera_hw/kd_camera_hw.h"#define GPIO8 8/******************************************************************************* Debug configuration
******************************************************************************/
/* availible parameter */
/* ANDROID_LOG_ASSERT */
/* ANDROID_LOG_ERROR */
/* ANDROID_LOG_WARNING */
/* ANDROID_LOG_INFO */
/* ANDROID_LOG_DEBUG */
/* ANDROID_LOG_VERBOSE */#define TAG_NAME "[leds_strobe.c]"
#define PK_DBG_NONE(fmt, arg...)    do {} while (0)
#define PK_DBG_FUNC(fmt, arg...)    pr_debug(TAG_NAME "%s: " fmt, __func__ , ##arg)/*#define DEBUG_LEDS_STROBE*/
#ifdef DEBUG_LEDS_STROBE
#define PK_DBG PK_DBG_FUNC
#else
#define PK_DBG(a, ...)
#endif/******************************************************************************* local variables
******************************************************************************/static DEFINE_SPINLOCK(g_strobeSMPLock);    /* cotta-- SMP proection */static u32 strobe_Res;
static u32 strobe_Timeus;
static BOOL g_strobe_On;static int g_duty = -1;
static int g_timeOutTimeMs;static DEFINE_MUTEX(g_strobeSem);#define STROBE_DEVICE_ID 0xC6static struct work_struct workTimeOut;/* #define FLASH_GPIO_ENF GPIO12 */
/* #define FLASH_GPIO_ENT GPIO13 *///static int g_bLtVersion;static struct pwm_spec_config pwm_setting;/*****************************************************************************
Functions
*****************************************************************************/
static void work_timeOutFunc(struct work_struct *data);int FL_Enable(void)
{pwm_set_spec_config(&pwm_setting);return 0;
}int FL_Disable(void)
{mt_pwm_disable(PWM1,0);return 0;
}int FL_dim_duty(kal_uint32 duty)
{PK_DBG(" FL_dim_duty line=%d\n", __LINE__);g_duty = duty;if(duty == 0)pwm_setting.PWM_MODE_OLD_REGS.THRESH = 16;else if (duty == 1)pwm_setting.PWM_MODE_OLD_REGS.THRESH = 8;else if (duty > 16)pwm_setting.PWM_MODE_OLD_REGS.THRESH = 16;elsepwm_setting.PWM_MODE_OLD_REGS.THRESH = duty;return 0;
}int FL_Init(void)
{mt_set_gpio_mode(GPIO8, GPIO_MODE_02);pwm_setting.pwm_no = PWM1;pwm_setting.pmic_pad = 0;
#ifdef PWM_FIFO_1pwm_setting.mode = PWM_MODE_FIFO;pwm_setting.clk_div=CLK_DIV1;pwm_setting.clk_src = PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625;pwm_setting.PWM_MODE_FIFO_REGS.IDLE_VALUE = 0;pwm_setting.PWM_MODE_FIFO_REGS.GUARD_VALUE = 0;pwm_setting.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 31;pwm_setting.PWM_MODE_FIFO_REGS.HDURATION = 4;pwm_setting.PWM_MODE_FIFO_REGS.LDURATION = 4;pwm_setting.PWM_MODE_FIFO_REGS.GDURATION =(pwm_setting.PWM_MODE_FIFO_REGS.HDURATION + 1) * 32 - 1;pwm_setting.PWM_MODE_FIFO_REGS.GUARD_VALUE = 1;pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA0 =50;pwm_setting.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
#elsepwm_setting.mode = PWM_MODE_OLD;pwm_setting.clk_div=CLK_DIV1;pwm_setting.clk_src = PWM_CLK_OLD_MODE_BLOCK;pwm_setting.PWM_MODE_OLD_REGS.IDLE_VALUE = 0;pwm_setting.PWM_MODE_OLD_REGS.GUARD_VALUE = 0;pwm_setting.PWM_MODE_OLD_REGS.GDURATION = 0;pwm_setting.PWM_MODE_OLD_REGS.WAVE_NUM = 0;pwm_setting.PWM_MODE_OLD_REGS.DATA_WIDTH = 16;pwm_setting.PWM_MODE_OLD_REGS.THRESH = 8;
#endif/*  PK_DBG(" FL_Init line=%d\n", __LINE__); */return 0;
}int FL_Uninit(void)
{FL_Disable();return 0;
}/*****************************************************************************
User interface
*****************************************************************************/static void work_timeOutFunc(struct work_struct *data)
{FL_Disable();PK_DBG("ledTimeOut_callback\n");
}enum hrtimer_restart ledTimeOutCallback(struct hrtimer *timer)
{schedule_work(&workTimeOut);return HRTIMER_NORESTART;
}static struct hrtimer g_timeOutTimer;
void timerInit(void)
{static int init_flag;if (init_flag == 0) {init_flag = 1;INIT_WORK(&workTimeOut, work_timeOutFunc);g_timeOutTimeMs = 1000;hrtimer_init(&g_timeOutTimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);g_timeOutTimer.function = ledTimeOutCallback;}
}static int constant_flashlight_ioctl(unsigned int cmd, unsigned long arg)
{int i4RetValue = 0;int ior_shift;int iow_shift;int iowr_shift;ior_shift = cmd - (_IOR(FLASHLIGHT_MAGIC, 0, int));iow_shift = cmd - (_IOW(FLASHLIGHT_MAGIC, 0, int));iowr_shift = cmd - (_IOWR(FLASHLIGHT_MAGIC, 0, int));switch (cmd) {case FLASH_IOC_SET_TIME_OUT_TIME_MS:PK_DBG("FLASH_IOC_SET_TIME_OUT_TIME_MS: %d\n", (int)arg);g_timeOutTimeMs = arg;break;case FLASH_IOC_SET_DUTY:PK_DBG("FLASHLIGHT_DUTY: %d\n", (int)arg);FL_dim_duty(arg);break;case FLASH_IOC_SET_STEP:PK_DBG("FLASH_IOC_SET_STEP: %d\n", (int)arg);break;case FLASH_IOC_SET_ONOFF:PK_DBG("FLASHLIGHT_ONOFF: %d\n", (int)arg);if (arg == 1) {int s;int ms;if (g_timeOutTimeMs > 1000) {s = g_timeOutTimeMs / 1000;ms = g_timeOutTimeMs - s * 1000;} else {s = 0;ms = g_timeOutTimeMs;}if (g_timeOutTimeMs != 0) {ktime_t ktime;ktime = ktime_set(s, ms * 1000000);hrtimer_start(&g_timeOutTimer, ktime, HRTIMER_MODE_REL);}FL_Enable();} else {FL_Disable();hrtimer_cancel(&g_timeOutTimer);}break;default:PK_DBG(" No such command\n");i4RetValue = -EPERM;break;}return i4RetValue;
}static int constant_flashlight_open(void *pArg)
{int i4RetValue = 0;PK_DBG("constant_flashlight_open line=%d\n", __LINE__);if (0 == strobe_Res) {FL_Init();timerInit();}PK_DBG("constant_flashlight_open line=%d\n", __LINE__);spin_lock_irq(&g_strobeSMPLock);if (strobe_Res) {PK_DBG(" busy!\n");i4RetValue = -EBUSY;} else {strobe_Res += 1;}spin_unlock_irq(&g_strobeSMPLock);PK_DBG("constant_flashlight_open line=%d\n", __LINE__);return i4RetValue;}static int constant_flashlight_release(void *pArg)
{PK_DBG(" constant_flashlight_release\n");if (strobe_Res) {spin_lock_irq(&g_strobeSMPLock);strobe_Res = 0;strobe_Timeus = 0;/* LED On Status */g_strobe_On = FALSE;spin_unlock_irq(&g_strobeSMPLock);FL_Uninit();}PK_DBG(" Done\n");return 0;}FLASHLIGHT_FUNCTION_STRUCT constantFlashlightFunc = {constant_flashlight_open,constant_flashlight_release,constant_flashlight_ioctl
};MUINT32 constantFlashlightInit(PFLASHLIGHT_FUNCTION_STRUCT *pfFunc)
{if (pfFunc != NULL)*pfFunc = &constantFlashlightFunc;return 0;
}/* LED flash control for high current capture mode*/
ssize_t strobe_VDIrq(void)
{return 0;
}
EXPORT_SYMBOL(strobe_VDIrq);

二、hal层:

1.front camera 打开flashlight宏控制:

file path:alps/vendor/mediatek/proprietary/custom/mt6580/hal/flashlight/flash_tuning_custom2.h

example

#define SUB_FLASH_SUPPORT 1

MTK camera flashlight bring up相关推荐

  1. MTK Camera Senor Bring up 复盘总结

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一 .ProjectConfig.mk文件配置 二.defconfig文件修改 三.kernel层驱动代 ...

  2. Android MTK Camera博客分享

    MTK Camera博客分享 MTK Camera OTP调用过程 MTK Camera Flashlight调用过程 MTK Camera 应用层到底层过程 MTK Camera HAL层分析 深入 ...

  3. mtk camera 移植步骤

    mtk camera 移植步骤: 1, Kernel层驱动代码文件添加 /mediatek/custom/doov92_wet_tdd/kernel/imgsensor/下添加imx179_mipi_ ...

  4. Camera4 MTK camera驱动结构介绍

    一.概述: MTK  camera主要的内容在hal层,现在有hal1/hal3,当下主流的使用的是hal3,驱动主要负责sensor 电源的控制以及sensor相关寄存器的操作,MTK采用设备和驱动 ...

  5. Mtk Camera中Hal1/Hal3的Picture size和Preview size配置

    在进行camera系统开发时,总会碰到产品需要,需要一个添加一个多少多少M的照片大小,比如产品经理说我们也要添加一个1:1,添加一个18:9的照片大小.这个情况很常见了,所以这篇文章总结一下平常工作中 ...

  6. MTK Camera 基础知识

    文章目录 数字成像系统流程综述 曝光 对焦马达 镜头(lens) MIPI数据与RAW数据的转换(未完待续) ISP的主要内容和Bayer Raw的处理 RGB.YUV和YCbCr三种颜色空间 补充 ...

  7. MTK平台开机初始化时 camera驱动流程|MTK camera调试常见几十种问题处理方法

    转载:https://www.jianshu.com/p/75ab1d82bbd3 mtk的驱动多是以模块加载的方式(module_init():module_exit():)加载到内核中去的:正因为 ...

  8. android mtk camera startpreview,android8.1 mtk camera hal各种操作流程

    最近一年,一直在做android上的视频编解码和录相.以及camera hal和系统框架这一块.随着做的慢慢的深入,越发觉得mtk的camera hal这一块,有其独到之处.偏偏网上相关的资料却是极少 ...

  9. MTK Camera驱动移植

    对于MTK Camera驱动移植一般分为四部分: 1.硬件IO口配置: 2.Camera驱动移植: 3.上电时序: 4.修改i2c控制器: 硬件电路: 1.GPIO配置 打开 mediatek\dct ...

最新文章

  1. [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具
  2. 分布式全文检索引擎之ElasticSearch
  3. oracle rac standby,oracle RAC数据库建立STANDBY(二)
  4. 微信小程序按钮Button使用详解
  5. 3gpp协议_C-V2X: 3GPP协议阅读前的一些准备
  6. C++的学习(十一)继承
  7. selenium之 chromedriver与chrome版本映射表(更新至v2.46)
  8. 期末总结(第五章—)
  9. 深度分析:PSP3000被破解 狂欢?还是哀悼?
  10. 计算机控制技术毕业论文题目,计算机控制方面论文选题 计算机控制论文题目怎样定...
  11. 2021SC@SDUSC Zxing开源代码(九)Wifi 二维码结果处理
  12. 服务器虚拟机启动失败经验总结
  13. nubia android root权限,努比亚Z11 root教程及获取root权限的方法
  14. Linux使用cp命令报cp:omitting directory错误
  15. RAC环境备份归档日志和恢复数据库方法
  16. 写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2。要求当s1=s2
  17. 使用away3d 精灵表实现材质动画
  18. 家电消费市场潜力爆发,智能制造成发展趋势
  19. 第二代战斗机的特点有哪些
  20. MySQL之悲观锁场景举例

热门文章

  1. NLP-二分类的应用-区分外卖评论好评/差评
  2. centos 7-aarch64如何替换yum源
  3. 投稿时Cover Letter的重要性
  4. 游戏直播平台新赛程:负重前行与危中求生
  5. 时钟频率,时钟周期他们的关系是什么?
  6. matlab中cla和clf作用,28377中CLA初始化部分不明白Cla1Task1和cla1Isr1的区别
  7. 我的三年自学深度学习之路
  8. 一点透视,二点透视,三点透视的理解
  9. RTTHREAD软件包目录
  10. JavaScript大作业(华为手机购物网站设计与实现)