KL520_SDK_2.2/mdw/include/kmdw_camera.h
2025-12-17 15:55:25 +08:00

309 lines
9.6 KiB
C

/**
* @file kmdw_camera.h
* @brief Kneron camera middleware for camera driver
*
* @copyright Copyright (c) 2020 Kneron Inc. All rights reserved.
*/
#ifndef __KMDW_CAMERA_H__
#define __KMDW_CAMERA_H__
#include "kmdw_status.h"
#include "kdrv_camera.h"
#include <stdint.h>
#define CAP_VIDEO_CAPTURE 0x00000001 /**< Is a video capture device */
#define CAP_STREAMING 0x00000002 /**< can stream on/off */
#define CAP_DEVICE_CAPS 0x00000004 /**< can query capabilities */
enum {
CID_SCANNING_MODE = 0x1,
CID_AUTO_EXPOSURE_MODE,
CID_AUTO_EXPOSURE_PRIORITY,
CID_EXPOSURE_TIME_ABSOLUTE,
CID_EXPOSURE_TIME_RELATIVE,
CID_FOCUS_ABSOLUTE,
CID_FOCUS_RELATIVE,
CID_IRIS_ABSOLUTE,
CID_IRIS_RELATIVE,
CID_ZOOM_ABSOLUTE,
CID_ZOOM_RELATIVE,
CID_PANTILT_ABSOLUTE,
CID_PANTILT_RELATIVE,
CID_ROLL_ABSOLUTE,
CID_ROLL_RELATIVE,
CID_FOCUS_AUTO,
CID_PRIVACY,
CID_FOCUS_SIMPLE,
CID_DIGITAL_WINDOW,
CID_REGION_OF_INTEREST,
CID_BRIGHTNESS,
CID_CONTRAST,
CID_HUE,
CID_SATURATION,
CID_SHARPNESS,
CID_GAMMA,
CID_WHITE_BALANCE_TEMPERATURE,
CID_WHITE_BALANCE_COMPONENT,
CID_BACKLIGHT_COMPENSATION,
CID_GAIN,
CID_POWER_LINE_FREQUENCY,
CID_HUE_AUTO,
CID_WHITE_BALANCE_TEMPERATURE_AUTO,
CID_WHITE_BALANCE_COMPONENT_AUTO,
CID_DIGITAL_MULTIPLIER,
CID_DIGITAL_MULTIPLIER_LIMIT,
CID_CONTRAST_AUTO,
CID_LIST_ALL = 0xFF,
};
enum {
KDP_CAM_0,
KDP_CAM_1,
KDP_CAM_NUM, // = IMGSRC_NUM
};
enum camera_state {
CAMERA_STATE_IDLE = 0,
CAMERA_STATE_INITED,
CAMERA_STATE_RUNNING,
CAMERA_STATE_IN_FDR_INFERENCE,
CAMERA_STATE_IN_FDR_REGISTRATION,
CAMERA_STATE_IN_FDR_AUTO_REGISTRATION,
CAMERA_STATE_IN_FDR_REGISTRATION_CONFIRM,
CAMERA_STATE_IN_FDR_BOTH_REGISTRATION,
CAMERA_STATE_IN_FDR_BOTH_REGISTRATION_CONFIRM,
CAMERA_STATE_IN_FDR_BOTH_INFERENCE,
CAMERA_STATE_IN_FDR_REGISTRATION_POSE_JUSTIFY,
};
typedef struct cam_capability {
char driver[16];
char desc[16];
uint32_t version;
uint32_t capabilities;
}cam_capability;
typedef struct cam_sensor_aec {
uint8_t x1;
uint8_t x2;
uint8_t y1;
uint8_t y2;
uint8_t center_x1;
uint8_t center_x2;
uint8_t center_y1;
uint8_t center_y2;
}cam_sensor_aec;
typedef void (*kmdw_camera_callback_t)(uint32_t cam_idx, uint32_t img_buf, uint32_t *p_new_img);
typedef struct cam_ops {
kmdw_status_t (*open)(uint32_t cam_idx);
kmdw_status_t (*close)(uint32_t cam_idx);
kmdw_status_t (*set_format)(uint32_t cam_idx, cam_format *format);
kmdw_status_t (*get_format)(uint32_t cam_idx, cam_format *format);
kmdw_status_t (*buffer_init)(uint32_t cam_idx, uint32_t buf_addr_0, uint32_t buf_addr_1);
kmdw_status_t (*start_capture)(uint32_t cam_idx, kmdw_camera_callback_t img_cb);
kmdw_status_t (*stop_capture)(uint32_t cam_idx);
kmdw_status_t (*buffer_prepare)(uint32_t cam_idx);
kmdw_status_t (*buffer_capture)(uint32_t cam_idx, uint32_t *addr, uint32_t *size);
kmdw_status_t (*stream_on)(uint32_t cam_idx);
kmdw_status_t (*stream_off)(uint32_t cam_idx);
kmdw_status_t (*query_capability)(uint32_t cam_idx, struct cam_capability *cap);
kmdw_status_t (*set_gain)(uint32_t cam_idx, uint32_t gain1, uint32_t gain2);
kmdw_status_t (*set_aec)(uint32_t cam_idx, struct cam_sensor_aec *aec_p);
kmdw_status_t (*set_exp_time)(uint32_t cam_idx, uint32_t gain1, uint32_t gain2);
kmdw_status_t (*get_lux)(uint32_t cam_idx, uint16_t *expo, uint8_t *pre_gain, uint8_t *post_gain, uint8_t *global_gain, uint8_t *y_average);
kmdw_status_t (*led_switch)(uint32_t cam_idx, uint32_t on);
kmdw_status_t (*set_mirror)(uint32_t cam_idx, uint32_t enable);
kmdw_status_t (*set_flip)(uint32_t cam_idx, uint32_t enable);
uint32_t (*get_device_id)(uint32_t cam_idx);
kmdw_status_t (*ioctl)(uint32_t cam_idx, uint32_t cid, void *data, uint16_t len);
}cam_ops;
/**
* @brief Initializes camera setting
*
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_init(void);
/**
* @brief camera open function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_open(uint32_t cam_idx);
/**
* @brief camera close function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_close(uint32_t cam_idx);
/**
* @brief camera get device information function
*
* @param[in] cam_idx camera id
* @param[out] cap point of camera capability information.
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_get_device_info(uint32_t cam_idx, struct cam_capability *cap);
/**
* @brief camera set frame format function
*
* @param[in] cam_idx camera id
* @param[in] cap point of format information.
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_set_frame_format(uint32_t cam_idx, cam_format *format);
/**
* @brief camera get frame format function
*
* @param[in] cam_idx camera id
* @param[out] cap point of format information.
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_get_frame_format(uint32_t cam_idx, cam_format *format);
/**
* @brief camera buffer init function
*
* @param[in] cam_idx camera id
* @param[in] buf_addr_0 buffer address 0
* @param[in] buf_addr_1 buffer address 1
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_buffer_init(uint32_t cam_idx, uint32_t buf_addr_0, uint32_t buf_addr_1);
/**
* @brief camera start function
*
* @param[in] cam_idx camera id
* @param[in] img_cb image complete callback function
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_start(uint32_t cam_idx, kmdw_camera_callback_t img_cb);
/**
* @brief camera stop function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_stop(uint32_t cam_idx);
/**
* @brief camera buffer prepare function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_buffer_prepare(uint32_t cam_idx);
/**
* @brief camera buffer capture function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_buffer_capture(uint32_t cam_idx, uint32_t *addr, uint32_t *size);
/**
* @brief camera streaming on function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_stream_on(uint32_t cam_idx);
/**
* @brief camera streaming off function
*
* @param[in] cam_idx camera id
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_stream_off(uint32_t cam_idx);
/**
* @brief camera set gain function
*
* @param[in] cam_idx camera id
* @param[in] gain1 gain parameter 1
* @param[in] gain2 gain parameter 2
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_set_gain(uint32_t cam_idx, uint32_t gain1, uint32_t gain2);
/**
* @brief camera set ae controller ROI area function
*
* @param[in] cam_idx camera id
* @param[in] aec_p point of cam_sensor_aec
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_set_aec(uint32_t cam_idx, struct cam_sensor_aec *aec_p);
/**
* @brief camera set exposure time function
*
* @param[in] cam_idx camera id
* @param[in] gain1 exposure time parameter 1
* @param[in] gain2 exposure time parameter 2
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_set_exp_time(uint32_t cam_idx, uint32_t gain1, uint32_t gain2);
/**
* @brief camera get lum and other parameter function
*
* @param[in] cam_idx camera id
* @param[out] expo exposure time parameter
* @param[out] pre_gain exposure time parameter
* @param[out] post_gain exposure time parameter
* @param[out] global_gain exposure time parameter
* @param[in] y_average exposure time parameter 2
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_get_lux(uint32_t cam_idx, uint16_t *expo, uint8_t *pre_gain, uint8_t *post_gain, uint8_t *global_gain, uint8_t *y_average);
/**
* @brief camera set nir led on/off function
*
* @param[in] cam_idx camera id
* @param[in] on LED on/off cmd, 1: on, 0:off
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_led_switch(uint32_t cam_idx, uint32_t on);
/**
* @brief camera ioctl function
*
* @param[in] cam_idx camera id
* @param[in] cid control command id
* @param[in|out] *data poniter to the parameter structure, a control command specific
* @param[in] len structure length
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_ioctl(uint32_t cam_idx, uint32_t cid, void *data, uint16_t len);
kmdw_status_t kmdw_camera_controller_register(uint32_t cam_idx, struct cam_ops *cam_ops_p);
/**
* @brief unregister specific cam ops with cam_idx
*
* @param[in] cam_idx camera id
* @param[in] cam_ops_p incidence for each cam_idx
* @return kmdw_status_t see @ref kmdw_status_t
*/
kmdw_status_t kmdw_camera_controller_unregister(uint32_t cam_idx, struct cam_ops *cam_ops_p);
#endif // __KMDW_CAMERA_H__