From 56be0ab0509d766de292b2a7ffdbd3205eefcce9 Mon Sep 17 00:00:00 2001 From: yuexinyi Date: Wed, 5 Jul 2023 18:08:34 +0800 Subject: [PATCH] drivers/video: add capture arg to support multi instance Signed-off-by: yuexinyi --- arch/arm/src/cxd56xx/cxd56_cisif.c | 22 +++++++++++++++------- arch/sim/src/sim/sim_camera.c | 10 +++++++--- drivers/video/video.c | 10 ++++++---- include/nuttx/video/imgdata.h | 10 ++++++---- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/arch/arm/src/cxd56xx/cxd56_cisif.c b/arch/arm/src/cxd56xx/cxd56_cisif.c index c1d0da5e78..5d7007ad5f 100644 --- a/arch/arm/src/cxd56xx/cxd56_cisif.c +++ b/arch/arm/src/cxd56xx/cxd56_cisif.c @@ -175,6 +175,7 @@ static uint32_t g_cisif_time_stop; #endif static imgdata_capture_t g_cxd56_cisif_complete_capture; +static void *g_cxd56_cisif_capture_arg; /**************************************************************************** * Private Function Prototypes @@ -216,7 +217,8 @@ static int cxd56_cisif_start_capture uint8_t nr_datafmt, imgdata_format_t *datafmt, 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_validate_buf(struct imgdata_s *data, uint8_t *addr, uint32_t size); @@ -373,7 +375,7 @@ static void cisif_callback_for_intlev(uint8_t code) /* 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; @@ -413,7 +415,8 @@ static void cisif_ycc_axi_trdn_int(uint8_t code) else { 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); } } @@ -463,7 +466,8 @@ static void cisif_jpg_axi_trdn_int(uint8_t code) else { 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); } } @@ -495,7 +499,8 @@ static void cisif_ycc_err_int(uint8_t code) #endif 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); g_errint_receive = true; } @@ -513,7 +518,8 @@ static void cisif_jpg_err_int(uint8_t code) #endif 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); g_errint_receive = true; } @@ -850,7 +856,8 @@ static int cxd56_cisif_start_capture uint8_t nr_fmt, imgdata_format_t *fmt, imgdata_interval_t *interval, - imgdata_capture_t callback) + imgdata_capture_t callback, + void *arg) { cisif_param_t param = { @@ -924,6 +931,7 @@ static int cxd56_cisif_start_capture } g_cxd56_cisif_complete_capture = callback; + g_cxd56_cisif_capture_arg = arg; g_state = STATE_CAPTURE; diff --git a/arch/sim/src/sim/sim_camera.c b/arch/sim/src/sim/sim_camera.c index 7069793284..bfa543751b 100644 --- a/arch/sim/src/sim/sim_camera.c +++ b/arch/sim/src/sim/sim_camera.c @@ -44,6 +44,7 @@ typedef struct struct imgdata_s data; struct imgsensor_s sensor; imgdata_capture_t capture_cb; + void *capture_arg; uint32_t buf_size; uint8_t *next_buf; struct timeval *next_ts; @@ -86,7 +87,8 @@ static int sim_camera_data_start_capture(struct imgdata_s *data, uint8_t nr_datafmt, imgdata_format_t *datafmt, 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_set_buf(struct imgdata_s *data, 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, imgdata_format_t *datafmt, imgdata_interval_t *interval, - imgdata_capture_t callback) + imgdata_capture_t callback, + void *arg) { sim_camera_priv_t *priv = (sim_camera_priv_t *)data; int ret; @@ -306,6 +309,7 @@ static int sim_camera_data_start_capture(struct imgdata_s *data, } priv->capture_cb = callback; + priv->capture_arg = arg; return host_video_start_capture(priv->vdev); } @@ -344,7 +348,7 @@ void sim_camera_loop(void) { clock_gettime(CLOCK_MONOTONIC, &ts); TIMESPEC_TO_TIMEVAL(&tv, &ts); - priv->capture_cb(0, ret, &tv); + priv->capture_cb(0, ret, &tv, priv->capture_arg); } } } diff --git a/drivers/video/video.c b/drivers/video/video.c index bded458eb9..9ed2b9d01d 100644 --- a/drivers/video/video.c +++ b/drivers/video/video.c @@ -232,7 +232,8 @@ static int save_scene_param(FAR video_mng_t *vmng, uint32_t id, struct v4l2_ext_control *control); 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, enum v4l2_buf_type type, 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, nr_fmt, sf, &si); 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); 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. */ 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 vbuf_container_t *container = NULL; enum v4l2_buf_type buf_type; diff --git a/include/nuttx/video/imgdata.h b/include/nuttx/video/imgdata.h index c36290e6e9..3e5e3bbab3 100644 --- a/include/nuttx/video/imgdata.h +++ b/include/nuttx/video/imgdata.h @@ -57,9 +57,9 @@ #define IMGDATA_VALIDATE_FRAME_SETTING(d, n, f, i) \ ((d)->ops->validate_frame_setting ? \ (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, n, f, i, c) : -ENOTTY) + (d)->ops->start_capture(d, n, f, i, c, a) : -ENOTTY) #define IMGDATA_STOP_CAPTURE(d) \ ((d)->ops->stop_capture ? (d)->ops->stop_capture(d) : -ENOTTY) @@ -83,7 +83,8 @@ typedef struct imgdata_interval_s } imgdata_interval_t; 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 */ @@ -104,7 +105,8 @@ struct imgdata_ops_s uint8_t nr_datafmts, FAR imgdata_format_t *datafmts, 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); };