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
54
55#include <stddef.h>
56#include <stdint.h>
57
58#include "book.h"
59#include "epub.h"
60#include "ra8_board_ek_ra8d2.h"
61#include "ra8_boot_entry.h"
62#include "ra8_cgc.h"
63#include "ra8_err.h"
64#include "ra8_fs.h"
65#include "ra8_isr.h"
66#include "ra8_log.h"
67#include "ra8_rabook_pipeline.h"
68#include "ra8_sdmmc_spi.h"
69#include "ra8_time.h"
70#include "ra8_vmem.h"
71#include "rabook_compile.h"
72#include "rabook_import.h"
74
75/* =============================================================================
76 * Tunables
77 * =============================================================================
78 */
79
94
99typedef enum : uint32_t {
108 k_imp_string_cap = 64U * 1024U,
109 k_imp_imgpool_cap = 1024U * 1024U,
110 k_imp_out_cap = 512U * 1024U,
111 k_imp_xhtml_cap = 64U * 1024U,
112 k_imp_css_cap = 16U * 1024U,
113 k_imp_imgraw_cap = 2U * 1024U * 1024U,
114 k_imp_arena_cap = 4U * 1024U * 1024U,
115 k_imp_gray_cap = 2U * 1024U * 1024U,
116 k_imp_readback_cap = 512U * 1024U,
118
119/* =============================================================================
120 * Pinout (Pmod2 SPI for SD card)
121 * =============================================================================
122 */
123
129
131static const char k_imp_epub_path[] = "BOOK.EPB";
132
133/* =============================================================================
134 * SDRAM working storage (no heap; NASA Rule 3). All NOLOAD .sdram_data.
135 * =============================================================================
136 */
137
139[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_scratch[k_imp_scratch_cap];
140
142[[gnu::section(".sdram_data"),
144
147
150
153
156
158[[gnu::section(".sdram_data"), gnu::aligned(8)]] static epub_book_t s_imp_epub;
159
161[[gnu::section(".sdram_data"),
163[[gnu::section(".sdram_data"), gnu::aligned(8)]] static book_node_t s_imp_nodes[k_imp_node_cap];
164[[gnu::section(".sdram_data"), gnu::aligned(8)]] static book_attr_t s_imp_attrs[k_imp_attr_cap];
165[[gnu::section(".sdram_data"),
167[[gnu::section(".sdram_data"), gnu::aligned(8)]] static book_image_t s_imp_images[k_imp_image_cap];
168[[gnu::section(".sdram_data"), gnu::aligned(8)]] static char s_imp_strpool[k_imp_string_cap];
169[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_imgpool[k_imp_imgpool_cap];
170[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_out[k_imp_out_cap];
171
173[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_xhtml[k_imp_xhtml_cap];
174[[gnu::section(".sdram_data"),
176[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_image_raw[k_imp_imgraw_cap];
177[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_img_scratch[k_imp_arena_cap];
178[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_gray[k_imp_gray_cap];
179[[gnu::section(".sdram_data"), gnu::aligned(8)]] static char s_imp_css[k_imp_css_cap];
180
182[[gnu::section(".sdram_data"), gnu::aligned(8)]] static uint8_t s_imp_readback[k_imp_readback_cap];
183
184/* =============================================================================
185 * Static message strings (ASCII-only per project policy)
186 * =============================================================================
187 */
188
189static const uint8_t k_msg_boot[] = "import_reader: boot\r\n";
190static const uint8_t k_msg_card_ok[] = "import_reader: card ready\r\n";
191static const uint8_t k_msg_mounted[] = "import_reader: volume mounted\r\n";
192static const uint8_t k_msg_miss[] = "import_reader: first open MISS -> compiled, cache=";
193static const uint8_t k_msg_hit[] = "import_reader: second open HIT (no recompile), cache=";
194static const uint8_t k_msg_cbytes[] = "import_reader: cache bytes=";
195static const uint8_t k_msg_title[] = "import_reader: title=";
196static const uint8_t k_msg_chaps[] = " chapters=";
197static const uint8_t k_msg_ch[] = "import_reader: ch";
198static const uint8_t k_msg_textlen[] = " textlen=";
199static const uint8_t k_msg_eol[] = "\r\n";
200static const uint8_t k_msg_pass[] = "import_reader: miss->compile->cache->hit->read PASS\r\n";
201static const uint8_t k_msg_fail[] = "import_reader: FAIL ";
202
203/* =============================================================================
204 * Console output helpers
205 * =============================================================================
206 */
207
219static void imp_print(const uint8_t* msg, uint32_t len)
220{
221 (void)ra8_board_uart_console_write(msg, (size_t)len);
222}
223
225#define IMP_PUTS(lit) imp_print((lit), (uint32_t)sizeof(lit) - 1U)
226
237static void imp_print_cstr(const char* str)
238{
239 uint32_t n = 0U;
240 while ((n < (uint32_t)k_imp_str_max) && (str[n] != '\0')) {
241 n++;
242 }
243 imp_print((const uint8_t*)str, n);
244}
245
256static void imp_print_uint(uint32_t value)
257{
258 uint8_t buf[k_imp_dec_base];
259 uint32_t n = 0U;
260 if (value == 0U) {
261 buf[n] = '0';
262 n++;
263 }
264 while ((value > 0U) && (n < (uint32_t)k_imp_dec_base)) {
265 buf[n] = (uint8_t)('0' + (value % (uint32_t)k_imp_dec_base));
266 n++;
267 value /= (uint32_t)k_imp_dec_base;
268 }
269 for (uint32_t i = 0U; i < n; i++) {
270 imp_print(&buf[n - 1U - i], 1U);
271 }
272}
273
285static void imp_panic(const char* stage)
286{
288 imp_print_cstr(stage);
289 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
291 __asm__ volatile("bkpt #0");
292 while (true) {
293 __asm__ volatile("wfi");
294 }
295}
296
297/* =============================================================================
298 * Hardware bring-up
299 * =============================================================================
300 */
301
313static void imp_setup_or_halt(uint32_t* out_pclka_hz)
314{
315 uint32_t cpuclk0_hz = 0U;
316 uint32_t pclka_hz = 0U;
317 if (ra8_cgc_init() != k_ra8_ok) {
318 imp_panic("clocks");
319 }
321 imp_panic("clocks");
322 }
324 imp_panic("clocks");
325 }
326 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
327 imp_panic("time");
328 }
330 imp_panic("console");
331 }
332 *out_pclka_hz = pclka_hz;
333}
334
346static void imp_init_card_or_halt(uint32_t pclka_hz)
347{
348 const ra8_sdmmc_spi_sci_pins_t pins = {
349 .sck = k_imp_pin_sck,
350 .cipo = k_imp_pin_cipo,
351 .copi = k_imp_pin_copi,
352 .cs = k_imp_pin_cs,
353 };
354 ra8_sdmmc_spi_transport_t transport = {};
355 if (ra8_sdmmc_spi_transport_sci((uint8_t)k_imp_spi_channel, pclka_hz, &pins, &transport) !=
356 k_ra8_ok) {
357 imp_panic("sd transport");
358 }
359 if (ra8_sdmmc_spi_init(&transport) != k_ra8_ok) {
360 imp_panic("sd init");
361 }
363}
364
377static void imp_mount_or_halt(ra8_fs_mount_t** out_mount)
378{
379 ra8_fs_backend_t backend = {};
380 if (ra8_sdmmc_spi_bind_fs_backend(&backend) != k_ra8_ok) {
381 imp_panic("sd backend");
382 }
383 if (ra8_fs_mount(&backend, out_mount) != k_ra8_ok) {
384 imp_panic("mount");
385 }
387}
388
389/* =============================================================================
390 * Importer wiring (production compile adapter behind the DIP seam)
391 * =============================================================================
392 */
393
399
417static void imp_build_cookie(void)
418{
420 .chapters = s_imp_chapters,
421 .chapter_cap = (uint32_t)k_imp_chapter_cap,
422 .nodes = s_imp_nodes,
423 .node_cap = (uint32_t)k_imp_node_cap,
424 .attrs = s_imp_attrs,
425 .attr_cap = (uint32_t)k_imp_attr_cap,
426 .stylesheets = s_imp_styles,
427 .stylesheet_cap = (uint32_t)k_imp_style_cap,
428 .images = s_imp_images,
429 .image_cap = (uint32_t)k_imp_image_cap,
430 .string_pool = s_imp_strpool,
431 .string_cap = (uint32_t)k_imp_string_cap,
432 .image_pool = s_imp_imgpool,
433 .image_pool_cap = (uint32_t)k_imp_imgpool_cap,
434 .out = s_imp_out,
435 .out_cap = (uint32_t)k_imp_out_cap,
436 };
439 .xhtml = s_imp_xhtml,
440 .xhtml_cap = sizeof(s_imp_xhtml),
441 .image_raw = s_imp_image_raw,
442 .image_cap = sizeof(s_imp_image_raw),
443 .img_arena = &s_imp_arena,
444 .gray = s_imp_gray,
445 .gray_cap = (uint32_t)k_imp_gray_cap,
446 .css = s_imp_css,
447 .css_cap = sizeof(s_imp_css),
448 .xml_workspace = &s_imp_xml_workspace,
449 };
451 .epub = &s_imp_epub,
452 .cache = &s_imp_cache,
453 .cache_frames = s_imp_cache_frames,
454 .cache_frame_bytes = (uint32_t)k_imp_cache_frame_bytes,
455 .cache_frame_count = (uint32_t)k_imp_cache_frames,
456 .cache_meta = s_imp_cache_meta,
457 .cache_keys = s_imp_cache_keys,
458 .cache_buckets = s_imp_cache_buckets,
459 .cache_bucket_count = (uint32_t)k_imp_cache_buckets,
460 .bufs = &s_imp_bufs,
461 .scr = &s_imp_scr,
462 };
463}
464
478{
479 rabook_import_cfg_t cfg = {};
480 cfg.mount = mount;
484 cfg.scratch_cap = (uint32_t)k_imp_scratch_cap;
485 cfg.format_version = (uint32_t)k_imp_format_version;
487 return cfg;
488}
489
490/* =============================================================================
491 * Cache read-back + book walk
492 * =============================================================================
493 */
494
511[[nodiscard]] static ra8_err_t
512imp_read_cache(ra8_fs_mount_t* mount, const char* path, uint32_t* out_len)
513{
514 ra8_fs_file_t* file = nullptr;
515 ra8_err_t err = ra8_fs_open(mount, path, k_ra8_fs_mode_read, &file);
516 if (err != k_ra8_ok) {
517 return err;
518 }
519 uint64_t size = 0U;
520 err = ra8_fs_size(file, &size);
521 if (err != k_ra8_ok) {
522 (void)ra8_fs_close(file);
523 return err;
524 }
525 if (size > (uint64_t)sizeof(s_imp_readback)) {
526 (void)ra8_fs_close(file);
527 return k_ra8_err_no_mem;
528 }
529 uint32_t got = 0U;
530 err = ra8_fs_read(file, s_imp_readback, (uint32_t)sizeof(s_imp_readback), &got);
531 (void)ra8_fs_close(file);
532 if (err != k_ra8_ok) {
533 return err;
534 }
535 *out_len = got;
536 return k_ra8_ok;
537}
538
553[[nodiscard]] static ra8_err_t imp_walk_book(uint32_t len)
554{
555 const void* base = (const void*)s_imp_readback;
556 ra8_err_t err = book_validate(base, (size_t)len);
557 if (err != k_ra8_ok) {
558 return err;
559 }
560 const book_header_t* hdr = book_header(base);
565 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
566
567 for (uint32_t ci = 0U; ci < hdr->chapter_count; ci++) {
568 size_t tlen = 0U;
569 ra8_err_t cerr = book_chapter_text(base, ci, (char*)s_imp_xhtml, sizeof(s_imp_xhtml), &tlen);
570 if (cerr != k_ra8_ok) {
571 return cerr;
572 }
574 imp_print_uint(ci);
576 imp_print_uint((uint32_t)tlen);
577 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
578 }
579 return k_ra8_ok;
580}
581
582/* =============================================================================
583 * End-to-end flow
584 * =============================================================================
585 */
586
598static void imp_run(ra8_fs_mount_t* mount)
599{
602 char path1[k_imp_path_cap] = {};
603 char path2[k_imp_path_cap] = {};
604
605 /* First open: cache miss -> compile + write-through. */
606 if (rabook_import_open(&cfg, k_imp_epub_path, path1, (uint32_t)sizeof(path1), &out) != k_ra8_ok) {
607 imp_panic("import compile");
608 }
609 if (out != k_rabook_import_compiled) {
610 imp_panic("expected miss");
611 }
613 imp_print_cstr(path1);
614 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
615
616 /* The .rabook now exists on the card. */
617 uint32_t cache_len = 0U;
618 if (imp_read_cache(mount, path1, &cache_len) != k_ra8_ok) {
619 imp_panic("cache read");
620 }
622 imp_print_uint(cache_len);
623 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
624
625 /* Second open: fresh cache -> hit, the compiler seam is NOT invoked. */
626 if (rabook_import_open(&cfg, k_imp_epub_path, path2, (uint32_t)sizeof(path2), &out) != k_ra8_ok) {
627 imp_panic("import reopen");
628 }
629 if (out != k_rabook_import_hit) {
630 imp_panic("expected hit");
631 }
633 imp_print_cstr(path2);
634 imp_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
635
636 /* Read the cached book back and walk it. */
637 if (imp_read_cache(mount, path2, &cache_len) != k_ra8_ok) {
638 imp_panic("cache reread");
639 }
640 if (imp_walk_book(cache_len) != k_ra8_ok) {
641 imp_panic("book walk");
642 }
643}
644
645/* =============================================================================
646 * Main
647 * =============================================================================
648 */
649
659void main(void)
660{
661 uint32_t pclka_hz = 0U;
662 imp_setup_or_halt(&pclka_hz);
664 ra8_log_init();
666
667 imp_init_card_or_halt(pclka_hz);
668
669 ra8_fs_mount_t* mount = nullptr;
670 imp_mount_or_halt(&mount);
671
673 imp_run(mount);
674
677
678 while (true) {
679 __asm__ volatile("wfi");
680 }
681}
void main(void)
Secure fallback main entry point.
Definition main.c:37
Flat, execute-in-place container for a build-time "compiled" e-book.
ra8_err_t book_chapter_text(const void *base, uint32_t chapter_idx, char *out, size_t cap, size_t *out_len)
Extract one chapter's readable plain text from the DOM.
Definition book_xhtml.c:683
static const book_header_t * book_header(const void *base)
View the blob base as its header.
Definition book.h:382
static const char * book_string(const void *base, uint32_t off)
Resolve a string-pool offset to a NUL-terminated UTF-8 string.
Definition book.h:443
ra8_err_t book_validate(const void *base, size_t size)
Validate that a byte buffer is a well-formed, intact .rabook blob.
Definition book.c:231
EPUB (.epub) reader and chapter iterator for ra8-firmware.
static const uint8_t k_msg_boot[]
Definition main.c:140
static const uint8_t k_msg_fail[]
Definition main.c:63
static const uint8_t k_msg_eol[]
Definition main.c:328
static const uint8_t k_msg_miss[]
Console banner fragment: cache miss counter label.
Definition main.c:288
static const uint8_t k_msg_hit[]
Console banner fragment: cache hit counter label.
Definition main.c:286
static uint8_t s_imp_scratch[k_imp_scratch_cap]
Streaming CRC chunk for the source-key pass.
Definition main.c:139
static epub_book_t s_imp_epub
Open-book storage owned across the compile.
Definition main.c:158
static ra8_vmem_frame_t s_imp_cache_meta[k_imp_cache_frames]
Per-frame metadata for the source page cache.
Definition main.c:146
static book_stylesheet_t s_imp_styles[k_imp_style_cap]
Definition main.c:166
static uint8_t s_imp_readback[k_imp_readback_cap]
Cached-.rabook read-back buffer (4-byte aligned for the accessors).
Definition main.c:182
static ra8_rabook_buffers_t s_imp_bufs
Builder arenas, pipeline scratch, stb arena, and the compiler cookie.
Definition main.c:395
static void imp_build_cookie(void)
Populate the builder/scratch views + the production compile cookie.
Definition main.c:417
static const ra8_port_pin_t k_imp_pin_copi
Definition main.c:127
static char s_imp_strpool[k_imp_string_cap]
Definition main.c:168
static uint8_t s_imp_image_raw[k_imp_imgraw_cap]
Definition main.c:176
#define IMP_PUTS(lit)
Emit a NUL-terminated literal (length via sizeof at the call site).
Definition main.c:225
static uint8_t s_imp_gray[k_imp_gray_cap]
Definition main.c:178
static const uint8_t k_msg_cbytes[]
Definition main.c:194
static void imp_panic(const char *stage)
Print the FAIL banner with a stage tag, then trap and park.
Definition main.c:285
static void imp_run(ra8_fs_mount_t *mount)
Run the import twice (miss then hit), confirm the cache, read + walk.
Definition main.c:598
static char s_imp_css[k_imp_css_cap]
Definition main.c:179
imp_buf_cap_t
SDRAM working-arena capacities (sized for a small text book).
Definition main.c:99
@ k_imp_readback_cap
Cached-.rabook read buffer.
Definition main.c:116
@ k_imp_node_cap
Max DOM nodes.
Definition main.c:104
@ k_imp_image_cap
Max image descriptors.
Definition main.c:107
@ k_imp_cache_buckets
Page-cache hash buckets (~2x frames).
Definition main.c:102
@ k_imp_string_cap
String-pool capacity (bytes).
Definition main.c:108
@ k_imp_imgraw_cap
Raw cover/image scratch (bytes).
Definition main.c:113
@ k_imp_cache_frame_bytes
Source page-cache frame size (bytes).
Definition main.c:100
@ k_imp_gray_cap
Gray downscale scratch (pixels).
Definition main.c:115
@ k_imp_xhtml_cap
Chapter XHTML scratch (bytes).
Definition main.c:111
@ k_imp_attr_cap
Max attribute records.
Definition main.c:105
@ k_imp_arena_cap
stb_image bump arena (bytes).
Definition main.c:114
@ k_imp_css_cap
Stylesheet load scratch (bytes).
Definition main.c:112
@ k_imp_out_cap
Output-blob capacity (bytes).
Definition main.c:110
@ k_imp_cache_frames
Fixed frame budget: 64 x 4 KiB = 256 KiB.
Definition main.c:101
@ k_imp_chapter_cap
Max chapters.
Definition main.c:103
@ k_imp_imgpool_cap
Image-pool capacity (bytes).
Definition main.c:109
@ k_imp_style_cap
Max stylesheets.
Definition main.c:106
static void imp_init_card_or_halt(uint32_t pclka_hz)
Build the SCI-SPI transport, run SD identification; panic on failure.
Definition main.c:346
static rabook_import_compiler_ctx_t s_imp_cookie
Definition main.c:398
static uint8_t s_imp_cache_frames[k_imp_cache_frames *k_imp_cache_frame_bytes]
Fixed frame pool the streamed source is paged through (#230).
Definition main.c:143
static const uint8_t k_msg_textlen[]
Definition main.c:198
imp_config_t
Compile-time settings for the on-import compile + cache + read demo.
Definition main.c:84
@ k_imp_spi_channel
Pmod2 / J25 SCI0 Simple-SPI.
Definition main.c:86
@ k_imp_format_version
RABOOK1 on-disk format stamp.
Definition main.c:87
@ k_imp_path_cap
Cache-path buffer (holds "BOOK.rabook").
Definition main.c:90
@ k_imp_uart_baud
J-Link OB CDC console baud.
Definition main.c:85
@ k_imp_scratch_cap
Source-CRC streaming chunk (bytes).
Definition main.c:89
@ k_imp_dec_base
Radix for integer-to-ASCII.
Definition main.c:91
@ k_imp_importer_version
Importer/compiler version stamp.
Definition main.c:88
@ k_imp_str_max
Bound on a logged C-string (Rule 2).
Definition main.c:92
static ra8_rabook_xml_workspace_t s_imp_xml_workspace
Definition main.c:175
static ra8_err_t imp_read_cache(ra8_fs_mount_t *mount, const char *path, uint32_t *out_len)
Read the whole cached .rabook at path into s_imp_readback.
Definition main.c:512
static const uint8_t k_msg_ch[]
Definition main.c:197
static ra8_img_arena_t s_imp_arena
Definition main.c:397
static const uint8_t k_msg_pass[]
Definition main.c:200
static const uint8_t k_msg_card_ok[]
Definition main.c:190
static ra8_rabook_pipeline_scratch_t s_imp_scr
Definition main.c:396
static void imp_print(const uint8_t *msg, uint32_t len)
Write a byte run on the J-Link OB console.
Definition main.c:219
static const uint8_t k_msg_mounted[]
Definition main.c:191
static const uint8_t k_msg_chaps[]
Definition main.c:196
static uint8_t s_imp_imgpool[k_imp_imgpool_cap]
Definition main.c:169
static void imp_setup_or_halt(uint32_t *out_pclka_hz)
Bring up CGC + SysTick + console SCI; panic on failure.
Definition main.c:313
static const ra8_port_pin_t k_imp_pin_sck
Pmod2 SPI pins (J25) – SCI0 Simple-SPI; CS held by GPIO.
Definition main.c:125
static uint8_t s_imp_xhtml[k_imp_xhtml_cap]
Pipeline scratch (XHTML load + stylesheet load + image decode + gray downscale).
Definition main.c:173
static ra8_vmem_t s_imp_cache
Source page cache; re-initialised by the adapter per compile.
Definition main.c:155
static ra8_err_t imp_walk_book(uint32_t len)
Validate the cached blob and log its title, chapter count, and the plain-text length of every chapter...
Definition main.c:553
static const char k_imp_epub_path[]
Root-level 8.3 source name the appliance imports.
Definition main.c:131
static book_chapter_t s_imp_chapters[k_imp_chapter_cap]
RABOOK1 builder arenas (one per table + the two pools + output).
Definition main.c:162
static book_node_t s_imp_nodes[k_imp_node_cap]
Definition main.c:163
static void imp_mount_or_halt(ra8_fs_mount_t **out_mount)
Bind the SD-over-SPI block device into ra8_fs and mount the volume.
Definition main.c:377
static const ra8_port_pin_t k_imp_pin_cs
Definition main.c:128
static rabook_import_cfg_t imp_make_cfg(ra8_fs_mount_t *mount)
Build the import config that injects the production compile adapter.
Definition main.c:477
static void imp_print_cstr(const char *str)
Emit a NUL-terminated C-string, bounded to k_imp_str_max bytes.
Definition main.c:237
static ra8_vmem_key_t s_imp_cache_keys[k_imp_cache_frames]
Per-frame key storage for the source page cache.
Definition main.c:149
static uint8_t s_imp_out[k_imp_out_cap]
Definition main.c:170
static const uint8_t k_msg_title[]
Definition main.c:195
static book_attr_t s_imp_attrs[k_imp_attr_cap]
Definition main.c:164
static int32_t s_imp_cache_buckets[k_imp_cache_buckets]
Hash-bucket heads for the source page cache.
Definition main.c:152
static void imp_print_uint(uint32_t value)
Print a small unsigned integer in decimal.
Definition main.c:256
static uint8_t s_imp_img_scratch[k_imp_arena_cap]
Definition main.c:177
static book_image_t s_imp_images[k_imp_image_cap]
Definition main.c:167
static const ra8_port_pin_t k_imp_pin_cipo
Definition main.c:126
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.
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.
ra8_err_t ra8_board_uart_console_flush(void)
Block until every byte queued on the J-Link OB VCOM console has finished clocking out on the wire.
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_no_mem
Static buffer exhausted (no dynamic memory on this project).
Definition ra8_err.h:142
@ 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
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.
ra8_err_t ra8_fs_size(const ra8_fs_file_t *file, uint64_t *out_bytes)
Report the file's size in bytes (64-bit on exFAT, #676).
ra8_err_t ra8_fs_read(ra8_fs_file_t *file, uint8_t *buf, uint32_t max_len, uint32_t *got_len)
Read up to max_len bytes; advance the cluster chain on cluster crossings.
ra8_err_t ra8_fs_open(ra8_fs_mount_t *handle, const char *path, ra8_fs_mode_t mode, ra8_fs_file_t **out_file)
Open or create a file by path, 8.3 or long.
ra8_err_t ra8_fs_close(ra8_fs_file_t *file)
Close an open file, stamping its final modification time.
@ k_ra8_fs_mode_read
Read-only, must exist.
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Lightweight Logging Interface for ra8-firmware.
void ra8_log_init(void)
Initialise the logging backend.
Definition ra8_log.c:379
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
End-to-end EPUB -> RABOOK1 compile pipeline (#149).
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.
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
Byte-range page cache with SLRU eviction (Layer 2, #147).
ra8_keycache_cell_t ra8_vmem_frame_t
Per-frame cache metadata (one caller-owned array entry per frame).
Definition ra8_vmem.h:122
Zero-heap builder that emits a RABOOK1 blob (the #149 compiler back-end).
On-import EPUB -> .rabook compile-and-cache manager (#151).
rabook_import_outcome_t
How rabook_import_open satisfied the request.
@ k_rabook_import_hit
Fresh cache reused; the compiler was NOT invoked.
@ k_rabook_import_compiled
Miss/stale; the book was compiled and cached.
ra8_err_t rabook_import_open(const rabook_import_cfg_t *cfg, const char *epub_path, char *out_cache_path, uint32_t cache_path_cap, rabook_import_outcome_t *out_outcome)
Resolve a source .epub to a fresh cached .rabook, compiling once.
Production adapter binding the import seam to the real compiler (#151).
ra8_err_t rabook_import_compile_adapter(void *compile_ctx, ra8_fs_mount_t *mount, const char *epub_path, const char *out_path)
Import-seam adapter: stream a .epub off mount and compile it.
One name="value" attribute on an element.
Definition book.h:317
One spine document (a renderable chapter) plus its TOC label.
Definition book.h:280
Fixed 100-byte prologue describing every table and pool in the blob.
Definition book.h:246
uint32_t chapter_count
Number of spine chapters.
Definition book.h:256
uint32_t title_off
String-pool offset of the book title.
Definition book.h:251
Descriptor for one transcoded image in the image pool.
Definition book.h:354
One DOM node.
Definition book.h:299
A preserved CSS stylesheet and the chapter it scopes to.
Definition book.h:332
Opened EPUB book.
Definition epub.h:286
Block-device interface that ra8_fs runs on top of.
Open-file state.
Cached parse of one mounted FAT volume.
Caller-owned bump arena backing a single image decode.
Caller-owned, fixed-capacity arenas the builder appends into (no heap).
Caller-owned temporary buffers the pipeline stage needs.
Caller-owned storage for one parser invocation.
The four bus pins of an SCI Simple-SPI SD slot.
Driver-to-bus binding (Dependency Inversion seam).
The (object_id, frame-aligned offset) key the page cache hashes on.
Definition ra8_vmem.h:136
Page-cache state (caller-owned; treat as private).
Definition ra8_vmem.h:179
Injected dependencies + versioning for rabook_import_open.
uint32_t scratch_cap
Capacity of scratch in bytes.
ra8_fs_mount_t * mount
Mounted FAT volume (cache + source).
void * compile_ctx
Cookie forwarded to compile.
rabook_import_compile_fn compile
Compile-on-miss seam (non-NULL).
uint32_t format_version
.rabook format version stamp.
uint8_t * scratch
Streaming buffer for the source CRC.
uint32_t importer_version
Importer/compiler version stamp.
Cookie carrying the storage rabook_import_compile_adapter needs.