ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1
42
43#include <stdint.h>
44
45#include "ra8_board_ek_ra8d2.h"
46#include "ra8_boot_entry.h"
47#include "ra8_cgc.h"
48#include "ra8_err.h"
49#include "ra8_i2c.h"
50#include "ra8_isr.h"
51#include "ra8_mstp.h"
52#include "ra8_time.h"
53
55typedef enum : uint32_t {
60
69
80typedef struct {
81 uint8_t channel;
82 uint32_t rx_len;
85
87static const uint8_t k_riic_target_msg_armed[] = "riic-target: armed 0x42 poll-dispatch\r\n";
88static const uint8_t k_riic_target_msg_rx[] = "riic-target: write serviced\r\n";
89static const uint8_t k_riic_target_msg_tx[] = "riic-target: read serviced\r\n";
90
98static void riic_target_panic_halt(void)
99{
100 while (1) {
101 __asm__ volatile("wfi");
102 }
103}
104
122{
124 if (ctx == nullptr) {
125 return;
126 }
128 uint32_t got = 0U;
129 (void)ra8_i2c_peripheral_receive(ctx->channel, ctx->rx, (uint32_t)k_riic_target_buf_len, &got);
130 if (got > 0U) {
131 ctx->rx_len = got;
132 }
135 return;
136 }
137 if (event == k_ra8_i2c_peripheral_event_read) {
138 uint32_t sent = 0U;
139 (void)ra8_i2c_peripheral_transmit(ctx->channel, ctx->rx, ctx->rx_len, &sent);
142 }
143}
144
153{
154 uint32_t cpuclk0_hz = 0U;
155 if (ra8_cgc_init() != k_ra8_ok) {
157 }
160 }
161 if (ra8_mstp_init() != k_ra8_ok) {
163 }
164 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
166 }
167}
168
195
211{
212 if (ctx == nullptr) {
213 return k_ra8_err_null_ptr;
214 }
215 const ra8_err_t attached =
217 if (attached != k_ra8_ok) {
218 return attached;
219 }
220 const ra8_i2c_peripheral_cfg_t cfg = {
221 .own_addr_7b = (uint8_t)k_riic_target_own_addr,
223 .general_call = false,
224 .clock_stretch = true,
225 .irq_enable = false, /* polled dispatch, no NVIC wiring */
226 };
227 return ra8_i2c_peripheral_init((uint8_t)k_riic_target_channel, &cfg);
228}
229
239void main(void)
240{
243
244 static riic_target_ctx_t s_ctx = {
245 .channel = (uint8_t)k_riic_target_channel,
246 .rx_len = (uint32_t)k_riic_target_seed_len,
247 .rx = {(uint8_t)k_riic_target_seed_byte},
248 };
249 if (riic_target_arm(&s_ctx) != k_ra8_ok) {
251 }
253 k_ra8_ok) {
255 }
256
257 while (1) {
259 }
260
262}
void main(void)
Secure fallback main entry point.
Definition main.c:37
riic_target_u8_t
8-bit app tunables (channel, own address, buffer, reply).
Definition main.c:62
@ k_riic_target_channel
RIIC ch1 (P512 SCL1 / P511 SDA1).
Definition main.c:63
@ k_riic_target_seed_byte
Seed reply until a write arrives.
Definition main.c:66
@ k_riic_target_own_addr
Our 7-bit own address.
Definition main.c:64
@ k_riic_target_seed_len
Seed reply length.
Definition main.c:67
@ k_riic_target_buf_len
Controller-write capture size.
Definition main.c:65
static const uint8_t k_riic_target_msg_tx[]
Definition main.c:89
static ra8_err_t riic_target_arm(riic_target_ctx_t *ctx)
Arm the RIIC1 target at 0x42 with a clock-stretched callback.
Definition main.c:210
static void riic_target_setup_or_halt(void)
Bring CGC + console + RIIC1 up.
Definition main.c:181
static const uint8_t k_riic_target_msg_rx[]
Definition main.c:88
static void riic_target_on_event(void *vctx, ra8_i2c_peripheral_event_t event)
Address-match callback: service the controller-driven transfer.
Definition main.c:121
static void riic_target_panic_halt(void)
Park forever after a fatal init failure.
Definition main.c:98
static const uint8_t k_riic_target_msg_armed[]
SCI8 status strings emitted per target event.
Definition main.c:87
static void riic_target_clocks_or_halt(void)
Bring CGC + SysTick + MSTP up.
Definition main.c:152
riic_target_u32_t
32-bit app tunables (baud, bus rate).
Definition main.c:55
@ k_riic_target_bus_hz
RIIC1 bus clock (unused here; the board bring-up owns the rate, kept for clarity).
Definition main.c:57
@ k_riic_target_baud
SCI8 console baud.
Definition main.c:56
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_led_toggle(ra8_board_led_id_t led)
Toggle led's output state.
ra8_err_t ra8_board_led_init(ra8_board_led_id_t led)
Configure led as a digital output, initial level low (off).
@ k_ra8_board_led1
LED1, BLUE, P600 (jumper E27).
ra8_err_t ra8_board_io_expander_apply_project_sw4_defaults(void)
Program the U15 I/O expander to apply the project's SW4 layout.
ra8_err_t ra8_board_uart_console_write(const uint8_t *data, size_t len)
Polled blocking write to the J-Link OB VCOM console.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
Boot entry points shared between a vector table and its startup code.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_get_clock_hz(ra8_clock_id_t id, uint32_t *out_hz)
Query the current frequency of a clock-tree domain.
Definition ra8_cgc.c:132
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
Definition ra8_cgc.h:70
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Definition ra8_cgc.c:727
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
I2C Bus Interface (IIC) controller driver – polling mode.
ra8_err_t ra8_i2c_peripheral_transmit(uint8_t channel, const uint8_t *data, uint32_t len, uint32_t *out_sent)
Answer a controller-read transaction from data (target transmit).
ra8_err_t ra8_i2c_peripheral_init(uint8_t channel, const ra8_i2c_peripheral_cfg_t *cfg)
Arm an IIC channel to answer as an I2C target (peripheral).
@ k_ra8_i2c_peripheral_slot_0
Own-address slot 0 (SARL0/SARU0).
Definition ra8_i2c.h:411
void ra8_i2c_peripheral_dispatch(uint8_t channel)
Snapshot the latched target status and fire the attached callback.
ra8_err_t ra8_i2c_peripheral_receive(uint8_t channel, uint8_t *buf, uint32_t capacity, uint32_t *out_received)
Drain a controller-write transaction into buf (target receive).
ra8_i2c_peripheral_event_t
Outcome of ra8_i2c_peripheral_poll / ra8_i2c_peripheral_dispatch.
Definition ra8_i2c.h:431
@ k_ra8_i2c_peripheral_event_write
Controller WRITE: call receive next.
Definition ra8_i2c.h:433
@ k_ra8_i2c_peripheral_event_read
Controller READ: call transmit next.
Definition ra8_i2c.h:434
ra8_err_t ra8_i2c_peripheral_attach_handler(uint8_t channel, ra8_i2c_peripheral_event_fn_t fn, void *ctx)
Attach (or detach) the address-match callback for a channel.
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_init(void)
Re-establish the ra8_mstp ref-count table from current hardware state.
Definition ra8_mstp.c:291
static sdfont_ctx_t s_ctx
Single-shot transport context for the SD bus shim.
Definition ra8_sdfont.c:88
SysTick-based tick counter, delay and timestamp helpers.
ra8_err_t ra8_time_init(uint32_t cpu_hz)
Initialise SysTick for a 1 kHz tick interrupt.
Definition ra8_time.c:59
Configuration descriptor for ra8_i2c_peripheral_init.
Definition ra8_i2c.h:482
Callback context: the channel and the last controller-write payload.
Definition main.c:80
uint32_t rx_len
Bytes captured from the last write (>= 1).
Definition main.c:82
uint8_t channel
RIIC channel the target answers on.
Definition main.c:81
uint8_t rx[k_riic_target_buf_len]
Last controller-write payload (echoed).
Definition main.c:83