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
46
47#include <stddef.h>
48#include <stdint.h>
49
50#include "literata_latin1.h"
51#include "ra8_attributes.h"
52#include "ra8_board_ek_ra8d2.h"
53#include "ra8_boot_entry.h"
54#include "ra8_cgc.h"
55#include "ra8_err.h"
56#include "ra8_fs.h"
57#include "ra8_isr.h"
58#include "ra8_log.h"
59#include "ra8_port_utils.h"
60#include "ra8_sci_spi.h"
61#include "ra8_sdmmc_spi.h"
62#include "ra8_spi.h"
63#include "ra8_time.h"
64#include "reflow.h"
65#include "reflow_cache.h"
66
68typedef enum : uint32_t {
69 k_pc_uart_baud = 115200U,
72 98304U,
73 k_pc_blob_cap = 16384U,
74 k_pc_view_w = 600U,
75 k_pc_view_h = 800U,
78 k_pc_ink_argb = 0xFF101010U,
79 k_pc_link_argb = 0xFF2A52BEU,
80 k_pc_crc_init = 0xFFFFFFFFU,
81 k_pc_crc_poly = 0xEDB88320U,
84
93
102
111
120
128static const char s_pc_font_path[] = "FONT.OTF";
129
137static const char s_pc_cache_path[] = "PCACHE.BIN";
138
147static const char s_pc_body[] = "<html><body><h1>Cache</h1>"
148 "<p>Pagination cache round-trip on silicon.</p>"
149 "<p>Second paragraph for the break engine.</p></body></html>";
150
169
171typedef enum : uint32_t {
173} pc_pace_t;
174
175/* ---- J-Link / ra8_emulator readable diagnostics (memprobe gate) ------------- */
176
178volatile uint32_t g_pc_err = (uint32_t)k_pc_err_none;
180volatile uint32_t g_pc_hit = 0U;
182volatile uint32_t g_pc_crc_match = 0U;
184volatile uint32_t g_pc_invalidate = 0U;
186volatile uint32_t g_pc_pages = 0U;
188volatile uint32_t g_pc_live_crc = 0U;
190volatile uint32_t g_pc_cache_crc = 0U;
192volatile uint32_t g_pc_heartbeat = 0U;
193
194/* ---- Static storage (large pools off the stack) -------------------------- */
195
197static uint8_t s_font_buf[k_pc_font_cap];
208
216static const uint8_t s_msg_boot[] = "pagecache-hil: boot\r\n";
217
225static const uint8_t s_msg_pass[] = "pagecache-hil: hit=";
226
234static const uint8_t s_msg_ok[] = " crc_match=1 invalidate=1 PASS\r\n";
235
249RA8_INTERNAL static void internal_pc_print(const uint8_t* msg, uint32_t len)
250{
251 (void)ra8_board_uart_console_write(msg, (size_t)len);
252}
253
266[[noreturn]] RA8_INTERNAL static void internal_pc_fail(uint32_t err)
267{
268 g_pc_err = err;
269 while (1) {
270 __asm__ volatile("wfi");
271 }
272}
273
289RA8_INTERNAL static uint32_t internal_pc_crc32(const uint8_t* data, size_t len)
290{
291 uint32_t crc = (uint32_t)k_pc_crc_init;
292 for (size_t i = 0U; i < len; i++) {
293 crc ^= (uint32_t)data[i];
294 for (uint32_t bit = 0U; bit < (uint32_t)k_pc_crc_bits; bit++) {
295 const uint32_t mask = (uint32_t)(-(int32_t)(crc & 1U));
296 crc = (crc >> 1U) ^ ((uint32_t)k_pc_crc_poly & mask);
297 }
298 }
299 return ~crc;
300}
301
319RA8_INTERNAL static bool internal_pc_blob_equal(const uint8_t* a, const uint8_t* b, size_t len)
320{
321 for (size_t i = 0U; i < len; i++) {
322 if (a[i] != b[i]) {
323 return false;
324 }
325 }
326 return true;
327}
328
329/* ---- SPI -> ra8_sdmmc_spi transport adapter (mirror of epub_open) ------ */
330
347// cppcheck-suppress constParameterCallback -- The set_clock vtable fixes void* ctx.
349{
350 const uint32_t pclka_hz = *(const uint32_t*)ctx;
351 return ra8_sci_spi_set_clock((uint8_t)k_pc_spi_chan, hz, pclka_hz);
352}
353
370RA8_INTERNAL static ra8_err_t internal_pc_spi_cs(void* ctx, bool asserted)
371{
372 (void)ctx;
374}
375
395internal_pc_spi_xfer(void* ctx, const uint8_t* tx, uint8_t* rx, uint32_t len)
396{
397 (void)ctx;
398 return ra8_sci_spi_xfer((uint8_t)k_pc_spi_chan, tx, rx, len);
399}
400
416{
418 if (err != k_ra8_ok) {
419 return err;
420 }
422 if (err != k_ra8_ok) {
423 return err;
424 }
426 if (err != k_ra8_ok) {
427 return err;
428 }
430}
431
444RA8_INTERNAL static void internal_pc_setup_or_halt(uint32_t* out_pclka_hz)
445{
446 uint32_t cpuclk0_hz = 0U;
447 uint32_t pclka_hz = 0U;
448 if ((ra8_cgc_init() != k_ra8_ok) ||
451 (ra8_time_init(cpuclk0_hz) != k_ra8_ok)) {
453 }
456 }
459 }
460 const ra8_sci_spi_cfg_t spi_cfg = {.baud_hz = (uint32_t)k_ra8_sdmmc_spi_clock_init_hz,
461 .pclk_hz = pclka_hz,
462 .mode = k_ra8_spi_mode_0,
463 .lsb_first = false};
464 if (ra8_sci_spi_init((uint8_t)k_pc_spi_chan, &spi_cfg) != k_ra8_ok) {
466 }
467 *out_pclka_hz = pclka_hz;
468}
469
482RA8_INTERNAL static void internal_pc_init_card_or_halt(uint32_t* pclka_hz)
483{
484 const ra8_sdmmc_spi_transport_t transport = {.set_clock = internal_pc_spi_set_clock,
485 .cs = internal_pc_spi_cs,
486 .xfer = internal_pc_spi_xfer,
487 .ctx = pclka_hz};
488 if (ra8_sdmmc_spi_init(&transport) != k_ra8_ok) {
490 }
491}
492
507{
510 }
511 ra8_fs_mount_t* mount = nullptr;
512 if (ra8_fs_mount(&s_backend, &mount) != k_ra8_ok) {
513 ra8_fs_format_opts_t opts = {};
515 opts.label = "RAPCACHE";
516 if ((ra8_fs_format(&s_backend, &opts) != k_ra8_ok) ||
517 (ra8_fs_mount(&s_backend, &mount) != k_ra8_ok)) {
519 }
520 }
521 return mount;
522}
523
537RA8_INTERNAL static void internal_pc_font_or_halt(ra8_fs_mount_t* mount, uint32_t* out_len)
538{
539 ra8_fs_file_t* file = nullptr;
540 if (ra8_fs_open(mount, s_pc_font_path, k_ra8_fs_mode_read, &file) != k_ra8_ok) {
541 if (ra8_fs_write_file(mount,
546 }
547 if (ra8_fs_open(mount, s_pc_font_path, k_ra8_fs_mode_read, &file) != k_ra8_ok) {
549 }
550 }
551 uint32_t got = 0U;
552 if ((ra8_fs_read(file, s_font_buf, (uint32_t)k_pc_font_cap, &got) != k_ra8_ok) || (got == 0U)) {
553 (void)ra8_fs_close(file);
555 }
556 (void)ra8_fs_close(file);
557 *out_len = got;
558}
559
577RA8_INTERNAL static uint32_t
578internal_pc_read_cache(ra8_fs_mount_t* mount, uint8_t* buf, uint32_t cap)
579{
580 ra8_fs_file_t* file = nullptr;
582 return 0U;
583 }
584 uint32_t got = 0U;
585 if (ra8_fs_read(file, buf, cap, &got) != k_ra8_ok) {
586 got = 0U;
587 }
588 (void)ra8_fs_close(file);
589 return got;
590}
591
608RA8_INTERNAL static bool internal_pc_engine_init(uint16_t font_px, uint32_t font_len)
609{
610 return reflow_init((uint16_t)k_pc_view_w,
611 (uint16_t)k_pc_view_h,
613 (size_t)font_len,
614 font_px,
615 (uint32_t)k_pc_ink_argb,
616 (uint32_t)k_pc_link_argb,
617 &s_engine) == k_ra8_ok;
618}
619
633RA8_INTERNAL static void internal_pc_live_layout_or_halt(uint32_t font_len, size_t* out_n)
634{
635 if (!internal_pc_engine_init((uint16_t)k_pc_font_px, font_len)) {
637 }
638 uint32_t pages = 0U;
640 (const uint8_t*)s_pc_body,
641 (size_t)(sizeof(s_pc_body) - 1U),
642 &pages) != k_ra8_ok) {
644 }
645 g_pc_pages = pages;
646 size_t n = 0U;
648 (const uint8_t*)s_pc_body,
649 (size_t)(sizeof(s_pc_body) - 1U),
651 (size_t)k_pc_blob_cap,
652 &n) != k_ra8_ok) {
654 }
656 *out_n = n;
657}
658
673{
674 if (ra8_fs_write_file(mount, s_pc_cache_path, s_live_blob, (uint32_t)n) != k_ra8_ok) {
676 }
677 const uint32_t got = internal_pc_read_cache(mount, s_read_blob, (uint32_t)k_pc_blob_cap);
678 if (got != (uint32_t)n) {
680 }
683 }
684}
685
699RA8_INTERNAL static void internal_pc_reload_check_or_halt(uint32_t font_len, size_t n)
700{
701 if (!internal_pc_engine_init((uint16_t)k_pc_font_px, font_len)) {
703 }
705 (const uint8_t*)s_pc_body,
706 (size_t)(sizeof(s_pc_body) - 1U),
708 n) != k_ra8_ok) {
710 }
711 size_t n2 = 0U;
713 (const uint8_t*)s_pc_body,
714 (size_t)(sizeof(s_pc_body) - 1U),
716 (size_t)k_pc_blob_cap,
717 &n2) != k_ra8_ok) {
719 }
721 if ((n2 != n) || (g_pc_cache_crc != g_pc_live_crc)) {
723 }
724 g_pc_crc_match = 1U;
725}
726
740RA8_INTERNAL static void internal_pc_invalidate_check_or_halt(uint32_t font_len, size_t n)
741{
742 if (!internal_pc_engine_init((uint16_t)k_pc_font_px_alt, font_len)) {
744 }
746 (const uint8_t*)s_pc_body,
747 (size_t)(sizeof(s_pc_body) - 1U),
751 }
752 g_pc_invalidate = 1U;
753}
754
764void main(void)
765{
766 uint32_t pclka_hz = 0U;
767 internal_pc_setup_or_halt(&pclka_hz);
769 ra8_log_init();
770 internal_pc_print(s_msg_boot, (uint32_t)sizeof(s_msg_boot) - 1U);
771
774
775 /* Reset-survival: a prior boot's persisted cache file is the hit signal. */
776 g_pc_hit = (internal_pc_read_cache(mount, s_read_blob, (uint32_t)k_pc_blob_cap) != 0U) ? 1U : 0U;
777
778 uint32_t font_len = 0U;
779 internal_pc_font_or_halt(mount, &font_len);
780
781 size_t n = 0U;
786
787 internal_pc_print(s_msg_pass, (uint32_t)sizeof(s_msg_pass) - 1U);
788 internal_pc_print((const uint8_t*)(g_pc_hit != 0U ? "1" : "0"), 1U);
789 internal_pc_print(s_msg_ok, (uint32_t)sizeof(s_msg_ok) - 1U);
790
791 /* Idle with a heartbeat that advances ONLY here -- every failure path parks
792 * in WFI without bumping it -- so a memprobe gate proves the full SD -> ra8_fs
793 * -> reflow_cache round-trip + invalidation ran clean. */
794 while (1) {
797 }
798}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static ra8_fs_backend_t s_backend
SD backend; file-scope so the mount handle may reference it.
Definition main.c:138
static ra8_err_t internal_pc_spi_pins_init(void)
Route Pmod2 SPI signals and initialize chip select high.
Definition main.c:415
pc_err_t
Failure-stage codes stamped to g_pc_err for SWD / --dump-sym.
Definition main.c:155
@ k_pc_err_none
No failure (success path).
Definition main.c:156
@ k_pc_err_crc
Reloaded layout CRC != live CRC.
Definition main.c:166
@ k_pc_err_persist
Write / read-back the blob on SD.
Definition main.c:163
@ k_pc_err_init
CGC / time / console / SPI bring-up.
Definition main.c:157
@ k_pc_err_ser
reflow_cache_serialize.
Definition main.c:162
@ k_pc_err_font
Provision / read FONT.OTF.
Definition main.c:160
@ k_pc_err_load
reflow_cache_load (expected hit).
Definition main.c:165
@ k_pc_err_layout
reflow_init / layout_chapter.
Definition main.c:161
@ k_pc_err_mount
Mount (and format-if-blank).
Definition main.c:159
@ k_pc_err_readback
Read-back blob != written blob.
Definition main.c:164
@ k_pc_err_card
SD card SPI init.
Definition main.c:158
@ k_pc_err_invalid
Alt-size load did not invalidate.
Definition main.c:167
static reflow_t s_engine
Reflow engine (glyph / page / token / text pools live inside).
Definition main.c:199
static ra8_fs_mount_t * internal_pc_mount_or_halt(void)
Bind and mount the SD filesystem, formatting blank media if needed.
Definition main.c:506
static const ra8_port_pin_t s_pc_pin_copi
Pmod2 controller-output/peripheral-input pin.
Definition main.c:110
static const char s_pc_cache_path[]
Root-directory 8.3 name for the serialized pagination cache.
Definition main.c:137
volatile uint32_t g_pc_crc_match
1 if the reloaded-cache blob CRC equals the live-layout blob CRC.
Definition main.c:182
volatile uint32_t g_pc_invalidate
1 if loading the blob at the alt font size returned invalid_state.
Definition main.c:184
static uint8_t s_font_buf[k_pc_font_cap]
Font blob read off the card.
Definition main.c:197
static const uint8_t s_msg_boot[]
Console marker emitted after core and peripheral setup.
Definition main.c:216
static uint8_t s_live_blob[k_pc_blob_cap]
Serialised cache blob from the live layout.
Definition main.c:201
static ra8_err_t internal_pc_spi_cs(void *ctx, bool asserted)
Drive the SD-card active-low chip-select GPIO.
Definition main.c:370
static const uint8_t s_msg_ok[]
Final cache-CRC and invalidation success suffix.
Definition main.c:234
volatile uint32_t g_pc_live_crc
CRC-32 of the live-layout serialised blob.
Definition main.c:188
static uint32_t internal_pc_read_cache(ra8_fs_mount_t *mount, uint8_t *buf, uint32_t cap)
Read the persisted cache file into a bounded caller buffer.
Definition main.c:578
volatile uint32_t g_pc_heartbeat
Idle heartbeat; advances ONLY after every assertion passes.
Definition main.c:192
static const ra8_port_pin_t s_pc_pin_sck
Pmod2 SCI clock pin used by the SD-card transport.
Definition main.c:92
pc_consts_t
Console / SPI / reflow knobs (no magic numbers).
Definition main.c:68
@ k_pc_blob_cap
Cache-blob buffer capacity, bytes.
Definition main.c:73
@ k_pc_font_cap
Font read buffer (OTF is ~57 KiB; trimmed from 128 KiB when the fs sector arena grew ....
Definition main.c:71
@ k_pc_uart_baud
Console baud.
Definition main.c:69
@ k_pc_link_argb
Anchor text colour.
Definition main.c:79
@ k_pc_spi_chan
Pmod2 / J25 SCI0 Simple-SPI.
Definition main.c:70
@ k_pc_view_w
Reflow viewport width, px.
Definition main.c:74
@ k_pc_ink_argb
Body text colour.
Definition main.c:78
@ k_pc_crc_poly
CRC-32 reflected polynomial.
Definition main.c:81
@ k_pc_font_px
Body font size, px (round-trip key).
Definition main.c:76
@ k_pc_font_px_alt
Alt font size to force invalidation.
Definition main.c:77
@ k_pc_crc_init
CRC-32 initial value.
Definition main.c:80
@ k_pc_view_h
Reflow viewport height, px.
Definition main.c:75
@ k_pc_crc_bits
Bits folded per byte.
Definition main.c:82
pc_pace_t
Idle-loop pacing for the success heartbeat.
Definition main.c:171
@ k_pc_frame_ms
Heartbeat period in milliseconds.
Definition main.c:172
static void internal_pc_fail(uint32_t err)
Stamp the failure stage and park the CPU without a heartbeat.
Definition main.c:266
static ra8_err_t internal_pc_spi_xfer(void *ctx, const uint8_t *tx, uint8_t *rx, uint32_t len)
Exchange an SD-card byte span through SCI SPI.
Definition main.c:395
static bool internal_pc_blob_equal(const uint8_t *a, const uint8_t *b, size_t len)
Compare two equal-length cache-blob spans.
Definition main.c:319
static void internal_pc_print(const uint8_t *msg, uint32_t len)
Emit a byte run on the board console.
Definition main.c:249
static uint32_t internal_pc_crc32(const uint8_t *data, size_t len)
Calculate reflected CRC-32 over a byte span.
Definition main.c:289
static bool internal_pc_engine_init(uint16_t font_px, uint32_t font_len)
Initialise the engine at font_px over the SD font.
Definition main.c:608
static const uint8_t s_msg_pass[]
Prefix for the final reset-survival hit diagnostic.
Definition main.c:225
static uint8_t s_read_blob[k_pc_blob_cap]
Blob read back off SD (compared to s_live_blob).
Definition main.c:203
static ra8_err_t internal_pc_spi_set_clock(void *ctx, uint32_t hz)
Apply an SD-card SPI clock through the SCI transport.
Definition main.c:348
static uint8_t s_reser_blob[k_pc_blob_cap]
Blob re-serialised from the reloaded engine (CRC vs live).
Definition main.c:205
static void internal_pc_reload_check_or_halt(uint32_t font_len, size_t n)
Load the read-back blob into a fresh same-size engine and CRC it.
Definition main.c:699
static const char s_pc_font_path[]
Root-directory 8.3 name for the persisted font.
Definition main.c:128
static void internal_pc_font_or_halt(ra8_fs_mount_t *mount, uint32_t *out_len)
Provision FONT.OTF if absent, then read it into s_font_buf.
Definition main.c:537
static void internal_pc_setup_or_halt(uint32_t *out_pclka_hz)
Bring up clocks, timekeeping, console, and the SD SPI controller.
Definition main.c:444
static void internal_pc_init_card_or_halt(uint32_t *pclka_hz)
Initialize the SD card over the configured SPI transport.
Definition main.c:482
static const ra8_port_pin_t s_pc_pin_cipo
Pmod2 controller-input/peripheral-output pin.
Definition main.c:101
static const char s_pc_body[]
Fixed HTML chapter used by the live and cached layout passes.
Definition main.c:147
static void internal_pc_invalidate_check_or_halt(uint32_t font_len, size_t n)
Verify that a font-size change invalidates the persisted cache.
Definition main.c:740
volatile uint32_t g_pc_err
First failing stage (pc_err_t), 0 on success.
Definition main.c:178
static const ra8_port_pin_t s_pc_pin_cs
GPIO-driven active-low SD-card chip-select pin.
Definition main.c:119
static void internal_pc_live_layout_or_halt(uint32_t font_len, size_t *out_n)
Lay out the chapter live and serialise it into s_live_blob.
Definition main.c:633
static void internal_pc_persist_and_verify_or_halt(ra8_fs_mount_t *mount, size_t n)
Persist the live cache blob and verify an exact read-back.
Definition main.c:672
volatile uint32_t g_pc_cache_crc
CRC-32 of the reloaded-then-reserialised blob.
Definition main.c:190
volatile uint32_t g_pc_hit
1 if the cache file existed at boot (reset-survival hit).
Definition main.c:180
volatile uint32_t g_pc_pages
Page count produced by the live layout.
Definition main.c:186
Declaration of the Latin-1 Literata font baked into internal flash.
const unsigned int g_ra8_font_literata_latin1_len
Length of g_ra8_font_literata_latin1 in bytes.
const unsigned char g_ra8_font_literata_latin1[]
Baked Latin-1 subset of Literata Regular (TrueType/glyf), in flash.
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.
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_invalid_state
Module in wrong state for requested operation.
Definition ra8_err.h:161
@ 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_format(const ra8_fs_backend_t *backend, const ra8_fs_format_opts_t *opts)
Format a block device as a fresh, empty FAT12/FAT16/FAT32/exFAT volume.
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_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.
ra8_err_t ra8_fs_write_file(ra8_fs_mount_t *handle, const char *path, const uint8_t *data, uint32_t len)
Create a whole file in one call (provisioning helper).
@ k_ra8_fs_type_fat32
count_of_clusters >= 65525.
@ k_ra8_fs_mode_read
Read-only, must exist.
@ k_ra8_psel_sci_async
00100b: SCI async serial (UART).
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.
@ k_ra8_level_high
Drive or read 1.
@ k_ra8_level_low
Drive or read 0.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_gpio_output_init(ra8_port_pin_t pin, ra8_level_t init_level)
Configure a pin as a digital output and drive it to an initial level.
Definition gpio.c:88
ra8_err_t ra8_gpio_write(ra8_port_pin_t pin, ra8_level_t level)
Drive a previously-configured output to the given level.
Definition gpio.c:154
ra8_err_t ra8_pfs_route_peripheral(ra8_port_pin_t pin, ra8_psel_t psel, const char *owner)
Route a pin to a non-IRQ peripheral function via PFS.PSEL.
Definition gpio.c:238
SCI Simple-SPI controller-mode driver (polling, full-duplex).
ra8_err_t ra8_sci_spi_set_clock(uint8_t channel, uint32_t baud_hz, uint32_t pclk_hz)
Re-program the bit-rate without otherwise reconfiguring.
ra8_err_t ra8_sci_spi_xfer(uint8_t channel, const uint8_t *tx, uint8_t *rx, uint32_t len)
Full-duplex multi-byte transfer.
ra8_err_t ra8_sci_spi_init(uint8_t channel, const ra8_sci_spi_cfg_t *cfg)
Bring an SCI channel up as a Simple-SPI controller.
SD card driver in SPI-mode (PMOD-attached cards).
@ k_ra8_sdmmc_spi_clock_init_hz
Mandatory init clock floor.
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.
SPI_B controller driver (RA8D2 Type-B SPI peripheral).
@ k_ra8_spi_mode_0
CPOL=0, CPHA=0.
Definition ra8_spi.h:62
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
HTML / CSS reflow + paginate engine for the ra8d2 ereader.
ra8_err_t reflow_layout_chapter(reflow_t *engine, const uint8_t *xhtml_buf, size_t xhtml_len, uint32_t *out_total_pages)
Parse + lay out one chapter of XHTML.
ra8_err_t reflow_init(uint16_t viewport_w, uint16_t viewport_h, const uint8_t *font_data, size_t font_len, uint16_t font_px, uint32_t body_color, uint32_t link_color, reflow_t *out_engine)
Initialise a reflow engine for a given viewport / font.
Import-time pagination cache for reflow (#79).
ra8_err_t reflow_cache_serialize(const reflow_t *engine, const uint8_t *content, size_t content_len, uint8_t *out_buf, size_t out_cap, size_t *out_len)
Serialise the laid-out pages of engine into a keyed byte blob.
ra8_err_t reflow_cache_load(reflow_t *engine, const uint8_t *content, size_t content_len, const uint8_t *buf, size_t len)
Validate a cache blob and, if it matches, restore the layout.
Block-device interface that ra8_fs runs on top of.
Open-file state.
Tunables for ra8_fs_format() (the on-disk geometry of a fresh volume).
ra8_fs_type_t type
FAT variant to lay down (12/16/32).
const char * label
0..11 char volume label, or NULL.
Cached parse of one mounted FAT volume.
Configuration descriptor for ra8_sci_spi_init.
Definition ra8_sci_spi.h:49
Driver-to-bus binding (Dependency Inversion seam).
Reflow / pagination engine state.