Skip to content

Commit 4cd4e46

Browse files
committed
Convert NXP's CSI
Signed-off-by: Phi Bang Nguyen <phibang.nguyen@nxp.com>
1 parent 9f41e77 commit 4cd4e46

File tree

1 file changed

+51
-15
lines changed

1 file changed

+51
-15
lines changed

drivers/video/video_mcux_csi.c

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <fsl_cache.h>
2020
#endif
2121

22+
#include "video_buffer.h"
2223
#include "video_device.h"
2324

2425
struct video_mcux_csi_config {
@@ -40,11 +41,9 @@ static void __frame_done_cb(CSI_Type *base, csi_handle_t *handle, status_t statu
4041
const struct device *dev = data->dev;
4142
const struct video_mcux_csi_config *config = dev->config;
4243
enum video_signal_result result = VIDEO_BUF_DONE;
43-
// struct video_buffer *vbuf, *vbuf_first = NULL;
4444
uint32_t buffer_addr;
4545

4646
/* IRQ context */
47-
4847
if (status != kStatus_CSI_FrameDone) {
4948
return;
5049
}
@@ -55,22 +54,24 @@ static void __frame_done_cb(CSI_Type *base, csi_handle_t *handle, status_t statu
5554
return;
5655
}
5756

58-
struct video_buffer *vbuf = video_get_buf_sqe(&data->io_q);
57+
struct rtio_iodev_sqe *iodev_sqe = video_pop_io_q(&data->io_q);
5958

60-
if ((uint32_t)vbuf->buffer != buffer_addr) {
59+
if (iodev_sqe == NULL) {
6160
return;
6261
}
6362

64-
vbuf->timestamp = k_uptime_get_32();
63+
64+
struct video_buffer *vbuf = iodev_sqe->sqe.userdata;
6565

6666
#ifdef CONFIG_HAS_MCUX_CACHE
6767
DCACHE_InvalidateByRange(buffer_addr, vbuf->bytesused);
6868
#endif
6969

70-
// k_fifo_put(&data->fifo_out, vbuf);
70+
if ((uint32_t)vbuf->buffer != buffer_addr) {
71+
return;
72+
}
7173

72-
struct mpsc_node *node = mpsc_pop(&data->io_q);
73-
struct rtio_iodev_sqe *iodev_sqe = CONTAINER_OF(node, struct rtio_iodev_sqe, q);
74+
vbuf->timestamp = k_uptime_get_32();
7475

7576
rtio_iodev_sqe_ok(iodev_sqe, 0);
7677

@@ -307,35 +308,70 @@ static int video_mcux_csi_enum_frmival(const struct device *dev, struct video_fr
307308
return ret;
308309
}
309310

310-
static int video_mcux_csi_enqueue(const struct device *dev, struct video_buffer *vbuf)
311+
// static int video_mcux_csi_enqueue(const struct device *dev, struct video_buffer *vbuf)
312+
// {
313+
// const struct video_mcux_csi_config *config = dev->config;
314+
// struct video_mcux_csi_data *data = dev->data;
315+
// unsigned int to_read;
316+
// status_t ret;
317+
318+
// struct rtio_iodev_sqe *iodev_sqe = video_pop_io_q(&data->io_q);
319+
320+
// if (iodev_sqe == NULL) {
321+
// return -EIO;
322+
// }
323+
324+
// struct video_buffer *vbuf = iodev_sqe->sqe.userdata;
325+
326+
// to_read = data->csi_config.linePitch_Bytes * data->csi_config.height;
327+
// vbuf->bytesused = to_read;
328+
// vbuf->line_offset = 0;
329+
330+
// ret = CSI_TransferSubmitEmptyBuffer(config->base, &data->csi_handle,
331+
// (uint32_t)vbuf->buffer);
332+
// if (ret != kStatus_Success) {
333+
// return -EIO;
334+
// }
335+
336+
// return 0;
337+
// }
338+
339+
static void video_mcux_csi_iodev_submit(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe)
311340
{
341+
312342
const struct video_mcux_csi_config *config = dev->config;
313343
struct video_mcux_csi_data *data = dev->data;
314-
unsigned int to_read;
344+
struct video_buffer *vbuf = iodev_sqe->sqe.userdata;
315345
status_t ret;
316346

317-
to_read = data->csi_config.linePitch_Bytes * data->csi_config.height;
318-
vbuf->bytesused = to_read;
347+
// struct rtio_iodev_sqe *iodev_sqe = video_pop_io_q(&data->io_q);
348+
349+
// if (iodev_sqe == NULL) {
350+
// return -EIO;
351+
// }
352+
353+
vbuf->bytesused = data->csi_config.linePitch_Bytes * data->csi_config.height;
319354
vbuf->line_offset = 0;
320355

321356
ret = CSI_TransferSubmitEmptyBuffer(config->base, &data->csi_handle,
322357
(uint32_t)vbuf->buffer);
323358
if (ret != kStatus_Success) {
324-
return -EIO;
359+
return;
325360
}
326361

327-
return 0;
362+
return;
328363
}
329364

330365
static DEVICE_API(video, video_mcux_csi_driver_api) = {
331366
.set_format = video_mcux_csi_set_fmt,
332367
.get_format = video_mcux_csi_get_fmt,
333368
.set_stream = video_mcux_csi_set_stream,
334-
.enqueue = video_mcux_csi_enqueue,
369+
// .enqueue = video_mcux_csi_enqueue,
335370
.get_caps = video_mcux_csi_get_caps,
336371
.set_frmival = video_mcux_csi_set_frmival,
337372
.get_frmival = video_mcux_csi_get_frmival,
338373
.enum_frmival = video_mcux_csi_enum_frmival,
374+
.iodev_submit = video_mcux_csi_iodev_submit,
339375
};
340376

341377
#if 1 /* Unique Instance */

0 commit comments

Comments
 (0)