4G_module/include/cmiot/cm_camera_sensor.h

325 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file cm_camera_sensor.h
* @brief 相机硬件驱动适配接口
* @copyright Copyright @2023 China Mobile IOT. All rights reserved.
* @author By chenxy
* @date 2023/03/13
*
* @defgroup camera
* @ingroup camera
* @{
*/
#ifndef __CM_CAMERA_SENSOR_H__
#define __CM_CAMERA_SENSOR_H__
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdint.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* raw8 */
#define MEDIA_BUS_FMT_SBGGR8_1X8 0x3001
#define MEDIA_BUS_FMT_SGBRG8_1X8 0x3013
#define MEDIA_BUS_FMT_SGRBG8_1X8 0x3002
#define MEDIA_BUS_FMT_SRGGB8_1X8 0x3014
/* raw10 */
#define MEDIA_BUS_FMT_SBGGR10_1X10 0x3007
#define MEDIA_BUS_FMT_SGBRG10_1X10 0x300e
#define MEDIA_BUS_FMT_SGRBG10_1X10 0x300a
#define MEDIA_BUS_FMT_SRGGB10_1X10 0x300f
/* yuv422 */
#define MEDIA_BUS_FMT_UYVY8_2X8 0x2006
#define MEDIA_BUS_FMT_VYUY8_2X8 0x2007
#define MEDIA_BUS_FMT_YUYV8_2X8 0x2008
#define MEDIA_BUS_FMT_YVYU8_2X8 0x2009
/****************************************************************************
* Public Types
****************************************************************************/
/**
* @brief camera ata模式参数
*/
typedef struct {
uint32_t on;
int32_t read_crc_value;
}cm_cam_sensor_ata_t;
/**
* @brief camera 频率
*/
typedef enum{
CAM_BANDING_50HZ = 0,
CAM_BANDING_60HZ = 1,
CAM_BANDING_AUTO = 2,
} cm_cam_sensor_banding;
/**
* @brief camera 曝光参数
*/
typedef struct {
uint32_t exp_high;
uint32_t exp_low;
uint32_t gain;
uint32_t aec_en;
uint32_t min_fps;
uint32_t max_fps;
cm_cam_sensor_banding banding;
uint32_t sensor_out_yuv;
} cm_cam_sensor_aec_t;
/**
* @brief camera操作函数
* @details 上层接口操作camera的实际驱动接口内部需自行实现目前系统只用到s_power、
* ata_open、ata_open三个接口其余预留设置为NULL。
*/
typedef struct {
int32_t *get_pixel_rate;
int32_t *get_dphy_desc;
int32_t *update_otp;
int32_t (*s_power)(int32_t onoff); /*!< camera上下电 */
int32_t (*ata_open)(cm_cam_sensor_ata_t *ata); /*!< 打开/关闭camera 模组进入test pattern的功能 */
int32_t (*update_aec)(cm_cam_sensor_aec_t *aec); /*!< camera模组曝光参数设置 */
int32_t *set_effect;
int32_t *set_brightness;
int32_t *set_contrast;
int32_t *set_wb;
int32_t *set_saturation;
int32_t *set_banding;
}cm_cam_sensor_spec_ops;
/**
* @brief i2c寄存器支持的数据宽度
*/
typedef enum {
CAM_I2C_8BIT = 0,
CAM_I2C_16BIT,
CAM_I2C_32BIT
}cm_cam_sensor_i2c_len;
/**
* @brief i2c寄存器地址及写入值
*/
typedef struct {
uint16_t reg; /*!< 寄存器地址 */
uint16_t val; /*!< 数据值 */
uint16_t mask; /*!< 延时时间ms */
}cm_cam_regval_tab;
/**
* @brief i2c寄存器操作表
*/
typedef struct {
const cm_cam_regval_tab *tab; /*!< i2c寄存器操作表可同时配置多个 */
uint32_t num; /*!< i2c寄存器操作表个数 */
}cm_cam_sensor_regs;
/**
* @brief i2c参数
*/
typedef struct {
cm_cam_sensor_i2c_len reg_len; /*!< i2c寄存器宽度*/
cm_cam_sensor_i2c_len val_len; /*!< i2c数据宽度*/
uint8_t addr; /*!< i2c设备地址*/
}cm_cam_sensor_i2c_attr;
/**
* @brief 预留参数相关结构体,暂无使用
*/
typedef struct {
cm_cam_sensor_regs regs;
int32_t sensor_out_format;
}cm_cam_sensor_global;
/**
* @brief 预留参数相关结构体
*/
typedef enum {
CAM_SENSOR_RES_BINING1,
CAM_SENSOR_RES_BINING2,
CAM_SENSOR_RES_CROPPED,
CAM_SENSOR_RES_MAX,
}cm_cam_sensor_res_prop;
/**
* @brief camera输出数据类型
*/
typedef enum {
CAM_SENSOR_FMT_RAW8 = 0,
CAM_SENSOR_FMT_ONLY_Y,
CAM_SENSOR_FMT_RAW10,
CAM_SENSOR_FMT_RAW12,
CAM_SENSOR_FMT_YUV422,
} cm_cam_sensor_fmt;
/**
* @brief camera参数设置及初始化
*/
typedef struct {
uint32_t sensor_out_format; /*!< camera输出数据类型cm_cam_sensor_fmt*/
uint16_t mbus_code; /*!< 多媒体总线数据类型,相机调试时,如果存在色变,可修改该值*/
uint16_t width; /*!< camera输出width像素数*/
uint16_t height; /*!< camera输出height像素数*/
uint32_t hts; /*!< 行周期值*/
uint32_t min_vts; /*!< 最小场周期值*/
uint8_t max_fps; /*!< 最大帧率*/
uint8_t min_fps; /*!< 最小帧率*/
cm_cam_sensor_res_prop prop; /*!< 预留参数*/
cm_cam_sensor_regs regs; /*!< 模组init代码*/
}cm_cam_sensor_resolution;
/**
* @brief 预留参数结构体
*/
typedef struct {
uint32_t id;
char *name;/* as module id send to userspace, limit the size to 7 characters*/
uint32_t apeture_size;
}cm_cam_sensor_module;
/**
* @brief ISP 寄存器地址组及写入值
*/
typedef struct {
uint16_t reg; /*!< 寄存器地址*/
uint16_t val; /*!< 写入值*/
}cm_isp_tuning_tab;
/**
* @brief ISP 寄存器操作表
*/
typedef struct {
cm_isp_tuning_tab *tab; /*!< ISP寄存器操作表可同时配置多个 */
uint32_t num; /*!< ISP寄存器操作表可同时配置多个 */
}cm_isp_tuning_data;
/**
* @brief camera驱动结构体
*/
typedef struct {
char * const name; /*!< camera名称 */
cm_cam_sensor_spec_ops *ops; /*!< camera操作函数 */
int32_t position; /*!< camera相机位置0 后置1 前置 */
cm_cam_sensor_i2c_attr *i2c_attr; /*!< camera i2c参数*/
int32_t num_i2c_attr; /*!< i2c挂载的设备数 */
cm_cam_sensor_regs id; /*!< camera id寄存器地址及对应的预期值用于判断camera是否匹配 */
cm_cam_sensor_global *global_setting; /*!< 预留参数,暂未使用,可不设置 */
int32_t num_global; /*!< 预留参数,暂未使用,可不设置 */
cm_cam_sensor_resolution *res; /*!< camera参数设置及初始化 */
int32_t num_res; /*!< camera参数设置的组数 */
cm_cam_sensor_regs streamon; /*!< camera streamon需要用到的寄存器组及写入值 */
cm_cam_sensor_regs streamoff; /*!< camera streamoff需要用到的寄存器组及写入值 */
cm_cam_sensor_regs expo_reg; /*!< camera 曝光值需要用到的寄存器组及写入值 */
cm_cam_sensor_regs vts_reg; /*!< camera 场周期值需要用到的寄存器组及写入值,预留值,暂未使用,可不设置 */
cm_cam_sensor_regs gain_reg; /*!< camera 增益需要用到的寄存器组及写入值,预留值,暂未使用,可不设置 */
cm_cam_sensor_regs hflip; /*!< camera 水平翻转需要用到的寄存器组及写入值,预留值,暂未使用,可不设置 */
cm_cam_sensor_regs vflip; /*!< camera 垂直翻转需要用到的寄存器组及写入值,预留值,暂未使用,可不设置 */
cm_cam_sensor_module *module; /*!< 预留参数,暂未使用,可不设置 */
int32_t num_module; /*!< 预留参数,暂未使用,可不设置 */
cm_isp_tuning_tab *tuning_tab; /*!< ISP 寄存器地址组及写入值用于ISP图像优化由芯片厂商提供一般设置为NULL */
int32_t num_tuning_tab; /*!< ISP 寄存器地址组数 */
cm_isp_tuning_data banding_tab[2]; /*!< ISP 寄存器地址组及写入值用于ISP图像优化由芯片厂商提供一般设置为NULL */
int32_t interface_type; /*!< camera接口类型目前只支持设置0SPI */
uint8_t lane_num; /*!< camera具体的接口规格目前只支持设置1SPI_2_LAN */
uint8_t spi_sdr; /*!< SPI采样模式0sdr即单边采样模式1ddr即双边采样模式 */
uint8_t spi_crc; /*!< ISP crc校验功能0不使能crc校验1: 使能crc校验 */
int32_t reset_delay; /*!< reset延迟暂未使用可不设置 */
int32_t cur_i2c_index; /*!< i2c_attr中的I2C外设索引值即当前使用哪一组i2c_attr */
int32_t cur_res_index; /*!< res中的camera参数设置及初始化索引值即当前使用哪一组res */
}cm_cam_sensor_data_t;
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/**
* @brief 使能mclk
*
* @param [in] enable 使能(1 打开, 0 关闭)
*
* @return
*
* @details 用于相机上电逻辑控制mclk时钟输出
*/
void cm_camera_sensor_set_mclk(int32_t enable);
/**
* @brief 设置驱动参数
*
* @param [in] data 驱动参数
*
* @return
*
* @details 操作相机前需设置
*/
void cm_camera_sensor_set_data(cm_cam_sensor_data_t *data);
/**
* @brief i2c读取
*
* @param [in] attr i2c参数
* @param [in] reg 寄存器地址
* @param [out] val 读取值
*
* @return 0 成功;-1 失败
*
* @details 通过i2c读取相机寄存器
*/
int32_t cm_camera_sensor_i2c_read(const cm_cam_sensor_i2c_attr *attr, uint32_t reg, uint32_t *val);
/**
* @brief i2c写
*
* @param [in] attr i2c参数
* @param [in] regs 寄存器操作表
*
* @return 0 成功;-1 失败
*
* @details 通过i2c写相机寄存器
*/
int32_t cm_camera_sensor_i2c_write(const cm_cam_sensor_i2c_attr *attr, cm_cam_sensor_regs regs);
/**
* @brief i2c写单个数据
*
* @param [in] attr i2c参数
* @param [in] reg 寄存器地址
* @param [out] val 写入值
*
* @return 0 成功;-1 失败
*
* @details 通过i2c写相机寄存器
*/
int32_t cm_camera_sensor_i2c_write_single(const cm_cam_sensor_i2c_attr *attr, uint32_t reg, uint32_t val);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __CM_CAMERA_SENSOR_H__ */
/** @}*/