当前位置: 首页 > news >正文

MTK Camera Senor Bring up 复盘总结

859b34926a83ac3bbef98b3d82b61a57.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一 、ProjectConfig.mk文件配置
二、defconfig文件修改
三、kernel层驱动代码
四、hal层驱动代码
五、kernel层摄像头文件夹
六、hal层摄像头文件夹
七、sensor上下电代码

这里记录添加一个新的sensor需要注意的文件,以mt6779为例。

一 、ProjectConfig.mk文件配置

//device/mediatek/mt6779/ProjectConfig.mk

//sensorCUSTOM_HAL_IMGSENSOR = gc8034_mipi_raw hi846_mipi_raw gc5035_mipi_raw sc500cs_mipi_raw
CUSTOM_HAL_MAIN_IMGSENSOR =gc8034_mipi_raw hi846_mipi_raw
CUSTOM_HAL_SUB_IMGSENSOR = gc5035_mipi_raw sc500cs_mipi_raw

CUSTOM_KERNEL_IMGSENSOR = gc8034_mipi_raw hi846_mipi_raw gc5035_mipi_raw sc500cs_mipi_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR = gc8034_mipi_raw hi846_mipi_raw
CUSTOM_KERNEL_SUB_IMGSENSOR = gc5035_mipi_raw sc500cs_mipi_raw//lensCUSTOM_HAL_LENS = fp5510e2af dummy_lens
CUSTOM_HAL_MAIN_LENS = fp5510e2af
CUSTOM_HAL_SUB_LENS = dummy_lens

CUSTOM_KERNEL_LENS = fp5510e2af dummy_lens
CUSTOM_KERNEL_MAIN_LENS = fp5510e2af
CUSTOM_KERNEL_SUB_LENS = dummy_lens//flashlight:支持flashlight则设置为constant_flashlight,不支持设置为 dummy_flashlightCUSTOM_HAL_FLASHLIGHT = dummy_flashlight
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight

二、defconfig文件修改

//kernel-4.19/arch/arm64/configs/
//k79v1_64_defconfig 和 k79v1_64_debug_defconfig

CONFIG_CUSTOM_KERNEL_IMGSENSOR="gc8034_mipi_raw hi846_mipi_raw gc5035_mipi_raw sc500cs_mipi_raw"

三、kernel层驱动代码

添加新的camera sensor ID定义,sensor ID 来自于对应的 datasheet

//device/mediatek/common/kernel-headers/kd_imgsensor.h

#define GC8034_SENSOR_ID      0x8044#define SENSOR_DRVNAME_GC8034_MIPI_RAW "gc8034_mipi_raw"#define SC500CS_SENSOR_ID     0xEE27#define SENSOR_DRVNAME_SC500CS_MIPI_RAW          "sc500cs_mipi_raw"//kernel-4.19/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h#define GC8034_SENSOR_ID     0x8044#define SENSOR_DRVNAME_GC8034_MIPI_RAW          "gc8034_mipi_raw"#define SC500CS_SENSOR_ID    0xEE27#define SENSOR_DRVNAME_SC500CS_MIPI_RAW          "sc500cs_mipi_raw"

//kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1(v1_1)/imgsensor_sensor_list.h

extern struct IMGSENSOR_INIT_FUNC_LIST kdSensorList[];UINT32 GC8034_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);/*
   第一个参数对应 Camera Snesor ID
   第二个参数对应 Camera Sensor name
   第三个参数对应 Camera Sensor init Function
*///kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1(v1_1)/imgsensor_sensor_list.cstruct IMGSENSOR_INIT_FUNC_LIST kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR] = {//...#if defined(GC8034_MIPI_RAW)
    {GC8034_SENSOR_ID,
    SENSOR_DRVNAME_GC8034_MIPI_RAW,
    GC8034_MIPI_RAW_SensorInit},#endif}//kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6779/gc8034_mipi_raw/gc8034mipi_Sensor.cUINT32 GC8034_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc){
    /* Check Sensor status here */
    if (pfFunc != NULL)
        *pfFunc = &sensor_func;
    return ERROR_NONE;}

四、hal层驱动代码

在hal层的sensor列表添加新的sensor

//vendor/mediatek/proprietary/custom/mt6739/hal/imgsensor_src/sensorlist.cpp

MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] ={//...#if defined(GC8034_MIPI_RAW)
    RAW_INFO_M(GC8034_SENSOR_ID, DEFAULT_MODULE_INDEX, DEFAULT_MODULE_ID, SENSOR_DRVNAME_GC8034_MIPI_RAW,NULL),#endif#if defined(SC500CS_MIPI_RAW)
    RAW_INFO_M(SC500CS_SENSOR_ID, DEFAULT_MODULE_INDEX, DEFAULT_MODULE_ID, SENSOR_DRVNAME_SC500CS_MIPI_RAW, NULL),#endif}

注意:sensorlist.cpp 中的SensorList[] 与 kd_sensorlist.h 中的kdSensorList[]的sensor 顺序必须一致,否则 user space 和 kernel space 在通过 ioctl 传递命令 id 时会对应错误。

五、kernel层摄像头文件夹

(A)lens文件路径:kernel-4.19/drivers/misc/mediatek/lens/

(B)flashlight文件路径:kernel-4.19/drivers/misc/mediatek/flashlight/

(C)imgsensor文件路径:

把厂商提供的包含前摄像头驱动文件夹 sc500cs_mipi_raw 和后摄像头驱动文件夹 gc8034_mipi_raw 拷贝到对应目录下,这两个文件夹里存放着厂商写好的前后摄像头驱动代码。

//kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6779/gc8034_mipi_raw
gc8034mipi_Sensor.h
gc8034mipi_Sensor.cMakefile//kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6779/sc500cs_mipi_raw
sc500csmipiraw_Sensor.h
sc500csmipiraw_Sensor.cMakefile

六、hal层摄像头文件夹

(A)lens文件路径:/vendor/mediatek/proprietary/custom/mt6779/hal/lens/

outside_default.png

(B)flashlight文件路径:/vendor/mediatek/proprietary/custom/mt6779/hal/flashlight/

(C)imgsensor文件路径:/vendor/mediatek/proprietary/custom/mt6779/hal/imgsensor/

outside_default.png

(D)metadata文件路径:/vendor/mediatek/proprietary/custom/mt6779/hal/imgsensor_metadata/

outside_default.png

七、sensor上下电代码

//该文件配置sensor的上下电
//kernel-4.19/dirvers/misc/mediateck/imgsensor/src/mt6739/camera_hw/imgsensor_cfg_table.c

struct IMGSENSOR_HW_POWER_SEQ sensor_power_sequence[] = {
    //...
    /*
    第一个参数对应 PowerType
    第二个参数对应 Voltage
    第三个参数对应 Delay Time in ms
    DVDD/DOVDD/AVDD/AFVDD 的电压支持情况可以参考 specific pmic datasheet 进行设置
    */
    #if defined(GC8034_MIPI_RAW)
    {
        SENSOR_DRVNAME_GC8034_MIPI_RAW,
        {
            {PDN, Vol_Low, 0},
            {RST, Vol_Low, 1},
            {DOVDD, Vol_1800, 1},
            {DVDD, Vol_1200, 1},
            {AVDD, Vol_2800, 1},
            {SensorMCLK, Vol_High, 2},
            {PDN, Vol_High, 0},
            {RST, Vol_High, 2}
        },
    },
    #endif

    #if defined(SC500CS_MIPI_RAW)
    {
        SENSOR_DRVNAME_SC500CS_MIPI_RAW,
        {
            {PDN, Vol_Low, 0},
            {RST, Vol_Low, 1},
            {DOVDD, Vol_1800, 1},
            {DVDD, Vol_1200, 1},
            {AVDD, Vol_2800, 1},
            {SensorMCLK, Vol_High, 2},
            {PDN, Vol_High, 0},
            {RST, Vol_High, 2}
        },
    },
    #endif}struct IMGSENSOR_HW_CFG imgsensor_custom_config[] = {

    {
        IMGSENSOR_SENSOR_IDX_MAIN,
        IMGSENSOR_I2C_DEV_0,
        {
            {IMGSENSOR_HW_PIN_MCLK,  IMGSENSOR_HW_ID_MCLK},
            {IMGSENSOR_HW_PIN_AVDD,  IMGSENSOR_HW_ID_GPIO},//GPIO上电逻辑
            {IMGSENSOR_HW_PIN_DOVDD, IMGSENSOR_HW_ID_REGULATOR},
            {IMGSENSOR_HW_PIN_DVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_PDN,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_RST,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_NONE,  IMGSENSOR_HW_ID_NONE},
        },
    },
    {
        IMGSENSOR_SENSOR_IDX_SUB,
        IMGSENSOR_I2C_DEV_1,
        {
            {IMGSENSOR_HW_PIN_MCLK,  IMGSENSOR_HW_ID_MCLK},
            {IMGSENSOR_HW_PIN_AVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_DOVDD, IMGSENSOR_HW_ID_REGULATOR},
            {IMGSENSOR_HW_PIN_DVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_PDN,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_RST,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_NONE, IMGSENSOR_HW_ID_NONE},
        },
    },}struct IMGSENSOR_HW_POWER_SEQ platform_power_sequence[] = {#ifdef MIPI_SWITCH
    {
        IMGSENSOR_TOSTRING(IMGSENSOR_SENSOR_IDX_SUB),
        {
            {
                IMGSENSOR_HW_PIN_MIPI_SWITCH_EN,
                IMGSENSOR_HW_PIN_STATE_LEVEL_0,
                0,
                IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH,
                0
            },
            {
                IMGSENSOR_HW_PIN_MIPI_SWITCH_SEL,
                IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH,
                0,
                IMGSENSOR_HW_PIN_STATE_LEVEL_0,
                0
            },
        }
    },#endif

//kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6761/camera_hw/regulator/regulator.c

enum REGULATOR_VOLTAGE {
    REGULATOR_VOLTAGE_0    = 0,
    REGULATOR_VOLTAGE_1000 = 1000000,
    REGULATOR_VOLTAGE_1100 = 1100000,
    REGULATOR_VOLTAGE_1200 = 1200000,
    REGULATOR_VOLTAGE_1210 = 1210000,
    REGULATOR_VOLTAGE_1220 = 1220000,
    REGULATOR_VOLTAGE_1500 = 1500000,
    REGULATOR_VOLTAGE_1800 = 1800000,
    REGULATOR_VOLTAGE_2500 = 2500000,
    REGULATOR_VOLTAGE_2800 = 2800000,
    REGULATOR_VOLTAGE_2900 = 2900000,};enum REGULATOR_TYPE {
    REGULATOR_TYPE_VCAMA,
    REGULATOR_TYPE_VCAMD,
    REGULATOR_TYPE_VCAMIO,
    REGULATOR_TYPE_MAX_NUM};static const int regulator_voltage[] = {
    REGULATOR_VOLTAGE_0,
    REGULATOR_VOLTAGE_1000,
    REGULATOR_VOLTAGE_1100,
    REGULATOR_VOLTAGE_1200,
    REGULATOR_VOLTAGE_1210,
    REGULATOR_VOLTAGE_1220,
    REGULATOR_VOLTAGE_1500,
    REGULATOR_VOLTAGE_1800,
    REGULATOR_VOLTAGE_2500,
    REGULATOR_VOLTAGE_2800,
    REGULATOR_VOLTAGE_2900,};struct REGULATOR_CTRL regulator_control[REGULATOR_TYPE_MAX_NUM] = {
    {"vcama"},
    {"vcamd"},
    {"vcamio"},};//然后通过regulator_init,regulator_set函数进行电压设置static struct IMGSENSOR_HW_DEVICE device = {
    .id        = IMGSENSOR_HW_ID_REGULATOR,
    .pinstance = (void *)&reg_instance,
    .init      = regulator_init,
    .set       = regulator_set,
    .release   = regulator_release,
    .dump      = regulator_dump};enum IMGSENSOR_RETURN imgsensor_hw_regulator_open(
    struct IMGSENSOR_HW_DEVICE **pdevice){
    *pdevice = &device;
    return IMGSENSOR_RETURN_SUCCESS;}

GPIO上电逻辑:主要配置GPIO的上电逻辑,把camera的上电管脚与平台管脚相关联
code:kernel-4.19/arch/arm64/boot/dts/mediatek/k79v1_64.dts

原文链接:https://blog.csdn.net/dongxianfei/article/details/121081576

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

7a00382ebcb7233340a94efc01afa5b4.jpeg

点击阅读原文,为大佬点赞!

相关文章:

  • map有关的运算符重载
  • Java项目硅谷课堂学习笔记-P9-整合网关与实现订单和营销管理模块
  • 我的周刊(第055期)
  • 【GraphSAGE实践】YelpChi评论图数据集上的反欺诈检测
  • 基于单目和低成本GPS的车道定位方法
  • MyBatisPlus——多表查询——多条件查询——分页查询
  • 面向跨模态匹配的噪声关联学习
  • Java中的反射
  • java毕业设计旅游网站设计mybatis+源码+调试部署+系统+数据库+lw
  • Java基础进阶-序列化
  • 02.3 线性代数
  • java毕业设计木材产销系统的生产管理模块mybatis+源码+调试部署+系统+数据库+lw
  • Nuxt - 自定义页面布局,<Nuxt /> 个性化多套模板(一个项目内既要有用户正常浏览的普通页面,又要存在后台管理系统布局的页面)
  • java毕业设计拉萨旅游自助民宿平台mybatis+源码+调试部署+系统+数据库+lw
  • 微信公众号查题搜题功能系统平台
  • [译]如何构建服务器端web组件,为何要构建?
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【Linux系统编程】快速查找errno错误码信息
  • 0基础学习移动端适配
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • EventListener原理
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java深入 - 深入理解Java集合
  • node 版本过低
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 算法之不定期更新(一)(2018-04-12)
  • Semaphore
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • Spring Batch JSON 支持
  • (1)虚拟机的安装与使用,linux系统安装
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C语言)逆序输出字符串
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • .NET : 在VS2008中计算代码度量值
  • .Net 4.0并行库实用性演练
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Redis的秒杀Dome和异步执行
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • ?.的用法
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [14]内置对象
  • [Android]使用Git将项目提交到GitHub
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C/C++]数据结构 栈和队列()
  • [C语言]——分支和循环(4)