栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Mtk Camera Sensor Bring Up(笔记)

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mtk Camera Sensor Bring Up(笔记)

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

(1)ProjectConfig.mk文件配置

//device/mediatek/mt6779/ProjectConfig.mk

//sensor
CUSTOM_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

//lens
CUSTOM_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_flashlight
CUSTOM_HAL_FLASHLIGHT = dummy_flashlight
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight

(2)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"

(3)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);


//kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1(v1_1)/imgsensor_sensor_list.c
struct 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.c
UINT32 GC8034_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc)
{
	
	if (pfFunc != NULL)
		*pfFunc = &sensor_func;
	return ERROR_NONE;
}

(4)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 时会对应错误。

(5)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.c
Makefile

//kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6779/sc500cs_mipi_raw
sc500csmipiraw_Sensor.h
sc500csmipiraw_Sensor.c
Makefile

(6)hal层摄像头文件夹

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


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

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


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


(7)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[] = {
	//...
	
	#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 *)®_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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号