10
10
#include <zephyr/drivers/video.h>
11
11
#include <zephyr/kernel.h>
12
12
#include <zephyr/logging/log.h>
13
+ #include <zephyr/rtio/rtio.h>
13
14
#include <zephyr/sys/byteorder.h>
14
15
#include <zephyr/sys/util.h>
15
16
16
17
#include "video_ctrls.h"
17
18
#include "video_device.h"
19
+ #include "video_buffer.h"
18
20
19
21
LOG_MODULE_REGISTER (video_sw_generator , CONFIG_VIDEO_LOG_LEVEL );
20
22
@@ -38,11 +40,9 @@ struct video_sw_generator_data {
38
40
const struct device * dev ;
39
41
struct sw_ctrls ctrls ;
40
42
struct video_format fmt ;
41
- struct k_fifo fifo_in ;
42
- struct k_fifo fifo_out ;
43
+ struct mpsc io_q ;
43
44
struct k_work_delayable work ;
44
45
int pattern ;
45
- struct k_poll_signal * sig ;
46
46
uint32_t frame_rate ;
47
47
};
48
48
@@ -289,74 +289,29 @@ static int video_sw_generator_fill(const struct device *const dev, struct video_
289
289
static void video_sw_generator_worker (struct k_work * work )
290
290
{
291
291
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 ;
296
296
297
297
k_work_reschedule (& data -> work , K_MSEC (1000 / data -> frame_rate ));
298
298
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 ) {
301
301
return ;
302
302
}
303
303
304
304
switch (data -> pattern ) {
305
305
case VIDEO_PATTERN_COLOR_BAR :
306
- video_sw_generator_fill (data -> dev , vbuf );
306
+ video_sw_generator_fill (dev , iodev_sqe -> sqe . userdata );
307
307
break ;
308
308
}
309
309
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 );
317
311
}
318
312
319
313
static int video_sw_generator_enqueue (const struct device * dev , struct video_buffer * vbuf )
320
314
{
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
-
360
315
return 0 ;
361
316
}
362
317
@@ -371,21 +326,6 @@ static int video_sw_generator_get_caps(const struct device *dev, struct video_ca
371
326
return 0 ;
372
327
}
373
328
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
-
389
329
static int video_sw_generator_set_frmival (const struct device * dev , struct video_frmival * frmival )
390
330
{
391
331
struct video_sw_generator_data * data = dev -> data ;
@@ -439,16 +379,11 @@ static DEVICE_API(video, video_sw_generator_driver_api) = {
439
379
.set_format = video_sw_generator_set_fmt ,
440
380
.get_format = video_sw_generator_get_fmt ,
441
381
.set_stream = video_sw_generator_set_stream ,
442
- .flush = video_sw_generator_flush ,
443
382
.enqueue = video_sw_generator_enqueue ,
444
- .dequeue = video_sw_generator_dequeue ,
445
383
.get_caps = video_sw_generator_get_caps ,
446
384
.set_frmival = video_sw_generator_set_frmival ,
447
385
.get_frmival = video_sw_generator_get_frmival ,
448
386
.enum_frmival = video_sw_generator_enum_frmival ,
449
- #ifdef CONFIG_POLL
450
- .set_signal = video_sw_generator_set_signal ,
451
- #endif
452
387
};
453
388
454
389
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)
464
399
struct video_sw_generator_data * data = dev -> data ;
465
400
466
401
data -> dev = dev ;
467
- k_fifo_init (& data -> fifo_in );
468
- k_fifo_init (& data -> fifo_out );
402
+ mpsc_init (& data -> io_q );
469
403
k_work_init_delayable (& data -> work , video_sw_generator_worker );
470
404
471
405
return video_sw_generator_init_controls (dev );
@@ -484,6 +418,9 @@ static int video_sw_generator_init(const struct device *dev)
484
418
NULL, POST_KERNEL, CONFIG_VIDEO_INIT_PRIORITY, \
485
419
&video_sw_generator_driver_api); \
486
420
\
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);
488
425
489
426
DT_INST_FOREACH_STATUS_OKAY (VIDEO_SW_GENERATOR_DEFINE )
0 commit comments