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
48
49#include <stddef.h>
50#include <stdint.h>
51
52#include "epub.h"
53#include "epub_fixture.h"
54#include "epub_fs.h"
55#include "ra8_board_ek_ra8d2.h"
56#include "ra8_boot_entry.h"
57#include "ra8_cgc.h"
58#include "ra8_err.h"
59#include "ra8_isr.h"
60#include "ra8_log.h"
61#include "ra8_port_constants.h"
62#include "ra8_port_utils.h"
63#include "ra8_sci_spi.h"
64#include "ra8_sdmmc_spi.h"
65#include "ra8_spi.h"
66#include "ra8_time.h"
67
83
89
91static const char k_eoh_book_path[] = "BOOK.EPB";
92
112
114typedef enum : uint32_t {
116} eoh_pace_t;
117
123volatile uint32_t g_eoh_err = (uint32_t)k_eoh_err_none;
125volatile uint32_t g_eoh_chapters = 0U;
127volatile uint32_t g_eoh_crc = 0U;
129volatile uint32_t g_eoh_heartbeat = 0U;
130
136static uint8_t s_chapter[k_eoh_chap_cap];
139
140static const uint8_t k_msg_boot[] = "epub-open-hil: boot\r\n";
141static const uint8_t k_msg_cardok[] = "epub-open-hil: card ready\r\n";
142static const uint8_t k_msg_finit[] = "epub-hil: FAIL init\r\n";
143static const uint8_t k_msg_fcard[] = "epub-hil: FAIL card\r\n";
144static const uint8_t k_msg_fmount[] = "epub-hil: FAIL mount\r\n";
145static const uint8_t k_msg_fprov[] = "epub-hil: FAIL provision\r\n";
146static const uint8_t k_msg_fopen[] = "epub-hil: FAIL open\r\n";
147static const uint8_t k_msg_fchap[] = "epub-hil: FAIL chapters\r\n";
148static const uint8_t k_msg_fload[] = "epub-hil: FAIL load\r\n";
149static const uint8_t k_msg_fcrc[] = "epub-hil: FAIL crc\r\n";
150static const uint8_t k_msg_fmeta[] = "epub-hil: FAIL meta\r\n";
151static const uint8_t k_msg_pre[] = "epub-hil: chapters=";
152static const uint8_t k_msg_crc[] = " ch0_crc=";
153static const uint8_t k_msg_ok[] = " PASS\r\n";
154
156static void eoh_print(const uint8_t* msg, uint32_t len)
157{
158 (void)ra8_board_uart_console_write(msg, (size_t)len);
159}
160
173static void eoh_fail(uint32_t err, const uint8_t* msg, uint32_t len)
174{
175 g_eoh_err = err;
176 eoh_print(msg, len);
177 while (1) {
178 __asm__ volatile("wfi");
179 }
180}
181
183static uint32_t eoh_crc32(const uint8_t* data, size_t len)
184{
185 uint32_t crc = (uint32_t)k_eoh_crc_init;
186 for (size_t i = 0U; i < len; i++) {
187 crc ^= (uint32_t)data[i];
188 for (uint32_t bit = 0U; bit < (uint32_t)k_eoh_crc_bits; bit++) {
189 const uint32_t mask = (uint32_t)(-(int32_t)(crc & 1U));
190 crc = (crc >> 1U) ^ ((uint32_t)k_eoh_crc_poly & mask);
191 }
192 }
193 return ~crc;
194}
195
197static void eoh_print_hex(uint32_t value)
198{
199 uint8_t buf[k_eoh_hex_nibbles];
200 for (uint32_t i = 0U; i < (uint32_t)k_eoh_hex_nibbles; i++) {
201 const uint32_t shift = ((uint32_t)k_eoh_hex_nibbles - 1U - i) * (uint32_t)k_eoh_nibble_bits;
202 const uint32_t nib = (value >> shift) & (uint32_t)k_eoh_nibble_mask;
203 buf[i] =
204 (uint8_t)((nib < (uint32_t)k_eoh_dec_ten) ? ('0' + nib) : ('A' + (nib - k_eoh_dec_ten)));
205 }
206 eoh_print(buf, (uint32_t)k_eoh_hex_nibbles);
207}
208
210static void eoh_print_uint(uint32_t value)
211{
212 uint8_t buf[k_eoh_dec_ten];
213 uint32_t n = 0U;
214 if (value == 0U) {
215 buf[n] = '0';
216 n++;
217 }
218 while ((value > 0U) && (n < (uint32_t)k_eoh_dec_ten)) {
219 buf[n] = (uint8_t)('0' + (value % (uint32_t)k_eoh_dec_ten));
220 n++;
221 value /= (uint32_t)k_eoh_dec_ten;
222 }
223 for (uint32_t i = 0U; i < n; i++) {
224 eoh_print(&buf[n - 1U - i], 1U);
225 }
226}
227
228/* ---- SPI -> ra8_sdmmc_spi transport adapter (mirror of fs_format_mount) ---- */
229
230/* cppcheck-suppress constParameterCallback -- bound to ra8_sdmmc_spi_transport_t::set_clock, `ra8_err_t (*)(void*, uint32_t)`; constifying ctx would break the binding. */
231static ra8_err_t eoh_spi_set_clock(void* ctx, uint32_t hz)
232{
233 const uint32_t pclka_hz = *(const uint32_t*)ctx;
234 return ra8_sci_spi_set_clock((uint8_t)k_eoh_spi_chan, hz, pclka_hz);
235}
236
238static ra8_err_t eoh_spi_cs(void* ctx, bool asserted)
239{
240 (void)ctx;
242}
243
245static ra8_err_t eoh_spi_xfer(void* ctx, const uint8_t* tx, uint8_t* rx, uint32_t len)
246{
247 (void)ctx;
248 return ra8_sci_spi_xfer((uint8_t)k_eoh_spi_chan, tx, rx, len);
249}
250
252[[nodiscard]] static ra8_err_t eoh_spi_pins_init(void)
253{
255 if (err != k_ra8_ok) {
256 return err;
257 }
259 if (err != k_ra8_ok) {
260 return err;
261 }
263 if (err != k_ra8_ok) {
264 return err;
265 }
267}
268
270static void eoh_setup_or_halt(uint32_t* out_pclka_hz)
271{
272 uint32_t cpuclk0_hz = 0U;
273 uint32_t pclka_hz = 0U;
274 if ((ra8_cgc_init() != k_ra8_ok) ||
277 (ra8_time_init(cpuclk0_hz) != k_ra8_ok) ||
279 eoh_fail((uint32_t)k_eoh_err_init, k_msg_finit, (uint32_t)sizeof(k_msg_finit) - 1U);
280 }
281 if (eoh_spi_pins_init() != k_ra8_ok) {
282 eoh_fail((uint32_t)k_eoh_err_init, k_msg_finit, (uint32_t)sizeof(k_msg_finit) - 1U);
283 }
284 const ra8_sci_spi_cfg_t spi_cfg = {.baud_hz = (uint32_t)k_ra8_sdmmc_spi_clock_init_hz,
285 .pclk_hz = pclka_hz,
286 .mode = k_ra8_spi_mode_0,
287 .lsb_first = false};
288 if (ra8_sci_spi_init((uint8_t)k_eoh_spi_chan, &spi_cfg) != k_ra8_ok) {
289 eoh_fail((uint32_t)k_eoh_err_init, k_msg_finit, (uint32_t)sizeof(k_msg_finit) - 1U);
290 }
291 *out_pclka_hz = pclka_hz;
292}
293
295static void eoh_init_card_or_halt(uint32_t* pclka_hz)
296{
297 const ra8_sdmmc_spi_transport_t transport = {.set_clock = eoh_spi_set_clock,
298 .cs = eoh_spi_cs,
299 .xfer = eoh_spi_xfer,
300 .ctx = pclka_hz};
301 if (ra8_sdmmc_spi_init(&transport) != k_ra8_ok) {
302 eoh_fail((uint32_t)k_eoh_err_card, k_msg_fcard, (uint32_t)sizeof(k_msg_fcard) - 1U);
303 }
304 eoh_print(k_msg_cardok, (uint32_t)sizeof(k_msg_cardok) - 1U);
305}
306
317{
319 eoh_fail((uint32_t)k_eoh_err_mount, k_msg_fmount, (uint32_t)sizeof(k_msg_fmount) - 1U);
320 }
321 ra8_fs_mount_t* mount = nullptr;
322 if (ra8_fs_mount(&s_backend, &mount) != k_ra8_ok) {
323 ra8_fs_format_opts_t opts = {};
325 opts.label = "RAEPUB";
326 if ((ra8_fs_format(&s_backend, &opts) != k_ra8_ok) ||
327 (ra8_fs_mount(&s_backend, &mount) != k_ra8_ok)) {
328 eoh_fail((uint32_t)k_eoh_err_mount, k_msg_fmount, (uint32_t)sizeof(k_msg_fmount) - 1U);
329 }
330 }
331 return mount;
332}
333
336{
337 ra8_fs_file_t* file = nullptr;
339 (void)ra8_fs_close(file); /* already present -- nothing to provision. */
340 return;
341 }
343 k_ra8_ok) {
344 eoh_fail((uint32_t)k_eoh_err_prov, k_msg_fprov, (uint32_t)sizeof(k_msg_fprov) - 1U);
345 }
346}
347
355static uint16_t eoh_parse_or_halt(ra8_fs_mount_t* mount, uint32_t* out_crc)
356{
358 eoh_fail((uint32_t)k_eoh_err_open, k_msg_fopen, (uint32_t)sizeof(k_msg_fopen) - 1U);
359 }
360 uint16_t chapters = 0U;
361 if ((epub_get_chapter_count(&s_book, &chapters) != k_ra8_ok) ||
362 (chapters != (uint16_t)k_eoh_expect_chap)) {
363 eoh_fail((uint32_t)k_eoh_err_chap, k_msg_fchap, (uint32_t)sizeof(k_msg_fchap) - 1U);
364 }
365 size_t got = 0U;
366 if ((epub_load_chapter(&s_book, 0U, s_chapter, (size_t)k_eoh_chap_cap, &got) != k_ra8_ok) ||
367 (got == 0U)) {
368 eoh_fail((uint32_t)k_eoh_err_load, k_msg_fload, (uint32_t)sizeof(k_msg_fload) - 1U);
369 }
370 const uint32_t crc = eoh_crc32(s_chapter, got);
371 if (crc != (uint32_t)k_eoh_expect_crc) {
372 eoh_fail((uint32_t)k_eoh_err_crc, k_msg_fcrc, (uint32_t)sizeof(k_msg_fcrc) - 1U);
373 }
374 epub_metadata_t meta = {};
375 if ((epub_get_metadata(&s_book, &meta) != k_ra8_ok) || (meta.title == nullptr) ||
376 (meta.title[0] == '\0')) {
377 eoh_fail((uint32_t)k_eoh_err_meta, k_msg_fmeta, (uint32_t)sizeof(k_msg_fmeta) - 1U);
378 }
379 *out_crc = crc;
380 return chapters;
381}
382
393void main(void)
394{
395 uint32_t pclka_hz = 0U;
396 eoh_setup_or_halt(&pclka_hz);
398 ra8_log_init();
399 eoh_print(k_msg_boot, (uint32_t)sizeof(k_msg_boot) - 1U);
400
401 eoh_init_card_or_halt(&pclka_hz);
402 ra8_fs_mount_t* const mount = eoh_mount_or_halt();
404
405 uint32_t ch0_crc = 0U;
406 const uint16_t chapters = eoh_parse_or_halt(mount, &ch0_crc);
407
408 /* Latch the results for the J-Link / `--dump-sym` memprobe gate. */
409 g_eoh_chapters = (uint32_t)chapters;
410 g_eoh_crc = ch0_crc;
411
412 eoh_print(k_msg_pre, (uint32_t)sizeof(k_msg_pre) - 1U);
413 eoh_print_uint((uint32_t)chapters);
414 eoh_print(k_msg_crc, (uint32_t)sizeof(k_msg_crc) - 1U);
415 eoh_print_hex(ch0_crc);
416 eoh_print(k_msg_ok, (uint32_t)sizeof(k_msg_ok) - 1U);
417
418 /* Idle with a heartbeat that advances ONLY here -- the failure path parks in
419 * WFI without bumping it -- so a memprobe gate proves the full SD -> ra8_fs ->
420 * epub open/parse pipeline ran and the chapter-0 CRC matched. */
421 while (1) {
424 }
425}
void main(void)
Secure fallback main entry point.
Definition main.c:37
EPUB (.epub) reader and chapter iterator for ra8-firmware.
ra8_err_t epub_get_metadata(const epub_book_t *book, epub_metadata_t *out_meta)
Return Dublin Core metadata strings.
ra8_err_t epub_load_chapter(epub_book_t *book, uint16_t idx, uint8_t *out_xhtml, size_t max_len, size_t *got_len)
Extract the raw XHTML bytes of one chapter into the caller's buffer.
ra8_err_t epub_get_chapter_count(const epub_book_t *book, uint16_t *out_count)
Report how many chapters the spine contains.
ra8_fs -> epub bridge: open a .epub straight off a filesystem.
ra8_err_t epub_open_streamed_fs(ra8_fs_mount_t *mount, const char *path, epub_stream_fs_ctx_t *io, epub_book_t *out_book)
Stream-open an EPUB directly off a mounted ra8_fs volume, no residency (#151).
static const uint8_t k_epub_fixture[k_epub_fixture_len]
Baked seed_two_chapters.epub byte stream.
@ k_epub_fixture_len
EPUB fixture length.
static const uint8_t k_msg_fcard[]
Definition main.c:143
static void eoh_print_hex(uint32_t value)
Print a 32-bit value as 8 upper-case hex digits.
Definition main.c:197
static epub_book_t s_book
Opened book (large – file-scope, not on the stack).
Definition main.c:132
static const ra8_port_pin_t k_eoh_pin_cipo
Definition main.c:86
static const uint8_t k_msg_pre[]
Definition main.c:151
static void eoh_init_card_or_halt(uint32_t *pclka_hz)
Init the SD card over SPI; halt with a diagnostic on failure.
Definition main.c:295
static ra8_err_t eoh_spi_pins_init(void)
Route Pmod2 SPI pins and claim CS as a GPIO output (idle high).
Definition main.c:252
volatile uint32_t g_eoh_heartbeat
Idle heartbeat; advances ONLY after a clean parse (the HIL gate).
Definition main.c:129
volatile uint32_t g_eoh_chapters
Parsed chapter (spine) count on success; 0 otherwise.
Definition main.c:125
static ra8_err_t eoh_spi_xfer(void *ctx, const uint8_t *tx, uint8_t *rx, uint32_t len)
ra8_sdmmc_spi_transport_t::xfer over ra8_sci_spi_xfer.
Definition main.c:245
static const uint8_t k_msg_cardok[]
Definition main.c:141
static uint32_t eoh_crc32(const uint8_t *data, size_t len)
CRC-32 (reflected, poly 0xEDB88320) over data.
Definition main.c:183
static void eoh_provision_or_halt(ra8_fs_mount_t *mount)
Write the baked .epub onto the volume if k_eoh_book_path absent.
Definition main.c:335
static ra8_fs_mount_t * eoh_mount_or_halt(void)
Mount the card, formatting FAT32 first if it is blank/unmountable.
Definition main.c:316
static const uint8_t k_msg_ok[]
Definition main.c:153
eoh_consts_t
Console / SPI / parse knobs (no magic numbers).
Definition main.c:69
@ k_eoh_chap_cap
Chapter XHTML scratch capacity.
Definition main.c:74
@ k_eoh_expect_crc
Chapter-0 XHTML CRC-32 (seed).
Definition main.c:73
@ k_eoh_crc_bits
Bits folded per byte.
Definition main.c:77
@ k_eoh_crc_poly
CRC-32 reflected polynomial.
Definition main.c:76
@ k_eoh_hex_nibbles
Hex digits in a 32-bit value.
Definition main.c:78
@ k_eoh_spi_chan
Pmod2 / J25 SCI0 Simple-SPI.
Definition main.c:71
@ k_eoh_crc_init
CRC-32 initial value.
Definition main.c:75
@ k_eoh_uart_baud
Console baud.
Definition main.c:70
@ k_eoh_expect_chap
Spine length of the baked seed.
Definition main.c:72
@ k_eoh_nibble_bits
Bits per hex nibble.
Definition main.c:79
@ k_eoh_nibble_mask
Low-nibble mask.
Definition main.c:80
@ k_eoh_dec_ten
Hex digit / decimal split.
Definition main.c:81
static ra8_fs_backend_t s_backend
SD backend; file-scope so the mount handle may reference it.
Definition main.c:138
static const uint8_t k_msg_fopen[]
Definition main.c:146
static const uint8_t k_msg_fprov[]
Definition main.c:145
static const char k_eoh_book_path[]
Book path on the SD volume (8.3 short name; ra8_fs is root-only).
Definition main.c:91
static void eoh_setup_or_halt(uint32_t *out_pclka_hz)
Bring up CGC + SysTick + console SCI + SPI + CS GPIO; halt on fail.
Definition main.c:270
static const ra8_port_pin_t k_eoh_pin_copi
Definition main.c:87
static const uint8_t k_msg_crc[]
Definition main.c:152
static void eoh_print_uint(uint32_t value)
Print a small unsigned integer in decimal.
Definition main.c:210
static void eoh_print(const uint8_t *msg, uint32_t len)
Emit a byte run on the SCI8 console.
Definition main.c:156
static const ra8_port_pin_t k_eoh_pin_sck
Pmod2 SPI pins (J25) – SCI0 Simple-SPI; CS held by GPIO.
Definition main.c:85
static ra8_err_t eoh_spi_set_clock(void *ctx, uint32_t hz)
Definition main.c:231
static const uint8_t k_msg_fload[]
Definition main.c:148
volatile uint32_t g_eoh_crc
Chapter-0 decompressed-XHTML CRC-32 on success; 0 otherwise.
Definition main.c:127
static const uint8_t k_msg_fchap[]
Definition main.c:147
static const uint8_t k_msg_fmeta[]
Definition main.c:150
volatile uint32_t g_eoh_err
First failing stage (eoh_err_t), 0 on success.
Definition main.c:123
static uint16_t eoh_parse_or_halt(ra8_fs_mount_t *mount, uint32_t *out_crc)
Open the provisioned .epub off SD, verify the spine, CRC chapter 0.
Definition main.c:355
static epub_stream_fs_ctx_t s_epub_io
Streamed-open source-file context; must outlive s_book (#230).
Definition main.c:134
static const uint8_t k_msg_boot[]
Definition main.c:140
eoh_pace_t
Idle-loop pacing for the success heartbeat.
Definition main.c:114
@ k_eoh_frame_ms
Heartbeat period in milliseconds.
Definition main.c:115
static const uint8_t k_msg_finit[]
Definition main.c:142
static ra8_err_t eoh_spi_cs(void *ctx, bool asserted)
ra8_sdmmc_spi_transport_t::cs over ra8_gpio (CS active-low).
Definition main.c:238
static const uint8_t k_msg_fcrc[]
Definition main.c:149
static const uint8_t k_msg_fmount[]
Definition main.c:144
static uint8_t s_chapter[k_eoh_chap_cap]
Chapter-0 XHTML scratch (file-scope to keep the stack small).
Definition main.c:136
eoh_err_t
Failure-stage codes stamped to g_eoh_err for SWD / --dump-sym.
Definition main.c:100
@ k_eoh_err_mount
Mount (and format-if-blank).
Definition main.c:104
@ k_eoh_err_none
No failure (success path).
Definition main.c:101
@ k_eoh_err_meta
Metadata parse / empty title.
Definition main.c:110
@ k_eoh_err_init
CGC / time / console / SPI bring-up.
Definition main.c:102
@ k_eoh_err_prov
Provision the .epub onto the card.
Definition main.c:105
@ k_eoh_err_chap
Chapter-count mismatch.
Definition main.c:107
@ k_eoh_err_card
SD card SPI init.
Definition main.c:103
@ k_eoh_err_open
epub_open_streamed_fs.
Definition main.c:106
@ k_eoh_err_load
Chapter-0 DEFLATE load.
Definition main.c:108
@ k_eoh_err_crc
Chapter-0 CRC mismatch.
Definition main.c:109
static void eoh_fail(uint32_t err, const uint8_t *msg, uint32_t len)
Stamp the failure stage, print the FAIL banner, and park the CPU.
Definition main.c:173
static const ra8_port_pin_t k_eoh_pin_cs
Definition main.c:88
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_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
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_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
Typed Port / Pin Constants for the RA8D2 IOPORT Module.
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
Opened EPUB book.
Definition epub.h:286
Dublin Core metadata bundle returned by epub_get_metadata().
Definition epub.h:370
const char * title
NUL-terminated title; "" if absent.
Definition epub.h:371
Backing state for a streamed ra8_fs EPUB open (#151).
Definition epub_fs.h:55
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).