|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
Real-Time Clock driver (BCD calendar mode). More...
Go to the source code of this file.
Data Structures | |
| struct | ra8_rtc_datetime_t |
| Calendar date + time decoded from BCD. More... | |
Typedefs | |
| typedef void(* | ra8_rtc_event_fn_t) (void *ctx, uint8_t status_mask) |
| RTC event callback. | |
Enumerations | |
| enum | ra8_rtc_clk_src_t : uint8_t { k_ra8_rtc_clk_subclock = 0U , k_ra8_rtc_clk_loco = 1U } |
| RTC count-source selection (RCR4.RCKSEL encoding). More... | |
| enum | ra8_rtc_irq_mask_t : uint8_t { k_ra8_rtc_irq_none = 0x00U , k_ra8_rtc_irq_alarm = 0x01U , k_ra8_rtc_irq_carry = 0x02U , k_ra8_rtc_irq_periodic = 0x04U } |
| RCR1 IRQ enable bits. More... | |
Functions | |
| ra8_err_t | ra8_rtc_clock_init (ra8_rtc_clk_src_t src) |
| Bring up and select the RTC count source (HUM Fig 26.3). | |
| ra8_err_t | ra8_rtc_init (void) |
| Start the RTC in 24-hour calendar mode. | |
| ra8_err_t | ra8_rtc_set (const ra8_rtc_datetime_t *dt) |
| Write the calendar registers. | |
| ra8_err_t | ra8_rtc_get (ra8_rtc_datetime_t *out) |
| Read the calendar registers. | |
| ra8_err_t | ra8_rtc_set_alarm (const ra8_rtc_datetime_t *alarm) |
| Programme the alarm-match registers (hour/minute/second). | |
| ra8_err_t | ra8_rtc_deinit (void) |
| Tear down the RTC (stop counter + disable IRQs). | |
| ra8_err_t | ra8_rtc_set_irq_enable (uint8_t mask) |
| Enable one or more RTC IRQ sources via RCR1. | |
| ra8_err_t | ra8_rtc_get_status (uint8_t *out_mask) |
| Read RCR1 IRQ enable bits. | |
| ra8_err_t | ra8_rtc_clear_status (uint8_t mask) |
| Clear RCR1 IRQ enable bits. | |
| ra8_err_t | ra8_rtc_attach_handler (ra8_rtc_event_fn_t fn, void *ctx) |
| Attach a callback for the RTC alarm / periodic event. | |
| void | ra8_rtc_dispatch (void) |
| Dispatch an RTC event – snapshot RCR1 + fire callback. | |
| ra8_err_t | ra8_rtc_enter_stop (void) |
| Stop the RTC counter for low-power mode. | |
| ra8_err_t | ra8_rtc_exit_stop (void) |
| Restart the RTC counter from stop. | |
Real-Time Clock driver (BCD calendar mode).
Declares validated BCD calendar configuration and read/write operations for the RA8 real-time clock.
Definition in file ra8_rtc.h.
| typedef void(* ra8_rtc_event_fn_t) (void *ctx, uint8_t status_mask) |
| enum ra8_rtc_clk_src_t : uint8_t |
RTC count-source selection (RCR4.RCKSEL encoding).
The RA8D2 RTC counts on either the 32.768 kHz sub-clock crystal oscillator (SOSC) or the internal LOCO. The numeric values match the RCR4.RCKSEL bit pattern (HUM Ch 26.2.23 "RCR4 : RTC Control Register 4" p 1236), so the enum value can be written directly into RCKSEL.
Prefer k_ra8_rtc_clk_subclock on a board with the 32.768 kHz crystal populated (the EK-RA8D2) for an accurate time base; fall back to k_ra8_rtc_clk_loco on boards without the crystal.
| Enumerator | |
|---|---|
| k_ra8_rtc_clk_subclock | RCKSEL=0: 32.768 kHz sub-clock crystal (SOSC). |
| k_ra8_rtc_clk_loco | RCKSEL=1: internal LOCO (~32.768 kHz, crystal-free). |
| enum ra8_rtc_irq_mask_t : uint8_t |
|
nodiscard |
Attach a callback for the RTC alarm / periodic event.
Definition at line 520 of file ra8_rtc.c.
References k_ra8_ok, and s_rtc_state.
|
nodiscard |
Clear RCR1 IRQ enable bits.
Definition at line 513 of file ra8_rtc.c.
References k_ra8_ok, k_ra8_rtc_irq_all, ra8_rtc(), and r_rtc_regs_t::RCR1.
Referenced by main().
|
nodiscard |
Bring up and select the RTC count source (HUM Fig 26.3).
The RTC counter does not advance until a count clock is both running and selected. This routine performs the "Clock and Count Mode Setting Procedure" of HUM Ch 26.3.2 (Figure 26.3, p 1243):
Call this once at power-on, BEFORE ra8_rtc_init(): it leaves the RTC stopped with its count source running and selected, ready for the 24-hour-calendar bring-up that ra8_rtc_init() finishes.
| [in] | src | Count source to bring up and select (k_ra8_rtc_clk_subclock or k_ra8_rtc_clk_loco). |
| k_ra8_ok | Count source running, selected, RTC reset. |
| k_ra8_err_invalid_arg | src is not a valid ra8_rtc_clk_src_t. |
| k_ra8_err_hw_init_failed | The selected oscillator did not leave its stop state (stop bit still set after enable). |
src and the RTC has been software-reset with its prescaler stopped (RCR2.START = 0).Definition at line 260 of file ra8_rtc.c.
References internal_start_count_source(), internal_wait_bit(), k_ra8_err_invalid_arg, k_ra8_ok, k_ra8_rcr2_bit_reset, k_ra8_rcr2_bit_start, k_ra8_rtc_clk_loco, k_ra8_rtc_clk_reset_ms, k_ra8_rtc_clk_six_clocks_ms, k_ra8_rtc_rfrh_cold, k_ra8_rtc_rfrl_32768, ra8_delay_ms(), ra8_log_error, ra8_log_info_val, ra8_rtc(), r_rtc_regs_t::RCR2, r_rtc_regs_t::RCR4, r_rtc_regs_t::RFRH, r_rtc_regs_t::RFRL, and s_tag.
Referenced by internal_rtc_demo_setup_or_halt().
|
nodiscard |
Tear down the RTC (stop counter + disable IRQs).
Definition at line 486 of file ra8_rtc.c.
References k_ra8_ok, ra8_rtc(), r_rtc_regs_t::RCR1, r_rtc_regs_t::RCR2, and s_rtc_state.
| void ra8_rtc_dispatch | ( | void | ) |
Dispatch an RTC event – snapshot RCR1 + fire callback.
Reads RTC.RCR1 (HUM Ch 25.2.18 "RCR1 : RTC Control Register 1", p ~1097) to capture which interrupt flag (alarm AIE, carry CIE, or periodic PIE) is asserted, clears the captured bits, and invokes the handler installed via ra8_rtc_attach_handler() with the snapshot mask. Silently returns if no handler is installed.
Definition at line 527 of file ra8_rtc.c.
References k_ra8_rtc_irq_all, ra8_rtc(), and s_rtc_state.
|
nodiscard |
Stop the RTC counter for low-power mode.
Definition at line 537 of file ra8_rtc.c.
References internal_wait_bit(), k_ra8_ok, k_ra8_rcr2_bit_start, ra8_rtc(), and r_rtc_regs_t::RCR2.
|
nodiscard |
Restart the RTC counter from stop.
Definition at line 546 of file ra8_rtc.c.
References internal_wait_bit(), k_ra8_ok, k_ra8_rcr2_bit_start, ra8_rtc(), and r_rtc_regs_t::RCR2.
|
nodiscard |
Read the calendar registers.
| [out] | out | Receive buffer. |
Definition at line 385 of file ra8_rtc.c.
References ra8_rtc_datetime_t::day, ra8_rtc_datetime_t::hour, internal_bcd_to_bin(), k_ra8_ok, k_ra8_rtc_year_base, ra8_rtc_datetime_t::minute, ra8_rtc_datetime_t::month, RA8_CHECK_NULL_PTR, ra8_rtc(), r_rtc_regs_t::RDAYCNT, r_rtc_regs_t::RHRCNT, r_rtc_regs_t::RMINCNT, r_rtc_regs_t::RMONCNT, r_rtc_regs_t::RSECCNT, r_rtc_regs_t::RWKCNT, r_rtc_regs_t::RYRCNT, s_tag, ra8_rtc_datetime_t::second, ra8_rtc_datetime_t::weekday, and ra8_rtc_datetime_t::year.
Referenced by main().
|
nodiscard |
Read RCR1 IRQ enable bits.
Definition at line 506 of file ra8_rtc.c.
References k_ra8_ok, k_ra8_rtc_irq_all, RA8_CHECK_NULL_PTR, ra8_rtc(), and s_tag.
Referenced by main().
|
nodiscard |
Start the RTC in 24-hour calendar mode.
Definition at line 308 of file ra8_rtc.c.
References internal_wait_bit(), k_ra8_ok, k_ra8_rcr2_bit_cntmd, k_ra8_rcr2_bit_hr24, k_ra8_rcr2_bit_start, k_ra8_rtc_byte_mask_all, ra8_log_info, ra8_rtc(), r_rtc_regs_t::RCR1, r_rtc_regs_t::RCR2, and s_tag.
Referenced by internal_lpm_dpsby1_setup_or_halt(), internal_lpm_dpsby2_setup_or_halt(), internal_lpm_dpsby3_setup_or_halt(), internal_lpm_swstd_setup_or_halt(), and internal_rtc_demo_setup_or_halt().
|
nodiscard |
Write the calendar registers.
| [in] | dt | Date/time to install (BCD-encoded internally). |
Definition at line 343 of file ra8_rtc.c.
References ra8_rtc_datetime_t::day, ra8_rtc_datetime_t::hour, internal_bin_to_bcd(), internal_wait_bit(), k_ra8_err_invalid_arg, k_ra8_ok, k_ra8_rcr2_bit_start, k_ra8_rtc_year_base, ra8_rtc_datetime_t::minute, ra8_rtc_datetime_t::month, RA8_CHECK_NULL_PTR, ra8_log_info_val, ra8_rtc(), r_rtc_regs_t::RCR2, r_rtc_regs_t::RDAYCNT, r_rtc_regs_t::RHRCNT, r_rtc_regs_t::RMINCNT, r_rtc_regs_t::RMONCNT, r_rtc_regs_t::RSECCNT, r_rtc_regs_t::RWKCNT, r_rtc_regs_t::RYRCNT, s_tag, ra8_rtc_datetime_t::second, ra8_rtc_datetime_t::weekday, and ra8_rtc_datetime_t::year.
Referenced by internal_lpm_dpsby1_setup_or_halt(), internal_lpm_dpsby2_setup_or_halt(), internal_lpm_dpsby3_setup_or_halt(), internal_lpm_swstd_setup_or_halt(), and internal_rtc_demo_setup_or_halt().
|
nodiscard |
Programme the alarm-match registers (hour/minute/second).
Writes RSECAR / RMINAR / RHRAR with the BCD-encoded match values from alarm and sets each register's ENB bit (bit 7) so the field participates in the match. Day, month, year, weekday alarm registers are wildcarded (ENB cleared) so the alarm fires on the next time-of-day match within the current day.
Caller is responsible for enabling RCR1.AIE via ra8_rtc_set_irq_enable(k_ra8_rtc_irq_alarm) after this call.
| [in] | alarm | Hour/minute/second to match. year and month fields are ignored. Must not be NULL. |
| k_ra8_ok | Alarm registers written. |
| k_ra8_err_null_ptr | alarm is NULL. |
| k_ra8_err_invalid_arg | alarm->hour > 23 or alarm->minute > 59 or alarm->second > 59. |
Programme the alarm-match registers (hour/minute/second).
Writes the BCD-encoded second / minute / hour into RSECAR / RMINAR / RHRAR with their ENB bits set, and clears every other AR register's ENB so the alarm matches purely on time-of-day.
| [in] | alarm | See header. |
| k_ra8_ok | Alarm written. |
| k_ra8_err_null_ptr | alarm is NULL. |
| k_ra8_err_invalid_arg | Out-of-range hour/min/sec. |
Definition at line 437 of file ra8_rtc.c.
References ra8_rtc_datetime_t::hour, internal_bin_to_bcd(), k_ra8_err_invalid_arg, k_ra8_ok, k_ra8_rtc_alarm_enb_bit, k_ra8_rtc_alarm_max_hr, k_ra8_rtc_alarm_max_min, k_ra8_rtc_alarm_max_sec, ra8_rtc_datetime_t::minute, RA8_CHECK_NULL_PTR, ra8_rtc(), r_rtc_regs_t::RDAYAR, r_rtc_regs_t::RHRAR, r_rtc_regs_t::RMINAR, r_rtc_regs_t::RMONAR, r_rtc_regs_t::RSECAR, r_rtc_regs_t::RWKAR, r_rtc_regs_t::RYRAR, r_rtc_regs_t::RYRAREN, s_tag, and ra8_rtc_datetime_t::second.
Referenced by internal_lpm_dpsby1_arm_wake(), internal_lpm_dpsby2_arm_wake(), internal_lpm_dpsby3_arm_wake(), internal_lpm_swstd_arm_wake(), and internal_rtc_demo_arm_alarm().
|
nodiscard |
Enable one or more RTC IRQ sources via RCR1.
Definition at line 498 of file ra8_rtc.c.
References k_ra8_ok, k_ra8_rtc_irq_all, ra8_rtc(), and r_rtc_regs_t::RCR1.
Referenced by internal_lpm_dpsby1_arm_wake(), internal_lpm_dpsby2_arm_wake(), internal_lpm_dpsby3_arm_wake(), internal_lpm_swstd_arm_wake(), and internal_rtc_demo_arm_alarm().