一、概序:

  前文已经介绍了camera驱动部分的内容Camera4 MTK camera驱动结构介绍,这里在回顾下之前的框架图,

这篇主要介绍红框部分的内容:
    

  imgsensor起到承上启下的作用,在系统起来时会创建整个camera驱动运行的环境,其中主要的

文件和函数如下框图所示,先设备挂载时会调用注册platform设备platform_driver_register,在匹配成

功后会调用probe函数进行初始相关的设备:

    

  其中camera的三路电压的上电方式可以通过GPIO来控制,也可以通过PMIC(REGULATOR)的方式来

进行控制,在imgsensor_hw中通过不同的pdev信息,调用不同的set函数。涉及的文件路径:

  kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor.c

  kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_hw.c

  kernel-4.9/drivers/misc/mediatek/imgsensor/src/mt6765/camera_hw/regulator/regulator.c

  kernel-4.9/drivers/misc/mediatek/imgsensor/src/mt6765/camera_hw/gpio/gpio.c

二、上电相关的结构体之间的联系:

(1)IMGSENSOR_HW结构体:

  IMGSENSOR_HW结构体包含了pdev(gpio/regulator)的设备结构体和上电时序相关的结构体:

  

(2)上电时序控制相关:

  上电方式控制:GPIO?REGULATOR?

  

  上电时序控制结构体:

  

三、系统初始化:

1、设备加载:

  imgsensor和其他的驱动模块相同,也是通过module_init来初始化模块,在init中注册platform总线驱动,

从而需要对应的platform_driver结构体信息:

static const struct of_device_id gimgsensor_of_device_id[] = {{ .compatible = "mediatek,camera_hw", },{}
};static struct platform_driver gimgsensor_platform_driver = {.probe      = imgsensor_probe,.remove     = imgsensor_remove,.suspend    = imgsensor_suspend,.resume     = imgsensor_resume,.driver     = {.name   = "image_sensor",.owner  = THIS_MODULE,
#ifdef CONFIG_OF.of_match_table = gimgsensor_of_device_id,
#endif}
};

  当gimgsensor_of_device_id的信息在dts中match上以后回执行到对应的probe函数,probe中主要注册

了sensordrv的字符设备和初始化imgsensor的硬件信息(时钟及上电):

static int imgsensor_probe(struct platform_device *pdev)
{/* Register char driver */imgsensor_driver_register();gpimgsensor_hw_platform_device = pdev;imgsensor_clk_init(&pgimgsensor->clk);imgsensor_hw_init(&pgimgsensor->hw);imgsensor_i2c_create();imgsensor_proc_init();atomic_set(&pgimgsensor->imgsensor_open_cnt, 0);return 0;
}

2、imgsensor_driver_register创建字符设备:

//字符设备的file_operation结构体
static const struct file_operations gimgsensor_file_operations = {.owner = THIS_MODULE,.open = imgsensor_open,.release = imgsensor_release,.unlocked_ioctl = imgsensor_ioctl,
#ifdef CONFIG_COMPAT.compat_ioctl = imgsensor_compat_ioctl
#endif
};static inline int imgsensor_driver_register(void){//分配一个设备号和nanmealloc_chrdev_region(&dev_no, 0, 1, IMGSENSOR_DEV_NAME)/* Allocate driver */gpimgsensor_cdev = cdev_alloc();/* Attatch file operation. */cdev_init(gpimgsensor_cdev, &gimgsensor_file_operations);/* Add to system */cdev_add(gpimgsensor_cdev, dev_no, 1);gpimgsensor_class = class_create(THIS_MODULE, "sensordrv");device_create(gpimgsensor_class, NULL, dev_no, NULL, IMGSENSOR_DEV_NAME);
}

3、imgsensor_clk_init 时钟初始化:

enum IMGSENSOR_RETURN imgsensor_clk_init(struct IMGSENSOR_CLK *pclk)
{int i;struct platform_device *pplatform_dev = gpimgsensor_hw_platform_device;/* get all possible using clocks */for (i = 0; i < IMGSENSOR_CCF_MAX_NUM; i++)pclk->imgsensor_ccf[i] =devm_clk_get(&pplatform_dev->dev, gimgsensor_mclk_name[i]);return IMGSENSOR_RETURN_SUCCESS;
}

4、imgsensor_hw_init电压初始化:

(1)依次调用GPIO/REGULATOR/MCLK的init接口;

(2)解析出imgsensor_custom_config,获取到对应sensor的对应管脚(DVDD/AVDD...)的上电方式(GPIO/REGULATOR);

    

enum IMGSENSOR_RETURN imgsensor_hw_init(struct IMGSENSOR_HW *phw)
{struct IMGSENSOR_HW_SENSOR_POWER      *psensor_pwr;struct IMGSENSOR_HW_CFG               *pcust_pwr_cfg;struct IMGSENSOR_HW_CUSTOM_POWER_INFO *ppwr_info;int i, j;char str_prop_name[LENGTH_FOR_SNPRINTF];struct device_node *of_node= of_find_compatible_node(NULL, NULL, "mediatek,camera_hw");//依次调用GPIO/REGULATOR/MCLK的init接口;for (i = 0; i < IMGSENSOR_HW_ID_MAX_NUM; i++) {if (hw_open[i] != NULL)(hw_open[i])(&phw->pdev[i]);if (phw->pdev[i]->init != NULL)(phw->pdev[i]->init)(phw->pdev[i]->pinstance);}//解析出imgsensor_custom_configfor (i = 0; i < IMGSENSOR_SENSOR_IDX_MAX_NUM; i++) {psensor_pwr = &phw->sensor_pwr[i];pcust_pwr_cfg = imgsensor_custom_config;//上电时序while (pcust_pwr_cfg->sensor_idx != i)pcust_pwr_cfg++;//退出循环if (pcust_pwr_cfg->sensor_idx == IMGSENSOR_SENSOR_IDX_NONE)continue;//ppwr_info对应{IMGSENSOR_HW_ID_GPIO, IMGSENSOR_HW_PIN_AVDD}ppwr_info = pcust_pwr_cfg->pwr_info;while (ppwr_info->pin != IMGSENSOR_HW_PIN_NONE) {//查询imgsensor_custom_config中ID_PIN 是否在GPIO/REGULATOR/Mclk中?for (j = 0; j < IMGSENSOR_HW_ID_MAX_NUM; j++){if (ppwr_info->id == phw->pdev[j]->id)break;}//将对应sensor的对应PIN(DVDD/AVDD...)设置为系统的ID_PIN(GPIO/REGULATOR/MCKL)psensor_pwr->id[ppwr_info->pin] = j;ppwr_info++;}}//判断dts中是否设定对应的index为对应的name,如:cam3_enable_sensor = "gc2375hmain3_mipi_raw";for (i = 0; i < IMGSENSOR_SENSOR_IDX_MAX_NUM; i++) {memset(str_prop_name, 0, sizeof(str_prop_name));snprintf(str_prop_name,sizeof(str_prop_name),"cam%d_%s",i,"enable_sensor");if (of_property_read_string(of_node,str_prop_name,&phw->enable_sensor_by_index[i]) < 0) {pr_info("Property cust-sensor not defined\n");phw->enable_sensor_by_index[i] = NULL;}}return IMGSENSOR_RETURN_SUCCESS;
}

5、imgsensor_i2c_create I2C设备初始化:

enum IMGSENSOR_RETURN imgsensor_i2c_create(void)
{int i;for (i = 0; i < IMGSENSOR_I2C_DEV_MAX_NUM; i++)i2c_add_driver(&gi2c_driver[i]);return IMGSENSOR_RETURN_SUCCESS;
}

6、具体类型的上电介绍(以pmic控制的regulator方式为例)

  前面imgsensor_hw_init中有去调用imgsensor_hw_regulator_open和regulator_init:

(1)传入对应的设备的device结构体:

static struct IMGSENSOR_HW_DEVICE device = {.pinstance = (void *)&reg_instance,.init      = regulator_init,//开机初始化时调用.set       = regulator_set,//在上电设置电压时会调用.release   = regulator_release,.id        = IMGSENSOR_HW_ID_REGULATOR
};enum IMGSENSOR_RETURN imgsensor_hw_regulator_open(struct IMGSENSOR_HW_DEVICE **pdevice)
{*pdevice = &device;return IMGSENSOR_RETURN_SUCCESS;
}

(2)调用对应的init进行初始化:

  因为MTK 平台的PMIC上电是通过统一的REGULATOR进行统一管理的,每一种上电方式需要申请对应type

的regulator控制的结构体,才可以来进行设置:

enum REGULATOR_TYPE {REGULATOR_TYPE_VCAMA,REGULATOR_TYPE_VCAMD,REGULATOR_TYPE_VCAMIO,REGULATOR_TYPE_MAX_NUM
};static enum IMGSENSOR_RETURN regulator_init(void *pinstance)
{struct REGULATOR *preg = (struct REGULATOR *)pinstance;struct device            *pdevice;struct device_node       *pof_node;int j, i;char str_regulator_name[LENGTH_FOR_SNPRINTF];pdevice  = gimgsensor_device;for (j = IMGSENSOR_SENSOR_IDX_MIN_NUM;j < IMGSENSOR_SENSOR_IDX_MAX_NUM;j++) {for (i = 0; i < REGULATOR_TYPE_MAX_NUM; i++) {snprintf(str_regulator_name,sizeof(str_regulator_name),"cam%d_%s", j,regulator_control[i].pregulator_type);preg->pregulator[j][i] =regulator_get(pdevice, str_regulator_name);if (preg->pregulator[j][i] == NULL)pr_err("regulator[%d][%d]  %s fail!\n",j, i, str_regulator_name);atomic_set(&preg->enable_cnt[j][i], 0);}}pdevice->of_node = pof_node;imgsensor_oc_init();return IMGSENSOR_RETURN_SUCCESS;
}

  到这里imgsensor部分的内容还有对上(hal层)承接的ioctl相关的内容没有介绍,这部分的内容会在后续的

整个系统调用流程中进行梳理。

作者:frank_zyp
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文无所谓版权,欢迎转载。

Camera5 MTK camera驱动框架介绍相关推荐

  1. Camera4 MTK camera驱动结构介绍

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

  2. Lind.DDD敏捷领域驱动框架~介绍

    最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...

  3. camera驱动框架分析(上)

    前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连接到soc的camif口上的,有些是通过usb接口导出的,如usb camera.我这里主要讨论前者, ...

  4. MTK Camera驱动移植

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

  5. android驱动框架介绍

    android驱动框架介绍 了解android驱动框架: 1.方法1--jni调用底层驱动 在android框架中写入c/c++直接调用底层linux驱动,并向上提供jni接口给应用程序: 优点:简单 ...

  6. Android MTK Camera驱动代码分析

    一.Camera调用过程:      imgsensor起到承上启下的作用,在系统起来时会创建整个camera驱动运行的环境,其中主要的文件和函数如下框图所示,先设备挂载时会调用注册platform设 ...

  7. 【Camera专题】Sprd-深入浅出Camera驱动框架1(HAL层-Kernel层)

    一.前言 本文主要研究展讯平台Camera驱动和HAL层代码架构,熟悉展讯Camera的控制流程. 平台:Sprd-展讯平台 Hal版本:[HAL3] 知识点如下: 从HAL层到deiver层 1.C ...

  8. MTK Keypad驱动框架

    上一节,看完了http://blog.csdn.net/morixinguan/article/details/7717020,tpd驱动框架的实现. 那么这一节来分析下Keypad驱动框架的实现,其 ...

  9. Mtk Sensor 驱动框架变更简要分析

    Mtk Android 8.0 以后版本,Sensor 部分主要修改了 data path 框架,原来数据通过输入子系统传递到应用层,现在采用 misc dev + poll 实现数据上报.下面以 G ...

最新文章

  1. HTML JS 数据校验
  2. 2019年度全球工程前沿研究报告
  3. Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)
  4. usaco Mother's Milk
  5. Linux ipcs命令与ipcrm命令的用法详解
  6. Hey, Apple | Decode the Week
  7. eclipse中选中字段,其他相同字段被覆盖的颜色修改
  8. 代码加载 Prefabs
  9. HTML5 — 知识总结篇《V》【a元素】
  10. exce小技巧,Mac Excel单元格内换行快捷键
  11. 服务器创建新文件夹权限设置密码,在服务器上修改文件夹权限设置密码
  12. 线性判别分析LDA解析2
  13. JavaScript表单提交
  14. 冒险岛无敌外挂代码诠释
  15. 计算机网络在电力系统继电保护的应用毕业论文,毕业论文 110kV电力系统继电保护的配置...
  16. 北理珠计算机与科学就业去向,2019届我国大学毕业生就业情况:计算机类专业领跑薪酬榜...
  17. 华为VLAN隔离配置
  18. 铁路 信号组调工 技师 练习题 01
  19. 微信小程序云开发入门-快速获取手机号
  20. 菜鸟成长记----做一个简易的搜索引擎

热门文章

  1. python解题思路_黄哥Python: 一道水题“最大唯一数” 解题思路
  2. design短语的用法总结_style的用法总结大全
  3. C++define用法
  4. C#获取本机网络连接名,获取和设置IP地址
  5. 求安卓拓扑图实现思路
  6. 大众点评探索性数据分析
  7. 超五类网线和六类网线的选择-锦安
  8. 云安全三大趋势:纵深防御、软件定义安全、设备虚拟化
  9. 人工智能时代的APP测试
  10. 电商运营个人简历范文