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
41
42#include <stddef.h>
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_eth.h"
50#include "ra8_eth_coma.h"
51#include "ra8_isr.h"
52#include "ra8_mstp.h"
53#include "ra8_mstp_regs.h"
54#include "ra8_time.h"
55
57typedef enum : uint32_t {
58 k_ehb_baud = 115200U,
60
62typedef enum : uint8_t {
65} ehb_fmt_t;
66
67/* Console line fragments (short so each write is one shift-register fill). */
68static const uint8_t k_ehb_msg_boot[] = "eth-hal: boot\r\n";
69static const uint8_t k_ehb_msg_eswclk[] = "eth-hal: eswclk_init rc=";
70static const uint8_t k_ehb_msg_mstp[] = "eth-hal: mstp_eswm rc=";
71static const uint8_t k_ehb_msg_coma[] = "eth-hal: coma_bringup rc=";
72static const uint8_t k_ehb_msg_rgmii[] = "eth-hal: rgmii_select rc=";
73static const uint8_t k_ehb_msg_pass[] = "eth-hal: bringup PASS\r\n";
74static const uint8_t k_ehb_msg_fail[] = "eth-hal: bringup FAIL\r\n";
75static const uint8_t k_ehb_msg_hw_fail[] = "eth-hal: hw_init_failed\r\n";
76static const uint8_t k_ehb_msg_crlf[] = "\r\n";
77
92static void ehb_write(const uint8_t* data, uint32_t len)
93{
94 (void)ra8_board_uart_console_write(data, (size_t)len);
95}
96
113static void ehb_write_u32_line(uint32_t val)
114{
115 uint8_t buf[k_ehb_dec_u32_max];
116 uint32_t n = 0U;
117 if (val == 0U) {
118 buf[n] = (uint8_t)'0';
119 n++;
120 }
121 while ((val > 0U) && (n < (uint32_t)k_ehb_dec_u32_max)) {
122 buf[n] = (uint8_t)((uint32_t)'0' + (val % (uint32_t)k_ehb_radix));
123 n++;
124 val /= (uint32_t)k_ehb_radix;
125 }
126 for (uint32_t i = 0U; i < n; i++) {
127 ehb_write(&buf[n - 1U - i], 1U);
128 }
129 ehb_write(k_ehb_msg_crlf, (uint32_t)sizeof(k_ehb_msg_crlf) - 1U);
130}
131
146[[noreturn]] static void ehb_panic_halt(void)
147{
148 ehb_write(k_ehb_msg_hw_fail, (uint32_t)sizeof(k_ehb_msg_hw_fail) - 1U);
149 while (1) {
150 __asm__ volatile("wfi");
151 }
152}
153
169static void ehb_setup_or_halt(void)
170{
171 uint32_t cpuclk0_hz = 0U;
172 if (ra8_cgc_init() != k_ra8_ok) {
174 }
177 }
178 if (ra8_mstp_init() != k_ra8_ok) {
180 }
181 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
183 }
186 }
187}
188
218[[nodiscard]] static ra8_err_t ehb_run_once(void)
219{
221 ehb_write(k_ehb_msg_eswclk, (uint32_t)sizeof(k_ehb_msg_eswclk) - 1U);
222 ehb_write_u32_line((uint32_t)rc);
223 if (rc != k_ra8_ok) {
224 return rc;
225 }
226
228 ehb_write(k_ehb_msg_mstp, (uint32_t)sizeof(k_ehb_msg_mstp) - 1U);
229 ehb_write_u32_line((uint32_t)rc);
230 if (rc != k_ra8_ok) {
231 return rc;
232 }
233
235 ehb_write(k_ehb_msg_coma, (uint32_t)sizeof(k_ehb_msg_coma) - 1U);
236 ehb_write_u32_line((uint32_t)rc);
237 if (rc != k_ra8_ok) {
238 return rc;
239 }
240
242 ehb_write(k_ehb_msg_rgmii, (uint32_t)sizeof(k_ehb_msg_rgmii) - 1U);
243 ehb_write_u32_line((uint32_t)rc);
244 return rc;
245}
246
247void main(void)
248{
251
252 ehb_write(k_ehb_msg_boot, (uint32_t)sizeof(k_ehb_msg_boot) - 1U);
253
254 if (ehb_run_once() != k_ra8_ok) {
255 ehb_write(k_ehb_msg_fail, (uint32_t)sizeof(k_ehb_msg_fail) - 1U);
256 } else {
257 ehb_write(k_ehb_msg_pass, (uint32_t)sizeof(k_ehb_msg_pass) - 1U);
258 }
259
260 while (1) {
261 __asm__ volatile("wfi");
262 }
263}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static ra8_err_t ehb_run_once(void)
Drive the ESWCLK + ESWM prerequisites, then the two ETH HAL primitives.
Definition main.c:218
static const uint8_t k_ehb_msg_mstp[]
Definition main.c:70
static void ehb_write_u32_line(uint32_t val)
Log one unsigned 32-bit value as decimal ASCII plus CRLF.
Definition main.c:113
static const uint8_t k_ehb_msg_crlf[]
Definition main.c:76
static void ehb_panic_halt(void)
Print the negative banner and park the CPU.
Definition main.c:146
static const uint8_t k_ehb_msg_pass[]
Definition main.c:73
static const uint8_t k_ehb_msg_fail[]
Definition main.c:74
static const uint8_t k_ehb_msg_boot[]
Definition main.c:68
static void ehb_write(const uint8_t *data, uint32_t len)
Write a byte span to the SCI8 console, discarding the status.
Definition main.c:92
ehb_fmt_t
Decimal-serialiser fields.
Definition main.c:62
@ k_ehb_radix
Decimal serialiser radix.
Definition main.c:63
@ k_ehb_dec_u32_max
Max decimal digits for a uint32_t.
Definition main.c:64
static const uint8_t k_ehb_msg_coma[]
Definition main.c:71
static const uint8_t k_ehb_msg_rgmii[]
Definition main.c:72
static const uint8_t k_ehb_msg_eswclk[]
Definition main.c:69
static const uint8_t k_ehb_msg_hw_fail[]
Definition main.c:75
static void ehb_setup_or_halt(void)
Bring up clocks, MSTP, SysTick and the SCI8 console; halt on failure.
Definition main.c:169
ehb_const_t
Console + demo knobs (no magic numbers).
Definition main.c:57
@ k_ehb_baud
SCI8 J-Link VCOM console baud.
Definition main.c:58
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
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
ra8_err_t ra8_cgc_eswclk_init(void)
Bring up the Ethernet Switch Module (ESWM / RMAC) clock.
@ 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
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Ethernet Switch Module (ESWM) + frame TX/RX driver.
@ k_ra8_eth_mii_port_1
ESWM media port 1 (RMAC1 / ETHA1).
Definition ra8_eth.h:139
ra8_err_t ra8_eth_rgmii_select(ra8_eth_mii_port_t port)
Select RGMII on a port's ESWM media-interface mux and enable it.
Ethernet Common Agent (COMA) driver.
ra8_err_t ra8_eth_coma_bringup(void)
Bring the COMA switch out of reset, init the buffer pool, and fan every per-agent clock out.
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_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
Definition ra8_mstp.c:343
ra8_err_t ra8_mstp_init(void)
Re-establish the ra8_mstp ref-count table from current hardware state.
Definition ra8_mstp.c:291
Module Stop Control (MSTP) register layout for the Renesas RA8D2.
@ k_ra8_mstp_eswm
MSTPC30 ESWM.
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