ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
c6_wifi_console.c
Go to the documentation of this file.
1
24
25#include <stddef.h>
26#include <stdint.h>
27
28#include "c6_wifi.h"
29#include "ra8_board_ek_ra8d2.h"
30#include "ra8_c6link.h"
31
46typedef enum : uint8_t {
51
52void c6_wifi_puts(const char* text)
53{
54 if (text == nullptr) {
55 return;
56 }
57 uint32_t len = 0U;
58 while ((len < (uint32_t)k_c6_wifi_str_max) && (text[len] != '\0')) {
59 len++;
60 }
61 (void)ra8_board_uart_console_write((const uint8_t*)text, (size_t)len);
62}
63
65void c6_wifi_put_u32(uint32_t value)
66{
67 uint8_t digits[k_c6_wifi_dec_digits] = {};
68 uint32_t count = 0U;
69 uint32_t rest = value;
70 do {
71 digits[count] = (uint8_t)('0' + (uint8_t)(rest % (uint32_t)k_c6_wifi_dec_radix));
72 rest = rest / (uint32_t)k_c6_wifi_dec_radix;
73 count++;
74 } while ((rest != 0U) && (count < (uint32_t)k_c6_wifi_dec_digits));
75
76 uint8_t out[k_c6_wifi_dec_digits] = {};
77 for (uint32_t i = 0U; i < count; i++) {
78 out[i] = digits[count - 1U - i];
79 }
80 (void)ra8_board_uart_console_write(out, (size_t)count);
81}
82
84void c6_wifi_put_i32(int32_t value)
85{
86 uint32_t magnitude = (uint32_t)value;
87 if (value < 0) {
88 c6_wifi_puts("-");
89 magnitude = ~(uint32_t)value + 1U;
90 }
91 c6_wifi_put_u32(magnitude);
92}
93
94void c6_wifi_put_hex(uint32_t value, uint8_t digits)
95{
96 if ((digits == 0U) || (digits > (uint8_t)k_c6_wifi_hex_digits)) {
97 return;
98 }
99 uint8_t out[k_c6_wifi_hex_digits] = {};
100 for (uint8_t i = 0U; i < digits; i++) {
101 const uint8_t shift = (uint8_t)((digits - 1U - i) * (uint8_t)k_c6_wifi_hex_bits);
102 const uint8_t nibble = (uint8_t)((value >> shift) & (uint32_t)k_c6_wifi_hex_mask);
103 out[i] = (nibble < (uint8_t)k_c6_wifi_hex_alpha)
104 ? (uint8_t)('0' + nibble)
105 : (uint8_t)('a' + (uint8_t)(nibble - (uint8_t)k_c6_wifi_hex_alpha));
106 }
107 (void)ra8_board_uart_console_write(out, (size_t)digits);
108}
109
111void c6_wifi_put_text(const char* text, size_t len)
112{
113 if ((text == nullptr) || (len == 0U)) {
114 return;
115 }
116 const size_t take = (len < (size_t)k_c6_wifi_text_max) ? len : (size_t)k_c6_wifi_text_max;
117 uint8_t out[k_c6_wifi_text_max] = {};
118 for (size_t i = 0U; i < take; i++) {
119 const uint8_t byte = (uint8_t)text[i];
120 const bool printable =
121 (byte >= (uint8_t)k_c6_wifi_ascii_low) && (byte <= (uint8_t)k_c6_wifi_ascii_high);
122 out[i] = printable ? byte : (uint8_t)k_c6_wifi_ascii_sub;
123 }
124 (void)ra8_board_uart_console_write(out, take);
125}
126
128{
129 if (mac == nullptr) {
130 return;
131 }
132 for (uint8_t i = 0U; i < (uint8_t)k_ra8_c6link_mac_bytes; i++) {
133 if (i != 0U) {
134 c6_wifi_puts(":");
135 }
136 c6_wifi_put_hex((uint32_t)mac->octet[i], (uint8_t)k_c6_wifi_hex_byte);
137 }
138}
139
140void c6_wifi_print_banner(uint32_t cpuclk_hz, uint32_t pclka_hz)
141{
142 c6_wifi_puts("c6_wifi: EK-RA8D2 <-> ESP32-C6 station bring-up through ra8_c6link\r\n");
143 c6_wifi_puts("c6_wifi: cpuclk0_hz=");
144 c6_wifi_put_u32(cpuclk_hz);
145 c6_wifi_puts(" pclka_hz=");
146 c6_wifi_put_u32(pclka_hz);
147 c6_wifi_puts("\r\n");
148 c6_wifi_puts("c6_wifi: spi sci=");
150 c6_wifi_puts(" sck_hz=");
152 c6_wifi_puts(" frame_bytes=");
154 c6_wifi_puts(" max_payload=");
156 c6_wifi_puts("\r\n");
157}
158
159void c6_wifi_print_stats(const char* label, const ra8_c6link_stats_t* stats)
160{
161 if ((label == nullptr) || (stats == nullptr)) {
162 return;
163 }
164 c6_wifi_puts("c6_wifi: poll ");
165 c6_wifi_puts(label);
166 c6_wifi_puts(" xfers=");
167 c6_wifi_put_u32((uint32_t)stats->transfers);
168 c6_wifi_puts(" data=");
169 c6_wifi_put_u32((uint32_t)stats->data);
170 c6_wifi_puts(" idle=");
171 c6_wifi_put_u32((uint32_t)stats->idle);
172 c6_wifi_puts(" badcsum=");
173 c6_wifi_put_u32((uint32_t)stats->bad_checksum);
174 c6_wifi_puts(" malformed=");
175 c6_wifi_put_u32((uint32_t)stats->malformed);
176 c6_wifi_puts(" rpc_in=");
177 c6_wifi_put_u32((uint32_t)stats->rpc_in);
178 c6_wifi_puts(" events=");
179 c6_wifi_put_u32((uint32_t)stats->events);
180 c6_wifi_puts(" eth_in=");
181 c6_wifi_put_u32((uint32_t)stats->eth_in);
182 c6_wifi_puts(" undecodable=");
183 c6_wifi_put_u32((uint32_t)stats->undecodable);
184 c6_wifi_puts(" unrouted=");
185 c6_wifi_put_u32((uint32_t)stats->unrouted);
186 c6_wifi_puts(" hs_timeouts=");
187 c6_wifi_put_u32((uint32_t)stats->hs_timeouts);
188 c6_wifi_puts("\r\n");
189}
Shared contract for the ra8_c6link facade bring-up application.
@ k_c6_wifi_str_max
Longest string the console helper emits.
Definition c6_wifi.h:91
@ k_c6_wifi_hex_mask
Nibble mask.
Definition c6_wifi.h:96
@ k_c6_wifi_hex_byte
Hex digits printed for a byte-wide field.
Definition c6_wifi.h:98
@ k_c6_wifi_dec_digits
Digits in the widest 32-bit decimal value.
Definition c6_wifi.h:93
@ k_c6_wifi_hex_alpha
First nibble value spelled with a letter.
Definition c6_wifi.h:97
@ k_c6_wifi_text_max
Longest co-processor-supplied string echoed to the console; anything longer is truncated rather than ...
Definition c6_wifi.h:99
@ k_c6_wifi_hex_digits
Digits in the widest 32-bit hex value.
Definition c6_wifi.h:94
@ k_c6_wifi_dec_radix
Decimal radix.
Definition c6_wifi.h:92
@ k_c6_wifi_hex_bits
Bits per hexadecimal digit.
Definition c6_wifi.h:95
@ k_c6_wifi_sck_hz
SPI bit rate; the rate the RPC round-trip ran at on silicon.
Definition c6_wifi.h:60
void c6_wifi_put_u32(uint32_t value)
Implementation of c6_wifi_put_u32() – reversed division loop.
void c6_wifi_print_stats(const char *label, const ra8_c6link_stats_t *stats)
Print what one facade poll did, as one console line.
void c6_wifi_put_i32(int32_t value)
Implementation of c6_wifi_put_i32() – two's-complement magnitude.
void c6_wifi_put_hex(uint32_t value, uint8_t digits)
Emit a value as a fixed-width lower-case hexadecimal field.
void c6_wifi_puts(const char *text)
Write a NUL-terminated string to the board console.
void c6_wifi_put_text(const char *text, size_t len)
Implementation of c6_wifi_put_text() – truncate, then sanitise.
void c6_wifi_put_mac(const ra8_c6link_mac_t *mac)
Emit an IEEE 802 address as six colon-separated hexadecimal octets.
c6_wifi_ascii_t
Printable-ASCII window used to sanitise co-processor text.
@ k_c6_wifi_ascii_high
Tilde: highest printable code point.
@ k_c6_wifi_ascii_low
Space: lowest printable code point.
@ k_c6_wifi_ascii_sub
Substitute for anything else.
void c6_wifi_print_banner(uint32_t cpuclk_hz, uint32_t pclka_hz)
Print the banner: identity, clocks and link parameters.
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
@ k_ra8_board_pmod1_sci_channel
Pmod1 (J26) Simple-SPI is SCI2.
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.