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
41
42#include <stdint.h>
43
44#include "ra8_board_ek_ra8d2.h"
45#include "ra8_boot_entry.h"
46#include "ra8_cgc.h"
47#include "ra8_check.h"
48#include "ra8_drw.h"
49#include "ra8_err.h"
50#include "ra8_isr.h"
51#include "ra8_mstp.h"
52#include "ra8_time.h"
53
55static const char* s_tag = "drw_demo";
56
58typedef enum : uint32_t {
59 k_drw_demo_baud = 115200U,
61 k_drw_demo_fill_argb = 0xFF00FF00U,
64
72
74static const uint8_t k_drw_demo_ok_msg[] = "drw: fill match=Y\r\n";
75static const uint8_t k_drw_demo_bad_msg[] = "drw: fill match=N\r\n";
76
83[[gnu::aligned(
84 4)]] static uint32_t g_drw_fb[(uint32_t)k_drw_demo_fb_dim * (uint32_t)k_drw_demo_fb_dim];
85
92volatile uint32_t g_drw_match = 0U;
93
100volatile uint32_t g_drw_rev = 0U;
101
108volatile uint32_t g_drw_fill_err = 0U;
109
116volatile uint32_t g_drw_heartbeat = 0U;
117
119static void drw_demo_panic_halt(void)
120{
121 while (1) {
122 __asm__ volatile("wfi");
123 }
124}
125
127static uint32_t drw_demo_px(uint16_t x, uint16_t y)
128{
129 return ((uint32_t)y * (uint32_t)k_drw_demo_fb_dim) + (uint32_t)x;
130}
131
133static void drw_demo_setup_or_halt(void)
134{
135 uint32_t cpuclk0_hz = 0U;
136
137 if (ra8_cgc_init() != k_ra8_ok) {
139 }
142 }
143 if (ra8_mstp_init() != k_ra8_ok) {
145 }
146 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
148 }
151 }
154 }
157 }
158}
159
171[[nodiscard]] static ra8_err_t drw_demo_configure(void)
172{
173 const ra8_drw_config_t cfg = {
174 .framebuffer_addr = (uintptr_t)g_drw_fb,
175 .pitch_px = (uint16_t)k_drw_demo_fb_dim,
177 .enable_caches = false,
178 .enable_buffered_writes = false,
179 };
180 uint32_t rev = 0U;
181 if (ra8_drw_get_hwrevision(&rev) == k_ra8_ok) {
182 g_drw_rev = rev;
183 }
184 return ra8_drw_init(&cfg);
185}
186
204[[nodiscard]] static ra8_err_t drw_demo_fill_and_check(uint8_t* out_ok)
205{
206 RA8_CHECK_NULL_PTR(out_ok, s_tag, "out_ok must not be nullptr");
207
208 for (uint32_t i = 0U; i < (uint32_t)k_drw_demo_fb_dim * (uint32_t)k_drw_demo_fb_dim; ++i) {
209 g_drw_fb[i] = 0U;
210 }
211
212 const ra8_drw_rect_t rect = {
213 .x = (int16_t)k_drw_demo_rect_xy,
214 .y = (int16_t)k_drw_demo_rect_xy,
215 .width_px = (uint16_t)k_drw_demo_rect_wh,
216 .height_px = (uint16_t)k_drw_demo_rect_wh,
217 .color_argb8888 = (uint32_t)k_drw_demo_fill_argb,
218 };
219 const ra8_err_t ferr = ra8_drw_fill_rect(&rect);
220 if (ferr != k_ra8_ok) {
221 g_drw_fill_err = (uint32_t)ferr;
222 return ferr;
223 }
224 const ra8_err_t werr = ra8_drw_wait_idle((uint32_t)k_drw_demo_idle_budget);
225 g_drw_fill_err = (werr == k_ra8_ok) ? 0U : (uint32_t)werr;
226
227 const uint32_t centre = g_drw_fb[drw_demo_px(k_drw_demo_center, k_drw_demo_center)];
228 const uint32_t tl = g_drw_fb[drw_demo_px(0U, 0U)];
229 const uint32_t br =
230 g_drw_fb[drw_demo_px((uint16_t)(k_drw_demo_fb_dim - 1U), (uint16_t)(k_drw_demo_fb_dim - 1U))];
231 *out_ok = (centre == (uint32_t)k_drw_demo_fill_argb && tl == 0U && br == 0U) ? 1U : 0U;
232 return k_ra8_ok;
233}
234
235void main(void)
236{
238 /* Clear PRIMASK so SysTick can dispatch and ra8_delay_ms() uses the
239 * SysTick path (ra8_emulator does not advance DWT_CYCCNT). No NVIC sources
240 * are armed by this demo. */
242
243 if (drw_demo_configure() != k_ra8_ok) {
245 }
246
247 while (1) {
248 uint8_t ok = 0U;
249 const ra8_err_t err = drw_demo_fill_and_check(&ok);
250 const uint8_t good = (err == k_ra8_ok && ok != 0U) ? 1U : 0U;
251 g_drw_match = (uint32_t)good;
252 if (good != 0U) {
254 (size_t)(sizeof(k_drw_demo_ok_msg) - 1U));
256 } else {
258 (size_t)(sizeof(k_drw_demo_bad_msg) - 1U));
260 }
263 }
265}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static uint32_t drw_demo_px(uint16_t x, uint16_t y)
Index of pixel (x, y) within the framebuffer.
Definition main.c:127
static const uint8_t k_drw_demo_bad_msg[]
Definition main.c:75
static ra8_err_t drw_demo_configure(void)
Bring up the DRW engine pointed at g_drw_fb.
Definition main.c:171
static const uint8_t k_drw_demo_ok_msg[]
Output line tags.
Definition main.c:74
volatile uint32_t g_drw_rev
DRW HWREVISION register snapshot (confirms the engine is present).
Definition main.c:100
volatile uint32_t g_drw_match
1 when the filled rectangle read back as expected.
Definition main.c:92
volatile uint32_t g_drw_heartbeat
Bumps once per main-loop pass – liveness for headless probes.
Definition main.c:116
drw_demo_config_t
Compile-time settings.
Definition main.c:58
@ k_drw_demo_fill_argb
Opaque green fill colour.
Definition main.c:61
@ k_drw_demo_period_ms
Delay between fills.
Definition main.c:60
@ k_drw_demo_baud
SCI8 baud rate.
Definition main.c:59
@ k_drw_demo_idle_budget
Bounded wait_idle poll budget.
Definition main.c:62
static void drw_demo_setup_or_halt(void)
Bring CGC + SysTick + SCI8 + LEDs + MSTP up.
Definition main.c:133
static void drw_demo_panic_halt(void)
Park forever after a fatal init failure.
Definition main.c:119
drw_demo_geom_t
Framebuffer + rectangle geometry (pixels).
Definition main.c:66
@ k_drw_demo_center
Centre pixel (16, 16) is inside.
Definition main.c:70
@ k_drw_demo_rect_xy
Rect top-left (8, 8).
Definition main.c:68
@ k_drw_demo_rect_wh
Rect 16 x 16 -> covers [8,24).
Definition main.c:69
@ k_drw_demo_fb_dim
32 x 32 framebuffer.
Definition main.c:67
static ra8_err_t drw_demo_fill_and_check(uint8_t *out_ok)
Clear the framebuffer, fill the centre rectangle, and verify.
Definition main.c:204
volatile uint32_t g_drw_fill_err
Non-zero if a DRW call returned an error.
Definition main.c:108
static uint32_t g_drw_fb[(uint32_t) k_drw_demo_fb_dim *(uint32_t) k_drw_demo_fb_dim]
32 x 32 ARGB8888 framebuffer the DRW rasterizes into.
Definition main.c:84
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_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).
@ 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.
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_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
2D Drawing Engine (DRW / D/AVE 2D) HAL driver – public API
ra8_err_t ra8_drw_fill_rect(const ra8_drw_rect_t *rect)
Issue a solid-fill rectangle blit into the framebuffer.
ra8_err_t ra8_drw_get_hwrevision(uint32_t *out)
Read the read-only HWREVISION register into *out.
Definition ra8_drw.c:581
ra8_err_t ra8_drw_init(const ra8_drw_config_t *cfg)
Power on the DRW block, install the supplied configuration, and arm the IRQ control register.
Definition ra8_drw.c:491
ra8_err_t ra8_drw_wait_idle(uint32_t poll_budget)
Poll STATUS until all "busy" bits clear or budget runs out.
Definition ra8_drw.c:631
@ k_ra8_drw_writefmt_argb8888
32 bpp ARGB8888.
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
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
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.
Definition ra8_mstp.c:291
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
Minimal DRW configuration captured by ra8_drw_init.
Definition ra8_drw.h:79
Rectangle parameters for ra8_drw_fill_rect.
Definition ra8_drw.h:96