50static const char*
s_tag =
"ADC";
56typedef enum : uint8_t {
115 switch (resolution) {
154 if (reg ==
nullptr) {
157 const uint32_t adprc_field =
262 if (reg !=
nullptr) {
286 if (reg ==
nullptr) {
290 const uint32_t cnvcs =
294 *reg = (cnvcs | sgsel);
318 const uint32_t admd0_code =
357 if ((chcr ==
nullptr) || (addr ==
nullptr)) {
369 if (adstr !=
nullptr) {
508 if (addr ==
nullptr) {
630 const uint8_t ch = cfg->
channels[i];
632 if (reg ==
nullptr) {
635 const uint32_t cnvcs =
637 const uint32_t sgsel =
639 *reg = (cnvcs | sgsel);
681 const uint32_t group_bit = (uint32_t)(1UL << (uint32_t)group);
711 if (adstr ==
nullptr) {
722 if (adstr ==
nullptr) {
748 if (addr ==
nullptr) {
767 const uint32_t code =
783 if (tbl ==
nullptr) {
795 if (mdr !=
nullptr) {
798 const uint32_t mask = ((uint32_t)0x3UL) << shift;
800 *mdr = (*mdr & ~mask) | code;
804 const uint32_t enable_bit = (uint32_t)(1UL << channel);
809 if (opcrb !=
nullptr) {
810 const uint32_t cmptble_bit =
827 if (opcrb ==
nullptr) {
831 const uint32_t avemd_field =
835 *opcrb = cleared | avemd_field | adc_field;
static void internal_wait_clksr(uint32_t desired)
Best-effort wait for ADCLKSR.CLKSR to match the requested level.
static uint32_t internal_build_admdr(bool scan_mode)
Build the ADMDR value (ADMD0 only – ADC1 stays disabled).
static bool internal_adprc_for_resolution(ra8_adc_resolution_t resolution, uint32_t *out_adprc)
Translate a public resolution selector into its ADDOPCRC.ADPRC code.
ra8_err_t ra8_adc_read_group_results(uint8_t group, uint16_t *out_buf, uint8_t *out_count)
Drain conversion results for every channel mapped to a group.
ra8_err_t ra8_adc_start_group(uint8_t group)
Kick a scan group via the per-group ADSTR register.
ra8_err_t ra8_adc_init_configured(const ra8_adc_cfg_t *cfg)
Initialise ADC_B with a full config descriptor.
ra8_err_t ra8_adc_attach_handler(ra8_adc_complete_fn_t fn, void *ctx)
Attach a conversion-complete callback.
ra8_err_t ra8_adc_set_oversampling(uint8_t channel, ra8_adc_oversample_t mode)
Programme ADDOPCRB[ch].AVEMD/ADC for a per-channel averaging mode.
ra8_adc_default_group_t
Scan-group used by the legacy single-channel polling API.
@ k_ra8_adc_default_group
Group 0 owns SW-trigger conversions.
static void internal_apply_group_enable(uint8_t group, ra8_adc_trigger_src_t trigger)
Apply the per-group enable bit (ADSGER) and trigger source (ADTRGENR).
static void internal_zero_channel_table(void)
Default-zero every per-channel ADCHCRn slot.
static void internal_apply_resolution_code(uint32_t adprc)
Install one ADPRC data-format code on every result-producing channel.
ra8_err_t ra8_adc_read_channel(uint8_t channel, uint16_t *out_raw)
Blocking single-channel sample.
ra8_err_t ra8_adc_configure_scan_group(uint8_t group, const ra8_adc_scan_group_cfg_t *cfg)
Configure scan group group with a list of channels + trigger.
ra8_err_t ra8_adc_set_resolution(ra8_adc_resolution_t resolution)
Change the ADC conversion resolution at runtime.
ra8_err_t ra8_adc_exit_stop(void)
Exit MSTP-gated stop.
static ra8_adc_state_t s_adc_state
ra8_err_t ra8_adc_get_status(uint16_t *out_mask)
Read the ADC status bits (ADCSR.ADST / ADIE).
ra8_err_t ra8_adc_enter_stop(void)
Put ADC_B into MSTP-gated stop.
static ra8_err_t internal_program_group_channels(uint8_t group, const ra8_adc_scan_group_cfg_t *cfg)
Walk the channel list and program ADCHCR[ch] = (SGSEL, CNVCS).
static ra8_err_t internal_oversample_encode(ra8_adc_oversample_t mode, uint32_t *out_avemd, uint32_t *out_adc)
Translate the public oversampling enum into ADDOPCRB AVEMD/ADC.
static ra8_err_t internal_validate_group_cfg(uint8_t group, const ra8_adc_scan_group_cfg_t *cfg)
Validate a scan-group configuration descriptor.
ra8_err_t ra8_adc_set_compare_window(uint8_t channel, uint16_t low, uint16_t high)
Programme a window comparator for a single channel.
ra8_err_t ra8_adc_init(void)
Legacy init – 14-bit right-aligned, software trigger.
ra8_err_t ra8_adc_deinit(void)
Tear down the ADC_B peripheral.
static void internal_write_adprc(uint8_t vch, uint32_t adprc)
Write the ADPRC data-format field of one ADDOPCRCn slot (RMW).
ra8_err_t ra8_adc_clear_status(void)
Clear the ADCSR.ADST busy bit (abort in-flight conversion).
static void internal_program_channel(uint8_t virtual_ch, uint8_t physical_ch)
Programme an ADCHCRn slot to map a physical channel into the default scan group with no special sampl...
ra8_err_t ra8_adc_set_continuous_scan(uint8_t group, bool enable)
Switch a scan group between one-shot and continuous (free-running).
static void internal_cache_group_channels(uint8_t group, const ra8_adc_scan_group_cfg_t *cfg)
Cache a group's channel list into s_adc_state.groups.
void ra8_adc_dispatch_cnv_end(uint8_t channel)
Dispatch conversion-complete – read result + fire callback.
ra8_err_t ra8_adc_stop_group(uint8_t group)
Stop a scan group: clear ADSTR[group] and write ADSTOPR.
static void internal_clock_bring_up(uint32_t clkcr_value)
Bring ADCLK up: ENR=0 -> wait CLKSR=0 -> CR=src -> ENR=1 -> CLKSR=1.
Cross-TU constants shared by the ADC_B driver split.
@ k_ra8_adc_busy_wait_limit
ADSR.ADACT busy-poll budget.
@ k_ra8_adc_clk_wait_limit
ADCLKSR settle-poll budget.
Full-featured ADC_B driver.
void(* ra8_adc_complete_fn_t)(void *ctx, uint16_t result)
Conversion-complete callback.
ra8_adc_resolution_t
ADDOPCRCn.ADPRC per-channel conversion-resolution (data-format) selector.
@ k_ra8_adc_res_12bit
12-bit conversion result (ADPRC = 0b10).
@ k_ra8_adc_res_14bit
14-bit conversion result (ADPRC = 0b01).
@ k_ra8_adc_res_10bit
10-bit conversion result (ADPRC = 0b11).
@ k_ra8_adc_res_16bit
16-bit conversion result (ADPRC = 0b00).
ra8_adc_oversample_t
Per-channel ADADC.AVEMD/ADC oversampling configuration.
@ k_ra8_adc_oversample_off
Single sample, no averaging.
@ k_ra8_adc_oversample_64x
64-sample average.
@ k_ra8_adc_oversample_4x
4-sample average.
@ k_ra8_adc_oversample_16x
16-sample average.
@ k_ra8_adc_status_ie
ADCSR.ADIE.
@ k_ra8_adc_status_busy
ADCSR.ADST (conversion in flight).
ra8_adc_trigger_src_t
Per-scan-group trigger source.
@ k_ra8_adc_trig_src_software
SW kick (default).
@ k_ra8_adc_scan_group_max_channels
Maximum channels per scan group.
ADC16H (16-bit SAR) register layout for the Renesas RA8D2 / RA8P1.
static volatile uint32_t * ra8_adc_b_adcmpmdr(uint8_t which)
Pointer to ADCMPMDR0 / ADCMPMDR1 (compare-table mode select).
@ k_ra8_addopcrc_adprc_12bit
12-bit data.
@ k_ra8_addopcrc_adprc_16bit
16-bit data.
@ k_ra8_addopcrc_adprc_14bit
14-bit data.
@ k_ra8_addopcrc_adprc_10bit
10-bit data.
static volatile uint32_t * ra8_adc_b_addopcrc(uint8_t ch)
Pointer to the per-virtual-channel ADDOPCRC[n] register.
static volatile uint32_t * ra8_adc_b_adclkenr(void)
Pointer to the 32-bit ADCLKENR register.
@ k_ra8_adchcr_mask_cnvcs
[14:8]
@ k_ra8_adchcr_mask_sgsel
[4:0]
static volatile uint32_t * ra8_adc_b_admdr(void)
Pointer to the 32-bit ADMDR register.
@ k_ra8_adstopr_mask_adstop1
[8]
@ k_ra8_adstopr_mask_adstop0
[0]
@ k_ra8_adc_avg_16x
RA8 ADC avg 16x.
@ k_ra8_adc_avg_4x
RA8 ADC avg 4x.
@ k_ra8_adc_avg_64x
RA8 ADC avg 64x.
@ k_ra8_adc_avg_1x
RA8 ADC avg 1x.
@ k_ra8_admdr_mode_continuous
Continuous-scan repeating.
@ k_ra8_admdr_mode_one_cycle
Single-shot scan, one cycle.
static volatile uint32_t * ra8_adc_b_adcmpenr(void)
Pointer to the 32-bit ADCMPENR register (compare-table enable).
@ k_ra8_adchcr_bit_sgsel
Scan group selection.
@ k_ra8_adchcr_bit_cnvcs
Physical channel selection.
static volatile uint32_t * ra8_adc_b_adclkcr(void)
Pointer to the 32-bit ADCLKCR register.
static volatile uint32_t * ra8_adc_b_addopcrb(uint8_t ch)
Pointer to the per-virtual-channel ADDOPCRB[n] register.
@ k_ra8_adcmpmd_inside
Match when low <= data <= high.
@ k_ra8_adclksr_mask_clksr
RA8 adclksr mask clksr.
static volatile uint32_t * ra8_adc_b_adintcr(void)
Pointer to the 32-bit ADINTCR register (per-group scan-end IE).
@ k_ra8_admdr_bit_admd0
ADC0 mode select [3:0].
static volatile uint32_t * ra8_adc_b_addr(uint8_t ch)
Pointer to the per-virtual-channel ADDR[n] result register.
@ k_ra8_adcmpmd_per_reg
Four CMPMDn per ADCMPMDR.
@ k_ra8_adcmpmd_field_step
Stride between CMPMDn fields.
@ k_ra8_adc_b_scan_groups
ADSGER / ADTRGENR / ADSYSTR width [8:0].
@ k_ra8_adc_b_result_regs
ADDR[0..22] result slots.
@ k_ra8_adc_b_max_channels
ADCHCR0..23 virtual-channel config slots.
@ k_ra8_adc_b_cmp_tables
ADCMPTBR0..7 / CMPMD0..7 / CMPENn[7:0].
@ k_ra8_addopcrc_mask_adprc
ADPRC[1:0].
@ k_ra8_addopcrb_bit_cmptblem
RA8 addopcrb bit cmptblem.
@ k_ra8_addopcrb_bit_avemd
RA8 addopcrb bit avemd.
@ k_ra8_addopcrb_bit_adc
RA8 addopcrb bit ADC.
@ k_ra8_addopcrb_mask_adc
[11:8]
@ k_ra8_addopcrb_mask_cmptblem
[23:16]
@ k_ra8_addopcrb_mask_avemd
[1:0]
@ k_ra8_addr_mask_data
[15:0] conversion data.
static volatile uint32_t * ra8_adc_b_adstr(uint8_t group)
Pointer to the per-scan-group ADSTR[n] register.
@ k_ra8_adstr_mask_adst
RA8 adstr mask adst.
@ k_ra8_avemd_off
Disabled (single-sample).
@ k_ra8_avemd_average
Sum then divide by N.
@ k_ra8_adclkenr_mask_clken
RA8 adclkenr mask clken.
static volatile uint32_t * ra8_adc_b_adchcr(uint8_t ch)
Pointer to the per-virtual-channel ADCHCR register.
@ k_ra8_adcmptbr_bit_high
High-side window level [31:16].
@ k_ra8_adcmptbr_bit_low
Low-side window level [15:0].
@ k_ra8_adsr_mask_adact0
RA8 adsr mask adact0.
@ k_ra8_adsr_mask_adact
Either unit busy.
static volatile uint32_t * ra8_adc_b_adtrgenr(void)
Pointer to the 32-bit ADTRGENR register (per-group HW trigger enable).
static volatile uint32_t * ra8_adc_b_adcmptbr(uint8_t table)
Pointer to a per-table ADCMPTBR[n] register (low/high pair).
static volatile uint32_t * ra8_adc_b_adclksr(void)
Pointer to the 32-bit ADCLKSR register.
@ k_ra8_admdr_mask_admd0
ADMD0 [3:0].
@ k_ra8_addopcrc_bit_adprc
Data-format select [17:16].
static volatile uint32_t * ra8_adc_b_adstopr(void)
Pointer to the 32-bit ADSTOPR register (force-stop).
static volatile uint32_t * ra8_adc_b_adsger(void)
Pointer to the 32-bit ADSGER register (scan-group enable).
static volatile uint32_t * ra8_adc_b_adcmpintcr(void)
Pointer to the 32-bit ADCMPINTCR register (compare-match IE).
static volatile uint32_t * ra8_adc_b_adsr(void)
Pointer to the 32-bit ADSR register (status).
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_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_out_of_range
Sensor or peripheral output out of valid range.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ 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.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info(tag, message)
RA8 log info.
#define ra8_log_error(tag, message)
RA8 log error.
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.
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
@ k_ra8_mstp_adc16h
MSTPD21 ADC16H.
Configuration descriptor for ra8_adc_init_configured.
bool scan_mode
True -> continuous scan.
ra8_adc_resolution_t resolution
16 / 14 / 12 / 10 bit.
Per-scan-group channel-list cache.
uint8_t channels[k_ra8_adc_scan_group_max_channels]
Physical channel list.
uint8_t num_channels
0 means group unconfigured.
Configuration for a single scan group.
uint8_t num_channels
1..8.
uint8_t channels[k_ra8_adc_scan_group_max_channels]
Physical-channel list.
ra8_adc_trigger_src_t trigger
Trigger source.
ra8_adc_priority_t priority
Priority class.
Driver-wide runtime state.
bool configured
True after first successful init.
void * ctx
Callback context.
ra8_adc_complete_fn_t fn
Conversion-complete callback or nullptr.
ra8_adc_resolution_t resolution
Last-applied resolution selection.
ra8_adc_group_cache_t groups[k_ra8_adc_b_scan_groups]
Per-group channel cache.