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
35
36#include <stddef.h>
37#include <stdint.h>
38
39#include "ra8_board_ek_ra8d2.h"
40#include "ra8_boot_entry.h"
41#include "ra8_bscan.h"
42#include "ra8_bscan_regs.h"
43#include "ra8_cgc.h"
44#include "ra8_err.h"
45#include "ra8_isr.h"
46#include "ra8_mstp.h"
47#include "ra8_time.h"
48
61
62static const uint8_t k_msg_boot[] = "bscan-selftest: boot\r\n";
63static const uint8_t k_msg_fail[] = "bscan-selftest: FAIL init\r\n";
64static const uint8_t k_msg_chk[] = "bscan-selftest: FAIL check\r\n";
65static const uint8_t k_msg_pre[] = "bscan: idcode=";
66static const uint8_t k_msg_mid[] = " checks=";
67static const uint8_t k_msg_ok[] = " PASS\r\n";
68
70static void bs_print(const uint8_t* msg, uint32_t len)
71{
72 (void)ra8_board_uart_console_write(msg, (size_t)len);
73}
74
76static void bs_panic_halt(const uint8_t* msg, uint32_t len)
77{
78 bs_print(msg, len);
79 __asm__ volatile("bkpt #0");
80 while (1) {
81 __asm__ volatile("wfi");
82 }
83}
84
86static void bs_require(bool ok)
87{
88 if (!ok) {
89 bs_panic_halt(k_msg_chk, (uint32_t)sizeof(k_msg_chk) - 1U);
90 }
91}
92
94static void bs_print_hex(uint32_t value)
95{
96 uint8_t buf[k_bs_hex_nibbles];
97 for (uint32_t i = 0U; i < (uint32_t)k_bs_hex_nibbles; i++) {
98 const uint32_t shift = ((uint32_t)k_bs_hex_nibbles - 1U - i) * (uint32_t)k_bs_nibble_bits;
99 const uint32_t nib = (value >> shift) & (uint32_t)k_bs_nibble_mask;
100 buf[i] = (uint8_t)((nib < (uint32_t)k_bs_dec_ten) ? ('0' + nib) : ('A' + (nib - k_bs_dec_ten)));
101 }
102 bs_print(buf, (uint32_t)k_bs_hex_nibbles);
103}
104
106static void bs_print_uint(uint32_t value)
107{
108 uint8_t buf[k_bs_dec_ten];
109 uint32_t n = 0U;
110 if (value == 0U) {
111 buf[n] = '0';
112 n++;
113 }
114 while ((value > 0U) && (n < (uint32_t)k_bs_dec_ten)) {
115 buf[n] = (uint8_t)('0' + (value % (uint32_t)k_bs_dec_ten));
116 n++;
117 value /= (uint32_t)k_bs_dec_ten;
118 }
119 for (uint32_t i = 0U; i < n; i++) {
120 bs_print(&buf[n - 1U - i], 1U);
121 }
122}
123
136static uint32_t bs_run_checks(uint32_t* out_idcode)
137{
138 uint32_t id = 0U;
139 ra8_bscan_status_t st = {};
140
141 bs_require(out_idcode != nullptr); /* 1 */
142 bs_require(ra8_bscan_init() == k_ra8_ok); /* 2 */
145 bs_require(id == (uint32_t)k_ra8_bscan_jtidr_reset); /* 5 */
148 bs_require(st.initialized && (st.expected_idcode == (uint32_t)k_ra8_bscan_jtidr_reset)); /* 8 */
151 bs_require(ra8_bscan_get_status(&st) == k_ra8_ok); /* 11 */
154 k_ra8_err_invalid_arg); /* 13 */
157 bs_require(ra8_bscan_get_status(&st) == k_ra8_ok); /* 16 */
159
160 *out_idcode = id;
161 return (uint32_t)k_bs_checks_total;
162}
163
165static void bs_setup_or_halt(void)
166{
167 uint32_t cpuclk0_hz = 0U;
168 if ((ra8_cgc_init() != k_ra8_ok) || (ra8_mstp_init() != k_ra8_ok)) {
169 bs_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
170 }
172 bs_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
173 }
174 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
175 bs_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
176 }
178 bs_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
179 }
180}
181
190void main(void)
191{
194 bs_print(k_msg_boot, (uint32_t)sizeof(k_msg_boot) - 1U);
195
196 uint32_t idcode = 0U;
197 const uint32_t checks = bs_run_checks(&idcode);
198
199 bs_print(k_msg_pre, (uint32_t)sizeof(k_msg_pre) - 1U);
200 bs_print_hex(idcode);
201 bs_print(k_msg_mid, (uint32_t)sizeof(k_msg_mid) - 1U);
202 bs_print_uint(checks);
203 bs_print(k_msg_ok, (uint32_t)sizeof(k_msg_ok) - 1U);
204
205 while (1) {
206 __asm__ volatile("wfi");
207 }
208}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static const uint8_t k_msg_pre[]
Definition main.c:151
static const uint8_t k_msg_ok[]
Definition main.c:153
static const uint8_t k_msg_boot[]
Definition main.c:140
static const uint8_t k_msg_fail[]
Definition main.c:63
static const uint8_t k_msg_mid[]
Definition main.c:93
static void bs_require(bool ok)
Self-check assertion: halt on the FAIL-check banner if ok is false.
Definition main.c:86
static void bs_print(const uint8_t *msg, uint32_t len)
Emit a byte run on the SCI8 console.
Definition main.c:70
static void bs_setup_or_halt(void)
Bring up clocks/MSTP/time + the SCI8 console; halt on failure.
Definition main.c:165
static void bs_print_uint(uint32_t value)
Print a small unsigned integer in decimal.
Definition main.c:106
static const uint8_t k_msg_chk[]
Definition main.c:64
static void bs_print_hex(uint32_t value)
Print a 32-bit value as 8 upper-case hex digits.
Definition main.c:94
bs_consts_t
Console / self-check knobs (no magic numbers).
Definition main.c:50
@ k_bs_uart_baud
Console baud.
Definition main.c:51
@ k_bs_hex_nibbles
Hex digits in a 32-bit value.
Definition main.c:56
@ k_bs_dec_ten
Hex digit / decimal split.
Definition main.c:59
@ k_bs_checks_total
Count of self-checks below.
Definition main.c:55
@ k_bs_nibble_bits
Bits per hex nibble.
Definition main.c:57
@ k_bs_clear_none
Legal clear mask (the only one).
Definition main.c:53
@ k_bs_reserved_op
A reserved JTIR opcode (HUM 50.2.1).
Definition main.c:52
@ k_bs_bad_mask
Illegal non-zero clear mask.
Definition main.c:54
@ k_bs_nibble_mask
Low-nibble mask.
Definition main.c:58
static void bs_panic_halt(const uint8_t *msg, uint32_t len)
Print the fail banner and trap (ra8_emulator halts on the BKPT).
Definition main.c:76
static uint32_t bs_run_checks(uint32_t *out_idcode)
Run the full ra8_bscan CPU-side contract; halt on any failure.
Definition main.c:136
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.
JTAG / IEEE-1149.1 Boundary Scan TAP HAL surface.
ra8_err_t ra8_bscan_get_status(ra8_bscan_status_t *out)
Get a snapshot of the driver's TAP bookkeeping state.
Definition ra8_bscan.c:147
ra8_err_t ra8_bscan_clear_status(uint32_t mask)
Clear the recorded last-instruction state (no hardware effect).
Definition ra8_bscan.c:159
ra8_err_t ra8_bscan_set_instruction(ra8_bscan_instr_t instr)
Record the JTIR opcode the external fixture is currently driving.
Definition ra8_bscan.c:174
ra8_err_t ra8_bscan_init(void)
Initialise the firmware-side TAP bookkeeping object.
Definition ra8_bscan.c:110
ra8_err_t ra8_bscan_get_idcode(uint32_t *out)
Get the chip's hardwired JTIDR device ID code.
Definition ra8_bscan.c:134
JTAG / IEEE-1149.1 Boundary Scan TAP constants for the RA8D2.
@ k_ra8_bscan_jtidr_reset
JTIDR fixed device ID.
ra8_bscan_instr_t
JTIR Test Bit Set (TS[3:0]) command codes.
@ k_ra8_bscan_instr_idcode
Read JTIDR (Renesas code).
@ k_ra8_bscan_instr_bypass
Bypass register selected.
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_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
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
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
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
Snapshot of the firmware-side TAP bookkeeping object.
Definition ra8_bscan.h:95
uint32_t expected_idcode
JTIDR value the fixture should observe.
Definition ra8_bscan.h:98
ra8_bscan_instr_t last_instruction
Last JTIR opcode reported by the fixture.
Definition ra8_bscan.h:97
bool initialized
True once ra8_bscan_init ran.
Definition ra8_bscan.h:96