48typedef enum : uint32_t {
57typedef enum : uint8_t {
85typedef enum : uint32_t {
103 __asm__
volatile(
"wfi");
114 uint32_t cpuclk0_hz = 0U;
161 const uint32_t ms_clamped = (ms == 0U) ? 1U : ms;
204 const uint32_t got = mem[i];
205 if (got != base + i) {
206 if (diag->
count == 0U) {
215 return diag->
count == 0U;
232 const uint8_t shift =
269 for (uint8_t i = 0U; i < n; i++) {
270 buf[i] = tmp[(uint8_t)(n - 1U - i)];
291 const uint8_t prefix[] =
"sdram: w=";
292 const uint8_t mid[] =
" MB/s r=";
293 const uint8_t suffix[] =
" MB/s\r\n";
294 for (uint32_t i = 0U; i <
sizeof(prefix) - 1U; i++) {
295 out[off++] = prefix[i];
298 for (uint32_t i = 0U; i <
sizeof(mid) - 1U; i++) {
302 for (uint32_t i = 0U; i <
sizeof(suffix) - 1U; i++) {
303 out[off++] = suffix[i];
327 const uint8_t prefix[] =
"sdram: FAIL idx=";
328 const uint8_t exp_tag[] =
" exp=";
329 const uint8_t got_tag[] =
" got=";
330 const uint8_t n_tag[] =
" n=";
331 const uint8_t suffix[] =
"\r\n";
332 for (uint32_t i = 0U; i <
sizeof(prefix) - 1U; i++) {
333 out[off++] = prefix[i];
336 for (uint32_t i = 0U; i <
sizeof(exp_tag) - 1U; i++) {
337 out[off++] = exp_tag[i];
340 for (uint32_t i = 0U; i <
sizeof(got_tag) - 1U; i++) {
341 out[off++] = got_tag[i];
344 for (uint32_t i = 0U; i <
sizeof(n_tag) - 1U; i++) {
345 out[off++] = n_tag[i];
348 for (uint32_t i = 0U; i <
sizeof(suffix) - 1U; i++) {
349 out[off++] = suffix[i];
void main(void)
Secure fallback main entry point.
static uint32_t sdram_demo_format_line(uint8_t *out, uint32_t w_mbps, uint32_t r_mbps)
Format the per-cycle MB/s line into out, return its length.
static const uint8_t k_sdram_demo_pass_msg[]
Verdict line emitted only when a read-back pass matched every word (never on a "sdram: FAIL idx=" pat...
static uint32_t sdram_demo_write_pass(uint32_t base)
Write base + i into every word of the SDRAM block.
static uint8_t sdram_demo_uint_to_dec(uint8_t *buf, uint32_t v)
Write a decimal uint32 into buf; returns bytes written.
sdram_demo_seed_t
Pattern seed – recognisable hex word for SWD inspection.
@ k_sdram_demo_pattern_seed
SDRAM demo pattern seed.
static void sdram_demo_panic_halt(void)
Park forever after a fatal init failure.
static void sdram_demo_setup_or_halt(void)
Bring CGC + SysTick + console + SDRAM up.
static uint32_t sdram_demo_mbps(uint32_t bytes, uint32_t ms)
Compute throughput in MB/s given a byte count and millisecond span.
sdram_demo_byte_t
Single-byte ASCII conversion constants.
@ k_sdram_demo_uint_dec_max
Max digits in a uint32 base-10.
@ k_sdram_demo_ascii_a
SDRAM demo ascii a.
@ k_sdram_demo_nyb_bits
Bits per hex nibble.
@ k_sdram_demo_print_buf
Max bytes in one throughput line.
@ k_sdram_demo_nyb_mask
Mask for one nibble.
@ k_sdram_demo_fail_buf
Max bytes in the FAIL diag line.
@ k_sdram_demo_dec_base
SDRAM demo dec base.
@ k_sdram_demo_ascii_zero
SDRAM demo ascii zero.
@ k_sdram_demo_hex_digits
Hex digits in a uint32.
sdram_demo_const_t
App-wide tunables.
@ k_sdram_demo_block_bytes
64 KB window per pass.
@ k_sdram_demo_period_ms
SDRAM demo period ms.
@ k_sdram_demo_block_words
65536 / sizeof(uint32_t).
@ k_sdram_demo_baud
SDRAM demo baud.
@ k_sdram_demo_us_per_ms
Conversion factor used in mbps.
static uint8_t sdram_demo_uint_to_hex(uint8_t *buf, uint32_t v)
Render v as exactly 8 lowercase hex digits into buf.
static uint32_t sdram_demo_format_fail(uint8_t *out, const sdram_demo_diag_t *diag)
Format the read-back FAIL diagnostic line into out.
static bool sdram_demo_read_check(uint32_t base, uint32_t *elapsed, sdram_demo_diag_t *diag)
Read every word back and check it matches base + i.
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_led_toggle(ra8_board_led_id_t led)
Toggle led's output state.
ra8_err_t ra8_board_led_init(ra8_board_led_id_t led)
Configure led as a digital output, initial level low (off).
ra8_err_t ra8_board_led_on(ra8_board_led_id_t led)
Drive led HIGH (light it).
@ k_ra8_board_led2
LED2, GREEN, P303 (jumper E26).
@ k_ra8_board_led1
LED1, BLUE, P600 (jumper E27).
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.
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
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.
External SDRAM controller driver (framework).
ra8_err_t ra8_sdramc_init(void)
Initialise the external SDRAM at k_ra8_sdram_base_addr.
External SDRAM controller register layout for the Renesas RA8D2.
@ k_ra8_sdram_base_addr
External SDRAM window.
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.
void ra8_delay_ms(uint32_t ms)
Busy-wait for at least ms milliseconds.
uint32_t ra8_time_ms(void)
Get the current 1 kHz tick count.
First-mismatch diagnostic captured by sdram_demo_read_check.
uint32_t expected
Value that should have been read back.
uint32_t got
Value actually read back at first_idx.
uint32_t first_idx
Word index of the first mismatch.
uint32_t count
Total mismatched words in the pass.