ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
usb_selftest_console.c
Go to the documentation of this file.
1
14
16
17#include <stdint.h>
18
19#include "ra8_board_ek_ra8d2.h"
20#include "ra8_err.h"
21#include "usb_selftest_common.h"
22
23static uint8_t selftest_nibble_to_hex(uint32_t nibble)
24{
25 if (nibble < k_selftest_hex_digit_split) {
26 return (uint8_t)((uint8_t)'0' + (uint8_t)nibble);
27 }
28 return (uint8_t)((uint8_t)'A' + (uint8_t)nibble - (uint8_t)k_selftest_hex_digit_split);
29}
30
49static uint32_t selftest_str_len(const char* text)
50{
51 uint32_t len = 0U;
52 while (len < (uint32_t)k_selftest_print_cap) {
53 if (text[len] == '\0') {
54 break;
55 }
56 len++;
57 }
58 return len;
59}
60
80[[nodiscard]] static ra8_err_t selftest_sci_write(const uint8_t* data, uint32_t len)
81{
82 return ra8_board_uart_console_write(data, (size_t)len);
83}
84
103[[nodiscard]] ra8_err_t selftest_print(const char* text)
104{
105 return selftest_sci_write((const uint8_t*)text, selftest_str_len(text));
106}
107
126[[nodiscard]] ra8_err_t selftest_print_dec(uint32_t value)
127{
128 uint8_t scratch[k_selftest_dec_chars_u32] = {};
129 uint8_t out[k_selftest_dec_chars_u32] = {};
130 uint8_t count = 0U;
131 uint32_t v = value;
132 if (v == 0U) {
133 out[0] = (uint8_t)'0';
134 return selftest_sci_write(out, 1U);
135 }
136 while (v != 0U) {
137 if (count >= (uint8_t)k_selftest_dec_chars_u32) {
138 break;
139 }
140 scratch[count] = (uint8_t)((uint8_t)'0' + (uint8_t)(v % k_selftest_dec_radix));
141 v = v / k_selftest_dec_radix;
142 count++;
143 }
144 for (uint8_t i = 0U; i < count; i++) {
145 out[i] = scratch[count - 1U - i];
146 }
147 return selftest_sci_write(out, (uint32_t)count);
148}
149
169[[nodiscard]] ra8_err_t selftest_print_hex(uint32_t value, uint8_t digits)
170{
171 uint8_t out[k_selftest_hex_chars_u32] = {};
172 uint8_t width = digits;
173 if (width > (uint8_t)k_selftest_hex_chars_u32) {
174 width = (uint8_t)k_selftest_hex_chars_u32;
175 }
176 for (uint8_t i = 0U; i < width; i++) {
177 const uint8_t shift = (uint8_t)((width - 1U - i) * k_selftest_nibble_bits);
178 out[i] = selftest_nibble_to_hex((value >> shift) & k_selftest_nibble_mask);
179 }
180 return selftest_sci_write(out, (uint32_t)width);
181}
182
203[[nodiscard]] ra8_err_t selftest_print_fail(const char* what, ra8_err_t err)
204{
205 ra8_err_t e = selftest_print("ra8d2 selftest: FAIL ");
206 if (e != k_ra8_ok) {
207 return e;
208 }
209 e = selftest_print(what);
210 if (e != k_ra8_ok) {
211 return e;
212 }
213 e = selftest_print(" err=0x");
214 if (e != k_ra8_ok) {
215 return e;
216 }
217 e = selftest_print_hex((uint32_t)err, (uint8_t)k_selftest_hex_chars_u32);
218 if (e != k_ra8_ok) {
219 return e;
220 }
221 return selftest_print("\r\n");
222}
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.
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
@ k_selftest_hex_digit_split
Threshold between '0-9'/'A-F'.
@ k_selftest_dec_chars_u32
Max digits for a 32-bit count.
@ k_selftest_hex_chars_u32
32-bit value -> "ABCDEF01".
@ k_selftest_nibble_bits
Bits per hex nibble.
@ k_selftest_dec_radix
Base for decimal conversion.
@ k_selftest_nibble_mask
4-bit nibble mask.
@ k_selftest_print_cap
Bound for console-string scans.
Shared constants for the usb_selftest_soak translation units.
ra8_err_t selftest_print_hex(uint32_t value, uint8_t digits)
Print a value as fixed-width uppercase hex.
static uint32_t selftest_str_len(const char *text)
Bounded ASCII string length (cap k_selftest_print_cap).
static uint8_t selftest_nibble_to_hex(uint32_t nibble)
ra8_err_t selftest_print_fail(const char *what, ra8_err_t err)
Print "FAIL <what> err=0xNNNNNNNN" on its own line.
static ra8_err_t selftest_sci_write(const uint8_t *data, uint32_t len)
Push a literal block over SCI8 polled.
ra8_err_t selftest_print(const char *text)
Print a NUL-terminated ASCII string over the console.
ra8_err_t selftest_print_dec(uint32_t value)
Print a uint32_t as ASCII decimal.
Shared SCI8 console + text formatters for the soak self-test.