个人学习总结记录,有错误望指正
概述:
camera驱动主要是配置两个部分:kernel层和hal层
一个进行驱动加载,一个管理效果显示
一、device目录
配置整个工程的文件,在这里需要对hal层和kernel层都进行一个配置
文件路径:Z:\work\mtk6789_T\alps\s0_vnd\device\mediateksample\t2203gmc_v1_gb_dh_h3_qd_t\ProjectConfig.mk
在这里,hal层和kernel层都有一个camera list以及主副摄像头需要添加,在这里进行配置
...
/*hal层
camera列表,所有的camera都要在这里加进去
*/
CUSTOM_HAL_IMGSENSOR = ov13850_mipi_raw gc5035_mipi_raw gc2385_mipi_raw imx351_mipi_raw gc05a2_mipi_raw
/*
camera的位置配置:
CUSTOM_HAL_MAIN2_IMGSENSOR = no 后副摄
CUSTOM_HAL_MAIN_IMGSENSOR = no 后摄
CUSTOM_HAL_SUB_IMGSENSOR = no 前摄
*/
...
/*
kernel层camera列表,将摄像头添加进去
*/
CUSTOM_KERNEL_IMGSENSOR = ov13850_mipi_raw gc5035_mipi_raw gc2385_mipi_raw imx351_mipi_raw gc05a2_mipi_raw
/*
camera的位置配置:
CUSTOM_KERNEL_MAIN2_IMGSENSOR = no 后副摄
CUSTOM_KERNEL_MAIN_IMGSENSOR = no 后摄
CUSTOM_KERNEL_SUB_IMGSENSOR = no 前摄
*/
...
而在kernel和hal层,都有一个数组文件(imgsensor_sensor_list.c)需要进行配置
二、KERNEL层目录
camera驱动添加位置:
Z:\work\mtk6789_T\alps\s0_vnd\kernel-5.10\drivers\misc\mediatek\imgsensor\src\common
基本上所有的camera驱动都图中在这两个目录下
kernel层的数组文件位置如下:
Z:\work\mtk6789_T\alps\s0_vnd\kernel-5.10\drivers\misc\mediatek\imgsensor\src\common\v1\imgsensor_sensor_list.c
//我以GC5035为例熟悉一下,结构基本如下:
...
#if defined(GC5035_MIPI_RAW)
//从硬件上区分camera,有专门的寄存器来存储sensor ID,可以判断设备是否在线
{GC5035_SENSOR_ID,
//定义了camera的driver_name
SENSOR_DRVNAME_GC5035MIPI_RAW,
//接口,一个函数的地址,每一个驱动的.c文件最下面都是它
GC5035MIPI_RAW_SensorInit},
#endif
...
上面提到的sensor ID以及driver name所在位置如下:
Z:\work\mtk6789_T\alps\s0_vnd\kernel-5.10\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.h
...
/*GC*/
#define GC5035_SENSOR_ID 0x5035
#define GC2385_SENSOR_ID 0x2385
...
#define SENSOR_DRVNAME_GC02M0_MIPI_RAW "gc02m0_mipi_raw"
#define SENSOR_DRVNAME_GC5035MIPI_RAW "gc5035_mipi_raw"
//注意,这个要跟ProjectConfig.mk文件中的name一致
#define SENSOR_DRVNAME_GC5035_MIPI_RAW "gc5035_mipi_raw"
#define SENSOR_DRVNAME_GC2375_MIPI_RAW "gc2375_mipi_raw"
...
我们添加的camera驱动要在这里做好定义!如果name不一致,初始化将不会继续下去了
第三个参数那个接口,文件路径如下:
Z:\work\mtk6789_T\alps\s0_vnd\kernel-5.10\drivers\misc\mediatek\imgsensor\src\common\v1_1\gc5035_mipi_raw\gc5035_mipi_Sensor.c
图中这个函数,将camera本身的操作函数传递回来
三、HAL层目录
hal层的数组文件位置如下:
关于怎么看cpu型号,提一嘴:
在ProjectConfig.mk文件当中,有一个变量 MTK_PLATFORM ,去看这个地方的配置
回归正题,来看看hal层的列表
文件路径:
Z:\work\mtk6789_T\alps\s0_vnd\vendor\mediatek\proprietary\custom\mt6789\hal\imgsensor_src\sensorlist.cpp
MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =
{
...
#if defined(GC5035_MIPI_RAW)
RAW_INFO_M(GC5035_SENSOR_ID, DEFAULT_MODULE_INDEX, DEFAULT_MODULE_ID, SENSOR_DRVNAME_GC5035_MIPI_RAW, NULL),
#endif
...
};
效果文件路径:
camera是可以输出多种格式(raw、yuv...),这里指定了camera的流程,现在Android 9之后基本都是raw了
raw处理首先要用到效果文件,效果文件路径:
- Z:\work\mtk6789_T\alps\s0_vnd\vendor\mediatek\proprietary\custom\mt6789\hal\imgsensor\ver1\gc5035_mipi_raw
- Z:\work\mtk6789_T\alps\s0_vnd\vendor\mediatek\proprietary\custom\mt6789\hal\imgsensor_metadata\gc5035_mipi_raw
上电文件路径:
Z:\work\mtk6789_T\alps\s0_vnd\kernel-5.10\drivers\misc\mediatek\imgsensor\src\isp3_m\camera_hw\imgsensor_cfg_table.c
struct IMGSENSOR_HW_POWER_SEQ sensor_power_sequence[] = {
...
/* GC */
//这个就是5035的上电时序图,具体要根据数据手册来详细配置,这个后面的延时,只能设置的比手册大,不能小!!
#if defined(GC5035_MIPI_RAW)
{
//这个和kernel下的driver name是一致的
SENSOR_DRVNAME_GC5035MIPI_RAW,
{
//1.系统对应的引脚,类似dtsi,直接拿来用就好
//2.Vol_High:高电平 Vol_Low:低电平
//3.延时时间
{PDN, Vol_High, 0},
{RST, Vol_Low, 0},
{AVDD, Vol_2800, 0},
{DOVDD, Vol_1800, 0},
{DVDD, Vol_1200, 0},
{SensorMCLK, Vol_High, 1},
{PDN, Vol_Low, 0},
{RST, Vol_High, 10}
},
},
#endif
...
};
如无法打开,iic读写失败,都可能是上电引起,此处非常重要
在此处配置完成后,其余地方就不再需要进行配置了