ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_poeg.c
Go to the documentation of this file.
1
13
14#include "ra8_poeg.h"
15
16#include <stdint.h>
17
18#include "ra8_attributes.h"
19#include "ra8_check.h"
20#include "ra8_err.h"
21#include "ra8_log.h"
22#include "ra8_mstp.h"
23#include "ra8_mstp_regs.h"
24#include "ra8_poeg_regs.h"
25
26static const char* s_tag = "POEG";
27
38
47
52typedef struct {
54 void* ctx;
56
58
83{
84 uint32_t v = 0U;
85 if (cfg->enable_pin) {
87 }
88 if (cfg->enable_ioc) {
90 }
91 if (cfg->enable_osc_stop) {
93 }
94 if (cfg->invert_input) {
96 }
97 return v;
98}
99
126ra8_err_t ra8_poeg_init(uint8_t group, const ra8_poeg_cfg_t* cfg)
127{
128 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
129 volatile r_poeg_regs_t* reg = ra8_poeg(group);
130 RA8_CHECK_NULL_PTR(reg, s_tag, "group out of range");
131
132 /* HUM Ch 11.2.9 "MSTPCRD : Module Stop Control Register D", p 448 */
133 const ra8_err_t mst_err = ra8_mstp_enable(s_poeg_mstp_table[group]);
134 /* GCOVR_EXCL_BR_START -- MSTP HW readback */
135 RA8_RETURN_ON_ERROR(mst_err, s_tag, "poeg_init: mstp enable");
136 /* GCOVR_EXCL_BR_STOP */
137
138 /* HUM Ch 21.2.1 "POEGG : POEG Group n Setting Register", p 872 */
139 reg->POEGG = internal_cfg_to_poegg(cfg);
140 ra8_log_info_val(s_tag, "init group", (uint32_t)group);
141 return k_ra8_ok;
142}
143
168{
169 volatile r_poeg_regs_t* reg = ra8_poeg(group);
170 RA8_CHECK_NULL_PTR(reg, s_tag, "group out of range");
171
172 reg->POEGG = 0U;
173 s_poeg_state[group].fn = nullptr;
174 s_poeg_state[group].ctx = nullptr;
176 return k_ra8_ok;
177}
178
203{
204 volatile r_poeg_regs_t* reg = ra8_poeg(group);
205 RA8_CHECK_NULL_PTR(reg, s_tag, "group out of range");
206
208 return k_ra8_ok;
209}
210
236ra8_err_t ra8_poeg_get_status(uint8_t group, uint32_t* out_mask)
237{
238 RA8_CHECK_NULL_PTR(out_mask, s_tag, "out_mask must not be nullptr");
239 volatile const r_poeg_regs_t* reg = ra8_poeg(group);
240 RA8_CHECK_NULL_PTR(reg, s_tag, "group out of range");
241
242 *out_mask = reg->POEGG & k_ra8_poeg_status_all;
243 return k_ra8_ok;
244}
245
270ra8_err_t ra8_poeg_clear_status(uint8_t group, uint32_t mask)
271{
272 volatile r_poeg_regs_t* reg = ra8_poeg(group);
273 RA8_CHECK_NULL_PTR(reg, s_tag, "group out of range");
274
275 const uint32_t current = reg->POEGG;
276 reg->POEGG = current & ~(mask & k_ra8_poeg_status_all);
277 return k_ra8_ok;
278}
279
306{
307 if (group >= (uint8_t)k_ra8_poeg_group_count) {
309 }
310 s_poeg_state[group].fn = fn;
311 s_poeg_state[group].ctx = ctx;
312 return k_ra8_ok;
313}
314
340{
341 if (group >= (uint8_t)k_ra8_poeg_group_count) {
343 }
344 return ra8_mstp_disable(s_poeg_mstp_table[group]);
345}
346
372{
373 if (group >= (uint8_t)k_ra8_poeg_group_count) {
375 }
376 return ra8_mstp_enable(s_poeg_mstp_table[group]);
377}
378
400void ra8_poeg_dispatch(uint8_t group)
401{
402 if (group >= (uint8_t)k_ra8_poeg_group_count) {
403 return;
404 }
405 volatile const r_poeg_regs_t* reg = ra8_poeg(group);
406 uint32_t mask = 0U;
407 if (reg != nullptr) {
408 mask = reg->POEGG & k_ra8_poeg_status_all;
409 }
410 const ra8_poeg_event_fn_t fn = s_poeg_state[group].fn;
411 void* const ctx = s_poeg_state[group].ctx;
412 if (fn != nullptr) {
413 fn(ctx, mask);
414 }
415}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
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_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_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ 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
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
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
Module Stop Control (MSTP) register layout for the Renesas RA8D2.
ra8_mstp_t
Packed (reg << 8) | bit module-stop identifier.
@ k_ra8_mstp_poeg_c
MSTPD12 POEG group C.
@ k_ra8_mstp_poeg_a
MSTPD14 POEG group A.
@ k_ra8_mstp_poeg_d
MSTPD11 POEG group D.
@ k_ra8_mstp_poeg_b
MSTPD13 POEG group B.
ra8_err_t ra8_poeg_trigger_stop(uint8_t group)
Manually fire the software-stop trigger (POEGG.SSF = 1).
Definition ra8_poeg.c:202
ra8_err_t ra8_poeg_exit_stop(uint8_t group)
Re-enable the MSTP gate for one POEG group after stop.
Definition ra8_poeg.c:371
ra8_err_t ra8_poeg_get_status(uint8_t group, uint32_t *out_mask)
Read the latched POEGG status bits.
Definition ra8_poeg.c:236
ra8_err_t ra8_poeg_init(uint8_t group, const ra8_poeg_cfg_t *cfg)
Bring up one POEG group with the given configuration.
Definition ra8_poeg.c:126
void ra8_poeg_dispatch(uint8_t group)
Snapshot POEGG status and fan out the per-group callback.
Definition ra8_poeg.c:400
static uint32_t internal_cfg_to_poegg(const ra8_poeg_cfg_t *cfg)
Translate a public ra8_poeg_cfg_t into a POEGG bitfield.
Definition ra8_poeg.c:82
ra8_err_t ra8_poeg_deinit(uint8_t group)
Tear down a POEG group and drop its MSTP reference.
Definition ra8_poeg.c:167
ra8_poeg_bits_t
POEGG status/control bit positions and combined masks.
Definition ra8_poeg.c:43
@ k_ra8_poeg_status_all
RA8 poeg status all.
Definition ra8_poeg.c:44
ra8_err_t ra8_poeg_attach_handler(uint8_t group, ra8_poeg_event_fn_t fn, void *ctx)
Register the per-group ISR callback (NULL detaches).
Definition ra8_poeg.c:305
ra8_err_t ra8_poeg_clear_status(uint8_t group, uint32_t mask)
Acknowledge selected POEGG status bits via write-0-to-clear.
Definition ra8_poeg.c:270
ra8_err_t ra8_poeg_enter_stop(uint8_t group)
Drop the MSTP reference for one POEG group (low-power gate).
Definition ra8_poeg.c:339
static const ra8_mstp_t s_poeg_mstp_table[k_ra8_poeg_group_count]
Per-group MSTP id lookup.
Definition ra8_poeg.c:32
static ra8_poeg_state_t s_poeg_state[k_ra8_poeg_group_count]
Definition ra8_poeg.c:57
Port Output Enable for GPT (POEG) driver.
void(* ra8_poeg_event_fn_t)(void *ctx, uint32_t status_mask)
POEG IRQ callback.
Definition ra8_poeg.h:98
@ k_ra8_poeg_en_inv
POEGG.INV input invert.
Definition ra8_poeg.h:73
@ k_ra8_poeg_en_iocen
POEGG.IOCE output short.
Definition ra8_poeg.h:71
@ k_ra8_poeg_en_osten
POEGG.OSTPE osc stop.
Definition ra8_poeg.h:72
@ k_ra8_poeg_en_pide
POEGG.PIDE input detect.
Definition ra8_poeg.h:70
@ k_ra8_poeg_status_ovrf
POEGG.OSTPF Osc Stop.
Definition ra8_poeg.h:60
@ k_ra8_poeg_status_st
POEGG.ST state.
Definition ra8_poeg.h:62
@ k_ra8_poeg_status_ssf
POEGG.SSF Software.
Definition ra8_poeg.h:61
@ k_ra8_poeg_status_pidf
POEGG.PIDF Port Input.
Definition ra8_poeg.h:58
@ k_ra8_poeg_status_iocf
POEGG.IOCF Output Short.
Definition ra8_poeg.h:59
Port Output Enable for GPT (POEG) register layout for the RA8D2.
@ k_ra8_poeg_group_count
RA8 poeg group count.
static volatile r_poeg_regs_t * ra8_poeg(uint8_t group)
Get pointer to POEG group N (0..3).
volatile uint32_t POEGG
+0x00 POEG Group setting + status.
Configuration descriptor for ra8_poeg_init.
Definition ra8_poeg.h:85
bool enable_ioc
True -> enable output short detect.
Definition ra8_poeg.h:87
bool enable_pin
True -> enable external PIDE input.
Definition ra8_poeg.h:86
bool invert_input
True -> invert PIDE input polarity.
Definition ra8_poeg.h:89
bool enable_osc_stop
True -> enable osc stop detect.
Definition ra8_poeg.h:88
Per-group runtime state.
Definition ra8_poeg.c:52
void * ctx
Ctx.
Definition ra8_poeg.c:54
ra8_poeg_event_fn_t fn
Fn.
Definition ra8_poeg.c:53