Skip to content

Commit 083b761

Browse files
josuahngphibang
authored andcommitted
convert the video_sw_generator
1 parent 44531a2 commit 083b761

File tree

1 file changed

+16
-79
lines changed

1 file changed

+16
-79
lines changed

drivers/video/video_sw_generator.c

Lines changed: 16 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
#include <zephyr/drivers/video.h>
1111
#include <zephyr/kernel.h>
1212
#include <zephyr/logging/log.h>
13+
#include <zephyr/rtio/rtio.h>
1314
#include <zephyr/sys/byteorder.h>
1415
#include <zephyr/sys/util.h>
1516

1617
#include "video_ctrls.h"
1718
#include "video_device.h"
19+
#include "video_buffer.h"
1820

1921
LOG_MODULE_REGISTER(video_sw_generator, CONFIG_VIDEO_LOG_LEVEL);
2022

@@ -38,11 +40,9 @@ struct video_sw_generator_data {
3840
const struct device *dev;
3941
struct sw_ctrls ctrls;
4042
struct video_format fmt;
41-
struct k_fifo fifo_in;
42-
struct k_fifo fifo_out;
43+
struct mpsc io_q;
4344
struct k_work_delayable work;
4445
int pattern;
45-
struct k_poll_signal *sig;
4646
uint32_t frame_rate;
4747
};
4848

@@ -289,74 +289,29 @@ static int video_sw_generator_fill(const struct device *const dev, struct video_
289289
static void video_sw_generator_worker(struct k_work *work)
290290
{
291291
struct k_work_delayable *dwork = k_work_delayable_from_work(work);
292-
struct video_sw_generator_data *data;
293-
struct video_buffer *vbuf;
294-
295-
data = CONTAINER_OF(dwork, struct video_sw_generator_data, work);
292+
struct video_sw_generator_data *data =
293+
CONTAINER_OF(dwork, struct video_sw_generator_data, work);
294+
const struct device *dev = data->dev;
295+
struct rtio_iodev_sqe *iodev_sqe;
296296

297297
k_work_reschedule(&data->work, K_MSEC(1000 / data->frame_rate));
298298

299-
vbuf = k_fifo_get(&data->fifo_in, K_NO_WAIT);
300-
if (vbuf == NULL) {
299+
iodev_sqe = video_pop_io_q(&data->io_q);
300+
if (iodev_sqe == NULL) {
301301
return;
302302
}
303303

304304
switch (data->pattern) {
305305
case VIDEO_PATTERN_COLOR_BAR:
306-
video_sw_generator_fill(data->dev, vbuf);
306+
video_sw_generator_fill(dev, iodev_sqe->sqe.userdata);
307307
break;
308308
}
309309

310-
k_fifo_put(&data->fifo_out, vbuf);
311-
312-
if (IS_ENABLED(CONFIG_POLL) && data->sig) {
313-
k_poll_signal_raise(data->sig, VIDEO_BUF_DONE);
314-
}
315-
316-
k_yield();
310+
rtio_iodev_sqe_ok(iodev_sqe, 0);
317311
}
318312

319313
static int video_sw_generator_enqueue(const struct device *dev, struct video_buffer *vbuf)
320314
{
321-
struct video_sw_generator_data *data = dev->data;
322-
323-
k_fifo_put(&data->fifo_in, vbuf);
324-
325-
return 0;
326-
}
327-
328-
static int video_sw_generator_dequeue(const struct device *dev, struct video_buffer **vbuf,
329-
k_timeout_t timeout)
330-
{
331-
struct video_sw_generator_data *data = dev->data;
332-
333-
*vbuf = k_fifo_get(&data->fifo_out, timeout);
334-
if (*vbuf == NULL) {
335-
return -EAGAIN;
336-
}
337-
338-
return 0;
339-
}
340-
341-
static int video_sw_generator_flush(const struct device *dev, bool cancel)
342-
{
343-
struct video_sw_generator_data *data = dev->data;
344-
struct video_buffer *vbuf;
345-
346-
if (!cancel) {
347-
/* wait for all buffer to be processed */
348-
do {
349-
k_sleep(K_MSEC(1));
350-
} while (!k_fifo_is_empty(&data->fifo_in));
351-
} else {
352-
while ((vbuf = k_fifo_get(&data->fifo_in, K_NO_WAIT))) {
353-
k_fifo_put(&data->fifo_out, vbuf);
354-
if (IS_ENABLED(CONFIG_POLL) && data->sig) {
355-
k_poll_signal_raise(data->sig, VIDEO_BUF_ABORTED);
356-
}
357-
}
358-
}
359-
360315
return 0;
361316
}
362317

@@ -371,21 +326,6 @@ static int video_sw_generator_get_caps(const struct device *dev, struct video_ca
371326
return 0;
372327
}
373328

374-
#ifdef CONFIG_POLL
375-
static int video_sw_generator_set_signal(const struct device *dev, struct k_poll_signal *sig)
376-
{
377-
struct video_sw_generator_data *data = dev->data;
378-
379-
if (data->sig && sig != NULL) {
380-
return -EALREADY;
381-
}
382-
383-
data->sig = sig;
384-
385-
return 0;
386-
}
387-
#endif
388-
389329
static int video_sw_generator_set_frmival(const struct device *dev, struct video_frmival *frmival)
390330
{
391331
struct video_sw_generator_data *data = dev->data;
@@ -439,16 +379,11 @@ static DEVICE_API(video, video_sw_generator_driver_api) = {
439379
.set_format = video_sw_generator_set_fmt,
440380
.get_format = video_sw_generator_get_fmt,
441381
.set_stream = video_sw_generator_set_stream,
442-
.flush = video_sw_generator_flush,
443382
.enqueue = video_sw_generator_enqueue,
444-
.dequeue = video_sw_generator_dequeue,
445383
.get_caps = video_sw_generator_get_caps,
446384
.set_frmival = video_sw_generator_set_frmival,
447385
.get_frmival = video_sw_generator_get_frmival,
448386
.enum_frmival = video_sw_generator_enum_frmival,
449-
#ifdef CONFIG_POLL
450-
.set_signal = video_sw_generator_set_signal,
451-
#endif
452387
};
453388

454389
static int video_sw_generator_init_controls(const struct device *dev)
@@ -464,8 +399,7 @@ static int video_sw_generator_init(const struct device *dev)
464399
struct video_sw_generator_data *data = dev->data;
465400

466401
data->dev = dev;
467-
k_fifo_init(&data->fifo_in);
468-
k_fifo_init(&data->fifo_out);
402+
mpsc_init(&data->io_q);
469403
k_work_init_delayable(&data->work, video_sw_generator_worker);
470404

471405
return video_sw_generator_init_controls(dev);
@@ -484,6 +418,9 @@ static int video_sw_generator_init(const struct device *dev)
484418
NULL, POST_KERNEL, CONFIG_VIDEO_INIT_PRIORITY, \
485419
&video_sw_generator_driver_api); \
486420
\
487-
VIDEO_DEVICE_DEFINE(video_sw_generator_##n, DEVICE_DT_INST_GET(n), NULL);
421+
VIDEO_DEVICE_DEFINE(video_sw_generator_##n, DEVICE_DT_INST_GET(n), NULL); \
422+
\
423+
VIDEO_INTERFACE_DEFINE(video_sw_generator_intf, DEVICE_DT_INST_GET(n), \
424+
&video_sw_generator_data_##n.io_q);
488425

489426
DT_INST_FOREACH_STATUS_OKAY(VIDEO_SW_GENERATOR_DEFINE)

0 commit comments

Comments
 (0)