ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_mipi_csi.c
Go to the documentation of this file.
1
47
48#include "ra8_mipi_csi.h"
49
50#include <stdint.h>
51
52#include "ra8_attributes.h"
53#include "ra8_check.h"
54#include "ra8_err.h"
55#include "ra8_hal_internal.h"
56#include "ra8_log.h"
57#include "ra8_mipi_csi_regs.h"
58#include "ra8_mstp.h"
59
66static const char* s_tag = "MIPI_CSI";
67
83
84/* =============================================================================
85 * Helpers
86 * =============================================================================
87 */
88
89/* Spin until RTST -- see surrounding code and HUM citations. */
92{
93 for (uint16_t i = 0U; i < k_ra8_mipi_csi_reset_spin_max; ++i) {
94 /* HUM Ch 66.3.6 "RTST : Reset Status Register" p 3939 */
95 const uint32_t rtst = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_rtst);
96 if ((rtst & k_ra8_mipi_csi_rtst_vsrsts_mask) == 0UL) {
97 return k_ra8_ok;
98 }
99 }
101}
102
103/* Build the MCT0 32-bit value from a config struct -- see surrounding code and HUM citations. */
106{
107 uint32_t mct0 = (uint32_t)cfg->lanes & k_ra8_mipi_csi_mct0_vdln_mask;
108 if (cfg->generic_rule) {
110 }
111 if (cfg->eccv13) {
113 }
114 if (cfg->lfsren) {
116 }
117 if (cfg->zlmd) {
119 }
120 if (cfg->edmd) {
122 }
123 if (cfg->rvmd) {
125 }
126 return mct0;
127}
128
129/* Refuse a write that requires RXEN = 0 if RXEN is set -- see surrounding code and HUM citations. */
132{
133 /* HUM Ch 66.3.4 "MCT3 : Module Control Register 3" p 3938 */
134 const uint32_t cur = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_mct3);
135 if ((cur & k_ra8_mipi_csi_mct3_rxen_mask) != 0UL) {
137 }
138 return k_ra8_ok;
139}
140
141/* =============================================================================
142 * Lifecycle
143 * =============================================================================
144 */
145
170{
171 if ((cfg->lanes != k_ra8_mipi_csi_lanes_1) && (cfg->lanes != k_ra8_mipi_csi_lanes_2)) {
173 }
174 if ((uint8_t)cfg->vlsien > k_ra8_mipi_csi_vlsien_x4) {
176 }
177 if (((uint32_t)cfg->epd_long_spacer & ~k_ra8_mipi_csi_epct_slp_mask) != 0UL) {
179 }
180 if (((uint32_t)cfg->epd_short_spacer &
183 }
184 if ((uint32_t)cfg->short_threshold > k_ra8_mipi_csi_gsct_shth_max) {
186 }
187 return k_ra8_ok;
188}
189
209{
210 /* HUM Ch 66.3.2 "MCT0 : Module Control Register 0" p 3936
211 * VDLN + GRMD + ECCV13 + LFSREN + ZLMD + EDMD + RVMD. */
213
214 /* HUM Ch 66.3.3 "MCT2 : Module Control Register 2" p 3937
215 * Pack FRRSKW @ [24:16] | FRRCLK @ [8:0]. */
216 const uint32_t mct2 =
219 ((uint32_t)cfg->frrclk & k_ra8_mipi_csi_mct2_frrclk_mask);
221
222 /* HUM Ch 66.3.7 "EPCT : EPD Option Control Register" p 3939 */
223 uint32_t epct = ((uint32_t)cfg->epd_long_spacer & k_ra8_mipi_csi_epct_slp_mask) |
224 (((uint32_t)cfg->epd_short_spacer &
227 if (cfg->epd_option_2) {
229 }
230 if (cfg->epd_enable) {
232 }
234
235 /* HUM Ch 66.3.8 "EMCT : EPD Misc Option Control Register" p 3941
236 * VLSIEN[5:4] + EOTPEN[6]. */
237 uint32_t emct =
239 if (cfg->eotp_enable) {
241 }
243
244 /* HUM Ch 66.3.10 "DTEL : Receive Data Type Enable Low" p 3943 */
246 /* HUM Ch 66.3.11 "DTEH : Receive Data Type Enable High" p 3944 */
248
249 /* HUM Ch 66.3.24 "GSCT : Generic Short Packet Control" p 3957
250 * SHTH[6:0] + GFIF[16]. */
251 uint32_t gsct = ((uint32_t)cfg->short_threshold & k_ra8_mipi_csi_gsct_shth_mask);
252 if (cfg->short_store_enable) {
254 }
256}
257
277{
278 /* HUM Ch 66.3.14 "RXIE : Receive Interrupt Enable Register" p 3946 */
280
281 /* HUM Ch 66.3.17 "DLIE0/1 : Data Lane N Interrupt Enable" p 3948 */
284
285 /* HUM Ch 66.3.20 "VCIE(M) : Virtual Channel M Interrupt Enable" p 3952 */
286 for (uint8_t vc = 0U; vc < (uint8_t)k_ra8_mipi_csi_vc_count; ++vc) {
288 *ra8_mipi_csi_reg32(off) = cfg->vc_irq_mask[vc];
289 }
290
291 /* HUM Ch 66.3.23 "PMIE : Power Management Interrupt Enable" p 3956 */
293
294 /* HUM Ch 66.3.27 "GSIE : Generic Short Packet Interrupt Enable" p 3958 */
296}
297
299{
300 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
301 const ra8_err_t cfg_err = internal_validate_cfg(cfg);
302 RA8_RETURN_ON_ERROR(cfg_err, s_tag, "mipi_csi_init: cfg out of range");
303
304 /* HUM Ch 11.2.8 "MSTPCRC : Module Stop Control Register C", p 446 */
306 RA8_RETURN_ON_ERROR(mst_err, s_tag, "mipi_csi_init: mstp enable");
307
308 /* HUM Ch 66.3.4 "MCT3 : Module Control Register 3" p 3938
309 * Ensure RXEN = 0 before re-configuring the receiver. */
311
312 /* HUM Ch 66.3.6 "RTST : Reset Status Register" p 3939
313 * Wait for any in-flight software reset to drain. */
314 const ra8_err_t rst_err = internal_wait_reset_idle();
315 RA8_RETURN_ON_ERROR(rst_err, s_tag, "mipi_csi_init: vsrsts spin");
316
319
320 ra8_log_info_val(s_tag, "mipi_csi_init lanes", (uint32_t)cfg->lanes);
321 return k_ra8_ok;
322}
323
325{
326 /* HUM Ch 66.3.4 "MCT3 : Module Control Register 3" p 3938 */
328
329 /* HUM Ch 66.3.5 "RTCT : Reset Control Register" p 3938
330 * Pulse the video-pixel software reset to drain any residual state. */
332
333 /* HUM Ch 66.3.14 "RXIE : Receive Interrupt Enable Register" p 3946 */
335
336 /* HUM Ch 66.3.17 "DLIE0/1 : Data Lane N Interrupt Enable" p 3948 */
339
340 /* HUM Ch 66.3.20 "VCIE(M) : Virtual Channel M Interrupt Enable" p 3952 */
341 for (uint8_t vc = 0U; vc < (uint8_t)k_ra8_mipi_csi_vc_count; ++vc) {
343 *ra8_mipi_csi_reg32(off) = 0UL;
344 }
345
346 /* HUM Ch 66.3.23 "PMIE : Power Management Interrupt Enable" p 3956 */
348
349 /* HUM Ch 66.3.27 "GSIE : Generic Short Packet Interrupt Enable" p 3958 */
351
353
354 /* HUM Ch 11.2.8 "MSTPCRC : Module Stop Control Register C", p 446 */
356}
357
359{
360 /* HUM Ch 66.3.5 "RTCT : Reset Control Register" p 3938 */
362 /* HUM Ch 66.3.6 "RTST : Reset Status Register" p 3939 */
364}
365
366/* =============================================================================
367 * Reception control
368 * =============================================================================
369 */
370
372{
373 const ra8_err_t state_err = internal_reject_if_running();
374 RA8_RETURN_ON_ERROR(state_err, s_tag, "mipi_csi start: already running");
375 /* HUM Ch 66.3.4 "MCT3 : Module Control Register 3" p 3938 */
377 ra8_log_info(s_tag, "mipi_csi start_receive");
378 return k_ra8_ok;
379}
380
382{
383 /* HUM Ch 66.3.4 "MCT3 : Module Control Register 3" p 3938 */
385 /* HUM Ch 66.3.5 "RTCT : Reset Control Register" p 3938 */
387 ra8_log_info(s_tag, "mipi_csi stop_receive");
388 return k_ra8_ok;
389}
390
391/* =============================================================================
392 * Module-level status
393 * =============================================================================
394 */
395
397{
398 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
399 /* HUM Ch 66.3.12 "RXST : Receive Status Register" p 3944 */
401 return k_ra8_ok;
402}
403
405{
406 /* HUM Ch 66.3.13 "RXSC : Receive Status Clear Register" p 3945
407 * Only RACTDETC (bit 17) is W1C; hardware drops other bits. */
409 return k_ra8_ok;
410}
411
413{
414 /* HUM Ch 66.3.14 "RXIE : Receive Interrupt Enable Register" p 3946 */
416 return k_ra8_ok;
417}
418
420{
421 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
422 /* HUM Ch 66.3.9 "MIST : Module Interrupt Status" p 3941 */
424 return k_ra8_ok;
425}
426
428{
429 RA8_CHECK_NULL_PTR(out, s_tag, "out must not be nullptr");
430 /* HUM Ch 66.3.1 "MCG : Module Configuration Register" p 3936 */
431 const uint32_t mcg = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_mcg);
432 out->raw = mcg;
433 out->version = (uint8_t)(mcg & k_ra8_mipi_csi_mcg_ver_mask);
435 out->fifo_stages =
437 return k_ra8_ok;
438}
439
440/* =============================================================================
441 * Data-type filter
442 * =============================================================================
443 */
444
445ra8_err_t ra8_mipi_csi_set_data_type_filter(uint32_t low_mask, uint32_t high_mask)
446{
447 /* HUM Ch 66.3.10 "DTEL : Receive Data Type Enable Low" p 3943 */
449 /* HUM Ch 66.3.11 "DTEH : Receive Data Type Enable High" p 3944 */
451 return k_ra8_ok;
452}
453
454/* =============================================================================
455 * ECC / scrambling / frame-error knobs
456 * =============================================================================
457 */
458
459ra8_err_t ra8_mipi_csi_set_ecc_mode(bool eccv13, bool lfsren)
460{
461 const ra8_err_t state_err = internal_reject_if_running();
462 RA8_RETURN_ON_ERROR(state_err, s_tag, "set_ecc_mode: rxen set");
463
464 /* HUM Ch 66.3.2 "MCT0 : Module Control Register 0" p 3936 */
467 if (eccv13) {
469 }
470 if (lfsren) {
472 }
474 return k_ra8_ok;
475}
476
477ra8_err_t ra8_mipi_csi_set_frame_error_mode(bool zlmd, bool edmd, bool rvmd)
478{
479 const ra8_err_t state_err = internal_reject_if_running();
480 RA8_RETURN_ON_ERROR(state_err, s_tag, "set_frame_error_mode: rxen set");
481
482 /* HUM Ch 66.3.2 "MCT0 : Module Control Register 0" p 3936 */
486 if (zlmd) {
488 }
489 if (edmd) {
491 }
492 if (rvmd) {
494 }
496 return k_ra8_ok;
497}
498
499/* =============================================================================
500 * EPD / LRTE tuning
501 * =============================================================================
502 */
503
505ra8_mipi_csi_set_epd(bool enable, bool option_2, uint16_t long_spacer, uint16_t short_spacer)
506{
507 if (((uint32_t)long_spacer & ~k_ra8_mipi_csi_epct_slp_mask) != 0UL) {
509 }
510 if (((uint32_t)short_spacer & ~(k_ra8_mipi_csi_epct_ssp_mask >> k_ra8_mipi_csi_epct_ssp_shift)) !=
511 0UL) {
513 }
514
515 const ra8_err_t state_err = internal_reject_if_running();
516 RA8_RETURN_ON_ERROR(state_err, s_tag, "set_epd: rxen set");
517
518 /* HUM Ch 66.3.7 "EPCT : EPD Option Control Register" p 3939 */
519 uint32_t epct =
520 ((uint32_t)long_spacer & k_ra8_mipi_csi_epct_slp_mask) |
521 (((uint32_t)short_spacer & (k_ra8_mipi_csi_epct_ssp_mask >> k_ra8_mipi_csi_epct_ssp_shift))
523 if (option_2) {
525 }
526 if (enable) {
528 }
530 return k_ra8_ok;
531}
532
534{
535 if ((uint8_t)vlsien > k_ra8_mipi_csi_vlsien_x4) {
537 }
538 const ra8_err_t state_err = internal_reject_if_running();
539 RA8_RETURN_ON_ERROR(state_err, s_tag, "set_lrte: rxen set");
540
541 /* HUM Ch 66.3.8 "EMCT : EPD Misc Option Control Register" p 3941 */
545 if (eotp_enable) {
547 }
549 return k_ra8_ok;
550}
551
552/* =============================================================================
553 * Per-data-lane status / IRQ
554 * =============================================================================
555 */
556
557ra8_err_t ra8_mipi_csi_dl_get_status(uint8_t lane, uint32_t* out_mask)
558{
559 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
560 if (lane > (uint8_t)k_ra8_mipi_csi_dl_max) {
562 }
563 /* HUM Ch 66.3.15 "DLST(N) : Data Lane N Status" p 3946 */
565 *out_mask = *ra8_mipi_csi_reg32(off);
566 return k_ra8_ok;
567}
568
569ra8_err_t ra8_mipi_csi_dl_clear_status(uint8_t lane, uint32_t mask)
570{
571 if (lane > (uint8_t)k_ra8_mipi_csi_dl_max) {
573 }
574 /* HUM Ch 66.3.16 "DLSC(N) : Data Lane N Status Clear" p 3947 */
577 return k_ra8_ok;
578}
579
580ra8_err_t ra8_mipi_csi_dl_set_irq_enable(uint8_t lane, uint32_t mask)
581{
582 if (lane > (uint8_t)k_ra8_mipi_csi_dl_max) {
584 }
585 /* HUM Ch 66.3.17 "DLIE(N) : Data Lane N Interrupt Enable" p 3948 */
587 *ra8_mipi_csi_reg32(off) = mask;
588 return k_ra8_ok;
589}
590
591/* =============================================================================
592 * Per-VC status / IRQ
593 * =============================================================================
594 */
595
596ra8_err_t ra8_mipi_csi_vc_get_status(uint8_t vc, uint32_t* out_mask)
597{
598 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
599 if (vc > (uint8_t)k_ra8_mipi_csi_vc_max) {
601 }
602 /* HUM Ch 66.3.18 "VCST(M) : Virtual Channel M Status" p 3949 */
604 *out_mask = *ra8_mipi_csi_reg32(off);
605 return k_ra8_ok;
606}
607
608ra8_err_t ra8_mipi_csi_vc_clear_status(uint8_t vc, uint32_t mask)
609{
610 if (vc > (uint8_t)k_ra8_mipi_csi_vc_max) {
612 }
613 /* HUM Ch 66.3.19 "VCSC(M) : Virtual Channel M Status Clear" p 3951 */
615 *ra8_mipi_csi_reg32(off) = mask;
616 return k_ra8_ok;
617}
618
620{
621 if (vc > (uint8_t)k_ra8_mipi_csi_vc_max) {
623 }
624 /* HUM Ch 66.3.20 "VCIE(M) : Virtual Channel M Interrupt Enable" p 3952 */
626 *ra8_mipi_csi_reg32(off) = mask;
627 return k_ra8_ok;
628}
629
630/* =============================================================================
631 * Power-management status / IRQ
632 * =============================================================================
633 */
634
636{
637 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
638 /* HUM Ch 66.3.21 "PMST : Power Management Status" p 3954 */
640 return k_ra8_ok;
641}
642
644{
645 /* HUM Ch 66.3.22 "PMSC : Power Management Status Clear" p 3955
646 * Only [7:0] are W1C; hardware drops other bits. */
648 return k_ra8_ok;
649}
650
652{
653 /* HUM Ch 66.3.23 "PMIE : Power Management Interrupt Enable" p 3956 */
655 return k_ra8_ok;
656}
657
658/* =============================================================================
659 * Generic short-packet FIFO
660 * =============================================================================
661 */
662
663ra8_err_t ra8_mipi_csi_short_packet_configure(uint8_t threshold, bool store_enable)
664{
665 if ((uint32_t)threshold > k_ra8_mipi_csi_gsct_shth_max) {
667 }
668 /* HUM Ch 66.3.24 "GSCT : Generic Short Packet Control" p 3957 */
669 uint32_t gsct = ((uint32_t)threshold & k_ra8_mipi_csi_gsct_shth_mask);
670 if (store_enable) {
672 }
674 return k_ra8_ok;
675}
676
678{
679 /* HUM Ch 66.3.27 "GSIE : Generic Short Packet Interrupt Enable" p 3958 */
681 return k_ra8_ok;
682}
683
685{
686 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
687 /* HUM Ch 66.3.25 "GSST : Generic Short Packet Status" p 3957 */
689 return k_ra8_ok;
690}
691
693{
694 /* HUM Ch 66.3.26 "GSSC : Generic Short Packet Status Clear" p 3958
695 * Only GOVC (bit 4) is W1C; hardware drops other bits. */
697 return k_ra8_ok;
698}
699
701{
702 RA8_CHECK_NULL_PTR(out, s_tag, "out must not be nullptr");
703 /* HUM Ch 66.3.25 "GSST : Generic Short Packet Status" p 3957
704 * PNUM[15:8] reports queued packet count. */
705 const uint32_t gsst = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_gsst);
706 const uint32_t pnum = (gsst & k_ra8_mipi_csi_gsst_pnum_mask) >> k_ra8_mipi_csi_gsst_pnum_shift;
707 if (pnum == 0UL) {
708 return k_ra8_err_empty;
709 }
710 /* HUM Ch 66.3.29 "GSIU : Generic Short Packet Information Update" p 3960
711 * FINC advances the read pointer before we sample GSHT. */
713
714 /* HUM Ch 66.3.28 "GSHT : Generic Short Packet Header" p 3959 */
715 const uint32_t gsht = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_gsht);
716 out->raw = gsht;
717 out->payload =
719 out->data_type =
722 return k_ra8_ok;
723}
724
726{
727 /* HUM Ch 66.3.29 "GSIU : Generic Short Packet Information Update" p 3960
728 * Drive GFCLR = 1 to request the clear, wait for GSST.GCD = 1, then
729 * release GFCLR by writing 0. */
731
733 for (uint16_t i = 0U; i < k_ra8_mipi_csi_gfclr_spin_max; ++i) {
734 /* HUM Ch 66.3.25 "GSST : Generic Short Packet Status" p 3957 */
735 const uint32_t gsst = *ra8_mipi_csi_reg32(k_ra8_mipi_csi_off_gsst);
736 if ((gsst & k_ra8_mipi_csi_gsst_gcd_mask) != 0UL) {
737 err = k_ra8_ok;
738 break;
739 }
740 }
741
742 /* Release the request line regardless of outcome. */
744 return err;
745}
746
748{
749 /* HUM Ch 66.3.29 "GSIU : Generic Short Packet Information Update" p 3960 */
751 return k_ra8_ok;
752}
753
754/* =============================================================================
755 * Power transition
756 * =============================================================================
757 */
758
760{
761 /* HUM Ch 11.2.8 "MSTPCRC : Module Stop Control Register C", p 446 */
763}
764
766{
767 /* HUM Ch 11.2.8 "MSTPCRC : Module Stop Control Register C", p 446 */
769}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Definition ra8_check.h:184
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_empty
Container empty – nothing to retrieve.
Definition ra8_err.h:222
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
Definition ra8_err.h:161
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
Definition ra8_err.h:304
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Cross-translation-unit private helpers shared inside ra8_hal.
void priv_ra8_mipi_csi_detach_all_handlers(void)
Detach every MIPI CSI-2 receiver callback (module / data-lane / virtual-channel / power-management / ...
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
#define ra8_log_info(tag, message)
RA8 log info.
Definition ra8_log.h:364
static ra8_err_t internal_reject_if_running(void)
ra8_err_t ra8_mipi_csi_vc_clear_status(uint8_t vc, uint32_t mask)
W1C-clear bits in VCST(M) via VCSC(M).
static void internal_program_receiver(const ra8_mipi_csi_config_t *cfg)
Program the MCT/EPCT/EMCT/DTEL/DTEH/GSCT receiver block.
ra8_err_t ra8_mipi_csi_enter_stop(void)
Gate the peripheral via MSTP (low-power entry helper).
ra8_err_t ra8_mipi_csi_exit_stop(void)
Ungate the peripheral via MSTP (low-power exit helper).
ra8_err_t ra8_mipi_csi_set_rx_irq_enable(uint32_t mask)
Programme RXIE (receive interrupt enable mask).
static ra8_err_t internal_validate_cfg(const ra8_mipi_csi_config_t *cfg)
Validate cfg field ranges before any register writes.
ra8_err_t ra8_mipi_csi_set_lrte(ra8_mipi_csi_vlsien_t vlsien, bool eotp_enable)
Programme EMCT (LRTE / EOTP options).
ra8_err_t ra8_mipi_csi_set_data_type_filter(uint32_t low_mask, uint32_t high_mask)
Programme the receive data-type filter (DTEL + DTEH).
ra8_mipi_csi_intern_t
Internal limits used by this translation unit only.
@ k_ra8_mipi_csi_reset_spin_max
Max VSRSTS poll iterations.
@ k_ra8_mipi_csi_gfclr_spin_max
Max GCD poll iterations.
ra8_err_t ra8_mipi_csi_pm_get_status(uint32_t *out_mask)
Read PMST (Power Management Status) live value.
ra8_err_t ra8_mipi_csi_short_packet_clear_fifo(void)
Request a clear of the entire short-packet FIFO (GSIU.GFCLR).
ra8_err_t ra8_mipi_csi_read_short_packet(ra8_mipi_csi_short_packet_t *out)
Drain one stored short-packet header from the FIFO.
ra8_err_t ra8_mipi_csi_pm_set_irq_enable(uint32_t mask)
Programme PMIE (Power Management IRQ enable).
ra8_err_t ra8_mipi_csi_pm_clear_status(uint32_t mask)
W1C-clear bits in PMST via PMSC.
static ra8_err_t internal_wait_reset_idle(void)
ra8_err_t ra8_mipi_csi_vc_set_irq_enable(uint8_t vc, uint32_t mask)
Programme VCIE(M) (Virtual Channel M IRQ enable).
ra8_err_t ra8_mipi_csi_start_receive(void)
Enable MIPI CSI reception (set MCT3.RXEN).
ra8_err_t ra8_mipi_csi_get_status(uint32_t *out_mask)
Read the RXST receive-status register.
ra8_err_t ra8_mipi_csi_short_packet_set_irq_enable(uint32_t mask)
Programme GSIE (short-packet IRQ enable).
ra8_err_t ra8_mipi_csi_get_module_irq_status(uint32_t *out_mask)
Read MIST (Module Interrupt Status, RO summary).
ra8_err_t ra8_mipi_csi_dl_set_irq_enable(uint8_t lane, uint32_t mask)
Programme DLIE(N) (Data Lane N IRQ enable).
ra8_err_t ra8_mipi_csi_short_packet_re_enable_store(void)
Re-enable storing into the FIFO after a GOV overflow (GSIU.GFEN).
static uint32_t internal_encode_mct0(const ra8_mipi_csi_config_t *cfg)
ra8_err_t ra8_mipi_csi_vc_get_status(uint8_t vc, uint32_t *out_mask)
Read VCST(M) (Virtual Channel M Status).
ra8_err_t ra8_mipi_csi_set_frame_error_mode(bool zlmd, bool edmd, bool rvmd)
Update MCT0 frame-error notification bits atomically.
ra8_err_t ra8_mipi_csi_init(const ra8_mipi_csi_config_t *cfg)
Initialise the MIPI CSI receiver.
ra8_err_t ra8_mipi_csi_set_ecc_mode(bool eccv13, bool lfsren)
Update MCT0 ECC bits (ECCV13, LFSREN) atomically.
ra8_err_t ra8_mipi_csi_dl_get_status(uint8_t lane, uint32_t *out_mask)
Read DLST(N) (Data Lane N Status).
ra8_err_t ra8_mipi_csi_dl_clear_status(uint8_t lane, uint32_t mask)
W1C-clear bits in DLST(N) via DLSC(N).
ra8_err_t ra8_mipi_csi_stop_receive(void)
Disable MIPI CSI reception (clear MCT3.RXEN, pulse VSRST).
ra8_err_t ra8_mipi_csi_short_packet_get_status(uint32_t *out_mask)
Read GSST (short-packet status).
ra8_err_t ra8_mipi_csi_set_epd(bool enable, bool option_2, uint16_t long_spacer, uint16_t short_spacer)
Programme EPCT (long-packet spacer + Option-2 EPD).
ra8_err_t ra8_mipi_csi_clear_status(uint32_t mask)
Clear the sticky receive-status bits selected by mask.
ra8_err_t ra8_mipi_csi_reset(void)
Issue a software reset (RTCT.VSRST) and wait for completion.
ra8_err_t ra8_mipi_csi_deinit(void)
Tear down the MIPI CSI receiver.
ra8_err_t ra8_mipi_csi_get_module_info(ra8_mipi_csi_module_info_t *out)
Read MCG (Module Configuration, RO IP info) and decode.
ra8_err_t ra8_mipi_csi_short_packet_clear_status(uint32_t mask)
W1C-clear GSST.GOV (FIFO overflow) via GSSC.
static void internal_program_irq_masks(const ra8_mipi_csi_config_t *cfg)
Program the receiver interrupt-enable mask block.
ra8_err_t ra8_mipi_csi_short_packet_configure(uint8_t threshold, bool store_enable)
Programme GSCT (short-packet FIFO threshold + store flag).
MIPI CSI-2 receiver HAL driver – public API.
MIPI CSI-2 Receiver register layout for the RA8D2 (HUM Ch 66).
@ k_ra8_mipi_csi_vc_max
Highest valid VC index.
@ k_ra8_mipi_csi_vc_count
Number of virtual channels.
@ k_ra8_mipi_csi_dl_max
Highest valid DL index.
@ k_ra8_mipi_csi_epct_epdop_mask
[15] option 2 sel.
@ k_ra8_mipi_csi_epct_slp_mask
[14:0] long spacers.
@ k_ra8_mipi_csi_epct_epden_mask
[31] EPD enable.
@ k_ra8_mipi_csi_epct_ssp_mask
[30:16] short spc.
@ k_ra8_mipi_csi_epct_ssp_shift
SSP shift.
@ k_ra8_mipi_csi_rtct_vsrst_mask
[0] software reset.
ra8_mipi_csi_off_t
Absolute byte offsets into the MIPI CSI register window.
@ k_ra8_mipi_csi_off_vcst0
Virtual Channel 0 Status.
@ k_ra8_mipi_csi_off_dtel
Receive Data-Type Enable Low.
@ k_ra8_mipi_csi_off_epct
EPD Option Control.
@ k_ra8_mipi_csi_off_mcg
Module Configuration (RO).
@ k_ra8_mipi_csi_off_rtct
Reset Control (VSRST).
@ k_ra8_mipi_csi_off_vcie0
Virtual Channel 0 IRQ Enable.
@ k_ra8_mipi_csi_off_gsht
Generic Short Packet Header (RO).
@ k_ra8_mipi_csi_off_gsst
Generic Short Packet Status.
@ k_ra8_mipi_csi_off_vcsc0
Virtual Channel 0 Status Clear.
@ k_ra8_mipi_csi_off_dlie0
Data Lane 0 Interrupt Enable.
@ k_ra8_mipi_csi_off_emct
EPD Misc-Option Control.
@ k_ra8_mipi_csi_off_gsct
Generic Short Packet Control.
@ k_ra8_mipi_csi_off_dlst0
Data Lane 0 Status.
@ k_ra8_mipi_csi_off_rxst
Receive Status.
@ k_ra8_mipi_csi_off_mct2
Module Control 2 (clock rates).
@ k_ra8_mipi_csi_off_mct0
Module Control 0 (lanes, modes).
@ k_ra8_mipi_csi_off_gssc
Generic Short Packet Stat Clear.
@ k_ra8_mipi_csi_off_mist
Module Interrupt Status.
@ k_ra8_mipi_csi_off_gsie
Generic Short Packet IRQ Enable.
@ k_ra8_mipi_csi_off_dlsc0
Data Lane 0 Status Clear.
@ k_ra8_mipi_csi_off_dteh
Receive Data-Type Enable High.
@ k_ra8_mipi_csi_off_pmie
Power-Management IRQ Enable.
@ k_ra8_mipi_csi_off_gsiu
Generic Short Packet Info Update.
@ k_ra8_mipi_csi_off_rtst
Reset Status (VSRSTS).
@ k_ra8_mipi_csi_off_rxie
Receive Interrupt Enable.
@ k_ra8_mipi_csi_off_dlie1
Data Lane 1 Interrupt Enable.
@ k_ra8_mipi_csi_off_pmst
Power-Management Status.
@ k_ra8_mipi_csi_off_mct3
Module Control 3 (RXEN).
@ k_ra8_mipi_csi_off_pmsc
Power-Management Status Clear.
@ k_ra8_mipi_csi_off_rxsc
Receive Status Clear.
@ k_ra8_mipi_csi_emct_vlsien_mask
[5:4] var spacer.
@ k_ra8_mipi_csi_emct_vlsien_shift
VLSIEN shift.
@ k_ra8_mipi_csi_emct_eotpen_mask
[6] EOTP enable.
@ k_ra8_mipi_csi_gsct_shth_mask
[6:0] threshold.
@ k_ra8_mipi_csi_gsct_gfif_mask
[16] FIFO store en.
@ k_ra8_mipi_csi_gsct_shth_max
Max meaningful SHTH.
@ k_ra8_mipi_csi_mcg_gsnm_mask
[23:16] FIFO depth.
@ k_ra8_mipi_csi_mcg_gsnm_shift
GSNM shift.
@ k_ra8_mipi_csi_mcg_ver_mask
[3:0] core version.
@ k_ra8_mipi_csi_mcg_sdln_mask
[11:8] sup.
@ k_ra8_mipi_csi_mcg_sdln_shift
SDLN shift.
@ k_ra8_mipi_csi_mct2_frrskw_shift
FRRSKW shift.
@ k_ra8_mipi_csi_mct2_frrclk_mask
[8:0] FRRCLK.
@ k_ra8_mipi_csi_mct2_frrskw_mask
[24:16] FRRSKW.
@ k_ra8_mipi_csi_rtst_vsrsts_mask
[0] reset busy.
@ k_ra8_mipi_csi_mct3_rxen_mask
[0] RX enable.
@ k_ra8_mipi_csi_pmie_all_mask
Enable everything.
@ k_ra8_mipi_csi_gsht_spvc_mask
[27:24] VC of packet.
@ k_ra8_mipi_csi_gsht_spvc_shift
SPVC shift.
@ k_ra8_mipi_csi_gsht_spdt_shift
SPDT shift.
@ k_ra8_mipi_csi_gsht_dtyp_mask
[21:16] data type.
@ k_ra8_mipi_csi_gsht_spdt_mask
[15:0] payload.
@ k_ra8_mipi_csi_gsht_dtyp_shift
DTYP shift.
@ k_ra8_mipi_csi_gssc_govc_mask
[4] clear GOV.
@ k_ra8_mipi_csi_mct0_lfsren_mask
[25] LFSR descrambling enable.
@ k_ra8_mipi_csi_mct0_vdln_mask
[3:0] valid lane count.
@ k_ra8_mipi_csi_mct0_grmd_mask
[20] Generic CSI-2 rule mode.
@ k_ra8_mipi_csi_mct0_eccv13_mask
[24] ECC v1.3 (24-bit) mode.
@ k_ra8_mipi_csi_mct0_edmd_mask
[17] ErrFrameData notify.
@ k_ra8_mipi_csi_mct0_zlmd_mask
[16] zero-length-LP output.
@ k_ra8_mipi_csi_mct0_rvmd_mask
[19] Reserved-DT receive mode.
@ k_ra8_mipi_csi_pmsc_all_mask
Clear everything.
@ k_ra8_mipi_csi_dlsc_all_mask
All clearable.
@ k_ra8_mipi_csi_gsie_all_mask
Enable everything.
static ra8_mipi_csi_off_t ra8_mipi_csi_dl_off(ra8_mipi_csi_off_t base, uint8_t lane)
Compute the byte offset of a per-data-lane register.
@ k_ra8_mipi_csi_gsst_pnum_mask
[15:8] FIFO depth.
@ k_ra8_mipi_csi_gsst_pnum_shift
PNUM shift.
@ k_ra8_mipi_csi_gsst_gcd_mask
[16] FIFO clear stat.
@ k_ra8_mipi_csi_gsiu_gfclr_mask
[8] FIFO clear req.
@ k_ra8_mipi_csi_gsiu_finc_mask
[0] FIFO increment.
@ k_ra8_mipi_csi_gsiu_gfen_mask
[16] FIFO re-enable.
ra8_mipi_csi_vlsien_t
Encodings for EMCT.VLSIEN[5:4] (HUM Ch 66.3.8 p 3941).
@ k_ra8_mipi_csi_vlsien_x4
11b spacer = 4 x n/lane.
static ra8_mipi_csi_off_t ra8_mipi_csi_vc_off(ra8_mipi_csi_off_t base, uint8_t vc)
Compute the byte offset of a per-virtual-channel register.
static volatile uint32_t * ra8_mipi_csi_reg32(ra8_mipi_csi_off_t off)
Get a 32-bit volatile pointer to a register inside the MIPI CSI window.
@ k_ra8_mipi_csi_lanes_2
Dual-lane D-PHY operation.
@ k_ra8_mipi_csi_lanes_1
Single-lane D-PHY operation.
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
Definition ra8_mstp.c:343
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
Definition ra8_mstp.c:382
@ k_ra8_mstp_mipi_csi
MSTPC17 MIPI CSI.
Configuration descriptor for ra8_mipi_csi_init.
uint16_t frrskw
MCT2.FRRSKW[8:0] skew.
bool zlmd
MCT0.ZLMD – zero-length LP.
bool eccv13
MCT0.ECCV13 – ECC v1.3 mode.
bool lfsren
MCT0.LFSREN – descrambling on.
bool edmd
MCT0.EDMD – ErrFrameData notify.
ra8_mipi_csi_vlsien_t vlsien
EMCT.VLSIEN[5:4] LRTE spacer.
uint32_t vc_irq_mask[16]
VCIE0..VCIE15 values.
uint8_t short_threshold
GSCT.SHTH (threshold-1 in stages).
bool epd_option_2
EPCT.EPDOP – 1 = Option 2 (recommended).
ra8_mipi_csi_lanes_t lanes
1 or 2 lanes (MCT0.VDLN).
uint16_t epd_short_spacer
EPCT.SSP[14:0].
uint32_t pm_irq_mask
PMIE value.
uint16_t frrclk
MCT2.FRRCLK[8:0] rate.
bool rvmd
MCT0.RVMD – reserved-DT receive.
bool epd_enable
EPCT.EPDEN – enable EPD.
uint32_t dl_irq_mask[2]
DLIE0 / DLIE1 values.
bool generic_rule
MCT0.GRMD: must be 1 here.
bool short_store_enable
GSCT.GFIF – 1 = store in FIFO.
uint32_t dt_high_mask
DTEH value to programme.
uint16_t epd_long_spacer
EPCT.SLP[14:0].
uint32_t short_irq_mask
GSIE value.
uint32_t dt_low_mask
DTEL value to programme.
bool eotp_enable
EMCT.EOTPEN bit 6.
uint32_t rx_irq_mask
RXIE value.
Decoded MCG (Module Configuration) RO snapshot.
uint32_t raw
Unprocessed register snapshot.
uint8_t lanes_max
MCG.SDLN[11:8] – max supported lanes.
uint8_t version
MCG.VER[3:0] – IP-core version.
uint8_t fifo_stages
MCG.GSNM[23:16] – short-packet FIFO depth.
One drained generic short-packet header.
uint16_t payload
GSHT.SPDT[15:0] – 16-bit user data.
uint32_t raw
Unprocessed register snapshot.
uint8_t data_type
GSHT.DTYP[21:16] – short-packet DT (0x08-0x0F).
uint8_t vc
GSHT.SPVC[27:24] – virtual channel.