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
26
27#include <stddef.h>
28#include <stdint.h>
29
30#include "book.h"
31#include "mdl_rabook_vfs.h"
32#include "mdl_storage_vfs.h"
34#include "miniz.h"
35#include "ra8_attributes.h"
36#include "ra8_board_ek_ra8d2.h"
37#include "ra8_boot_entry.h"
38#include "ra8_c6link.h"
40#include "ra8_c6link_wifi.h"
41#include "ra8_err.h"
43#include "ra8_esp_hosted_port.h"
44#include "ra8_fs.h"
45#include "ra8_io_vfs.h"
46#include "ra8_isr.h"
47#include "ra8_mstp.h"
48#include "ra8_net_provision.h"
49#include "ra8_rsip.h"
50#include "ra8_sdmmc_spi.h"
51#include "ra8_secure.h"
52#include "ra8_time.h"
53#include "tx_api.h"
54#ifndef RA8_MEDIA_DOWNLOAD_SOURCE_IMAGE
56#define RA8_MEDIA_DOWNLOAD_SOURCE_IMAGE (0)
57#endif
58
60 "RA8_MEDIA_DOWNLOAD_SOURCE_IMAGE must be 0 or 1");
61
82
84static const char s_destination[] = "sd:/BOOKS/C6BOOK.RBK";
86static const char s_stage_leaf[] = "C6STAGE.TMP";
89
91static uint32_t s_cpuclk_hz;
93static uint32_t s_pclka_hz;
99static CHAR s_worker_name[] = "media_download";
107static volatile uint8_t s_connected;
109static volatile uint8_t s_disconnected;
116
127
129[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint64_t s_table[k_media_table_entries];
131[[gnu::section(".sdram_data"),
132 gnu::aligned(8)]] static uint8_t s_compressed[k_media_compressed_bytes];
134[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_chunk[k_media_rbkc_chunk_bytes];
136[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_scratch[k_media_scratch_bytes];
137
150RA8_INTERNAL static void internal_puts(const char* text)
151{
152 size_t length = 0U;
153 while ((length < (size_t)k_media_diagnostic_bytes) && (text[length] != '\0')) {
154 length++;
155 }
156 (void)ra8_board_uart_console_write((const uint8_t*)text, length);
157}
158
174RA8_INTERNAL static bool internal_fail(const char* stage, ra8_err_t err)
175{
176 internal_puts("media_download: FAIL ");
177 internal_puts(stage);
178 internal_puts(" err=");
180 internal_puts("\r\n");
181 return false;
182}
183
193[[noreturn]] RA8_INTERNAL static void internal_halt(void)
194{
195 while (true) {
196 __asm volatile("wfi");
197 }
198}
199
212{
213 ra8_board_clock_rates_t clock_rates = {};
214 if (ra8_board_clocks_init(&clock_rates) != k_ra8_ok) {
216 }
217 s_cpuclk_hz = clock_rates.cpuclk0_hz;
218 s_pclka_hz = clock_rates.pclka_hz;
222 }
223}
224
238RA8_INTERNAL static void internal_on_event(void* context, const ra8_c6link_event_t* event)
239{
240 (void)context;
241 if (event == nullptr) {
242 return;
243 }
245 s_connected = 1U;
246 } else if (event->kind == k_ra8_c6link_event_sta_disconnected) {
247 s_disconnected = 1U;
248 }
249}
250
266{
267 for (uint32_t attempt = 0U; attempt < (uint32_t)k_media_assoc_tries; ++attempt) {
268 ra8_c6link_stats_t stats = {};
269 (void)ra8_c6link_poll(&s_link, (uint16_t)k_ra8_c6link_announce_transfers, &stats);
270 if (s_connected != 0U) {
271 return true;
272 }
273 if (s_disconnected != 0U) {
274 return false;
275 }
277 }
278 return false;
279}
280
297{
298 if ((credentials == nullptr) || (credentials->ssid[0] == '\0')) {
300 }
301 ra8_c6link_cfg_t link_config = {};
303 if (err != k_ra8_ok) {
304 return err;
305 }
306 link_config.arena = s_c6_arena;
307 link_config.arena_bytes = sizeof(s_c6_arena);
308 link_config.event_cb = internal_on_event;
309 err = ra8_c6link_open(&s_link, &link_config);
310 if (err != k_ra8_ok) {
311 return err;
312 }
313 ra8_c6link_fw_version_t version = {};
315 if (err == k_ra8_ok) {
317 }
318 ra8_c6link_sta_cfg_t station = {};
319 if (err == k_ra8_ok) {
320 err = ra8_c6link_sta_cfg_set(&station, credentials->ssid, credentials->psk);
321 }
322 if (err == k_ra8_ok) {
323 err = ra8_c6link_wifi_join(&s_link, &station);
324 }
325 ra8_secure_memzero(&station, sizeof(station));
326 if ((err == k_ra8_ok) && !internal_wait_connected()) {
327 err = k_ra8_err_timeout;
328 }
329 return err;
330}
331
347{
348 const ra8_sdmmc_spi_sci_pins_t pins = {
353 };
354 ra8_sdmmc_spi_transport_t transport = {};
357 &pins,
358 &transport);
359 if (err == k_ra8_ok) {
360 err = ra8_sdmmc_spi_init(&transport);
361 }
362 if (err == k_ra8_ok) {
364 }
365 if (err == k_ra8_ok) {
367 }
368 if (err == k_ra8_ok) {
369 err = ra8_io_vfs_init();
370 }
371 if (err == k_ra8_ok) {
372 err = ra8_io_vfs_mount("sd", s_mount);
373 }
374 ra8_io_vfs_stat_t book_dir = {};
375 if (err == k_ra8_ok) {
376 err = ra8_io_vfs_stat("sd:/BOOKS", &book_dir);
377 }
378 if ((err == k_ra8_ok) && !book_dir.exists) {
379 err = ra8_io_vfs_mkdir("sd:/BOOKS");
380 } else if ((err == k_ra8_ok) && !book_dir.is_directory) {
382 }
383 return err;
384}
385
405RA8_INTERNAL static ra8_err_t internal_inflate(const void* source,
406 size_t source_bytes,
407 void* destination,
408 size_t destination_capacity,
409 size_t* output_bytes)
410{
411 if ((source == nullptr) || (destination == nullptr) || (output_bytes == nullptr)) {
412 return k_ra8_err_null_ptr;
413 }
414 const size_t inflated = tinfl_decompress_mem_to_mem(
415 destination,
416 destination_capacity,
417 source,
418 source_bytes,
419 (uint32_t)(TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF));
420 if (inflated == TINFL_DECOMPRESS_MEM_TO_MEM_FAILED) {
422 }
423 *output_bytes = inflated;
424 return k_ra8_ok;
425}
426
443{
445}
446
465internal_sha_update(void* context, const uint8_t* data, uint16_t length)
466{
467 return ra8_rsip_sha256_update((ra8_rsip_sha256_ctx_t*)context, data, length);
468}
469
487 uint8_t output[k_ra8_mdl_sha256_bytes])
488{
489 return ra8_rsip_sha256_final((ra8_rsip_sha256_ctx_t*)context, output);
490}
491
507{
508 const mdl_rabook_vfs_config_t reader_config = {
509 .inflate_cb = internal_inflate,
510 .table = s_table,
511 .compressed = s_compressed,
512 .chunk = s_chunk,
513 .scratch = s_scratch,
514 .table_cap = (uint32_t)k_media_table_entries,
515 .compressed_cap = sizeof(s_compressed),
516 .chunk_cap = sizeof(s_chunk),
517 .scratch_cap = sizeof(s_scratch),
518 };
519 ra8_err_t err = mdl_rabook_vfs_init(&s_rabook, &reader_config);
520 ra8_mdl_storage_iface_t storage_interface = {};
521 if (err == k_ra8_ok) {
522 const mdl_storage_vfs_config_t storage_config = {
523 .stage_leaf = s_stage_leaf,
524 .validate = mdl_rabook_vfs_validate,
525 .validate_ctx = &s_rabook,
526 };
527 err = mdl_storage_vfs_init(&s_storage, &storage_config, &storage_interface);
528 }
529 if (err == k_ra8_ok) {
530 *output = (ra8_mdl_transfer_config_t){
531 .storage = storage_interface,
532 .sha256 = {.init = internal_sha_init,
533 .update = internal_sha_update,
534 .final = internal_sha_final,
535 .ctx = &s_sha},
536 .format = k_mdl_format_rabook,
537 .chunk_bytes = (uint16_t)k_media_transfer_chunk,
538 .max_chunks = (uint32_t)k_media_transfer_chunks,
539 };
540 }
541 return err;
542}
543
559{
561 book_header_t header = {};
562 uint64_t flat_size = 0U;
563 if (err == k_ra8_ok) {
564 err = mdl_rabook_vfs_info(&s_rabook, &header, &flat_size);
565 }
566 uint32_t first_bytes = 0U;
567 if (err == k_ra8_ok) {
568 first_bytes = s_rabook.reader.chunk_bytes;
569 if (flat_size < first_bytes) {
570 first_bytes = (uint32_t)flat_size;
571 }
572 if ((first_bytes == 0U) || (first_bytes > sizeof(s_chunk)) ||
573 ((uint64_t)header.total_size != flat_size)) {
575 }
576 }
577 if (err == k_ra8_ok) {
578 err = mdl_rabook_vfs_read_chunk(&s_rabook, 0U, s_chunk, first_bytes);
579 }
580 const ra8_err_t close_err = mdl_rabook_vfs_close(&s_rabook);
581 return ((err == k_ra8_ok) ? close_err : err);
582}
583
598{
599 ra8_mdl_transfer_config_t transfer = {};
600 ra8_err_t err = internal_bind_transfer(&transfer);
601 if (err == k_ra8_ok) {
602 if (s_source_is_image) {
603 err = priv_media_download_image_run(&s_link, configuration->url, s_destination, &transfer);
604 } else {
605 ra8_mdl_transfer_result_t result = {};
606 err = ra8_c6link_mdl_transfer(&s_link, configuration->url, s_destination, &transfer, &result);
607 }
608 }
609 if (err == k_ra8_ok) {
610 err = internal_consume();
611 }
612 return err;
613}
614
632{
633 if (s_port_err != k_ra8_ok) {
634 return internal_fail("c6 port", s_port_err);
635 }
636 if ((configuration == nullptr) || (configuration->url[0] == '\0')) {
637 return internal_fail("runtime configuration", k_ra8_err_invalid_arg);
638 }
640 if (err != k_ra8_ok) {
641 return internal_fail("sd mount", err);
642 }
643 const ra8_rsip_config_t rsip_config = {.run_bist = true};
644 err = ra8_rsip_init(&rsip_config);
645 if (err != k_ra8_ok) {
646 return internal_fail("rsip", err);
647 }
649 err = internal_open_and_join(configuration);
650 if (err != k_ra8_ok) {
651 return internal_fail("c6 join", err);
652 }
653 ra8_secure_memzero(configuration->ssid, sizeof(configuration->ssid));
654 ra8_secure_memzero(configuration->psk, sizeof(configuration->psk));
655 configuration->ssid_len = 0U;
656 configuration->psk_len = 0U;
657 err = internal_transfer_and_consume(configuration);
658 (void)ra8_c6link_close(&s_link);
659 if (err != k_ra8_ok) {
660 return internal_fail("transfer/consume", err);
661 }
662 internal_puts("media_download: PASS C6->RABOOK->SD publish and read\r\n");
663 return true;
664}
665
676[[noreturn]] RA8_INTERNAL static void internal_heartbeat(bool passed)
677{
678 while (true) {
679 internal_puts(passed ? "media_download: alive PASS\r\n" : "media_download: alive FAIL\r\n");
681 }
682}
683
697{
698 (void)input;
699 ra8_net_credentials_t configuration = {};
702 &configuration);
703 bool passed = false;
704 if (provisioned == k_ra8_ok) {
705 passed = internal_run(&configuration);
706 } else {
707 (void)internal_fail("runtime provisioning", provisioned);
708 }
709 ra8_net_provision_clear(&configuration);
710 internal_heartbeat(passed);
711}
712
723void tx_application_define(void* first_unused_memory)
724{
725 (void)first_unused_memory;
726 const ra8_esp_hosted_port_cfg_t port_config = {
727 .pclk_hz = s_pclka_hz,
728 .sck_hz = (uint32_t)k_media_c6_sck_hz,
729 .edge_poll_ms = (uint16_t)k_media_c6_edge_poll_ms,
730 .sci_channel = (uint8_t)k_ra8_board_pmod1_sci_channel,
731 };
732 s_port_err = ra8_esp_hosted_port_init(&port_config);
736 0U,
738 sizeof(s_worker_stack),
743 internal_puts("media_download: FAIL worker create\r\n");
744 }
745}
746
756void main(void)
757{
760 internal_puts("media_download: boot; C6 Pmod1 + SD Pmod2\r\n");
761 tx_kernel_enter();
763}
void main(void)
Secure fallback main entry point.
Definition main.c:37
Flat, execute-in-place container for a build-time "compiled" e-book.
static volatile uint8_t s_disconnected
Definition c6_cam_app.c:47
static uint32_t s_cpuclk_hz
Definition c6_cam_app.c:37
static volatile uint8_t s_connected
Definition c6_cam_app.c:46
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 uint32_t s_pclka_hz
Definition c6_cam_app.c:38
static ra8_err_t s_port_err
Definition c6_cam_app.c:39
void tx_application_define(void *first_unused_memory)
ThreadX system-define hook: build worker thread + byte pool.
Definition main.c:942
static uint8_t s_scratch[(size_t) k_ra8_compress_scratch_bytes]
Compressor scratch (one miniz tdefl_compressor) in SRAM.
Definition main.c:96
#define RA8_MEDIA_DOWNLOAD_SOURCE_IMAGE
Default preserves direct validation of prebuilt .rabook bodies.
Definition main.c:56
static const char s_destination[]
No-replace destination on the mounted SD card.
Definition main.c:84
static ra8_err_t internal_sha_update(void *context, const uint8_t *data, uint16_t length)
Feed one accepted body chunk to the independent RA8 digest.
Definition main.c:465
media_limit_t
Fixed application bounds and board integration policy.
Definition main.c:63
@ k_media_table_entries
2048 chunks + terminal offset.
Definition main.c:79
@ k_media_diagnostic_bytes
Maximum emitted diagnostic length.
Definition main.c:70
@ k_media_worker_priority
Worker priority and threshold.
Definition main.c:73
@ k_media_c6_sck_hz
Bench-proven C6 SPI rate.
Definition main.c:65
@ k_media_compressed_bytes
One worst-case zlib-wrapped 64 KiB chunk.
Definition main.c:78
@ k_media_worker_stack_bytes
ThreadX worker stack.
Definition main.c:72
@ k_media_rbkc_chunk_bytes
Accepted inflated RBKC chunk geometry.
Definition main.c:77
@ k_media_c6_edge_poll_ms
C6 side-band poll period.
Definition main.c:66
@ k_media_assoc_tries
Bounded station-event polls.
Definition main.c:68
@ k_media_transfer_chunks
32 MiB compressed-body ceiling.
Definition main.c:76
@ k_media_c6_arena_bytes
Protobuf decode arena.
Definition main.c:74
@ k_media_heartbeat_ms
Persistent verdict interval.
Definition main.c:71
@ k_media_transfer_chunk
Bytes requested per C6 body pull.
Definition main.c:75
@ k_media_c6_boot_wait_ms
Coprocessor settle time.
Definition main.c:67
@ k_media_assoc_gap_ms
Delay between association polls.
Definition main.c:69
@ k_media_scratch_bytes
Strict CRC/ownership validation scratch.
Definition main.c:80
@ k_media_uart_baud
J-Link OB console rate.
Definition main.c:64
static mdl_storage_vfs_t s_storage
Transactional VFS storage adapter.
Definition main.c:122
static void internal_worker(ULONG input)
Worker entry for the one-shot media transaction.
Definition main.c:696
static bool internal_run(ra8_net_credentials_t *configuration)
Execute the complete hardware composition once.
Definition main.c:631
static ra8_err_t internal_consume(void)
Reopen the committed RBKC and consume its first exact inflated chunk.
Definition main.c:558
static bool internal_fail(const char *stage, ra8_err_t err)
Emit one failed-stage diagnostic.
Definition main.c:174
static void internal_puts(const char *text)
Write one bounded NUL-terminated diagnostic to the board console.
Definition main.c:150
static ra8_fs_backend_t s_fs_backend
SD filesystem backend retained for the mount lifetime.
Definition main.c:118
static void internal_heartbeat(bool passed)
Keep the final verdict visible without busy-waiting.
Definition main.c:676
static ra8_err_t internal_open_and_join(const ra8_net_credentials_t *credentials)
Open the C6 link, prove readiness, and associate its Wi-Fi station.
Definition main.c:296
static ra8_err_t internal_mount_sd(void)
Mount the existing Pmod2 SD FAT volume under the VFS name sd.
Definition main.c:346
static const bool s_source_is_image
Build-time input policy: encoded image or prebuilt RBKC body.
Definition main.c:88
static ra8_rsip_sha256_ctx_t s_sha
Streaming RA8-side SHA-256 context.
Definition main.c:126
static ra8_err_t internal_bind_transfer(ra8_mdl_transfer_config_t *output)
Bind strict reader, transaction, SHA, and coordinator policy.
Definition main.c:506
static ra8_err_t internal_sha_final(void *context, uint8_t output[k_ra8_mdl_sha256_bytes])
Finalize the independent digest into the coordinator output.
Definition main.c:486
static const char s_stage_leaf[]
Reserved sibling transaction name.
Definition main.c:86
static void internal_on_event(void *context, const ra8_c6link_event_t *event)
Latch the two station events used by the bounded association wait.
Definition main.c:238
static ra8_err_t internal_sha_init(void *context)
Reset the caller-owned SHA-256 stream.
Definition main.c:442
static ra8_err_t internal_inflate(const void *source, size_t source_bytes, void *destination, size_t destination_capacity, size_t *output_bytes)
Inflate one zlib-wrapped RBKC chunk without heap allocation.
Definition main.c:405
static uint8_t s_c6_arena[k_media_c6_arena_bytes]
Fixed C6 decode arena.
Definition main.c:105
static bool internal_wait_connected(void)
Pump the C6 link until association succeeds or the fixed budget ends.
Definition main.c:265
static void internal_setup_or_halt(void)
Bring up clocks, MSTP, delay timing, and the board console.
Definition main.c:211
static void internal_halt(void)
Park the core permanently after an unrecoverable startup failure.
Definition main.c:193
static uint8_t s_chunk[k_media_rbkc_chunk_bytes]
One inflated RBKC chunk and final-consumption destination.
Definition main.c:134
static mdl_rabook_vfs_t s_rabook
Strict RBKC validator and final reader.
Definition main.c:124
static ra8_err_t internal_transfer_and_consume(const ra8_net_credentials_t *configuration)
Bind, execute, validate, and consume one configured media transfer.
Definition main.c:597
static uint8_t s_compressed[k_media_compressed_bytes]
One compressed zlib stream.
Definition main.c:132
@ k_mdl_format_rabook
Chunked reader-native book (.rabook).
Definition mdl_format.h:44
Strict no-heap RBKC validator and reader over named RA8 VFS mounts.
ra8_err_t mdl_rabook_vfs_read_chunk(mdl_rabook_vfs_t *ctx, uint64_t offset, uint8_t *dst, uint32_t len)
Read one exact chunk-aligned flat-blob span from an open book.
ra8_err_t mdl_rabook_vfs_close(mdl_rabook_vfs_t *ctx)
Close and release an open VFS reader facade.
ra8_err_t mdl_rabook_vfs_validate(void *opaque, const char *staging_path, uint64_t total_bytes, const uint8_t sha256[k_ra8_mdl_sha256_bytes])
Strictly validate one closed private RBKC staging object.
ra8_err_t mdl_rabook_vfs_info(const mdl_rabook_vfs_t *ctx, book_header_t *out_header, uint64_t *out_flat_size)
Copy metadata from an open strictly validated book.
ra8_err_t mdl_rabook_vfs_open(mdl_rabook_vfs_t *ctx, const char *path)
Open and strictly revalidate a published RBKC object for consumption.
ra8_err_t mdl_rabook_vfs_init(mdl_rabook_vfs_t *ctx, const mdl_rabook_vfs_config_t *config)
Initialize one strict RBKC VFS workspace binding.
No-heap VFS storage binding for the media-download coordinator.
ra8_err_t mdl_storage_vfs_init(mdl_storage_vfs_t *storage, const mdl_storage_vfs_config_t *config, ra8_mdl_storage_iface_t *out_iface)
Initialise one VFS storage adapter and bind its coordinator interface.
Private encoded-image download and RABOOK publication composition.
ra8_err_t priv_media_download_image_run(ra8_c6link_t *link, const char *url, const char *destination, const ra8_mdl_transfer_config_t *transfer)
Download one encoded image and publish it as a strict .rabook.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
@ k_ra8_board_pmod2_spi_cipo
Pmod2.3 CIPO (CIPO0_B), P602.
@ k_ra8_board_pmod2_spi_cs
Pmod2.1 CS (SS0_B), P604.
@ k_ra8_board_pmod2_spi_copi
Pmod2.2 COPI (COPI0_B), P603.
@ k_ra8_board_pmod2_spi_sck
Pmod2.4 SCK (SCK0_B), P601.
@ k_ra8_board_pmod1_sci_channel
Pmod1 (J26) Simple-SPI is SCI2.
@ k_ra8_board_pmod2_sci_channel
Pmod2 (J25) Simple-SPI is SCI0.
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_clocks_init(ra8_board_clock_rates_t *out_rates)
Initialize the standard EK-RA8D2 clock tree and return its rates.
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.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_validation_failed
Validation rule failed (caller-supplied invariant not satisfied).
Definition ra8_err.h:459
@ 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
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
@ k_ra8_err_timeout
Operation exceeded its time budget.
Definition ra8_err.h:188
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
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.
Minimal FAT12/FAT16/FAT32 filesystem adapter (read + write).
ra8_err_t ra8_fs_mount(const ra8_fs_backend_t *backend, ra8_fs_mount_t **out_handle)
Mount a FAT volume from a block-device backend, auto-selecting the first partition.
static vfs_slot_t s_table[(uint32_t) k_ra8_io_vfs_max_mounts]
Fixed mount table.
Definition ra8_io_vfs.c:41
ra8_io virtual filesystem – mount many volumes, address them by name.
ra8_err_t ra8_io_vfs_mount(const char *name, ra8_fs_mount_t *mount)
Register a mounted volume under a name.
Definition ra8_io_vfs.c:418
ra8_err_t ra8_io_vfs_mkdir(const char *path)
Create a directory named "name:/path".
ra8_err_t ra8_io_vfs_stat(const char *path, ra8_io_vfs_stat_t *out)
Query metadata for "name:/path".
ra8_err_t ra8_io_vfs_init(void)
Reset the VFS mount table to empty.
Definition ra8_io_vfs.c:403
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
@ k_ra8_mdl_sha256_bytes
SHA-256 digest size in bytes.
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.
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
Renesas Secure IP (RSIP-E50D) HAL driver – public API.
ra8_err_t ra8_rsip_sha256_final(ra8_rsip_sha256_ctx_t *ctx, uint8_t *digest_out)
Emit the digest of a streaming SHA-256 context.
Definition ra8_rsip.c:794
ra8_err_t ra8_rsip_init(const ra8_rsip_config_t *cfg)
Power on the RSIP engine and (optionally) run BIST.
Definition ra8_rsip.c:234
ra8_err_t ra8_rsip_sha256_update(ra8_rsip_sha256_ctx_t *ctx, const uint8_t *data, uint32_t len)
Absorb additional bytes into a streaming SHA-256 context.
Definition ra8_rsip.c:759
ra8_err_t ra8_rsip_sha256_init(ra8_rsip_sha256_ctx_t *ctx)
Initialise a streaming SHA-256 context.
Definition ra8_rsip.c:747
SD card driver in SPI-mode (PMOD-attached cards).
ra8_err_t ra8_sdmmc_spi_transport_sci(uint8_t sci_channel, uint32_t pclk_hz, const ra8_sdmmc_spi_sci_pins_t *pins, ra8_sdmmc_spi_transport_t *out)
Build the standard EK-RA8D2 SCI Simple-SPI transport for an SD card.
ra8_err_t ra8_sdmmc_spi_init(const ra8_sdmmc_spi_transport_t *transport)
Run the SD SPI-mode identification sequence on a card.
ra8_err_t ra8_sdmmc_spi_bind_fs_backend(ra8_fs_backend_t *out_backend)
Populate an ra8_fs_backend_t that mounts onto this SD driver.
Secure-comparison primitives for the crypto / secure-boot paths.
void ra8_secure_memzero(void *ptr, size_t len)
Securely zero a buffer such that the write cannot be optimised away.
Definition ra8_secure.c:37
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).
static ra8_fs_mount_t * s_mount
Mounted FAT volume, or NULL.
Definition sh_sd.c:53
Opaque thread stand-in for the host build.
Fixed 100-byte prologue describing every table and pool in the blob.
Definition book.h:246
uint32_t total_size
Total blob length in bytes.
Definition book.h:249
Caller-owned decompression and strict-validation workspace binding.
One initialized strict validator or one open validated RBKC reader.
Immutable policy copied or retained by an adapter instance.
Caller-owned VFS transaction context.
Clock rates published by the standard EK-RA8D2 bring-up.
uint32_t pclka_hz
Peripheral clock A rate in hertz.
uint32_t cpuclk0_hz
Main Cortex-M85 clock rate in hertz.
Block-device interface that ra8_fs runs on top of.
Cached parse of one mounted FAT volume.
Metadata returned by ra8_io_vfs_stat.
Definition ra8_io_vfs.h:96
bool is_directory
true => path names a directory.
Definition ra8_io_vfs.h:102
bool exists
true => the path resolves to an entry.
Definition ra8_io_vfs.h:103
uint8_t psk_len
Decoded PSK bytes, excluding the NUL.
char psk[k_ra8_net_provision_psk_bytes_max+1U]
NUL-terminated PSK storage.
char url[k_ra8_net_provision_url_bytes_max+1U]
NUL-terminated optional URL storage.
uint8_t ssid_len
Decoded SSID bytes, excluding the NUL.
char ssid[k_ra8_net_provision_ssid_bytes_max+1U]
NUL-terminated SSID storage.
Initial configuration for ra8_rsip_init.
Streaming state for incremental SHA-256.
The four bus pins of an SCI Simple-SPI SD slot.
Driver-to-bus binding (Dependency Inversion seam).