LibreSatCam/Cypress_FX3_USB_Firmware/Source/sensor_imx219.h

216 lines
6.0 KiB
C

#ifndef _IMX219MIPI_SENSOR_H
#define _IMX219MIPI_SENSOR_H
#include <cyu3types.h>
#include <stdbool.h>
#include "sensor_imx219.h"
#define LANES 2
#define SENSOR_ADDR_WR 0x20 /* Slave address used to write sensor registers. */
#define SENSOR_ADDR_RD 0x21 /* Slave address used to read from sensor registers. */
#define I2C_SLAVEADDR_MASK 0xFE /* Mask to get actual I2C slave address value without direction bit. */
/* GPIO 22 on FX3 is used to reset the Image sensor. */
#define DEBUG1_GPIO 23
#define DEBUG_GPIO 27
#define SENSOR_RESET_GPIO 22
#define _countof(array) (sizeof(array) / sizeof(array[0]))
#define GET_WORD_MSB(x) ((x >> 8) & 0xFF)
#define GET_WORD_LSB(x) ( x & 0xFF)
#define IMX219_SENSOR_ID 0x0219
#define CAMERA_ID IMX219_SENSOR_ID
#define REG_SW_RESET 0x0103
#define REG_MODEL_ID_MSB 0x0000
#define REG_MODEL_ID_LSB 0x0001
#define REG_MODE_SEL 0x0100
#define REG_CSI_LANE 0x0114
#define REG_DPHY_CTRL 0x0128
#define REG_EXCK_FREQ_MSB 0x012A
#define REG_EXCK_FREQ_LSB 0x012B
#define REG_FRAME_LEN_MSB 0x0160
#define REG_FRAME_LEN_LSB 0x0161
#define REG_LINE_LEN_MSB 0x0162
#define REG_LINE_LEN_LSB 0x0163
#define REG_X_ADD_STA_MSB 0x0164
#define REG_X_ADD_STA_LSB 0x0165
#define REG_X_ADD_END_MSB 0x0166
#define REG_X_ADD_END_LSB 0x0167
#define REG_Y_ADD_STA_MSB 0x0168
#define REG_Y_ADD_STA_LSB 0x0169
#define REG_Y_ADD_END_MSB 0x016A
#define REG_Y_ADD_END_LSB 0x016B
#define REG_X_OUT_SIZE_MSB 0x016C
#define REG_X_OUT_SIZE_LSB 0x016D
#define REG_Y_OUT_SIZE_MSB 0x016E
#define REG_Y_OUT_SIZE_LSB 0x016F
#define REG_X_ODD_INC 0x0170
#define REG_Y_ODD_INC 0x0171
#define REG_IMG_ORIENT 0x0172
#define REG_BINNING_H 0x0174
#define REG_BINNING_V 0x0175
#define REG_BIN_CALC_MOD_H 0x0176
#define REG_BIN_CALC_MOD_V 0x0177
#define REG_CSI_FORMAT_C 0x018C
#define REG_CSI_FORMAT_D 0x018D
#define REG_DIG_GAIN_GLOBAL_MSB 0x0158
#define REG_DIG_GAIN_GLOBAL_LSB 0x0159
#define REG_ANA_GAIN_GLOBAL 0x0157
#define REG_INTEGRATION_TIME_MSB 0x015A
#define REG_INTEGRATION_TIME_LSB 0x015B
#define REG_ANALOG_GAIN 0x0157
#define REG_VTPXCK_DIV 0x0301
#define REG_VTSYCK_DIV 0x0303
#define REG_PREPLLCK_VT_DIV 0x0304
#define REG_PREPLLCK_OP_DIV 0x0305
#define REG_PLL_VT_MPY_MSB 0x0306
#define REG_PLL_VT_MPY_LSB 0x0307
#define REG_OPPXCK_DIV 0x0309
#define REG_OPSYCK_DIV 0x030B
#define REG_PLL_OP_MPY_MSB 0x030C
#define REG_PLL_OP_MPY_LSB 0x030D
#define REG_TEST_PATTERN_MSB 0x0600
#define REG_TEST_PATTERN_LSB 0x0601
#define REG_TP_RED_MSB 0x0602
#define REG_TP_RED_LSB 0x0603
#define REG_TP_GREEN_MSB 0x0604
#define REG_TP_GREEN_LSB 0x0605
#define REG_TP_BLUE_MSB 0x0606
#define REG_TP_BLUE_LSB 0x0607
#define REG_TP_X_OFFSET_MSB 0x0620
#define REG_TP_X_OFFSET_LSB 0x0621
#define REG_TP_Y_OFFSET_MSB 0x0622
#define REG_TP_Y_OFFSET_LSB 0x0623
#define REG_TP_WIDTH_MSB 0x0624
#define REG_TP_WIDTH_LSB 0x0625
#define REG_TP_HEIGHT_MSB 0x0626
#define REG_TP_HEIGHT_LSB 0x0627
typedef enum{
IMGSENSOR_MODE_INIT,
IMGSENSOR_MODE_PREVIEW,
IMGSENSOR_MODE_CAPTURE,
IMGSENSOR_MODE_VIDEO,
IMGSENSOR_MODE_HIGH_SPEED_VIDEO,
IMGSENSOR_MODE_SLIM_VIDEO,
} IMGSENSOR_MODE;
enum
{
IMAGE_NORMAL=0,
IMAGE_H_MIRROR,
IMAGE_V_MIRROR,
IMAGE_HV_MIRROR
};
typedef struct imgsensor_mode_struct_s {
uint16_t pix_clk_mul;
uint16_t pix_clk_div;
uint8_t mirror;
uint16_t integration;
uint16_t gain;
uint16_t gain_max;
uint16_t linelength;
uint16_t framelength;
uint16_t startx;
uint16_t starty;
uint16_t endx;
uint16_t endy;
uint16_t width;
uint16_t height;
uint16_t framerate;
uint8_t binning;
uint8_t fps;
uint8_t test_pattern;
} imgsensor_mode_t;
#if LANES == 2
#define SENSOR_MODE0_WIDTH (unsigned int)640
#define SENSOR_MODE0_HEIGHT (unsigned int)78
#define SENSOR_MODE0_FPS (unsigned int)1000
#define SENSOR_MODE1_WIDTH (unsigned int)640
#define SENSOR_MODE1_HEIGHT (unsigned int)480
#define SENSOR_MODE1_FPS (unsigned int)200
#define SENSOR_MODE2_WIDTH (unsigned int)1280
#define SENSOR_MODE2_HEIGHT (unsigned int)720
#define SENSOR_MODE2_FPS (unsigned int)60
#define SENSOR_MODE3_WIDTH (unsigned int)1920
#define SENSOR_MODE3_HEIGHT (unsigned int)1080
#define SENSOR_MODE3_FPS (unsigned int)30
#define SENSOR_MODE4_WIDTH (unsigned int)3280
#define SENSOR_MODE4_HEIGHT (unsigned int)2464
#define SENSOR_MODE4_FPS_MIN (unsigned int)5
#define SENSOR_MODE4_FPS (unsigned int)15
#else
#define SENSOR_MODE0_WIDTH (unsigned int)640
#define SENSOR_MODE0_HEIGHT (unsigned int)78
#define SENSOR_MODE0_FPS (unsigned int)2000
#define SENSOR_MODE1_WIDTH (unsigned int)640
#define SENSOR_MODE1_HEIGHT (unsigned int)480
#define SENSOR_MODE1_FPS (unsigned int)400
#define SENSOR_MODE2_WIDTH (unsigned int)1280
#define SENSOR_MODE2_HEIGHT (unsigned int)720
#define SENSOR_MODE2_FPS (unsigned int)120
#define SENSOR_MODE3_WIDTH (unsigned int)1920
#define SENSOR_MODE3_HEIGHT (unsigned int)1080
#define SENSOR_MODE3_FPS (unsigned int)60
#define SENSOR_MODE4_WIDTH (unsigned int)3280
#define SENSOR_MODE4_HEIGHT (unsigned int)2464
#define SENSOR_MODE4_FPS_MIN (unsigned int)10
#define SENSOR_MODE4_FPS (unsigned int)30
#endif
typedef struct imx219_reg_s {
uint16_t address;
uint8_t val;
}imx219_reg_t;
void SensorInit (void);
void SensorReset (void);
uint8_t SensorI2cBusTest (void);
uint16_t getMaxBrightness(void);
uint8_t SensorGetBrightness (void);
void SensorSetBrightness (uint8_t input);
uint16_t sensor_get_exposure (void);
uint16_t sensor_get_max_exposure();
uint16_t sensor_get_min_exposure();
uint16_t sensor_get_def_exposure();
void sensor_set_exposure (uint16_t input);
uint8_t sensor_get_test_pattern (void);
void sensor_set_test_pattern (uint8_t input);
void sensor_configure_mode(imgsensor_mode_t * mode);
void sensor_handle_uvc_control(uint8_t frame_index, uint32_t interval);
#endif