drivers/video: add capture arg to support multi instance
Signed-off-by: yuexinyi <yuexinyi@xiaomi.com>
This commit is contained in:
parent
52859fe10f
commit
56be0ab050
@ -175,6 +175,7 @@ static uint32_t g_cisif_time_stop;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static imgdata_capture_t g_cxd56_cisif_complete_capture;
|
static imgdata_capture_t g_cxd56_cisif_complete_capture;
|
||||||
|
static void *g_cxd56_cisif_capture_arg;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
@ -216,7 +217,8 @@ static int cxd56_cisif_start_capture
|
|||||||
uint8_t nr_datafmt,
|
uint8_t nr_datafmt,
|
||||||
imgdata_format_t *datafmt,
|
imgdata_format_t *datafmt,
|
||||||
imgdata_interval_t *interval,
|
imgdata_interval_t *interval,
|
||||||
imgdata_capture_t callback);
|
imgdata_capture_t callback,
|
||||||
|
void *arg);
|
||||||
static int cxd56_cisif_stop_capture(struct imgdata_s *data);
|
static int cxd56_cisif_stop_capture(struct imgdata_s *data);
|
||||||
static int cxd56_cisif_validate_buf(struct imgdata_s *data,
|
static int cxd56_cisif_validate_buf(struct imgdata_s *data,
|
||||||
uint8_t *addr, uint32_t size);
|
uint8_t *addr, uint32_t size);
|
||||||
@ -373,7 +375,7 @@ static void cisif_callback_for_intlev(uint8_t code)
|
|||||||
|
|
||||||
/* Notify and get next addr */
|
/* Notify and get next addr */
|
||||||
|
|
||||||
g_cxd56_cisif_complete_capture(0, size, NULL);
|
g_cxd56_cisif_complete_capture(0, size, NULL, g_cxd56_cisif_capture_arg);
|
||||||
|
|
||||||
g_jpgint_receive = false;
|
g_jpgint_receive = false;
|
||||||
|
|
||||||
@ -413,7 +415,8 @@ static void cisif_ycc_axi_trdn_int(uint8_t code)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
|
size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
|
||||||
g_cxd56_cisif_complete_capture(0, size, NULL);
|
g_cxd56_cisif_complete_capture(0, size, NULL,
|
||||||
|
g_cxd56_cisif_capture_arg);
|
||||||
cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
|
cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -463,7 +466,8 @@ static void cisif_jpg_axi_trdn_int(uint8_t code)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
|
size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
|
||||||
g_cxd56_cisif_complete_capture(0, size, NULL);
|
g_cxd56_cisif_complete_capture(0, size, NULL,
|
||||||
|
g_cxd56_cisif_capture_arg);
|
||||||
cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
|
cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -495,7 +499,8 @@ static void cisif_ycc_err_int(uint8_t code)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
|
size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
|
||||||
g_cxd56_cisif_complete_capture(code, size, NULL);
|
g_cxd56_cisif_complete_capture(code, size, NULL,
|
||||||
|
g_cxd56_cisif_capture_arg);
|
||||||
cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
|
cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
|
||||||
g_errint_receive = true;
|
g_errint_receive = true;
|
||||||
}
|
}
|
||||||
@ -513,7 +518,8 @@ static void cisif_jpg_err_int(uint8_t code)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
|
size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
|
||||||
g_cxd56_cisif_complete_capture(code, size, NULL);
|
g_cxd56_cisif_complete_capture(code, size, NULL,
|
||||||
|
g_cxd56_cisif_capture_arg);
|
||||||
cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
|
cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
|
||||||
g_errint_receive = true;
|
g_errint_receive = true;
|
||||||
}
|
}
|
||||||
@ -850,7 +856,8 @@ static int cxd56_cisif_start_capture
|
|||||||
uint8_t nr_fmt,
|
uint8_t nr_fmt,
|
||||||
imgdata_format_t *fmt,
|
imgdata_format_t *fmt,
|
||||||
imgdata_interval_t *interval,
|
imgdata_interval_t *interval,
|
||||||
imgdata_capture_t callback)
|
imgdata_capture_t callback,
|
||||||
|
void *arg)
|
||||||
{
|
{
|
||||||
cisif_param_t param =
|
cisif_param_t param =
|
||||||
{
|
{
|
||||||
@ -924,6 +931,7 @@ static int cxd56_cisif_start_capture
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_cxd56_cisif_complete_capture = callback;
|
g_cxd56_cisif_complete_capture = callback;
|
||||||
|
g_cxd56_cisif_capture_arg = arg;
|
||||||
|
|
||||||
g_state = STATE_CAPTURE;
|
g_state = STATE_CAPTURE;
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ typedef struct
|
|||||||
struct imgdata_s data;
|
struct imgdata_s data;
|
||||||
struct imgsensor_s sensor;
|
struct imgsensor_s sensor;
|
||||||
imgdata_capture_t capture_cb;
|
imgdata_capture_t capture_cb;
|
||||||
|
void *capture_arg;
|
||||||
uint32_t buf_size;
|
uint32_t buf_size;
|
||||||
uint8_t *next_buf;
|
uint8_t *next_buf;
|
||||||
struct timeval *next_ts;
|
struct timeval *next_ts;
|
||||||
@ -86,7 +87,8 @@ static int sim_camera_data_start_capture(struct imgdata_s *data,
|
|||||||
uint8_t nr_datafmt,
|
uint8_t nr_datafmt,
|
||||||
imgdata_format_t *datafmt,
|
imgdata_format_t *datafmt,
|
||||||
imgdata_interval_t *interval,
|
imgdata_interval_t *interval,
|
||||||
imgdata_capture_t callback);
|
imgdata_capture_t callback,
|
||||||
|
void *arg);
|
||||||
static int sim_camera_data_stop_capture(struct imgdata_s *data);
|
static int sim_camera_data_stop_capture(struct imgdata_s *data);
|
||||||
static int sim_camera_data_set_buf(struct imgdata_s *data,
|
static int sim_camera_data_set_buf(struct imgdata_s *data,
|
||||||
uint8_t *addr, uint32_t size);
|
uint8_t *addr, uint32_t size);
|
||||||
@ -289,7 +291,8 @@ static int sim_camera_data_start_capture(struct imgdata_s *data,
|
|||||||
uint8_t nr_datafmt,
|
uint8_t nr_datafmt,
|
||||||
imgdata_format_t *datafmt,
|
imgdata_format_t *datafmt,
|
||||||
imgdata_interval_t *interval,
|
imgdata_interval_t *interval,
|
||||||
imgdata_capture_t callback)
|
imgdata_capture_t callback,
|
||||||
|
void *arg)
|
||||||
{
|
{
|
||||||
sim_camera_priv_t *priv = (sim_camera_priv_t *)data;
|
sim_camera_priv_t *priv = (sim_camera_priv_t *)data;
|
||||||
int ret;
|
int ret;
|
||||||
@ -306,6 +309,7 @@ static int sim_camera_data_start_capture(struct imgdata_s *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
priv->capture_cb = callback;
|
priv->capture_cb = callback;
|
||||||
|
priv->capture_arg = arg;
|
||||||
return host_video_start_capture(priv->vdev);
|
return host_video_start_capture(priv->vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +348,7 @@ void sim_camera_loop(void)
|
|||||||
{
|
{
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
TIMESPEC_TO_TIMEVAL(&tv, &ts);
|
TIMESPEC_TO_TIMEVAL(&tv, &ts);
|
||||||
priv->capture_cb(0, ret, &tv);
|
priv->capture_cb(0, ret, &tv, priv->capture_arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,8 @@ static int save_scene_param(FAR video_mng_t *vmng,
|
|||||||
uint32_t id,
|
uint32_t id,
|
||||||
struct v4l2_ext_control *control);
|
struct v4l2_ext_control *control);
|
||||||
static int video_complete_capture(uint8_t err_code, uint32_t datasize,
|
static int video_complete_capture(uint8_t err_code, uint32_t datasize,
|
||||||
FAR const struct timeval *ts);
|
FAR const struct timeval *ts,
|
||||||
|
FAR void *arg);
|
||||||
static int validate_frame_setting(FAR video_mng_t *vmng,
|
static int validate_frame_setting(FAR video_mng_t *vmng,
|
||||||
enum v4l2_buf_type type,
|
enum v4l2_buf_type type,
|
||||||
uint8_t nr_fmt,
|
uint8_t nr_fmt,
|
||||||
@ -630,7 +631,7 @@ static int start_capture(FAR video_mng_t *vmng,
|
|||||||
IMGSENSOR_STREAM_TYPE_VIDEO : IMGSENSOR_STREAM_TYPE_STILL,
|
IMGSENSOR_STREAM_TYPE_VIDEO : IMGSENSOR_STREAM_TYPE_STILL,
|
||||||
nr_fmt, sf, &si);
|
nr_fmt, sf, &si);
|
||||||
IMGDATA_START_CAPTURE(vmng->imgdata,
|
IMGDATA_START_CAPTURE(vmng->imgdata,
|
||||||
nr_fmt, df, &di, video_complete_capture);
|
nr_fmt, df, &di, video_complete_capture, vmng);
|
||||||
IMGDATA_SET_BUF(vmng->imgdata, (FAR uint8_t *)bufaddr, bufsize);
|
IMGDATA_SET_BUF(vmng->imgdata, (FAR uint8_t *)bufaddr, bufsize);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -3376,9 +3377,10 @@ static int video_unregister(FAR video_mng_t *priv)
|
|||||||
/* Callback function which device driver call when capture has done. */
|
/* Callback function which device driver call when capture has done. */
|
||||||
|
|
||||||
static int video_complete_capture(uint8_t err_code, uint32_t datasize,
|
static int video_complete_capture(uint8_t err_code, uint32_t datasize,
|
||||||
FAR const struct timeval *ts)
|
FAR const struct timeval *ts,
|
||||||
|
FAR void *arg)
|
||||||
{
|
{
|
||||||
FAR video_mng_t *vmng = (FAR video_mng_t *)g_video_handler;
|
FAR video_mng_t *vmng = (FAR video_mng_t *)arg;
|
||||||
FAR video_type_inf_t *type_inf;
|
FAR video_type_inf_t *type_inf;
|
||||||
FAR vbuf_container_t *container = NULL;
|
FAR vbuf_container_t *container = NULL;
|
||||||
enum v4l2_buf_type buf_type;
|
enum v4l2_buf_type buf_type;
|
||||||
|
@ -57,9 +57,9 @@
|
|||||||
#define IMGDATA_VALIDATE_FRAME_SETTING(d, n, f, i) \
|
#define IMGDATA_VALIDATE_FRAME_SETTING(d, n, f, i) \
|
||||||
((d)->ops->validate_frame_setting ? \
|
((d)->ops->validate_frame_setting ? \
|
||||||
(d)->ops->validate_frame_setting(d, n, f, i) : -ENOTTY)
|
(d)->ops->validate_frame_setting(d, n, f, i) : -ENOTTY)
|
||||||
#define IMGDATA_START_CAPTURE(d, n, f, i, c) \
|
#define IMGDATA_START_CAPTURE(d, n, f, i, c, a) \
|
||||||
((d)->ops->start_capture ? \
|
((d)->ops->start_capture ? \
|
||||||
(d)->ops->start_capture(d, n, f, i, c) : -ENOTTY)
|
(d)->ops->start_capture(d, n, f, i, c, a) : -ENOTTY)
|
||||||
#define IMGDATA_STOP_CAPTURE(d) \
|
#define IMGDATA_STOP_CAPTURE(d) \
|
||||||
((d)->ops->stop_capture ? (d)->ops->stop_capture(d) : -ENOTTY)
|
((d)->ops->stop_capture ? (d)->ops->stop_capture(d) : -ENOTTY)
|
||||||
|
|
||||||
@ -83,7 +83,8 @@ typedef struct imgdata_interval_s
|
|||||||
} imgdata_interval_t;
|
} imgdata_interval_t;
|
||||||
|
|
||||||
typedef int (*imgdata_capture_t)(uint8_t result, uint32_t size,
|
typedef int (*imgdata_capture_t)(uint8_t result, uint32_t size,
|
||||||
FAR const struct timeval *ts);
|
FAR const struct timeval *ts,
|
||||||
|
FAR void *arg);
|
||||||
|
|
||||||
/* Structure for Data Control I/F */
|
/* Structure for Data Control I/F */
|
||||||
|
|
||||||
@ -104,7 +105,8 @@ struct imgdata_ops_s
|
|||||||
uint8_t nr_datafmts,
|
uint8_t nr_datafmts,
|
||||||
FAR imgdata_format_t *datafmts,
|
FAR imgdata_format_t *datafmts,
|
||||||
FAR imgdata_interval_t *interval,
|
FAR imgdata_interval_t *interval,
|
||||||
FAR imgdata_capture_t callback);
|
FAR imgdata_capture_t callback,
|
||||||
|
FAR void *arg);
|
||||||
CODE int (*stop_capture)(FAR struct imgdata_s *data);
|
CODE int (*stop_capture)(FAR struct imgdata_s *data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user