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
27
28#include <stdint.h>
29
30#include "nx_ether_driver_c6.h"
31#include "ra8_board_ek_ra8d2.h"
32#include "ra8_boot_entry.h"
33#include "ra8_c6link.h"
34#include "ra8_cgc.h"
35#include "ra8_err.h"
37#include "ra8_esp_hosted_port.h"
38#include "ra8_isr.h"
39#include "ra8_mstp.h"
40#include "ra8_net_provision.h"
41#include "ra8_time.h"
42#include "ra8_wifi.h"
43#include "ra8_wifi_c6link.h"
44#include "tx_api.h"
45#include "wifi_hal_join.h"
46
48static uint32_t s_cpuclk_hz;
50static uint32_t s_pclka_hz;
56static CHAR s_worker_name[] = "wifi_hal_join";
73
86static void wifi_hal_panic_halt(void)
87{
88 while (true) {
89 __asm volatile("wfi");
90 }
91}
92
126
143{
144 ra8_wifi_c6link_cfg_t bcfg = {};
145 bcfg.link = &s_link;
146 bcfg.arena = s_arena;
147 bcfg.arena_bytes = (uint32_t)sizeof(s_arena);
150 if (bound != k_ra8_ok) {
151 return bound;
152 }
153 const ra8_err_t wired = ra8_wifi_c6link_setup(&s_c6, &bcfg, out);
154 if (wired != k_ra8_ok) {
155 return wired;
156 }
158 out->ip_ctx = &s_link;
159 return k_ra8_ok;
160}
161
175static void wifi_hal_print_lease(const ra8_wifi_lease_t* lease)
176{
177 wifi_hal_puts("wifi_hal: dhcp bound ip=");
178 wifi_hal_put_ip(lease->ip);
179 wifi_hal_puts(" mask=");
180 wifi_hal_put_ip(lease->mask);
181 wifi_hal_puts(" gw=");
182 wifi_hal_put_ip(lease->gateway);
183 wifi_hal_puts(" server=");
185 wifi_hal_puts("\r\n");
186}
187
188static bool wifi_hal_report(const wifi_hal_result_t* res, bool joined);
189
205static bool wifi_hal_run(const ra8_net_credentials_t* credentials)
206{
207 ra8_wifi_cfg_t cfg = {};
208 const ra8_err_t made = wifi_hal_make_cfg(&cfg);
209 if (made != k_ra8_ok) {
210 wifi_hal_puts("wifi_hal: FAIL transport setup err=");
212 wifi_hal_puts("\r\n");
213 return false;
214 }
215
216 const wifi_hal_run_cfg_t rcfg = {
217 .wifi_cfg = &cfg,
218 .wifi = &s_wifi,
219 .ssid = credentials->ssid,
220 .psk = credentials->psk,
221 .poll_budget = (uint32_t)k_wifi_hal_assoc_polls,
222 };
223 wifi_hal_result_t res = {};
224 const bool joined = wifi_hal_join_run(&rcfg, &res);
225 return wifi_hal_report(&res, joined);
226}
227
244static bool wifi_hal_report(const wifi_hal_result_t* res, bool joined)
245{
246 wifi_hal_puts("wifi_hal: init=");
248 wifi_hal_puts("\r\n");
249 if (!res->init_ok) {
250 return false;
251 }
252
253 if (!res->associated) {
254 wifi_hal_puts("wifi_hal: FAIL association did not complete connect=");
256 wifi_hal_puts("\r\n");
257 return false;
258 }
259
260 wifi_hal_puts("wifi_hal: associated mac=");
261 wifi_hal_put_mac(&res->mac);
262 wifi_hal_puts(" chan=");
263 wifi_hal_put_u32((uint32_t)res->ap.channel);
264 wifi_hal_puts("\r\n");
265 if (!res->ip_bound) {
266 wifi_hal_puts("wifi_hal: FAIL dhcp did not bind err=");
268 wifi_hal_puts("\r\n");
269 return false;
270 }
272 if (!joined) {
273 wifi_hal_puts("wifi_hal: FAIL join_run failed with every stage reported ok\r\n");
274 }
275 return joined;
276}
277
291static void wifi_hal_heartbeat(bool passed)
292{
293 while (true) {
294 wifi_hal_puts(passed ? "wifi_hal: alive PASS\r\n" : "wifi_hal: alive FAIL\r\n");
296 }
297}
298
312static void wifi_hal_worker_entry(ULONG thread_input)
313{
314 (void)thread_input;
315
316 wifi_hal_puts("wifi_hal: port_init=");
318 wifi_hal_puts("\r\n");
319 if (s_init_err != k_ra8_ok) {
320 wifi_hal_puts("wifi_hal: FAIL port init failed -- no transaction attempted\r\n");
321 wifi_hal_heartbeat(false);
322 return;
323 }
324
326
327 ra8_net_credentials_t credentials = {};
330 &credentials);
331 if (provisioned != k_ra8_ok) {
332 wifi_hal_puts("wifi_hal: FAIL runtime provisioning err=");
333 wifi_hal_puts(ra8_err_to_str(provisioned));
334 wifi_hal_puts("\r\n");
335 ra8_net_provision_clear(&credentials);
337 wifi_hal_heartbeat(false);
338 return;
339 }
340
341 const bool ok = wifi_hal_run(&credentials);
342 ra8_net_provision_clear(&credentials);
345}
346
360void tx_application_define(void* first_unused_memory)
361{
362 (void)first_unused_memory;
363
364 const ra8_esp_hosted_port_cfg_t cfg = {
365 .pclk_hz = s_pclka_hz,
366 .sck_hz = (uint32_t)k_wifi_hal_sck_hz,
367 .edge_poll_ms = (uint16_t)k_wifi_hal_edge_poll_ms,
368 .sci_channel = (uint8_t)k_ra8_board_pmod1_sci_channel,
369 };
371
375 0U,
377 (ULONG)sizeof(s_worker_stack),
382 wifi_hal_puts("wifi_hal: worker thread creation failed\r\n");
383 }
384}
385
396void main(void)
397{
400
402 wifi_hal_puts("wifi_hal: entering ThreadX; port init runs from tx_application_define\r\n");
403
404 tx_kernel_enter();
405
407}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static uint32_t s_cpuclk_hz
Definition c6_cam_app.c:37
static ra8_c6link_t s_link
Definition c6_cam_app.c:44
static TX_THREAD s_worker
Definition c6_cam_app.c:40
static const ra8_net_provision_uart_t s_provision_uart
Board-console binding for the shared runtime provisioner.
Definition c6_cam_app.c:50
static CHAR s_worker_name[]
Definition c6_cam_app.c:41
static UCHAR s_worker_stack[k_c6_cam_worker_stack]
Definition c6_cam_app.c:42
static uint8_t s_arena[k_c6_cam_arena_bytes]
Definition c6_cam_app.c:43
static uint32_t s_pclka_hz
Definition c6_cam_app.c:38
void tx_application_define(void *first_unused_memory)
ThreadX system-define hook: build worker thread + byte pool.
Definition main.c:942
static ra8_err_t s_init_err
Port-init result from tx_application_define.
Definition main.c:54
static ra8_wifi_c6link_t s_c6
The ESP32-C6 ra8_wifi backend context.
Definition main.c:64
static bool wifi_hal_run(const ra8_net_credentials_t *credentials)
Execute the HAL network journey with runtime credentials.
Definition main.c:205
static ra8_err_t wifi_hal_make_cfg(ra8_wifi_cfg_t *out)
Build the C6-backed Wi-Fi and NetX DHCP configuration.
Definition main.c:142
static void wifi_hal_heartbeat(bool passed)
Preserve the terminal verdict as a periodic console heartbeat.
Definition main.c:291
static void wifi_hal_setup_or_halt(void)
Initialize platform services required by the HAL join application.
Definition main.c:105
static void wifi_hal_print_lease(const ra8_wifi_lease_t *lease)
Print the non-secret fields of one DHCP lease.
Definition main.c:175
static bool wifi_hal_report(const wifi_hal_result_t *res, bool joined)
Report one completed HAL journey and derive its terminal verdict.
Definition main.c:244
static void wifi_hal_worker_entry(ULONG thread_input)
Run runtime provisioning, the HAL journey, erasure, and heartbeat.
Definition main.c:312
static ra8_wifi_t s_wifi
The Wi-Fi handle every operation goes through.
Definition main.c:66
static void wifi_hal_panic_halt(void)
Halt the processor after an unrecoverable start-up failure.
Definition main.c:86
NetX Duo network driver shim that bridges onto the ESP32-C6 link.
void nx_ether_driver_c6_rx(void *ctx, const uint8_t *frame, uint16_t len)
Receive callback the application registers with ra8_c6link_open.
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_read(uint8_t *out, size_t cap, size_t *out_len)
Polled non-blocking read from the J-Link OB VCOM console.
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
@ k_ra8_clock_id_pclka
PCLKA.
Definition ra8_cgc.h:73
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_not_initialized
Module not initialized – _init() not yet called successfully.
Definition ra8_err.h:235
@ 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
const char * ra8_err_to_str(ra8_err_t err)
Human-readable string for an error code.
Definition ra8_log.c:737
Public entry point of the RA8D2 + ThreadX port of esp-hosted.
struct ra8_esp_hosted_port_cfg ra8_esp_hosted_port_cfg_t
ra8_err_t ra8_esp_hosted_port_init(const ra8_esp_hosted_port_cfg_t *cfg)
Bring the esp-hosted port up and publish the OS-abstraction vtable.
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
Runtime network provisioning contract for EK-RA8D2 applications.
struct ra8_net_credentials ra8_net_credentials_t
struct ra8_net_provision_uart ra8_net_provision_uart_t
@ k_ra8_net_provision_timeout_ms
Standard application RX timeout.
ra8_err_t ra8_net_provision_receive(const ra8_net_provision_uart_t *uart, uint32_t timeout_ms, ra8_net_credentials_t *out)
Prompt once and receive one provisioning line within a fixed timeout.
void ra8_net_provision_clear(ra8_net_credentials_t *credentials)
Explicitly erase one decoded credential record.
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
unsigned int UINT
ThreadX-compatible unsigned int (host stub).
#define TX_SUCCESS
#define tx_thread_create
#define tx_thread_sleep
#define TX_NO_TIME_SLICE
char CHAR
ThreadX-compatible CHAR (host stub).
#define TX_AUTO_START
unsigned long ULONG
ThreadX-compatible unsigned long (host stub).
A small, uniform Wi-Fi facade: init, connect, get an IP, disconnect.
struct ra8_wifi_lease ra8_wifi_lease_t
struct ra8_wifi ra8_wifi_t
struct ra8_wifi_cfg ra8_wifi_cfg_t
Opaque thread stand-in for the host build.
char psk[k_ra8_net_provision_psk_bytes_max+1U]
NUL-terminated PSK storage.
char ssid[k_ra8_net_provision_ssid_bytes_max+1U]
NUL-terminated SSID storage.
uint8_t channel
Primary channel in use.
Definition ra8_wifi.h:267
ra8_wifi_ip_bind_fn ip_bind
IP-stack hook for ra8_wifi_wait_ip.
Definition ra8_wifi.h:372
void * ip_ctx
Opaque context handed to ip_bind.
Definition ra8_wifi.h:373
uint32_t dhcp_server
Address of the DHCP server that answered.
Definition ra8_wifi.h:237
uint32_t gateway
Default gateway from the lease.
Definition ra8_wifi.h:236
uint32_t mask
Subnet mask from the lease.
Definition ra8_wifi.h:235
uint32_t ip
Leased station address, or zero if unbound.
Definition ra8_wifi.h:234
ra8_wifi_lease_t lease
The DHCP lease, once bound.
ra8_wifi_ap_t ap
AP record, once associated.
ra8_err_t init_err
What ra8_wifi_init returned.
bool associated
The station joined the network.
bool ip_bound
A DHCP lease was obtained.
ra8_wifi_mac_t mac
Station MAC, once associated.
ra8_err_t ip_err
What ra8_wifi_wait_ip returned.
ra8_err_t connect_err
What ra8_wifi_connect returned.
bool init_ok
The facade initialised.
Constants, console formatters and the DHCP provider for the HAL join.
const char k_wifi_hal_pass_line[]
The exact PASS line the run prints; the HIL gate keys on it.
void wifi_hal_put_ip(uint32_t ip)
Write a packed IPv4 address as a dotted quad.
void wifi_hal_puts(const char *text)
Write a NUL-terminated string to the console, bounded.
void wifi_hal_print_banner(uint32_t cpuclk_hz, uint32_t pclka_hz)
Print the start-up banner naming the clocks and the link geometry.
void wifi_hal_put_mac(const ra8_wifi_mac_t *mac)
Write a station MAC as colon-separated hex octets.
struct wifi_hal_run_cfg wifi_hal_run_cfg_t
@ k_wifi_hal_worker_prio
Worker priority and preemption cap.
@ k_wifi_hal_boot_wait_ms
Settling delay before the first frame.
@ k_wifi_hal_worker_stack
Worker-thread stack, in bytes.
@ k_wifi_hal_sck_hz
SPI bit rate; the rate silicon ran at.
@ k_wifi_hal_uart_baud
Console rate over the J-Link OB VCOM.
@ k_wifi_hal_heartbeat_ms
Heartbeat gap after the verdict.
@ k_wifi_hal_arena_bytes
Decode arena handed to the facade.
@ k_wifi_hal_edge_poll_ms
Poll period for a side-band pin.
bool wifi_hal_join_run(const wifi_hal_run_cfg_t *cfg, wifi_hal_result_t *out)
The example's whole network journey, hardware-free: init, join, DHCP.
void wifi_hal_put_u32(uint32_t value)
Write an unsigned 32-bit value in decimal.
ra8_err_t wifi_hal_ip_bind(void *ip_ctx, const ra8_wifi_mac_t *mac, ra8_wifi_lease_t *out)
The application's IP provider: a NetX Duo DHCP client to a lease.
@ k_wifi_hal_assoc_polls
Extra association polls after connect.
struct wifi_hal_result wifi_hal_result_t
const char k_wifi_hal_fail_line[]
The summary FAIL line the run prints when it did not reach an IP.