58static const char*
s_tag =
"LPM";
61typedef enum : uint16_t {
69typedef enum : uint8_t {
80typedef enum : uint8_t {
89typedef enum : uint8_t {
435 const uint16_t cur = *prcr;
445 const uint16_t cur = *prcr;
477 *p = (uint32_t)(*p & ~bits);
493 *p = (uint32_t)(*p & ~bits);
558 if (ulpt0_underflow) {
561 if (ulpt1_underflow) {
614 uint8_t pdramscr1 = 0U;
716 if (poll_limit == 0U) {
719 for (uint32_t i = 0U; i < poll_limit; ++i) {
743 uint8_t lpscr_value = 0U;
744 bool sleepdeep =
false;
static const char * s_tag
Logging / check tag.
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.
#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_invalid_arg
Invalid function argument.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Shared CPU-intrinsic seam for the HAL drivers (host/target split).
static void ra8_hw_dsb(void)
Data Synchronisation Barrier (full system).
static void ra8_hw_wfi(void)
Wait For Interrupt: place the core in low-power wait.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
#define ra8_log_info(tag, message)
RA8 log info.
#define ra8_log_error(tag, message)
RA8 log error.
ra8_err_t ra8_lpm_wait_for_opccr(uint32_t poll_limit)
Wait for OPCCR.OPCMTSF to clear (mode-transition complete).
ra8_lpm_cause_shift_t
Bit shifts used to pack WUPEN0 / WUPEN1 into a 64-bit cause word.
@ k_ra8_lpm_cause_shift_wupen0
WUPEN0 occupies the low 32 bits.
@ k_ra8_lpm_cause_shift_wupen1
WUPEN1 occupies the high 32 bits.
ra8_err_t ra8_lpm_get_opccr(uint8_t *opccr)
Read OPCCR raw byte (OPCM[1:0] + OPCMTSF).
ra8_err_t ra8_lpm_init(const ra8_lpm_config_t *cfg)
Initialise the LPM block from a config descriptor.
ra8_err_t ra8_lpm_clear_wupen1_bits(uint32_t bits)
AND-out WUPEN1 bits to disarm specific wake-up sources.
ra8_err_t ra8_lpm_snooze_set_request_sources(bool ulpt0_underflow, bool ulpt1_underflow, bool acmphs0)
Configure ULPT-driven snooze request sources.
ra8_err_t ra8_lpm_get_exit_cause(uint64_t *out)
Snapshot WUPEN0 / WUPEN1 into a single 64-bit word.
static ra8_lpm_off_t internal_dpsifr_offset(ra8_lpm_dpsier_idx_t idx)
Resolve a DPSIFR index to its register offset.
static ra8_lpm_off_t internal_clock_offset(ra8_lpm_clock_t clock)
Resolve ra8_lpm_clock_t to its OCR offset.
static ra8_err_t internal_validate_mode(ra8_sleep_mode_t mode)
Validate mode against the LPSCR.LPMD encoding table.
ra8_err_t ra8_lpm_set_ram_retention(const ra8_lpm_ram_retention_t *cfg)
Programme PDRAMSCR0 / PDRAMSCR1 from a retention descriptor.
static ra8_lpm_off_t internal_dpsiegr_offset(ra8_lpm_dpsier_idx_t idx)
Resolve a DPSIEGR index to its register offset.
ra8_err_t ra8_lpm_prcr_relock(void)
Re-lock PRCR.PRC1 after protected writes.
ra8_err_t ra8_lpm_set_dpsiegr(ra8_lpm_dpsier_idx_t idx, uint8_t value)
Programme DPSIEGR0..2 (deep-standby IRQ edge polarity).
static void internal_set_sleepdeep(bool enable)
Toggle SCB.SCR.SLEEPDEEP for non-Sleep mode entry.
ra8_err_t ra8_lpm_enter_deep_standby(void)
Convenience wrapper – enter Deep Software Standby mode 1.
lpm_byte_mask_t
Low-byte mask for the PRCR protect register.
@ k_lpm_byte_mask
Lpm byte mask.
ra8_err_t ra8_lpm_enter_sleep(ra8_sleep_mode_t mode)
Programme LPSCR for mode and enter the requested sleep.
ra8_err_t ra8_lpm_get_clock_stop(ra8_lpm_clock_t clock, bool *stop)
Read the per-oscillator stop bit.
ra8_err_t ra8_lpm_snooze_set_end_sources(bool ulpt0, bool ulpt1, bool usbfs, bool usbhs)
Configure end-of-snooze sources via DPSIER3 (ULPT/USB hooks).
ra8_err_t ra8_lpm_arm_wupen0_bits(uint32_t bits)
OR-in additional WUPEN0 bits without disturbing other sources.
ra8_lpm_status_shift_t
Bit shifts used to pack SBYCR / DPSBYCR / LPSCR / SSCR1.
@ k_ra8_lpm_status_shift_dpsbycr
DPSBYCR occupies byte 1.
@ k_ra8_lpm_status_shift_lpscr
LPSCR occupies byte 2.
@ k_ra8_lpm_status_shift_sscr1
SSCR1 occupies byte 3.
@ k_ra8_lpm_status_shift_sbycr
SBYCR occupies byte 0.
ra8_err_t ra8_lpm_clear_dpsifr(ra8_lpm_dpsier_idx_t idx)
Clear DPSIFR0..3 so a stale flag does not cancel deep standby.
ra8_err_t ra8_lpm_arm_wupen1_bits(uint32_t bits)
OR-in additional WUPEN1 bits without disturbing other sources.
ra8_err_t ra8_lpm_deinit(void)
Restore SBYCR / DPSBYCR / LPSCR / SSCR1 to cold-reset defaults.
static void internal_wait_for_interrupt(void)
Issue a Data Synchronization Barrier followed by WFI.
ra8_err_t ra8_lpm_get_status(uint32_t *out)
Read LPM status (SBYCR | DPSBYCR | LPSCR | SSCR1) packed.
ra8_err_t ra8_lpm_prcr_unlock(void)
Unlock PRCR.PRC1 to permit writes to LPM control registers.
ra8_err_t ra8_lpm_set_clock_stop(ra8_lpm_clock_t clock, bool stop)
Set or clear the per-oscillator stop bit before sleep entry.
ra8_err_t ra8_lpm_arm_dpsier(ra8_lpm_dpsier_idx_t idx, uint8_t value)
Programme the per-byte DPSIER0..3 enable byte directly.
ra8_err_t ra8_lpm_set_wakeup_sources(uint32_t wupen0, uint32_t wupen1)
Programme the raw WUPEN0 / WUPEN1 masks.
ra8_err_t ra8_lpm_get_dpsi_state(uint8_t enables[4], uint8_t flags[4], uint8_t edges[3])
Read DPSIER0..3 + DPSIFR0..3 + DPSIEGR0..2 into a buffer.
ra8_lpm_dpsi_count_t
Buffer counts for ra8_lpm_get_dpsi_state.
@ k_ra8_lpm_dpsifr_count
DPSIFR0..3 count.
@ k_ra8_lpm_dpsieg_count
DPSIEGR0..2 count.
@ k_ra8_lpm_dpsier_count
DPSIER0..3 count.
ra8_err_t ra8_lpm_clear_wupen0_bits(uint32_t bits)
AND-out WUPEN0 bits to disarm specific wake-up sources.
ra8_err_t ra8_lpm_set_ldo_standby(const ra8_lpm_ldo_cfg_t *cfg)
Programme PLL1LDOCR / PLL2LDOCR / HOCOLDOCR SKEEP bits.
static ra8_lpm_off_t internal_dpsier_offset(ra8_lpm_dpsier_idx_t idx)
Resolve a DPSIER index to its register offset.
Low Power Mode (LPM) HAL driver – public API.
ra8_lpm_clock_t
Selector for ra8_lpm_set_clock_stop / ra8_lpm_get_clock_stop.
@ k_ra8_lpm_clock_loco
Low-Speed On-Chip Oscillator.
@ k_ra8_lpm_clock_sub
Sub-clock Oscillator.
@ k_ra8_lpm_clock_moco
Middle-Speed On-Chip Oscillator.
@ k_ra8_lpm_clock_main
Main Oscillator.
@ k_ra8_lpm_clock_count
RA8 lpm clock count.
@ k_ra8_lpm_clock_hoco
High-Speed On-Chip Oscillator.
Low Power Mode (LPM) register layout for the Renesas RA8D2.
@ k_ra8_lpm_dpsbycr_reset_val
Cold-reset value.
@ k_ra8_lpm_dpsbycr_iokeep_mask
IOKEEP @ bit 6.
@ k_ra8_lpm_dpsbycr_dcssmode_shift
DCSSMODE[1:0] starts at bit 2.
@ k_ra8_lpm_scb_scr_sleepdeep
SCR.SLEEPDEEP @ bit 2.
static volatile uint32_t * ra8_lpm_scb_scr(void)
Return a typed pointer to the Cortex-M SCB->SCR register.
@ k_ra8_lpm_sbycr_ope_mask
OPE @ bit 6 – bus-signal output keep.
@ k_ra8_lpm_sbycr_reset_val
Cold-reset value (OPE=1, all else 0).
ra8_sleep_mode_t
Software-selectable sleep modes (LPSCR.LPMD encoding).
@ k_ra8_sleep_mode_deep_standby_1
Deep Standby 1 (LPMD=0x8).
@ k_ra8_sleep_mode_deep_standby_2
Deep Standby 2 (LPMD=0x9).
@ k_ra8_sleep_mode_deep_sleep
CPU deep sleep (SCR.SLEEPDEEP=1).
@ k_ra8_sleep_mode_software_std
Software Standby (LPMD=0x5).
@ k_ra8_sleep_mode_sleep
CPU sleep, peripherals run.
@ k_ra8_sleep_mode_deep_standby_3
Deep Standby 3 (LPMD=0xA).
static volatile uint32_t * ra8_lpm_icu_reg32(ra8_lpm_off_t off)
Return a typed pointer to a 32-bit ICU/WUPEN register.
@ k_ra8_lpm_pdramscr0_writable
b14..b0 writable mask.
@ k_ra8_lpm_ldocr_skeep_shift
SKEEP starts at bit 1.
@ k_ra8_lpm_ldocr_skeep_mask
SKEEP @ bit 1 – retain in standby.
@ k_ra8_lpm_pdramscr1_rkeep1_mask
RKEEP1 @ bit 1 – CPU1 TCM.
@ k_ra8_lpm_pdramscr1_rkeep0_mask
RKEEP0 @ bit 0 – CPU0 TCM.
@ k_ra8_lpm_wupen0_acmphs0
legacy alias for PVD1 path.
ra8_lpm_dpsier_idx_t
Selector for DPSIER0..3 / DPSIFR0..3 / DPSIEGR0..2 helpers (HUM Ch 11.2.22..36 p 459....
@ k_ra8_lpm_dpsier_idx_count
RA8 lpm dpsier index count.
@ k_ra8_lpm_dpsier_idx_2
DPSIER2 / DPSIFR2 / DPSIEGR2.
@ k_ra8_lpm_dpsier_idx_1
DPSIER1 / DPSIFR1 / DPSIEGR1.
@ k_ra8_lpm_dpsier_idx_0
DPSIER0 / DPSIFR0 / DPSIEGR0.
@ k_ra8_lpm_dpsier_idx_3
DPSIER3 / DPSIFR3 (HUM Ch 11.2.25 p 461 – DPSIEGR3 @ 0xA34 exists, unexposed here).
ra8_lpm_off_t
Byte offsets of every LPM-relevant register from its block base.
@ k_ra8_lpm_pll2ldocr_off
PLL2LDOCR (8b) – HUM Ch 11.2.41 p 475.
@ k_ra8_lpm_dpsbycr_off
DPSBYCR (8b) – HUM Ch 11.2.21 p 458.
@ k_ra8_lpm_dpsiegr2_off
DPSIEGR2 (8b) – HUM Ch 11.2.36 p 463.
@ k_ra8_lpm_pdramscr1_off
PDRAMSCR1 (8b) – HUM Ch 11.2.17 p 455.
@ k_ra8_lpm_pll1ldocr_off
PLL1LDOCR (8b) – HUM Ch 11.2.40 p 475.
@ k_ra8_lpm_dpsifr0_off
DPSIFR0 (8b) – HUM Ch 11.2.28 p 462.
@ k_ra8_lpm_dpsier0_off
DPSIER0 (8b) – HUM Ch 11.2.22 p 459.
@ k_ra8_lpm_wupen0_off
WUPEN0 (32b) – HUM Ch 14.2.19 p 550.
@ k_ra8_lpm_dpsier1_off
DPSIER1 (8b) – HUM Ch 11.2.23 p 459.
@ k_ra8_lpm_sscr1_off
SSCR1 (8b) – HUM Ch 11.2.19 p 456.
@ k_ra8_lpm_mococr_off
MOCOCR (8b) – HUM Ch 9.2.18 p 346.
@ k_ra8_lpm_sbycr_off
SBYCR (8b) – HUM Ch 11.2.18 p 456.
@ k_ra8_lpm_dpsifr2_off
DPSIFR2 (8b) – HUM Ch 11.2.30 p 462.
@ k_ra8_lpm_hocoldocr_off
HOCOLDOCR (8b) – HUM Ch 11.2.42 p 476.
@ k_ra8_lpm_dpsier3_off
DPSIER3 (8b) – HUM Ch 11.2.25 p 461.
@ k_ra8_lpm_hococr_off
HOCOCR (8b) – HUM Ch 9.2.16 p 345.
@ k_ra8_lpm_lpscr_off
LPSCR (8b) – HUM Ch 11.2.20 p 457.
@ k_ra8_lpm_dpsiegr1_off
DPSIEGR1 (8b) – HUM Ch 11.2.35 p 463.
@ k_ra8_lpm_opccr_off
OPCCR (8b) – HUM Ch 11.2.11 p 451.
@ k_ra8_lpm_dpsiegr0_off
DPSIEGR0 (8b) – HUM Ch 11.2.34 p 463.
@ k_ra8_lpm_lococr_off
LOCOCR (8b) – HUM Ch 9.2.15 p 344.
@ k_ra8_lpm_wupen1_off
WUPEN1 (32b) – HUM Ch 14.2.20 p 552.
@ k_ra8_lpm_sosccr_off
SOSCCR (8b) – HUM Ch 9.2.14 p 343.
@ k_ra8_lpm_pdramscr0_off
PDRAMSCR0 (16b) – HUM Ch 11.2.16 p 453.
@ k_ra8_lpm_dpsier2_off
DPSIER2 (8b) – HUM Ch 11.2.24 p 460.
@ k_ra8_lpm_prcr_off
PRCR (16b) – HUM Ch 11.2.18 p 456.
@ k_ra8_lpm_dpsifr3_off
DPSIFR3 (8b) – HUM Ch 11.2.31 p 462.
@ k_ra8_lpm_mosccr_off
MOSCCR (8b) – HUM Ch 9.2.13 p 343.
@ k_ra8_lpm_dpsifr1_off
DPSIFR1 (8b) – HUM Ch 11.2.29 p 462.
@ k_ra8_lpm_sscr1_ss2lp_shift
SS2LP[1:0] starts at bit 2.
@ k_ra8_lpm_sscr1_ss2fr_mask
SS2FR @ bit 0 – fast return.
@ k_ra8_lpm_clock_stop_mask
STOP @ bit 0 in every OCR.
static volatile uint16_t * ra8_lpm_sysc_reg16(ra8_lpm_off_t off)
Return a typed pointer to a 16-bit SYSC register.
@ k_ra8_lpm_dpsier3_dulpt1ie_mask
DULPT1IE @ bit 3.
@ k_ra8_lpm_dpsier3_dusbfsie_mask
DUSBFSIE @ bit 0.
@ k_ra8_lpm_dpsier3_dulpt0ie_mask
DULPT0IE @ bit 2.
@ k_ra8_lpm_dpsier3_dusbhsie_mask
DUSBHSIE @ bit 1.
@ k_ra8_lpm_lpscr_lpmd_mask
LPMD[3:0] occupies bits 3..0.
@ k_ra8_lpm_prcr_key
Mandatory password in upper byte.
@ k_ra8_lpm_prcr_prc1_msk
PRC1 – LPM/SYSC group.
@ k_ra8_lpm_wupen1_ulpt1u
ULP1UWUPEN @ bit 12.
@ k_ra8_lpm_wupen1_ulpt0u
ULP0UWUPEN @ bit 8.
static volatile uint8_t * ra8_lpm_sysc_reg8(ra8_lpm_off_t off)
Return a typed pointer to an 8-bit SYSC register.
@ k_ra8_lpm_opccr_opcmtsf_msk
OPCMTSF @ bit 4 – mode-transition flag.
@ k_ra8_lpm_opccr_opcm_mask
OPCM[1:0] @ bits 1..0 – power mode.
Scoped PRCR unlock helper.
#define RA8_PROTECTED_WRITE(unlock_val)
Scoped PRCR unlock block.
@ k_ra8_prcr_unlock_cgc
RA8 prcr unlock cgc.
Configuration descriptor for ra8_lpm_init.
bool opa_bus_keep
SBYCR.OPE – keep bus signals driven.
ra8_lpm_dcssmode_t dcdc_softstart
DCSSMODE encoding (k_ra8_lpm_dcssmode_*).
bool io_port_keep
DPSBYCR.IOKEEP – retain IOs across DSBY.
bool sscr_fast_return
SSCR1.SS2FR – speed up wake from SSTBY.
ra8_lpm_sscr1_ss2lp_t sscr_low_power
SSCR1.SS2LP encoding.
LDO standby retention selection (HUM 11.2.1 p 436).
ra8_lpm_ldo_state_t pll2
PLL2 LDO state in standby.
ra8_lpm_ldo_state_t pll1
PLL1 LDO state in standby.
ra8_lpm_ldo_state_t hoco
HOCO LDO state in standby.
RAM retention configuration (HUM 11.2.16 / 11.2.17).
bool cpu0_tcm_keep
PDRAMSCR1.RKEEP0.
bool cpu1_tcm_keep
PDRAMSCR1.RKEEP1 (dual-core only).
uint16_t pdramscr0_bits
Raw PDRAMSCR0 RKEEP[12:0] value.