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
46
47#include <stddef.h>
48#include <stdint.h>
49
50#include "ra8_adc.h"
51#include "ra8_board_ek_ra8d2.h"
52#include "ra8_boot_entry.h"
53#include "ra8_cgc.h"
54#include "ra8_err.h"
55#include "ra8_isr.h"
56#include "ra8_mstp.h"
57#include "ra8_time.h"
58#include "ra8_tsn.h"
59
61typedef enum : uint32_t {
62 k_adc_diag_baud = 115200U,
65
73
75typedef enum : uint16_t {
78
85
86/* Console line fragments (kept short so each write is one shift-register
87 * fill; the periodic log is the only output path). */
88static const uint8_t k_adc_diag_mode_prefix[] = "diag: mode=";
89static const uint8_t k_adc_diag_code_sep[] = " code=";
90static const uint8_t k_adc_diag_pass_sfx[] = " PASS\r\n";
91static const uint8_t k_adc_diag_fail_sfx[] = " FAIL\r\n";
92static const uint8_t k_adc_diag_tsn_prefix[] = "tsn: die_mC=";
93static const uint8_t k_adc_diag_vref_prefix[] = "vref: raw=";
94static const uint8_t k_adc_diag_crlf[] = "\r\n";
95static const uint8_t k_adc_diag_verdict_pass[] = "diag: selftest PASS\r\n";
96static const uint8_t k_adc_diag_verdict_fail[] = "diag: selftest FAIL\r\n";
97
105static void adc_diag_panic_halt(void)
106{
107 while (1) {
108 __asm__ volatile("wfi");
109 }
110}
111
123static void adc_diag_write(const uint8_t* data, uint32_t len)
124{
125 (void)ra8_board_uart_console_write(data, (size_t)len);
126}
127
142static uint32_t adc_diag_u32_to_dec(uint8_t* buf, uint32_t val)
143{
144 if (val == 0U) {
145 buf[0] = (uint8_t)'0';
146 return 1U;
147 }
148 uint8_t tmp[k_adc_diag_dec_max];
149 uint32_t n = 0U;
150 uint32_t v = val;
151 while (v != 0U) {
152 tmp[n] = (uint8_t)('0' + (uint8_t)(v % (uint32_t)k_adc_diag_radix));
153 v = v / (uint32_t)k_adc_diag_radix;
154 n++;
155 }
156 for (uint32_t i = 0U; i < n; i++) {
157 buf[i] = tmp[n - 1U - i];
158 }
159 return n;
160}
161
172static void adc_diag_write_u32(uint32_t val)
173{
174 uint8_t buf[k_adc_diag_dec_max];
175 const uint32_t n = adc_diag_u32_to_dec(buf, val);
176 adc_diag_write(buf, n);
177}
178
190static void adc_diag_write_i32(int32_t val)
191{
192 if (val < 0) {
193 const uint8_t minus = (uint8_t)k_adc_diag_minus;
194 adc_diag_write(&minus, 1U);
195 adc_diag_write_u32((uint32_t)(-(int64_t)val));
196 } else {
197 adc_diag_write_u32((uint32_t)val);
198 }
199}
200
214static void adc_diag_emit_mode(uint8_t mode_num, uint16_t code, bool pass)
215{
217 adc_diag_write_u32((uint32_t)mode_num);
218 adc_diag_write(k_adc_diag_code_sep, (uint32_t)(sizeof(k_adc_diag_code_sep) - 1U));
219 adc_diag_write_u32((uint32_t)code);
220 if (pass) {
221 adc_diag_write(k_adc_diag_pass_sfx, (uint32_t)(sizeof(k_adc_diag_pass_sfx) - 1U));
222 } else {
223 adc_diag_write(k_adc_diag_fail_sfx, (uint32_t)(sizeof(k_adc_diag_fail_sfx) - 1U));
224 }
225}
226
239static bool adc_diag_run_cycle(void)
240{
241 bool healthy = true;
242 for (uint32_t i = 0U; i < (uint32_t)k_adc_diag_num_modes; i++) {
243 uint16_t code = 0U;
244 bool pass = false;
245 const ra8_err_t err = ra8_adc_self_diagnose(k_adc_diag_modes[i], &code, &pass);
246 if (err != k_ra8_ok) {
247 healthy = false;
248 pass = false;
249 }
250 if (!pass) {
251 healthy = false;
252 }
253 adc_diag_emit_mode((uint8_t)(i + 1U), code, pass);
254 }
255
256 int32_t milli = 0;
257 const ra8_err_t temp_err = ra8_tsn_read_die_temp_milli_c(&milli);
258 if (temp_err != k_ra8_ok) {
259 healthy = false;
260 }
262 adc_diag_write_i32(milli);
263 adc_diag_write(k_adc_diag_crlf, (uint32_t)(sizeof(k_adc_diag_crlf) - 1U));
264
265 uint16_t vref = 0U;
267 if (vref_err != k_ra8_ok) {
268 healthy = false;
269 }
271 adc_diag_write_u32((uint32_t)vref);
272 adc_diag_write(k_adc_diag_crlf, (uint32_t)(sizeof(k_adc_diag_crlf) - 1U));
273
274 return healthy;
275}
276
286static void adc_diag_setup_or_halt(void)
287{
288 uint32_t cpuclk0_hz = 0U;
289 if (ra8_cgc_init() != k_ra8_ok) {
291 }
294 }
295 if (ra8_mstp_init() != k_ra8_ok) {
297 }
298 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
300 }
303 }
306 }
307}
308
330[[nodiscard]] static ra8_err_t adc_diag_arm(void)
331{
332 const ra8_err_t adc_err = ra8_adc_init();
333 if (adc_err != k_ra8_ok) {
334 return adc_err;
335 }
336 const ra8_tsn_config_t cfg = {
337 .high_ref_degc = k_ra8_tsn_cal_temp_high_125,
338 .low_ref_degc = k_ra8_tsn_cal_temp_low_n40,
339 .stab_us = (uint16_t)k_adc_diag_stab_us,
340 };
341 return ra8_tsn_init(&cfg);
342}
343
344void main(void)
345{
348
349 if (adc_diag_arm() != k_ra8_ok) {
351 }
352
353 while (1) {
354 const bool healthy = adc_diag_run_cycle();
355 if (healthy) {
357 } else {
359 }
361 break;
362 }
364 }
366}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static const uint8_t k_adc_diag_crlf[]
Definition main.c:94
adc_diag_const_t
Demo tunables.
Definition main.c:61
@ k_adc_diag_period_ms
Delay between self-test cycles.
Definition main.c:63
@ k_adc_diag_baud
SCI8 console baud.
Definition main.c:62
static uint32_t adc_diag_u32_to_dec(uint8_t *buf, uint32_t val)
Serialise an unsigned 32-bit value into decimal ASCII.
Definition main.c:142
static void adc_diag_write_i32(int32_t val)
Log one signed 32-bit value (leading minus for negatives).
Definition main.c:190
static const uint8_t k_adc_diag_verdict_pass[]
Definition main.c:95
static const uint8_t k_adc_diag_fail_sfx[]
Definition main.c:91
static const uint8_t k_adc_diag_tsn_prefix[]
Definition main.c:92
adc_diag_tsn_t
TSN factory-trim selection (Tj_max part).
Definition main.c:75
@ k_adc_diag_stab_us
tTSTBL floor, HUM Figure 55.2 p 3502.
Definition main.c:76
static const uint8_t k_adc_diag_verdict_fail[]
Definition main.c:96
static const ra8_adc_selfdiag_mode_t k_adc_diag_modes[k_adc_diag_num_modes]
Ordered list of self-diagnosis modes to sweep each cycle.
Definition main.c:80
static const uint8_t k_adc_diag_code_sep[]
Definition main.c:89
static void adc_diag_write(const uint8_t *data, uint32_t len)
Write a byte span to the SCI8 console, discarding the status.
Definition main.c:123
static void adc_diag_setup_or_halt(void)
Core bring-up: CGC -> MSTP -> TIME -> console + LED.
Definition main.c:286
static void adc_diag_write_u32(uint32_t val)
Log one unsigned 32-bit value as decimal ASCII.
Definition main.c:172
static const uint8_t k_adc_diag_vref_prefix[]
Definition main.c:93
adc_diag_fmt_t
Formatting + iteration constants.
Definition main.c:67
@ k_adc_diag_minus
ASCII minus for signed serialisation.
Definition main.c:71
@ k_adc_diag_num_modes
Self-diagnosis modes 1/2/3.
Definition main.c:68
@ k_adc_diag_dec_max
Max decimal digits for a uint32_t.
Definition main.c:70
@ k_adc_diag_radix
Decimal serialiser radix.
Definition main.c:69
static ra8_err_t adc_diag_arm(void)
Initialise the ADC16H and the temperature sensor.
Definition main.c:330
static void adc_diag_emit_mode(uint8_t mode_num, uint16_t code, bool pass)
Emit one diag: mode=N code=CCCCC PASS|FAIL line.
Definition main.c:214
static const uint8_t k_adc_diag_pass_sfx[]
Definition main.c:90
static bool adc_diag_run_cycle(void)
Run one self-test cycle: 3 self-diagnosis modes + temp + Vref.
Definition main.c:239
static const uint8_t k_adc_diag_mode_prefix[]
Definition main.c:88
static void adc_diag_panic_halt(void)
Park forever after a fatal init error.
Definition main.c:105
Full-featured ADC_B driver.
ra8_err_t ra8_adc_read_internal_channel(ra8_adc_internal_chan_t chan, uint16_t *out_raw)
Blocking single conversion of an internal / extended-analog channel.
@ k_ra8_adc_chan_int_ref_volt
Internal reference voltage.
Definition ra8_adc.h:537
ra8_err_t ra8_adc_self_diagnose(ra8_adc_selfdiag_mode_t mode, uint16_t *out_code, bool *out_pass)
Run an ADC_B built-in self-diagnosis pass on A/D unit 0.
ra8_err_t ra8_adc_init(void)
Legacy init – 14-bit right-aligned, software trigger.
Definition adc.c:323
ra8_adc_selfdiag_mode_t
ADC_B built-in self-diagnosis modes (HUM Ch 53.3.11 p 3411-3414).
Definition ra8_adc.h:516
@ k_ra8_adc_selfdiag_mode_3
Positive full-scale.
Definition ra8_adc.h:519
@ k_ra8_adc_selfdiag_mode_2
Negative full-scale.
Definition ra8_adc.h:518
@ k_ra8_adc_selfdiag_mode_1
Zero-differential reference.
Definition ra8_adc.h:517
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_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
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
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
void ra8_delay_ms(uint32_t ms)
Busy-wait for at least ms milliseconds.
Definition ra8_time.c:129
On-chip Temperature Sensor (TSN) driver.
ra8_err_t ra8_tsn_init(const ra8_tsn_config_t *cfg)
Power on the TSN block and enable its ADC output path.
Definition ra8_tsn.c:149
@ k_ra8_tsn_cal_temp_high_125
125 degC Tj_max parts.
Definition ra8_tsn.h:99
@ k_ra8_tsn_cal_temp_low_n40
Always -40 degC on RA8D2.
Definition ra8_tsn.h:101
ra8_err_t ra8_tsn_read_die_temp_milli_c(int32_t *out_milli_c)
Read the die temperature end-to-end through the HAL.
Definition ra8_tsn.c:249
Configuration descriptor for ra8_tsn_init.
Definition ra8_tsn.h:121