65static const char*
s_tag =
"MIPI_DSI";
280 const uint32_t valid_bit = (1U << slot);
281 if ((reg->
RXRSSR & valid_bit) == 0U) {
318 const uint16_t eff = (max_len < cap) ? max_len : cap;
319 for (uint16_t i = 0U; i < eff; ++i) {
320 const uint16_t word_idx = (uint16_t)(i / 4U);
321 const uint16_t byte_idx = (uint16_t)(i % 4U);
335 *out_pending = ((v & te_mask) != 0U);
350 volatile uint32_t* ier =
nullptr;
419 fn(ctx, event, mask);
428 const uint32_t bits = reg->
SQCH0SR;
439 const uint32_t bits = reg->
SQCH1SR;
450 const uint32_t bits = reg->
VMSR;
468 const uint32_t bits = reg->
RXSR;
493 const uint32_t bits = reg->
FERRSR;
504 const uint32_t bits = reg->
PLSR;
554typedef enum : uint16_t {
590 .vsync_active_high =
true,
591 .hsync_active_high =
true,
600 .video_mode_delay = 0U,
606 const uint8_t params[2])
615 if ((len > 0U) && (payload ==
nullptr)) {
623 const uint8_t* payload,
626 if ((len > 0U) && (payload ==
nullptr)) {
633 k_ra8_mipi_dsi_short_payload_max = 2U,
635 if (len <= k_ra8_mipi_dsi_short_payload_max) {
636 const uint8_t p0 = (len > 0U) ? payload[0] : 0U;
637 const uint8_t p1 = (len > 1U) ? payload[1] : 0U;
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_no_data
No application data available (e.g.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Lightweight Logging Interface for ra8-firmware.
void * s_mipi_dsi_event_ctx
Single definition of the shared IRQ callback context.
uint16_t s_mipi_dsi_pending_rx_len
Single definition of the shared pending receive capacity.
ra8_err_t priv_ra8_mipi_dsi_internal_wait_eq(volatile const uint32_t *reg, uint32_t mask, uint32_t expect)
Implementation of priv_ra8_mipi_dsi_internal_wait_eq() – bounded busy-poll.
ra8_mipi_dsi_event_fn_t s_mipi_dsi_event_fn
Single definition of the shared IRQ callback pointer.
uint8_t * s_mipi_dsi_pending_rx_buffer
Single definition of the shared pending receive buffer.
MIPI DSI-2 host driver – public API (full HUM Ch 65 surface).
ra8_err_t ra8_mipi_dsi_ulps_exit(uint8_t lanes)
Wake the selected lanes out of ULPS.
ra8_err_t ra8_mipi_dsi_send_short_packet(ra8_mipi_dsi_dt_t cmd_id, ra8_mipi_dsi_vc_t vc, uint8_t param0, uint8_t param1)
Send a DSI short packet on sequence channel 0 (LP escape).
ra8_err_t ra8_mipi_dsi_send_long_packet(ra8_mipi_dsi_dt_t cmd_id, ra8_mipi_dsi_vc_t vc, const uint8_t *data, uint16_t tx_len, bool low_power)
Send a DSI long-packet write (Generic Long / DCS Long).
ra8_err_t ra8_mipi_dsi_ulps_enter(uint8_t lanes)
Drive the selected lanes into Ultra-Low-Power State.
ra8_err_t ra8_mipi_dsi_clear_status(uint32_t mask)
Clear bits in any of the sub-status registers.
void ra8_mipi_dsi_dispatch_fatal(void)
Fatal-error IRQ handler.
ra8_err_t ra8_mipi_dsi_video_configure(const ra8_mipi_dsi_video_cfg_t *vcfg)
Programme every video-mode timing register from a single config.
ra8_err_t ra8_mipi_dsi_rx_payload_read(uint8_t *dest, uint16_t max_len, uint16_t *out_len)
Copy out the most-recent long-packet RX payload (RXPPD0..3R).
void ra8_mipi_dsi_dispatch_seq1(void)
Sequence-channel-1 IRQ handler (HS path).
ra8_err_t ra8_mipi_dsi_te_event_pending(bool *out_pending)
Check if a tearing-effect (TE) trigger was received.
void ra8_mipi_dsi_dispatch_phy(void)
PHY-protocol-interface IRQ handler.
static void internal_ra8_mipi_dsi_decode_rx(uint32_t raw, ra8_mipi_dsi_rx_result_t *out_result)
Decode an RXRSS slot register into a struct.
void ra8_mipi_dsi_dispatch_seq0(void)
Sequence-channel-0 IRQ handler (LP path).
ra8_err_t ra8_mipi_dsi_video_stop(void)
Request a video-mode stop and wait for it.
void ra8_mipi_dsi_dispatch(void)
Snapshot ISR, clear sub-status, fan out per-class callbacks.
ra8_err_t ra8_mipi_dsi_send_command_long(ra8_mipi_dsi_dt_t dt, const uint8_t *payload, uint16_t len)
Send a DSI command-mode long packet on VC0 (HS path).
ra8_err_t ra8_mipi_dsi_get_status(uint32_t *out_mask)
Read the top-level Interrupt Status Register.
ra8_err_t ra8_mipi_dsi_irq_enable(ra8_mipi_dsi_event_t event, uint32_t mask, bool enable)
Toggle a sub-class IER bit.
ra8_mipi_dsi_timing_limits_t
Per-field bit-width caps for ra8_mipi_dsi_video_timing_t.
@ k_ra8_mipi_dsi_timing_max_active
15-bit field.
@ k_ra8_mipi_dsi_timing_max_porch
13-bit field.
@ k_ra8_mipi_dsi_timing_max_sync
12-bit field.
ra8_err_t ra8_mipi_dsi_exit_ulps(void)
Wake the entire link out of ULPS.
void ra8_mipi_dsi_dispatch_video(void)
Video-mode IRQ handler.
ra8_err_t ra8_mipi_dsi_enter_ulps(void)
Drive the entire link (clock + data lanes) into ULPS.
ra8_err_t ra8_mipi_dsi_send_command_short(ra8_mipi_dsi_dt_t dt, const uint8_t params[2])
Send a DSI command-mode short packet on VC0 (LP escape).
ra8_err_t ra8_mipi_dsi_video_start(const ra8_mipi_dsi_video_cfg_t *vcfg)
Start video-mode operation.
ra8_err_t ra8_mipi_dsi_ack_error_get(ra8_mipi_dsi_ack_error_t *out_err)
Read the latest accumulated ack/error report and clear it.
ra8_err_t ra8_mipi_dsi_send_command_payload(ra8_mipi_dsi_dt_t packet_type, const uint8_t *payload, uint16_t len)
Send a DSI command-mode packet (short or long) on VC0 in LP escape.
ra8_err_t ra8_mipi_dsi_set_video_timing(const ra8_mipi_dsi_video_timing_t *timing)
Load only the HSA/HBP/HACT/HFP/VSA/VBP/VACT/VFP video-timing registers from a compact descriptor.
static void internal_ra8_mipi_dsi_call_user(ra8_mipi_dsi_event_t event, uint32_t mask)
Common helper that fires the registered callback.
void ra8_mipi_dsi_dispatch_receive(void)
Receive IRQ handler.
ra8_err_t ra8_mipi_dsi_link_status_get(ra8_mipi_dsi_link_status_t *out_status)
Decode LINKSR into a struct.
ra8_err_t ra8_mipi_dsi_attach_handler(ra8_mipi_dsi_event_fn_t fn, void *ctx)
Attach a callback for MIPI DSI interrupt events.
ra8_err_t ra8_mipi_dsi_get_link_status(ra8_mipi_dsi_link_status_t *out)
Snapshot the link state (running flags + busy flags + accumulated ack/error report) into a single str...
ra8_err_t ra8_mipi_dsi_rx_result_get(uint8_t slot, ra8_mipi_dsi_rx_result_t *out_result)
Decode and consume an RXRSS slot.
ra8_err_t ra8_mipi_dsi_te_event_clear(void)
Clear the latched tearing-effect bits in RXSR.
Module-private link seam shared between the MIPI DSI-2 hostdriver translation units.
@ k_akep_vc_shift
Akep vc shift.
@ k_rxrss_vc_shift
Rxrss vc shift.
@ k_rxrss_dt_shift
Rxrss dt shift.
@ k_rxrss_data1_shift
Rxrss data1 shift.
@ k_ra8_mipi_dsi_byte_mask
8-bit byte field.
@ k_ra8_mipi_dsi_isr_all
RA8 mipi dsi ISR all.
@ k_ra8_mipi_dsi_vc_mask
2-bit virtual-channel.
MIPI DSI Host (DSI-2) register layout for the RA8D2.
@ k_ra8_mipi_dsi_vmsr_clear_all
Mask of every defined VMSR bit – write to VMSCR to scrub.
@ k_ra8_mipi_dsi_vmsr_virdy
Video mode ready (started).
@ k_ra8_mipi_dsi_vmsr_vbufovf
Video buffer overflow.
@ k_ra8_mipi_dsi_vmsr_stop
Video mode stopped.
@ k_ra8_mipi_dsi_vmsr_vbufudf
Video buffer underflow.
@ k_ra8_mipi_dsi_vmpp_vc_shift
VC field position.
@ k_ra8_mipi_dsi_vmpp_vc_mask
VC[23:22] mask, used to clamp the virtual-channel field.
@ k_ra8_mipi_dsi_vmpp_txesync
Transmit end-of-sync.
@ k_ra8_mipi_dsi_vmpp_dt_shift
DT field position.
@ k_ra8_mipi_dsi_vmpp_dt_mask
DT[21:16] mask, used to clamp the data-type field.
@ k_ra8_mipi_dsi_rstcr_swrst
Assert software reset.
@ k_ra8_mipi_dsi_rxrss_rxcerr
Correctable error.
@ k_ra8_mipi_dsi_rxrss_fmt
Long-packet flag.
@ k_ra8_mipi_dsi_rxrss_data0_mask
DATA0 byte 1 of pkt.
@ k_ra8_mipi_dsi_rxrss_rxfail
Receive fail.
@ k_ra8_mipi_dsi_rxrss_rxsuc
Receive success.
@ k_ra8_mipi_dsi_rxrss_data1_mask
DATA1 byte 2 of pkt.
@ k_ra8_mipi_dsi_rxrss_rxpfail
Packet data fail.
@ k_ra8_mipi_dsi_rxrss_vc_mask
Virtual channel.
@ k_ra8_mipi_dsi_rxrss_dt_mask
DT data type bits.
@ k_ra8_mipi_dsi_rxrss_rxferr
Fatal error.
@ k_ra8_mipi_dsi_rxrss_infoow
Info overwritten.
@ k_ra8_mipi_dsi_rxrss_rxake
Ack/error report.
@ k_ra8_mipi_dsi_ferrsr_clear_all
RW1C-able fields in FERRSCR (status-only bits 27/28 excluded).
@ k_ra8_mipi_dsi_vmset0_hsanolp
HSA period stays HS.
@ k_ra8_mipi_dsi_vmset0_hfpnolp
HFP period stays HS.
@ k_ra8_mipi_dsi_vmset0_vstop
VSTOP : request video stop.
@ k_ra8_mipi_dsi_vmset0_vstart
VSTART: start video mode.
@ k_ra8_mipi_dsi_vmset0_hbpnolp
HBP period stays HS.
@ k_ra8_mipi_dsi_vmhs_hact_shift
HACT shift.
@ k_ra8_mipi_dsi_vmhs_hsa_mask
HSA[11:0].
@ k_ra8_mipi_dsi_vmhs_hact_mask
HACT[30:16].
@ k_ra8_mipi_dsi_vmhs_hspol
HSYNC polarity.
@ k_ra8_mipi_dsi_vmhp_hfp_mask
HFP[28:16].
@ k_ra8_mipi_dsi_vmhp_hfp_shift
HFP shift.
@ k_ra8_mipi_dsi_vmhp_hbp_mask
HBP[12:0].
@ k_ra8_mipi_dsi_rx_slots
RXRSS0..3 receive slot count.
@ k_ra8_mipi_dsi_payload_max
TXPPD bytes (4 x 32-bit regs).
@ k_ra8_mipi_dsi_vmset1_dly_mask
DLY[13:2] field mask.
@ k_ra8_mipi_dsi_vmset1_dly_shift
DLY position.
@ k_ra8_mipi_dsi_vmvs_vact_shift
VACT shift.
@ k_ra8_mipi_dsi_vmvs_vspol
VSYNC polarity.
@ k_ra8_mipi_dsi_vmvs_vact_mask
VACT[30:16].
@ k_ra8_mipi_dsi_vmvs_vsa_mask
VSA[11:0].
static volatile r_mipi_dsi_regs_t * ra8_mipi_dsi(void)
Pointer to the RA8D2 MIPI DSI host register block.
@ k_ra8_mipi_dsi_isr_rcv
Receive interrupt.
@ k_ra8_mipi_dsi_isr_sq1
Sequence channel 1 interrupt.
@ k_ra8_mipi_dsi_isr_ppi
PPI (D-PHY) interrupt.
@ k_ra8_mipi_dsi_isr_ferr
Fatal-error interrupt.
@ k_ra8_mipi_dsi_isr_vm
Video-mode interrupt.
@ k_ra8_mipi_dsi_isr_sq0
Sequence channel 0 interrupt.
@ k_ra8_mipi_dsi_akep_vc_mask
Virtual channel id.
@ k_ra8_mipi_dsi_akep_erep_mask
16-bit error report.
@ k_ra8_mipi_dsi_rxrinfoow_sl0
Slot 0 overwrite flag.
@ k_ra8_mipi_dsi_rxsr_rxresp
Response packet received.
@ k_ra8_mipi_dsi_rxsr_rxte
Tearing-effect trigger rx.
@ k_ra8_mipi_dsi_rxsr_extedet
External TE detect.
@ k_ra8_mipi_dsi_rxsr_clear_all
Mask of every defined RXSR bit – write to RXSCR to scrub.
@ k_ra8_mipi_dsi_plsr_clear_all
Bit subset that is RW1C in PLSCR (steady-state lane bits aren't).
@ k_ra8_mipi_dsi_vmvp_vfp_mask
VFP[28:16].
@ k_ra8_mipi_dsi_vmvp_vbp_mask
VBP[12:0].
@ k_ra8_mipi_dsi_vmvp_vfp_shift
VFP shift.
@ k_ra8_mipi_dsi_sqch_clear_all
Mask of every RW1C bit in SQCH*SCR.
@ k_ra8_mipi_dsi_link_vrun
Video-mode operation running.
@ k_ra8_mipi_dsi_link_sq1run
Sequence ch 1 running.
@ k_ra8_mipi_dsi_link_lpbusy
LP operation busy.
@ k_ra8_mipi_dsi_link_hsbusy
HS operation busy.
@ k_ra8_mipi_dsi_link_sq0run
Sequence ch 0 running.
@ k_ra8_mipi_dsi_lane_all
Composite mask: clock + all data lanes.
ra8_mipi_dsi_dt_t
Frequently used DSI Data Types (cmd id) for short and long packets.
@ k_ra8_mipi_dsi_dt_pixel_rgb888
24-bit RGB packed pixel.
ra8_mipi_dsi_vc_t
DSI virtual channel identifier (DT[7:6] in the packet header).
@ k_ra8_mipi_dsi_vc3
Virtual channel 3.
@ k_ra8_mipi_dsi_vc0
Virtual channel 0 (default panel).
ra8_mipi_dsi_event_t
Event class delivered to the user callback.
@ k_ra8_mipi_dsi_event_seq1
Sequence channel 1 (HS) finished.
@ k_ra8_mipi_dsi_event_fatal
Fatal-error class IRQ.
@ k_ra8_mipi_dsi_event_receive
Packet / response received.
@ k_ra8_mipi_dsi_event_phy
PPI (PHY) lane event.
@ k_ra8_mipi_dsi_event_seq0
Sequence channel 0 (LP) finished.
@ k_ra8_mipi_dsi_event_video
Video-mode status changed.
void(* ra8_mipi_dsi_event_fn_t)(void *ctx, ra8_mipi_dsi_event_t event, uint32_t status_mask)
MIPI DSI ISR-context callback signature.
Ref-counted Module Stop Control wrapper for the RA8D2.
MIPI DSI host register block (full layout).
volatile uint32_t VMSET1R
+0x404 Video-mode set 1.
volatile uint32_t VMHSSETR
+0x430 Horizontal sync timing.
volatile uint32_t RSTCR
+0x110 Software reset control.
volatile uint32_t VMVPSETR
+0x42C Vertical porch timing.
volatile uint32_t SQCH0IER
+0x5D8 Sequence ch 0 int enable.
volatile uint32_t AKEPACMSR
+0x224 Ack/err accumulated (RO).
volatile uint32_t VMSCR
+0x414 Video-mode status clear.
volatile uint32_t SQCH1SR
+0x610 Sequence ch 1 status (RO).
volatile uint32_t VMVSSETR
+0x428 Vertical sync timing.
volatile uint32_t VMPPSETR
+0x420 Video pixel-packet set.
volatile uint32_t FERRIER
+0x308 Fatal-error int enable.
volatile uint32_t SQCH1IER
+0x618 Sequence ch 1 int enable.
volatile uint32_t LINKSR
+0x010 Link status (RO).
volatile uint32_t RXRSSCR
+0x234 Rx result save clear.
volatile uint32_t RXRSS0R
+0x240 Rx result save slot 0.
volatile uint32_t SQCH0SCR
+0x5D4 Sequence ch 0 clear.
volatile uint32_t RXSCR
+0x204 Receive status clear.
volatile uint32_t VMSET0R
+0x400 Video-mode set 0.
volatile uint32_t VMSR
+0x410 Video-mode status (RO).
volatile uint32_t VMIER
+0x418 Video-mode int enable.
volatile uint32_t PLSR
+0x320 PHY (PPI) status (RO).
volatile uint32_t RXRSS2R
+0x248 Rx result save slot 2.
volatile uint32_t RXRSS1R
+0x244 Rx result save slot 1.
volatile uint32_t RXRSS3R
+0x24C Rx result save slot 3.
volatile uint32_t RXRSSR
+0x230 Rx result save status.
volatile uint32_t RXPPD1R
+0x2C4 Rx packet payload data 1.
volatile uint32_t RXPPD3R
+0x2CC Rx packet payload data 3.
volatile uint32_t PLIER
+0x328 PHY interrupt enable.
volatile uint32_t RXIER
+0x208 Receive interrupt enable.
volatile uint32_t AKEPSCR
+0x228 Ack/err clear.
volatile uint32_t RXSR
+0x200 Receive status (RO).
volatile uint32_t FERRSR
+0x300 Fatal-error status (RO).
volatile uint32_t SQCH1SCR
+0x614 Sequence ch 1 clear.
volatile uint32_t ISR
+0x000 IRQ status (RO).
volatile uint32_t VMHPSETR
+0x434 Horizontal porch timing.
volatile uint32_t RXPPD0R
+0x2C0 Rx packet payload data 0.
volatile uint32_t PLSCR
+0x324 PHY status clear.
volatile uint32_t SQCH0SR
+0x5D0 Sequence ch 0 status (RO).
volatile uint32_t FERRSCR
+0x304 Fatal-error status clear.
volatile uint32_t RXRINFOOWSCR
+0x23C Rx info-overwrite clear.
volatile uint32_t RXPPD2R
+0x2C8 Rx packet payload data 2.
Decoded view of AKEPLATIR / AKEPACMSR.
ra8_mipi_dsi_vc_t virtual_channel
VC tag of the report.
uint16_t error_report
16-bit DSI ack/error bitmap.
bool sequence_ch0_running
LINKSR.SQ0RUN.
bool lp_busy
LINKSR.LPBUSY.
bool hs_busy
LINKSR.HSBUSY.
bool sequence_ch1_running
LINKSR.SQ1RUN.
bool video_running
LINKSR.VRUN.
Decoded view of a single RXRSS slot register.
bool long_packet
FMT bit (1 = long packet).
bool rx_success
RXSUC flag.
ra8_mipi_dsi_dt_t cmd_id
DT[5:0] received.
bool rx_packet_data_fail
RXPFAIL flag.
ra8_mipi_dsi_vc_t virtual_channel
VC[1:0] received.
bool rx_ack_and_error
RXAKE flag.
uint8_t data[2]
Header DATA0 / DATA1 bytes.
bool info_overwritten
INFOOW flag.
bool rx_fatal_error
RXFERR flag.
bool rx_correctable_error
RXCERR flag.
Video-mode timing + format + sync configuration.
uint16_t horizontal_back_porch
VMHPSETR.HBP[12:0].
uint16_t horizontal_active_pixels
VMHSSETR.HACT[30:16].
uint16_t vertical_back_porch
VMVPSETR.VBP[12:0].
uint16_t vertical_sync_lines
VMVSSETR.VSA[11:0].
uint16_t video_mode_delay
VMSET1R.DLY[13:2] x 4.
bool sync_pulse
Non-burst with sync pulse.
uint16_t vertical_front_porch
VMVPSETR.VFP[28:16].
bool hsync_active_high
VMHSSETR.HSPOL.
bool vsync_active_high
VMVSSETR.VSPOL.
ra8_mipi_dsi_vc_t virtual_channel
VC for the pixel stream.
uint16_t vertical_active_lines
VMVSSETR.VACT[30:16].
bool hbp_no_lp
Stay HS during HBP period.
bool hfp_no_lp
Stay HS during HFP period.
bool hsa_no_lp
Stay HS during HSA period.
ra8_mipi_dsi_dt_t pixel_format
RGB565 / RGB666 / RGB888.
uint16_t horizontal_front_porch
VMHPSETR.HFP[28:16].
uint16_t horizontal_sync_lines
VMHSSETR.HSA[11:0].
Compact video-mode timing block (HSA/HBP/HACT/HFP + VSA/VBP/VACT/VFP).
uint16_t horizontal_front_porch
HFP pixel count -> VMHPSETR.HFP.
uint16_t vertical_back_porch
VBP line count -> VMVPSETR.VBP.
uint16_t horizontal_active
HACT pixel count -> VMHSSETR.HACT.
uint16_t horizontal_back_porch
HBP pixel count -> VMHPSETR.HBP.
uint16_t vertical_front_porch
VFP line count -> VMVPSETR.VFP.
uint16_t vertical_sync
VSA line count -> VMVSSETR.VSA.
uint16_t vertical_active
VACT line count -> VMVSSETR.VACT.
uint16_t horizontal_sync
HSA pixel count -> VMHSSETR.HSA.