491 lines
17 KiB
C
491 lines
17 KiB
C
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @file HM01B0.h
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
#ifndef HM01B0_H
|
||
|
#define HM01B0_H
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C"
|
||
|
{
|
||
|
#endif
|
||
|
#include "am_mcu_apollo.h"
|
||
|
#include "am_bsp.h"
|
||
|
#include "am_util.h"
|
||
|
|
||
|
#define HM01B0_DRV_VERSION (0)
|
||
|
#define HM01B0_DRV_SUBVERSION (5)
|
||
|
|
||
|
#define HM01B0_DEFAULT_ADDRESS (0x24)
|
||
|
|
||
|
#define HM01B0_PIXEL_X_NUM (324)
|
||
|
#define HM01B0_PIXEL_Y_NUM (244)
|
||
|
|
||
|
#define HM01B0_REG_MODEL_ID_H (0x0000)
|
||
|
#define HM01B0_REG_MODEL_ID_L (0x0001)
|
||
|
#define HM01B0_REG_SILICON_REV (0x0002)
|
||
|
#define HM01B0_REG_FRAME_COUNT (0x0005)
|
||
|
#define HM01B0_REG_PIXEL_ORDER (0x0006)
|
||
|
|
||
|
#define HM01B0_REG_MODE_SELECT (0x0100)
|
||
|
#define HM01B0_REG_IMAGE_ORIENTATION (0x0101)
|
||
|
#define HM01B0_REG_SW_RESET (0x0103)
|
||
|
#define HM01B0_REG_GRP_PARAM_HOLD (0x0104)
|
||
|
|
||
|
#define HM01B0_REG_INTEGRATION_H (0x0202)
|
||
|
#define HM01B0_REG_INTEGRATION_L (0x0203)
|
||
|
#define HM01B0_REG_ANALOG_GAIN (0x0205)
|
||
|
#define HM01B0_REG_DIGITAL_GAIN_H (0x020E)
|
||
|
#define HM01B0_REG_DIGITAL_GAIN_L (0x020F)
|
||
|
|
||
|
#define HM01B0_REG_AE_TARGET_MEAN (0x2101)
|
||
|
#define HM01B0_REG_AE_MIN_MEAN (0x2102)
|
||
|
#define HM01B0_REG_CONVERGE_IN_TH (0x2103)
|
||
|
#define HM01B0_REG_CONVERGE_OUT_TH (0x2104)
|
||
|
|
||
|
|
||
|
#define HM01B0_REG_I2C_ID_SEL (0x3400)
|
||
|
#define HM01B0_REG_I2C_ID_REG (0x3401)
|
||
|
|
||
|
#define HM01B0_REG_PMU_PROGRAMMABLE_FRAMECNT (0x3020)
|
||
|
|
||
|
// #define HM01B0_REG_MODE_SELECT (0x0100)
|
||
|
#define HM01B0_REG_MODE_SELECT_STANDBY (0x00)
|
||
|
#define HM01B0_REG_MODE_SELECT_STREAMING (0x01)
|
||
|
#define HM01B0_REG_MODE_SELECT_STREAMING_NFRAMES (0x03)
|
||
|
#define HM01B0_REG_MODE_SELECT_STREAMING_HW_TRIGGER (0x05)
|
||
|
|
||
|
// #define HM01B0_REG_IMAGE_ORIENTATION (0x0101)
|
||
|
#define HM01B0_REG_IMAGE_ORIENTATION_DEFAULT (0x00)
|
||
|
#define HM01B0_REG_IMAGE_ORIENTATION_HMIRROR (0x01)
|
||
|
#define HM01B0_REG_IMAGE_ORIENTATION_VMIRROR (0x02)
|
||
|
#define HM01B0_REG_IMAGE_ORIENTATION_HVMIRROR (HM01B0_REG_IMAGE_ORIENTATION_HMIRROR | HM01B0_REG_IMAGE_ORIENTATION_HVMIRROR)
|
||
|
|
||
|
// #define HM01B0_REG_GRP_PARAM_HOLD (0x0104)
|
||
|
#define HM01B0_REG_GRP_PARAM_HOLD_CONSUME (0x00)
|
||
|
#define HM01B0_REG_GRP_PARAM_HOLD_HOLD (0x01)
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
HM01B0_ERR_OK = 0x00,
|
||
|
HM01B0_ERR_I2C,
|
||
|
HM01B0_ERR_MODE,
|
||
|
HM01B0_ERR_AE_NOT_CONVERGED,
|
||
|
};
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint16_t ui16Reg;
|
||
|
uint8_t ui8Val;
|
||
|
} hm_script_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint16_t ui16SlvAddr;
|
||
|
am_hal_iom_mode_e eIOMMode;
|
||
|
uint32_t ui32IOMModule;
|
||
|
am_hal_iom_config_t sIOMCfg;
|
||
|
void *pIOMHandle;
|
||
|
|
||
|
uint32_t ui32CTimerModule;
|
||
|
uint32_t ui32CTimerSegment;
|
||
|
uint32_t ui32CTimerOutputPin;
|
||
|
|
||
|
uint8_t ui8PinSCL;
|
||
|
uint8_t ui8PinSDA;
|
||
|
uint8_t ui8PinD0;
|
||
|
uint8_t ui8PinD1;
|
||
|
uint8_t ui8PinD2;
|
||
|
uint8_t ui8PinD3;
|
||
|
uint8_t ui8PinD4;
|
||
|
uint8_t ui8PinD5;
|
||
|
uint8_t ui8PinD6;
|
||
|
uint8_t ui8PinD7;
|
||
|
uint8_t ui8PinVSYNC;
|
||
|
uint8_t ui8PinHSYNC;
|
||
|
uint8_t ui8PinPCLK;
|
||
|
|
||
|
uint8_t ui8PinTrig;
|
||
|
uint8_t ui8PinInt;
|
||
|
void (*pfnGpioIsr)(void);
|
||
|
} hm01b0_cfg_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t ui8AETargetMean;
|
||
|
uint8_t ui8AEMinMean;
|
||
|
uint8_t ui8ConvergeInTh;
|
||
|
uint8_t ui8ConvergeOutTh;
|
||
|
uint8_t ui8AEMean;
|
||
|
} hm01b0_ae_cfg_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t ui8IntegrationH;
|
||
|
uint8_t ui8IntegrationL;
|
||
|
uint8_t ui8AGain;
|
||
|
uint8_t ui8DGain_H;
|
||
|
uint8_t ui8DGain_L;
|
||
|
} hm01b0_snr_expo_gain_ctrl_t;
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Write HM01B0 registers
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param ui16Reg - Register address.
|
||
|
//! @param pui8Value - Pointer to the data to be written.
|
||
|
//! @param ui32NumBytes - Length of the data in bytes to be written.
|
||
|
//!
|
||
|
//! This function writes value to HM01B0 registers.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_write_reg(hm01b0_cfg_t *psCfg, \
|
||
|
uint16_t ui16Reg, uint8_t *pui8Value, uint32_t ui32NumBytes);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Read HM01B0 registers
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param ui16Reg - Register address.
|
||
|
//! @param pui8Value - Pointer to the buffer for read data to be put into.
|
||
|
//! @param ui32NumBytes - Length of the data to be read.
|
||
|
//!
|
||
|
//! This function reads value from HM01B0 registers.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_read_reg(hm01b0_cfg_t *psCfg, \
|
||
|
uint16_t ui16Reg, uint8_t *pui8Value, uint32_t ui32NumBytes);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Load HM01B0 a given script
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param psScrip - Pointer to the script to be loaded.
|
||
|
//! @param ui32ScriptCmdNum - Number of entries in a given script.
|
||
|
//!
|
||
|
//! This function loads HM01B0 a given script.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_load_script(hm01b0_cfg_t *psCfg, hm_script_t *psScript, uint32_t ui32ScriptCmdNum);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Power up HM01B0
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function powers up HM01B0.
|
||
|
//!
|
||
|
//! @return none.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
void hm01b0_power_up(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Power down HM01B0
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function powers up HM01B0.
|
||
|
//!
|
||
|
//! @return none.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
void hm01b0_power_down(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Enable MCLK
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function utilizes CTimer to generate MCLK for HM01B0.
|
||
|
//!
|
||
|
//! @return none.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
void hm01b0_mclk_enable(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Disable MCLK
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function disable CTimer to stop MCLK for HM01B0.
|
||
|
//!
|
||
|
//! @return none.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
void hm01b0_mclk_disable(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Initialize interfaces
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function initializes interfaces.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_init_if(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Deinitialize interfaces
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function deinitializes interfaces.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_deinit_if(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Get HM01B0 Model ID
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param pui16MID - Pointer to buffer for the read back model ID.
|
||
|
//!
|
||
|
//! This function reads back HM01B0 model ID.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_get_modelid(hm01b0_cfg_t *psCfg, uint16_t *pui16MID);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Initialize HM01B0
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param psScript - Pointer to HM01B0 initialization script.
|
||
|
//! @param ui32ScriptCmdNum - No. of commands in HM01B0 initialization script.
|
||
|
//!
|
||
|
//! This function initilizes HM01B0 with a given script.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_init_system(hm01b0_cfg_t *psCfg, hm_script_t *psScript, uint32_t ui32ScriptCmdNum);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Set HM01B0 in the walking 1s test mode
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function sets HM01B0 in the walking 1s test mode.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_test_walking1s(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Check the data read from HM01B0 in the walking 1s test mode
|
||
|
//!
|
||
|
//! @param pui8Buffer - Pointer to data buffer.
|
||
|
//! @param ui32BufferLen - Buffer length
|
||
|
//! @param ui32PrintCnt - Number of mismatched data to be printed out
|
||
|
//!
|
||
|
//! This function sets HM01B0 in the walking 1s test mode.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
void hm01b0_test_walking1s_check_data_sanity(uint8_t *pui8Buffer, uint32_t ui32BufferLen, uint32_t ui32PrintCnt);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Software reset HM01B0
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! This function resets HM01B0 by issuing a reset command.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_reset_sw(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Get current HM01B0 operation mode.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param pui8Mode - Pointer to buffer
|
||
|
//! - for the read back operation mode to be put into
|
||
|
//!
|
||
|
//! This function get HM01B0 operation mode.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_get_mode(hm01b0_cfg_t *psCfg, uint8_t *pui8Mode);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Set HM01B0 operation mode.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param ui8Mode - Operation mode. One of:
|
||
|
//! HM01B0_REG_MODE_SELECT_STANDBY
|
||
|
//! HM01B0_REG_MODE_SELECT_STREAMING
|
||
|
//! HM01B0_REG_MODE_SELECT_STREAMING_NFRAMES
|
||
|
//! HM01B0_REG_MODE_SELECT_STREAMING_HW_TRIGGER
|
||
|
//! @param framecnt - Frame count for HM01B0_REG_MODE_SELECT_STREAMING_NFRAMES.
|
||
|
//! - Discarded if other modes.
|
||
|
//!
|
||
|
//! This function set HM01B0 operation mode.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_set_mode(hm01b0_cfg_t *psCfg, uint8_t ui8Mode, uint8_t framecnt);
|
||
|
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Activate the updated settings to HM01B0.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//!
|
||
|
//! Some settings updated to HM01B0 will only be affected after calling this function
|
||
|
//! 1. AE settings
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_cmd_update(hm01b0_cfg_t *psCfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Get HM01B0 AE settings
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param psAECfg - Pointer to the structure hm01b0_ae_cfg_t.
|
||
|
//!
|
||
|
//! This function checks if AE is converged or not and returns ui32Err accordingly.
|
||
|
//! If caller needs detailed AE settings, psAECfg has to be non NULL.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_get_ae(hm01b0_cfg_t *psCfg, hm01b0_ae_cfg_t *psAECfg);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief AE calibration.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param ui8CalFrames - Frame counts for calibratoin.
|
||
|
//! @param pui8Buffer - Pointer to the frame buffer.
|
||
|
//! @param ui32BufferLen - Framebuffer size.
|
||
|
//!
|
||
|
//! This function lets HM01B0 AE settled as much as possible within a given frame counts.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_cal_ae(hm01b0_cfg_t *psCfg, uint8_t ui8CalFrames, uint8_t *pui8Buffer, uint32_t ui32BufferLen);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Save HM01B0 exposure gain settings.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param psExpoGainCtrl - Pointer to the structure hm01b0_snr_expo_gain_ctrl_t
|
||
|
//!
|
||
|
//! This function saves HM01B0 exposure gain settings.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_save_exposure_gains(hm01b0_cfg_t *psCfg, hm01b0_snr_expo_gain_ctrl_t *psExpoGainCtrl);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Restore HM01B0 exposure gain settings.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param psExpoGainCtrl - Pointer to the structure hm01b0_snr_expo_gain_ctrl_t
|
||
|
//!
|
||
|
//! This function restores HM01B0 exposure gain settings. The call flow shall be
|
||
|
//! hm01b0_restore_exposure_gains() -> hm01b0_cmd_update() -> hm01b0_set_mode()
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_restore_exposure_gains(hm01b0_cfg_t *psCfg, hm01b0_snr_expo_gain_ctrl_t *psExpoGainCtrl);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Hardware trigger HM01B0 to stream.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param bTrigger - True to start streaming
|
||
|
//! - False to stop streaming
|
||
|
//!
|
||
|
//! This function triggers HM01B0 to stream by toggling the TRIG pin.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_hardware_trigger_streaming(hm01b0_cfg_t *psCfg, bool bTrigger);
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Set HM01B0 mirror mode.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param bHmirror - Horizontal mirror
|
||
|
//! @param bVmirror - Vertical mirror
|
||
|
//!
|
||
|
//! This function set HM01B0 mirror mode.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_set_mirror(hm01b0_cfg_t *psCfg, bool bHmirror, bool bVmirror);
|
||
|
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
//! @brief Read data of one frame from HM01B0.
|
||
|
//!
|
||
|
//! @param psCfg - Pointer to HM01B0 configuration structure.
|
||
|
//! @param pui8Buffer - Pointer to the frame buffer.
|
||
|
//! @param ui32BufferLen - Framebuffer size.
|
||
|
//!
|
||
|
//! This function read data of one frame from HM01B0.
|
||
|
//!
|
||
|
//! @return Error code.
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
uint32_t hm01b0_blocking_read_oneframe(hm01b0_cfg_t *psCfg, \
|
||
|
uint8_t *pui8Buffer, uint32_t ui32BufferLen);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // AM_HAL_CTIMER_H
|