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
35
36#include <stdint.h>
37#include <string.h>
38
39#include "ra8_board_ek_ra8d2.h"
40#include "ra8_boot_entry.h"
41#include "ra8_cgc.h"
42#include "ra8_check.h"
43#include "ra8_err.h"
44#include "ra8_isr.h"
45#include "ra8_log.h"
46#include "ra8_sdcard.h"
47#include "ra8_sdhi.h"
48#include "ra8_time.h"
49
50/* =============================================================================
51 * Tunables
52 * =============================================================================
53 */
54
71
72/* The test block must sit above block 0 (the FAT BPB) so the round-trip never
73 * clobbers the boot sector; promote the doc-only @pre to a compile-time check. */
74static_assert((uint32_t)k_sdhi_card_test_lba > 0U,
75 "ra8_sdhi_card_demo test LBA must be above block 0 (the FAT BPB)");
76
77/* =============================================================================
78 * Static message strings (ASCII-only per project policy)
79 * =============================================================================
80 */
81
82static const uint8_t k_msg_boot[] = "ra8_sdhi_card_demo: boot\r\n";
83static const uint8_t k_msg_card_ok[] = "ra8_sdhi_card_demo: card ready\r\n";
84static const uint8_t k_msg_init_fail[] = "ra8_sdhi_card_demo: FAIL init\r\n";
85static const uint8_t k_msg_pass[] = "ra8_sdhi_card_demo: native SDHI block round-trip PASS\r\n";
86static const uint8_t k_msg_fail[] = "ra8_sdhi_card_demo: FAIL\r\n";
87
89static const char* const s_tag = "ra8_sdhi_card_demo";
90
91/* =============================================================================
92 * UART output helpers
93 * =============================================================================
94 */
95
116static void sdhi_card_print(const uint8_t* msg, uint32_t len)
117{
118 (void)ra8_board_uart_console_write(msg, (size_t)len);
119}
120
122#define SDHI_CARD_PUTS(lit) sdhi_card_print((lit), (uint32_t)sizeof(lit) - 1U)
123
140static void sdhi_card_panic_halt(void)
141{
142 while (true) {
143 __asm__ volatile("wfi");
144 }
145}
146
147/* =============================================================================
148 * Hardware bring-up
149 * =============================================================================
150 */
151
170static void sdhi_card_setup_or_halt(void)
171{
172 uint32_t cpuclk0_hz = 0U;
173 if (ra8_cgc_init() != k_ra8_ok) {
175 }
178 }
179 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
181 }
184 }
187 }
188}
189
207static void sdhi_card_init_or_halt(void)
208{
209 /* Request the SD 4-bit wide bus (ACMD6). Best-effort inside
210 * ra8_sdcard_init: a card that declines is left at 1-bit and init
211 * still succeeds, so this never turns a working card into a failure. */
212 const ra8_sdcard_cfg_t cfg = {.instance = (uint8_t)k_sdhi_card_instance,
213 .bus_width = k_ra8_sdhi_bus_width_4bit};
214 if (ra8_sdcard_init(&cfg) != k_ra8_ok) {
217 }
219}
220
221/* =============================================================================
222 * Payload + raw-block round-trip
223 * =============================================================================
224 */
225
229
247static void sdhi_card_fill_payload(void)
248{
249 uint32_t state = (uint32_t)k_sdhi_card_prng_seed;
250 for (uint32_t i = 0U; i < (uint32_t)k_sdhi_card_block_bytes; i++) {
251 state = (state * (uint32_t)k_sdhi_card_prng_mul) + (uint32_t)k_sdhi_card_prng_add;
253 }
254}
255
276[[nodiscard]] static ra8_err_t sdhi_card_check_capacity(void)
277{
278 uint32_t blocks = 0U;
280 if (blocks <= (uint32_t)k_sdhi_card_test_lba) {
282 }
283 return k_ra8_ok;
284}
285
307[[nodiscard]] static ra8_err_t sdhi_card_block_roundtrip(void)
308{
310 s_payload,
311 (uint32_t)k_sdhi_card_block_count),
312 s_tag,
313 "write");
314 memset(s_readback, 0, sizeof(s_readback));
317 (uint32_t)k_sdhi_card_block_count),
318 s_tag,
319 "read");
322 }
323 return k_ra8_ok;
324}
325
344[[nodiscard]] static ra8_err_t sdhi_card_roundtrip(void)
345{
348 return k_ra8_ok;
349}
350
351/* =============================================================================
352 * Main
353 * =============================================================================
354 */
355
373void main(void)
374{
377 ra8_log_init();
379
382
383 const ra8_err_t r = sdhi_card_roundtrip();
384 if (r != k_ra8_ok) {
387 }
390
391 while (true) {
392 __asm__ volatile("wfi");
393 }
394}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static uint8_t s_payload[(size_t) k_demo_payload]
Original payload, compressed-blob staging, and the inflated copy.
Definition main.c:92
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_pass[]
Definition main.c:200
static const uint8_t k_msg_card_ok[]
Definition main.c:190
static const uint8_t k_msg_init_fail[]
Definition main.c:84
static void sdhi_card_print(const uint8_t *msg, uint32_t len)
Write a byte run on the J-Link OB VCOM console.
Definition main.c:116
static void sdhi_card_panic_halt(void)
Halt forever in WFI – panic stop on irrecoverable failure.
Definition main.c:140
static ra8_err_t sdhi_card_block_roundtrip(void)
Write the payload, read it back, and byte-compare (raw SDHI blocks).
Definition main.c:307
sdhi_card_config_t
Compile-time settings for the native-SDHI raw-block round-trip.
Definition main.c:59
@ k_sdhi_card_prng_mul
Numerical Recipes LCG multiplier.
Definition main.c:66
@ k_sdhi_card_prng_byte_shift
Bit shift selecting the PRNG byte.
Definition main.c:68
@ k_sdhi_card_uart_baud
J-Link OB CDC console baud.
Definition main.c:60
@ k_sdhi_card_byte_mask
Low-byte mask.
Definition main.c:69
@ k_sdhi_card_instance
SDHI0 drives the micro-SD bus.
Definition main.c:61
@ k_sdhi_card_prng_seed
Deterministic payload seed.
Definition main.c:65
@ k_sdhi_card_block_count
Round-trip one block.
Definition main.c:64
@ k_sdhi_card_block_bytes
One SD block.
Definition main.c:62
@ k_sdhi_card_prng_add
Numerical Recipes LCG increment.
Definition main.c:67
@ k_sdhi_card_test_lba
Block to round-trip (clear of the BPB).
Definition main.c:63
static void sdhi_card_fill_payload(void)
Fill the payload buffer with a deterministic LCG byte sequence.
Definition main.c:247
static ra8_err_t sdhi_card_check_capacity(void)
Confirm the card capacity covers the test block, then check it is sane.
Definition main.c:276
static void sdhi_card_init_or_halt(void)
Init the SD card over native SDHI, panic-halt on failure.
Definition main.c:207
static void sdhi_card_setup_or_halt(void)
Bring up CGC + SysTick + the board console + SDHI bus pins; panic on fail.
Definition main.c:170
#define SDHI_CARD_PUTS(lit)
Emit a NUL-terminated literal (length via sizeof at the call site).
Definition main.c:122
static ra8_err_t sdhi_card_roundtrip(void)
Run the capacity check + raw-block round-trip in order.
Definition main.c:344
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_sdhi_pins_init(void)
Route the eight SDHI0 bus pins to the SDHI peripheral function.
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
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Definition ra8_cgc.c:727
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Definition ra8_check.h:184
Error Code Definitions for ra8-firmware.
@ k_ra8_err_checksum_mismatch
Stored / transmitted checksum does not match computed value.
Definition ra8_err.h:465
@ k_ra8_err_out_of_range
Sensor or peripheral output out of valid range.
Definition ra8_err.h:337
@ 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
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
int memcmp(const void *a, const void *b, size_t n)
Compare bytes in two memory areas.
static uint8_t s_readback[k_ra8_io_roundtrip_max_payload]
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
SD card driver layered on top of the RA8D2 SDHI peripheral.
ra8_err_t ra8_sdcard_write_blocks(uint32_t lba, const uint8_t *buf, uint32_t count)
Write count 512-byte blocks starting at lba.
Definition ra8_sdcard.c:628
ra8_err_t ra8_sdcard_get_capacity(uint32_t *out_blocks)
Return card capacity in 512-byte blocks.
Definition ra8_sdcard.c:644
ra8_err_t ra8_sdcard_init(const ra8_sdcard_cfg_t *cfg)
Bring up the SDHI block and perform full SD card initialization.
Definition ra8_sdcard.c:544
ra8_err_t ra8_sdcard_read_blocks(uint32_t lba, uint8_t *buf, uint32_t count)
Read count 512-byte blocks starting at lba.
Definition ra8_sdcard.c:612
SD/MMC Host Interface (SDHI) driver scaffold.
@ k_ra8_sdhi_bus_width_4bit
Four data lanes (SD default-speed wide).
Definition ra8_sdhi.h:69
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
User-supplied configuration for ra8_sdcard_init.
Definition ra8_sdcard.h:88