You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.3 KiB
245 lines
7.3 KiB
/* |
|
* This file is part of the OpenMV project. |
|
* Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com> |
|
* This work is licensed under the MIT license, see the file LICENSE for details. |
|
* |
|
* Sensor abstraction layer. |
|
* |
|
*/ |
|
#ifndef __SENSOR_H__ |
|
#define __SENSOR_H__ |
|
#include <stdint.h> |
|
#include <stdbool.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
typedef enum { |
|
OV9650_PID = 0x96, |
|
OV7725_PID = 0x77, |
|
OV2640_PID = 0x26, |
|
OV3660_PID = 0x3660, |
|
OV5640_PID = 0x5640, |
|
OV7670_PID = 0x76, |
|
NT99141_PID = 0x1410, |
|
GC2145_PID = 0x2145, |
|
GC032A_PID = 0x232a, |
|
GC0308_PID = 0x9b, |
|
} camera_pid_t; |
|
|
|
typedef enum { |
|
CAMERA_OV7725, |
|
CAMERA_OV2640, |
|
CAMERA_OV3660, |
|
CAMERA_OV5640, |
|
CAMERA_OV7670, |
|
CAMERA_NT99141, |
|
CAMERA_GC2145, |
|
CAMERA_GC032A, |
|
CAMERA_GC0308, |
|
CAMERA_MODEL_MAX, |
|
CAMERA_NONE, |
|
} camera_model_t; |
|
|
|
typedef enum { |
|
OV2640_SCCB_ADDR = 0x30,// 0x60 >> 1 |
|
OV5640_SCCB_ADDR = 0x3C,// 0x78 >> 1 |
|
OV3660_SCCB_ADDR = 0x3C,// 0x78 >> 1 |
|
OV7725_SCCB_ADDR = 0x21,// 0x42 >> 1 |
|
OV7670_SCCB_ADDR = 0x21,// 0x42 >> 1 |
|
NT99141_SCCB_ADDR = 0x2A,// 0x54 >> 1 |
|
GC2145_SCCB_ADDR = 0x3C,// 0x78 >> 1 |
|
GC032A_SCCB_ADDR = 0x21,// 0x42 >> 1 |
|
GC0308_SCCB_ADDR = 0x21,// 0x42 >> 1 |
|
} camera_sccb_addr_t; |
|
|
|
typedef enum { |
|
PIXFORMAT_RGB565, // 2BPP/RGB565 |
|
PIXFORMAT_YUV422, // 2BPP/YUV422 |
|
PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE |
|
PIXFORMAT_JPEG, // JPEG/COMPRESSED |
|
PIXFORMAT_RGB888, // 3BPP/RGB888 |
|
PIXFORMAT_RAW, // RAW |
|
PIXFORMAT_RGB444, // 3BP2P/RGB444 |
|
PIXFORMAT_RGB555, // 3BP2P/RGB555 |
|
} pixformat_t; |
|
|
|
typedef enum { |
|
FRAMESIZE_96X96, // 96x96 |
|
FRAMESIZE_QQVGA, // 160x120 |
|
FRAMESIZE_QCIF, // 176x144 |
|
FRAMESIZE_HQVGA, // 240x176 |
|
FRAMESIZE_240X240, // 240x240 |
|
FRAMESIZE_QVGA, // 320x240 |
|
FRAMESIZE_CIF, // 400x296 |
|
FRAMESIZE_HVGA, // 480x320 |
|
FRAMESIZE_VGA, // 640x480 |
|
FRAMESIZE_SVGA, // 800x600 |
|
FRAMESIZE_XGA, // 1024x768 |
|
FRAMESIZE_HD, // 1280x720 |
|
FRAMESIZE_SXGA, // 1280x1024 |
|
FRAMESIZE_UXGA, // 1600x1200 |
|
// 3MP Sensors |
|
FRAMESIZE_FHD, // 1920x1080 |
|
FRAMESIZE_P_HD, // 720x1280 |
|
FRAMESIZE_P_3MP, // 864x1536 |
|
FRAMESIZE_QXGA, // 2048x1536 |
|
// 5MP Sensors |
|
FRAMESIZE_QHD, // 2560x1440 |
|
FRAMESIZE_WQXGA, // 2560x1600 |
|
FRAMESIZE_P_FHD, // 1080x1920 |
|
FRAMESIZE_QSXGA, // 2560x1920 |
|
FRAMESIZE_INVALID |
|
} framesize_t; |
|
|
|
typedef struct { |
|
const camera_model_t model; |
|
const char *name; |
|
const camera_sccb_addr_t sccb_addr; |
|
const camera_pid_t pid; |
|
const framesize_t max_size; |
|
const bool support_jpeg; |
|
} camera_sensor_info_t; |
|
|
|
typedef enum { |
|
ASPECT_RATIO_4X3, |
|
ASPECT_RATIO_3X2, |
|
ASPECT_RATIO_16X10, |
|
ASPECT_RATIO_5X3, |
|
ASPECT_RATIO_16X9, |
|
ASPECT_RATIO_21X9, |
|
ASPECT_RATIO_5X4, |
|
ASPECT_RATIO_1X1, |
|
ASPECT_RATIO_9X16 |
|
} aspect_ratio_t; |
|
|
|
typedef enum { |
|
GAINCEILING_2X, |
|
GAINCEILING_4X, |
|
GAINCEILING_8X, |
|
GAINCEILING_16X, |
|
GAINCEILING_32X, |
|
GAINCEILING_64X, |
|
GAINCEILING_128X, |
|
} gainceiling_t; |
|
|
|
typedef struct { |
|
uint16_t max_width; |
|
uint16_t max_height; |
|
uint16_t start_x; |
|
uint16_t start_y; |
|
uint16_t end_x; |
|
uint16_t end_y; |
|
uint16_t offset_x; |
|
uint16_t offset_y; |
|
uint16_t total_x; |
|
uint16_t total_y; |
|
} ratio_settings_t; |
|
|
|
typedef struct { |
|
const uint16_t width; |
|
const uint16_t height; |
|
const aspect_ratio_t aspect_ratio; |
|
} resolution_info_t; |
|
|
|
// Resolution table (in sensor.c) |
|
extern const resolution_info_t resolution[]; |
|
// camera sensor table (in sensor.c) |
|
extern const camera_sensor_info_t camera_sensor[]; |
|
|
|
typedef struct { |
|
uint8_t MIDH; |
|
uint8_t MIDL; |
|
uint16_t PID; |
|
uint8_t VER; |
|
} sensor_id_t; |
|
|
|
typedef struct { |
|
framesize_t framesize;//0 - 10 |
|
bool scale; |
|
bool binning; |
|
uint8_t quality;//0 - 63 |
|
int8_t brightness;//-2 - 2 |
|
int8_t contrast;//-2 - 2 |
|
int8_t saturation;//-2 - 2 |
|
int8_t sharpness;//-2 - 2 |
|
uint8_t denoise; |
|
uint8_t special_effect;//0 - 6 |
|
uint8_t wb_mode;//0 - 4 |
|
uint8_t awb; |
|
uint8_t awb_gain; |
|
uint8_t aec; |
|
uint8_t aec2; |
|
int8_t ae_level;//-2 - 2 |
|
uint16_t aec_value;//0 - 1200 |
|
uint8_t agc; |
|
uint8_t agc_gain;//0 - 30 |
|
uint8_t gainceiling;//0 - 6 |
|
uint8_t bpc; |
|
uint8_t wpc; |
|
uint8_t raw_gma; |
|
uint8_t lenc; |
|
uint8_t hmirror; |
|
uint8_t vflip; |
|
uint8_t dcw; |
|
uint8_t colorbar; |
|
} camera_status_t; |
|
|
|
typedef struct _sensor sensor_t; |
|
typedef struct _sensor { |
|
sensor_id_t id; // Sensor ID. |
|
uint8_t slv_addr; // Sensor I2C slave address. |
|
pixformat_t pixformat; |
|
camera_status_t status; |
|
int xclk_freq_hz; |
|
|
|
// Sensor function pointers |
|
int (*init_status) (sensor_t *sensor); |
|
int (*reset) (sensor_t *sensor); |
|
int (*set_pixformat) (sensor_t *sensor, pixformat_t pixformat); |
|
int (*set_framesize) (sensor_t *sensor, framesize_t framesize); |
|
int (*set_contrast) (sensor_t *sensor, int level); |
|
int (*set_brightness) (sensor_t *sensor, int level); |
|
int (*set_saturation) (sensor_t *sensor, int level); |
|
int (*set_sharpness) (sensor_t *sensor, int level); |
|
int (*set_denoise) (sensor_t *sensor, int level); |
|
int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling); |
|
int (*set_quality) (sensor_t *sensor, int quality); |
|
int (*set_colorbar) (sensor_t *sensor, int enable); |
|
int (*set_whitebal) (sensor_t *sensor, int enable); |
|
int (*set_gain_ctrl) (sensor_t *sensor, int enable); |
|
int (*set_exposure_ctrl) (sensor_t *sensor, int enable); |
|
int (*set_hmirror) (sensor_t *sensor, int enable); |
|
int (*set_vflip) (sensor_t *sensor, int enable); |
|
|
|
int (*set_aec2) (sensor_t *sensor, int enable); |
|
int (*set_awb_gain) (sensor_t *sensor, int enable); |
|
int (*set_agc_gain) (sensor_t *sensor, int gain); |
|
int (*set_aec_value) (sensor_t *sensor, int gain); |
|
|
|
int (*set_special_effect) (sensor_t *sensor, int effect); |
|
int (*set_wb_mode) (sensor_t *sensor, int mode); |
|
int (*set_ae_level) (sensor_t *sensor, int level); |
|
|
|
int (*set_dcw) (sensor_t *sensor, int enable); |
|
int (*set_bpc) (sensor_t *sensor, int enable); |
|
int (*set_wpc) (sensor_t *sensor, int enable); |
|
|
|
int (*set_raw_gma) (sensor_t *sensor, int enable); |
|
int (*set_lenc) (sensor_t *sensor, int enable); |
|
|
|
int (*get_reg) (sensor_t *sensor, int reg, int mask); |
|
int (*set_reg) (sensor_t *sensor, int reg, int mask, int value); |
|
int (*set_res_raw) (sensor_t *sensor, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning); |
|
int (*set_pll) (sensor_t *sensor, int bypass, int mul, int sys, int root, int pre, int seld5, int pclken, int pclk); |
|
int (*set_xclk) (sensor_t *sensor, int timer, int xclk); |
|
} sensor_t; |
|
|
|
camera_sensor_info_t *esp_camera_sensor_get_info(sensor_id_t *id); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* __SENSOR_H__ */
|
|
|