ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
board_periph_pdctr.c
Go to the documentation of this file.
1
37
38#include <stdint.h>
39#include <stdio.h>
40
41#include "board_periph_block.h"
45#include "ra8_attributes.h"
46
48typedef enum : uint64_t {
49 k_pdctr_gd_base = 0x4001E110UL,
52
54typedef enum : uint8_t {
60
62typedef enum : uint32_t {
65
67typedef struct {
68 uint8_t pdctrgd;
69 uint32_t power_on;
70 uint32_t blocked;
72
74
84{
86 s_pdctr.pdctrgd = (uint8_t)k_pdctr_reset_value;
87}
88
90{
91 return (uint8_t)(s_pdctr.pdctrgd & (uint8_t)k_pdctr_pdpgsf_mask) == 0U;
92}
93
107RA8_INTERNAL static uint64_t internal_pdctr_read(uc_engine* uc, uint64_t addr, unsigned size)
108{
109 (void)uc;
110 (void)addr;
111 (void)size;
112 return (uint64_t)s_pdctr.pdctrgd;
113}
114
132RA8_INTERNAL static void
133internal_pdctr_write(uc_engine* uc, uint64_t addr, unsigned size, uint64_t value)
134{
135 (void)uc;
136 (void)addr;
137 (void)size;
138 /* HUM Ch 13.1 Table 13.1 p 521 lists PDCTRGD under PRC1: a write with that
139 * group locked is discarded by the hardware with no fault and no flag. */
141 s_pdctr.blocked++;
142 return;
143 }
144 const bool power_off = ((uint8_t)value & (uint8_t)k_pdctr_pdde_mask) != 0U;
145 if (power_off) {
146 s_pdctr.pdctrgd = (uint8_t)(k_pdctr_pdde_mask | k_pdctr_pdpgsf_mask);
147 return;
148 }
150 s_pdctr.power_on++;
151 }
152 s_pdctr.pdctrgd = 0U; /* PDDE=0, PDCSF=0 (settled), PDPGSF=0 (powered). */
153}
154
164{
165 if (s_pdctr.blocked != 0U) {
166 /* Loud: PDCTRGD writes need PRCR.PRC1 unlocked or the domain stays dark. */
167 (void)priv_emu_io_errf(
168 " PWR-GRAPHICS : PDCTRGD writes DROPPED=%u (PRCR.PRC1 locked: unlock 0xA502)\n",
169 s_pdctr.blocked);
170 return;
171 }
172 if (s_pdctr.power_on == 0U) {
173 return; /* Untouched: stay quiet (domain still gated, as at reset). */
174 }
175 (void)priv_emu_io_errf(" PWR-GRAPHICS : graphics power domain on (DRW/GLCDC/MIPI/VIN)\n");
176}
177
180 .base = (uint64_t)k_pdctr_gd_base,
181 .span = (uint64_t)k_pdctr_gd_span,
182 .order = (uint32_t)k_pdctr_block_order,
183 .read = internal_pdctr_read,
185 .tick = nullptr,
186 .reset = internal_pdctr_reset,
187 .report = internal_pdctr_report,
188 .name = "PWR-GRAPHICS",
189};
190
Decentralized peripheral-block registry for the board emulator core.
void board_periph_register_block(const board_periph_block_t *block)
Register a peripheral block's descriptor with the core registry.
static pdctr_state_t s_pdctr
pdctr_mask_t
PDCTRGD field masks (HUM Ch 11.2.14 p 452).
@ k_pdctr_pdpgsf_mask
PDPGSF @ bit 7: 1 = gated off.
@ k_pdctr_reset_value
"Value after reset": gated off.
@ k_pdctr_pdde_mask
PDDE @ bit 0: 1 = power OFF.
@ k_pdctr_pdcsf_mask
PDCSF @ bit 6: control busy.
static void internal_pdctr_block_register(void)
Register the power-domain block before main (host constructor).
bool priv_board_pdctr_graphics_powered(void)
Report whether the graphics power domain is currently powered.
static const board_periph_block_t s_k_pdctr_block
Graphics power-domain block descriptor (self-registered).
static void internal_pdctr_report(void)
End-of-run graphics power-domain section.
pdctr_geom_t
PDCTRGD window geometry (HUM Ch 11.2.14 p 452).
@ k_pdctr_gd_span
One 8-bit register.
@ k_pdctr_gd_base
PDCTRGD: SYSC 0x4001_E000 + 0x110.
static void internal_pdctr_write(uc_engine *uc, uint64_t addr, unsigned size, uint64_t value)
MMIO write of PDCTRGD: apply PDDE, settle the gating flags.
static void internal_pdctr_reset(void)
Return PDCTRGD to its documented reset value: domain gated OFF.
static uint64_t internal_pdctr_read(uc_engine *uc, uint64_t addr, unsigned size)
MMIO read of PDCTRGD: PDDE as written, status flags derived.
pdctr_order_t
Per-tick order slot for the power-domain block.
@ k_pdctr_block_order
Between PRCR and the VBATT block.
Module-private graphics power-domain state for the gated blocks.
Module-private PRCR unlock state shared with the protected blocks.
bool priv_board_prcr_group_unlocked(uint16_t group_mask)
Report whether every bit in group_mask is currently unlocked.
@ k_board_prcr_grp1_lpm
PRC1: low-power modes + VBATT backup.
Bounded raw-descriptor I/O seam for the RA8 emulator.
emu_io_result_t priv_emu_io_errf(const char *format,...)
Format bounded text and write it to the injected error descriptor.
-proof
Annotation-attribute framework macros for ra8-firmware.
#define RA8_PRIV
Module-private helper: shared across TUs but only inside one library.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
A modelled peripheral block's self-description for the core registry.
Graphics power-domain state.
uint32_t power_on
Times the domain was powered on (report).
uint8_t pdctrgd
Live PDCTRGD value (PDDE + status flags).
uint32_t blocked
Writes dropped while PRCR.PRC1 was locked.