ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
cpu1_main.c
Go to the documentation of this file.
1
60
61#include <stdint.h>
62
63#include "book.h"
64#include "ereader_m33.h"
65#include "ra8_attributes.h"
66#include "ra8_gfx.h"
67#include "ra8_ipc.h"
68#include "rabook_fixture.h"
69
71extern uint32_t g_ra8_ls_cpu1_stack_top;
73extern uint32_t g_ra8_ls_cpu1_data_start;
75extern uint32_t g_ra8_ls_cpu1_data_end;
77extern uint32_t g_ra8_ls_cpu1_data_load;
79extern uint32_t g_ra8_ls_cpu1_bss_start;
81extern uint32_t g_ra8_ls_cpu1_bss_end;
82
83[[noreturn]] void cpu1_reset_handler(void);
84
85/* The published format tag must equal the real ra8_gfx RGB565 enumerator. */
86static_assert((uint32_t)k_erm33_fb_format_rgb565 == (uint32_t)k_ra8_gfx_format_rgb565,
87 "published fb_format must equal ra8_gfx RGB565");
88/* The geometry the mailbox advertises must match the baked plane size. */
89static_assert((uint32_t)k_erm33_fb_bytes ==
90 ((uint32_t)k_erm33_fb_width * (uint32_t)k_erm33_fb_height *
91 (uint32_t)k_erm33_fb_bpp),
92 "framebuffer byte size must equal width*height*bpp");
93
104[[gnu::section(".sdram_bss"), gnu::aligned(8)]] static uint8_t s_framebuffer[k_erm33_fb_bytes];
105
113typedef enum : uint32_t {
117
125typedef enum : uint16_t {
128 k_max_nodes = 4096U,
131
140typedef enum : uint32_t {
142 k_erm33_paper = 0xFFFFFFU,
143 k_erm33_ink = 0x000000U,
145
154typedef enum : uint32_t {
155 k_crc32_init = 0xFFFFFFFFU,
156 k_crc32_poly = 0xEDB88320U,
157} m33_crc_t;
158
164typedef enum : uint8_t {
167
176typedef enum : uint8_t {
178} cpu1_ipc_t;
179
188typedef enum : uint32_t {
189 k_m33_ack_budget = 50000000UL,
191
214static void append_run(char* out, uint32_t* plen, uint32_t cap, const char* txt)
215{
216 if (out == nullptr) {
217 return;
218 }
219 if (plen == nullptr) {
220 return;
221 }
222 if (txt == nullptr) {
223 return;
224 }
226 for (uint32_t i = 0U; i < (uint32_t)k_max_run_len; i++) {
227 const char c = txt[i];
228 if (c == '\0') {
229 break;
230 }
231 if (*plen >= cap) {
232 break;
233 }
234 out[*plen] = c;
235 *plen += 1U;
236 }
237}
238
247typedef struct {
249 uint32_t sp;
251
268static void walk_push(m33_walk_stack_t* st, uint32_t node)
269{
270 if (st == nullptr) {
271 return;
272 }
273 if (node == (uint32_t)k_book_nil) {
274 return;
275 }
276 if (st->sp < (uint32_t)k_walk_stack_depth) {
277 st->items[st->sp] = node;
278 st->sp += 1U;
279 }
280}
281
308static uint32_t
309collect_chapter_text(const void* base, uint32_t root, uint32_t node_count, char* out, uint32_t cap)
310{
311 if (base == nullptr) {
312 return 0U;
313 }
314 if (out == nullptr) {
315 return 0U;
316 }
317 if (root == (uint32_t)k_book_nil) {
318 return 0U;
319 }
320 const book_node_t* nodes = book_nodes(base);
321 m33_walk_stack_t st = {};
322 uint32_t len = 0U;
323 if (root != (uint32_t)k_book_nil) {
324 walk_push(&st, nodes[root].first_child);
325 }
327 for (uint32_t it = 0U; it < (uint32_t)k_walk_iter_max; it++) {
328 if ((st.sp == 0U) || (len >= cap)) {
329 break;
330 }
331 const uint32_t n = st.items[--st.sp];
332 if (n >= node_count) {
333 continue;
334 }
335 const book_node_t* node = &nodes[n];
336 walk_push(&st, node->next_sibling);
337 if (node->kind == (uint8_t)k_book_node_text) {
338 append_run(out, &len, cap, book_node_text(base, node));
339 } else {
340 walk_push(&st, node->first_child);
341 }
342 }
343 return len;
344}
345
370static bool render_page(uint8_t* fb, const char* text, uint32_t len)
371{
372 if (fb == nullptr) {
373 return false;
374 }
375 if (text == nullptr) {
376 return false;
377 }
378 if (ra8_gfx_init(fb,
379 (uint16_t)k_erm33_fb_width,
380 (uint16_t)k_erm33_fb_height,
382 return false;
383 }
384 if (ra8_gfx_clear((uint32_t)k_erm33_paper) != k_ra8_ok) {
385 return false;
386 }
388 for (uint32_t row = 0U; row < (uint32_t)k_erm33_fb_rows; row++) {
389 char line[(uint32_t)k_erm33_fb_cols + 1U];
390 uint32_t cols = 0U;
392 for (uint32_t col = 0U; col < (uint32_t)k_erm33_fb_cols; col++) {
393 const uint32_t idx = (row * (uint32_t)k_erm33_fb_cols) + col;
394 if (idx >= len) {
395 break;
396 }
397 line[cols] = text[idx];
398 cols += 1U;
399 }
400 line[cols] = '\0';
401 if (cols == 0U) {
402 continue;
403 }
404 const int32_t y = (int32_t)(row * (uint32_t)k_erm33_glyph_h);
405 if (ra8_gfx_text_out(0,
406 y,
407 line,
409 (uint32_t)k_erm33_ink,
410 (uint32_t)k_erm33_paper) != k_ra8_ok) {
411 return false;
412 }
413 }
414 return true;
415}
416
439static uint32_t fb_crc32(const uint8_t* fb, uint32_t len)
440{
441 if (fb == nullptr) {
442 return 0U;
443 }
444 if (len == 0U) {
445 return 0U;
446 }
447 uint32_t crc = (uint32_t)k_crc32_init;
449 for (uint32_t i = 0U; i < len; i++) {
450 if (i >= (uint32_t)k_erm33_fb_bytes) {
451 break;
452 }
453 crc ^= (uint32_t)fb[i];
455 for (uint8_t b = 0U; b < (uint8_t)k_crc32_bits; b++) {
456 const uint32_t mask = (uint32_t)(0U - (crc & 1U));
457 crc = (crc >> 1U) ^ ((uint32_t)k_crc32_poly & mask);
458 }
459 }
460 return crc ^ (uint32_t)k_crc32_init;
461}
462
484static void publish_page(volatile erm33_mailbox_t* mb, uint32_t crc, uint32_t glyphs)
485{
486 if (mb == nullptr) {
487 return;
488 }
489 mb->fb_base = (uint32_t)(uintptr_t)s_framebuffer;
490 mb->fb_width = (uint32_t)k_erm33_fb_width;
491 mb->fb_height = (uint32_t)k_erm33_fb_height;
492 mb->fb_stride = (uint32_t)k_erm33_fb_stride;
493 mb->fb_format = (uint32_t)k_erm33_fb_format_rgb565;
494 mb->glyph_count = glyphs;
495 mb->fb_crc = crc;
496 __asm volatile("dsb" ::: "memory");
497}
498
522static bool book_is_valid(const void* base, uint32_t size)
523{
524 if (base == nullptr) {
525 return false;
526 }
527 if (size < (uint32_t)k_book_sizeof_header) {
528 return false;
529 }
530 const book_header_t* hdr = book_header(base);
531 static const char expect[] = {'R', 'A', 'B', 'O', 'O', 'K', '1'};
533 for (uint32_t i = 0U; i < (uint32_t)k_magic_len; i++) {
534 if (hdr->magic[i] != expect[i]) {
535 return false;
536 }
537 }
538 if (hdr->format_version != (uint32_t)k_book_format_version) {
539 return false;
540 }
541 if (hdr->total_size != size) {
542 return false;
543 }
544 if ((hdr->chapter_count == 0U) || (hdr->chapter_count > (uint32_t)k_max_chapters)) {
545 return false;
546 }
547 if ((hdr->node_count == 0U) || (hdr->node_count > (uint32_t)k_max_nodes)) {
548 return false;
549 }
550 return true;
551}
552
579static bool render_held_page(const void* base, uint32_t* out_crc, uint32_t* out_glyphs)
580{
581 if (base == nullptr) {
582 return false;
583 }
584 if (out_crc == nullptr) {
585 return false;
586 }
587 if (out_glyphs == nullptr) {
588 return false;
589 }
590 const book_header_t* hdr = book_header(base);
591 const book_chapter_t* chapters = book_chapters(base);
592 char page_text[k_erm33_page_chars];
593 const uint32_t glyphs = collect_chapter_text(base,
594 chapters[0].root_node,
595 hdr->node_count,
596 page_text,
597 (uint32_t)k_erm33_page_chars);
598 if (!render_page(s_framebuffer, page_text, glyphs)) {
599 return false;
600 }
601 __asm volatile("dsb" ::: "memory");
602 *out_crc = fb_crc32(s_framebuffer, (uint32_t)k_erm33_fb_bytes);
603 *out_glyphs = glyphs;
604 return true;
605}
606
626static void notify_m85(void)
627{
629}
630
650static void simulate_touch_dwell(void)
651{
652 volatile uint32_t spin = 0U;
654 for (uint32_t i = 0U; i < (uint32_t)k_erm33_touch_dwell; i++) {
655 spin = spin + 1U;
656 }
657 (void)spin;
658}
659
683static bool wait_for_ack(volatile const erm33_mailbox_t* mb, uint32_t turn)
684{
685 if (mb == nullptr) {
686 return false;
687 }
689 for (uint32_t i = 0U; i < (uint32_t)k_m33_ack_budget; i++) {
690 if (mb->turn_ack >= turn) {
691 return true;
692 }
693 }
694 return false;
695}
696
720static void run_page_turns(volatile erm33_mailbox_t* mb, const void* base)
721{
722 if (mb == nullptr) {
723 return;
724 }
725 if (base == nullptr) {
726 return;
727 }
729 for (uint32_t turn = 1U; turn <= (uint32_t)k_erm33_max_turns; turn++) {
731 mb->turn_req = turn;
732 __asm volatile("dsb" ::: "memory");
733 notify_m85();
734 if (!wait_for_ack(mb, turn)) {
735 return;
736 }
737 uint32_t crc = 0U;
738 uint32_t glyphs = 0U;
739 if (render_held_page(base, &crc, &glyphs)) {
740 publish_page(mb, crc, glyphs);
741 }
742 mb->turn_done = turn;
743 __asm volatile("dsb" ::: "memory");
744 }
745}
746
761[[noreturn]] static void cpu1_park(void)
762{
763 while (1) {
764 __asm volatile("nop");
765 }
766}
767
785[[noreturn]] static void cpu1_fail(volatile erm33_mailbox_t* mb, uint32_t status)
786{
787 if (mb != nullptr) {
788 mb->status = status;
789 __asm volatile("dsb" ::: "memory");
790 mb->done = 1U;
791 __asm volatile("dsb" ::: "memory");
792 }
793 cpu1_park();
794}
795
818[[noreturn]] static void cpu1_run_reader(void)
819{
820 volatile erm33_mailbox_t* mb = erm33_mailbox();
821 mb->m33_sig = (uint32_t)k_erm33_m33_sig;
822 __asm volatile("dsb" ::: "memory");
823
824 const void* base = (const void*)k_rabook_fixture;
825 if (!book_is_valid(base, (uint32_t)k_rabook_fixture_len)) {
826 cpu1_fail(mb, (uint32_t)k_erm33_status_bad_book);
827 }
828
829 uint32_t crc = 0U;
830 uint32_t glyphs = 0U;
831 if (!render_held_page(base, &crc, &glyphs)) {
833 }
834 publish_page(mb, crc, glyphs);
835
836 mb->status = (uint32_t)k_erm33_status_ok;
837 __asm volatile("dsb" ::: "memory");
838 mb->done = 1U;
839 __asm volatile("dsb" ::: "memory");
840
841 /* #150 mode-switch: the M33 is now the live core. Hold the page, poll the
842 * simulated touch, and on each page turn wake the parked M85, wait for its
843 * heavy-work ack, then re-render + republish the (identical) held page. */
844 run_page_turns(mb, base);
845 cpu1_park();
846}
847
868[[noreturn]] void cpu1_reset_handler(void)
869{
870 uint32_t* dst = &g_ra8_ls_cpu1_data_start;
871 uint32_t* src = &g_ra8_ls_cpu1_data_load;
872 while (dst < &g_ra8_ls_cpu1_data_end) {
873 *dst = *src;
874 dst++;
875 src++;
876 }
877
878 uint32_t* bss = &g_ra8_ls_cpu1_bss_start;
879 while (bss < &g_ra8_ls_cpu1_bss_end) {
880 *bss = 0U;
881 bss++;
882 }
883
885}
886
905[[noreturn]] static void cpu1_fault_handler(void)
906{
907 while (1) {
908 __asm volatile("nop");
909 }
910}
911
922#ifndef RA8_OFF_TARGET
923/* The vector table is only meaningful in the cross-compiled M33 image. The host
924 * unit-test build compile-checks this TU but never links it as an executable, so
925 * dropping the table there costs no coverage. */
926[[gnu::used, gnu::section(".cpu1_vectors")]] const uintptr_t g_cpu1_vector_table[] = {
927 (uintptr_t)&g_ra8_ls_cpu1_stack_top,
928 (uintptr_t)&cpu1_reset_handler,
929 (uintptr_t)&cpu1_fault_handler,
930 (uintptr_t)&cpu1_fault_handler,
931 (uintptr_t)&cpu1_fault_handler,
932 (uintptr_t)&cpu1_fault_handler,
933 (uintptr_t)&cpu1_fault_handler,
934 (uintptr_t)&cpu1_fault_handler,
935};
936#endif
Flat, execute-in-place container for a build-time "compiled" e-book.
@ k_book_sizeof_header
Bytes in book_header_t.
Definition book.h:228
@ k_book_node_text
A text run: carries a string, no children.
Definition book.h:163
@ k_book_format_version
Current .rabook layout revision.
Definition book.h:86
@ k_book_nil
Absent index / "applies to all chapters".
Definition book.h:129
static const book_chapter_t * book_chapters(const void *base)
Base of the chapter table.
Definition book.h:458
static const book_header_t * book_header(const void *base)
View the blob base as its header.
Definition book.h:382
static const book_node_t * book_nodes(const void *base)
Base of the DOM node table.
Definition book.h:473
static const char * book_node_text(const void *base, const book_node_t *node)
Text of a text node.
Definition book.h:550
Shared contract for the "render a held e-reader page on the M33" demo.
@ k_erm33_page_chars
Characters the held page can carry.
@ k_erm33_status_bad_book
status: baked book failed validation.
@ k_erm33_status_ok
status: page rendered + published.
@ k_erm33_fb_format_rgb565
Published fb_format (RGB565).
@ k_erm33_status_render_fail
status: ra8_gfx render path failed.
@ k_erm33_m33_sig
"RDR3" boot sentinel written by M33.
@ k_erm33_fb_stride
Bytes per pixel row (width * bpp).
@ k_erm33_fb_bpp
Bytes per pixel (RGB565).
@ k_erm33_fb_bytes
Total plane size in bytes (stride * height).
@ k_erm33_fb_cols
Glyph columns (width / 8-px glyph).
@ k_erm33_fb_rows
Glyph rows (height / 16-px glyph).
@ k_erm33_fb_height
Plane height in pixels (4 glyph rows of 16).
@ k_erm33_fb_width
Plane width in pixels.
@ k_erm33_touch_dwell
M33 hold-loop spins per simulated touch wait.
@ k_erm33_max_turns
Page-turn handoffs the cycle exercises.
static volatile erm33_mailbox_t * erm33_mailbox(void)
Typed pointer to the fixed-address shared progress mailbox.
static uint16_t s_framebuffer[(size_t) k_panel_height_px *(size_t) k_panel_width_px]
1024x600 RGB565 framebuffer in external SDRAM (GLCDC scans this).
Definition main.c:67
void cpu1_reset_handler(void)
CPU1 reset handler.
Definition cpu1_main.c:266
uint32_t g_ra8_ls_cpu1_data_end
uint32_t g_ra8_ls_cpu1_bss_start
uint32_t g_ra8_ls_cpu1_data_load
uint32_t g_ra8_ls_cpu1_bss_end
const uintptr_t g_cpu1_vector_table[]
Minimal Armv8-M vector table for CPU1.
Definition cpu1_main.c:337
uint32_t g_ra8_ls_cpu1_stack_top
uint32_t g_ra8_ls_cpu1_data_start
static void notify_m85(void)
Poke the M85's IPC0 receive line to wake it from WFI.
Definition cpu1_main.c:350
cpu1_ipc_t
IPC channel the M33 pokes to wake the parked M85.
Definition cpu1_main.c:326
@ k_cpu1_ipc_wake_channel
IPC0 channel 0 (CPU1 -> CPU0).
Definition cpu1_main.c:327
static void cpu1_park(void)
Park the M33 forever once the emitter has reported its result.
Definition cpu1_main.c:311
static const uint8_t k_rabook_fixture[k_rabook_fixture_len]
The baked, inflated .rabook flat blob (validate + walk directly).
@ k_rabook_fixture_len
Inflated flat-blob length.
static void publish_page(volatile erm33_mailbox_t *mb, uint32_t crc, uint32_t glyphs)
Publish the rendered page's base, geometry, format and CRC.
Definition cpu1_main.c:484
static void walk_push(m33_walk_stack_t *st, uint32_t node)
Push a node index onto the DOM-walk stack if it fits.
Definition cpu1_main.c:268
m33_crc_t
Constants for the standard reflected CRC-32 over the rendered plane.
Definition cpu1_main.c:154
@ k_crc32_poly
Reflected CRC-32 polynomial.
Definition cpu1_main.c:156
@ k_crc32_init
Pre/post-inversion seed.
Definition cpu1_main.c:155
static bool wait_for_ack(volatile const erm33_mailbox_t *mb, uint32_t turn)
Poll the mailbox until the M85 acks page turn turn (heavy work done).
Definition cpu1_main.c:683
m33_cycle_bound_t
Static bound for the M33's wait-for-ack poll (NASA Rule 2).
Definition cpu1_main.c:188
@ k_m33_ack_budget
Max iters waiting for the M85's turn_ack.
Definition cpu1_main.c:189
static bool render_page(uint8_t *fb, const char *text, uint32_t len)
Render the collected page text into the SDRAM framebuffer via ra8_gfx.
Definition cpu1_main.c:370
static uint32_t fb_crc32(const uint8_t *fb, uint32_t len)
Fold a reflected CRC-32 over the rendered framebuffer pixels.
Definition cpu1_main.c:439
m33_walk_bound_t
Static iteration bounds for the M33 DOM walk (NASA Rule 2).
Definition cpu1_main.c:113
@ k_walk_iter_max
Max DOM-walk pops in the chapter.
Definition cpu1_main.c:114
@ k_max_run_len
Bounded text-run length cap, bytes.
Definition cpu1_main.c:115
m33_walk_size_t
Small table / validation sizes for the M33 reader.
Definition cpu1_main.c:125
@ k_max_nodes
Validation cap on node_count.
Definition cpu1_main.c:128
@ k_max_chapters
Validation cap on chapter_count.
Definition cpu1_main.c:127
@ k_magic_len
"RABOOK1" magic length (no NUL).
Definition cpu1_main.c:129
@ k_walk_stack_depth
Explicit DOM-walk stack depth.
Definition cpu1_main.c:126
static void simulate_touch_dwell(void)
Spin a bounded page-dwell that stands in for a touch-poll latency.
Definition cpu1_main.c:650
static bool book_is_valid(const void *base, uint32_t size)
Validate the baked RABOOK1 flat blob before walking it.
Definition cpu1_main.c:522
m33_render_t
Glyph cell height and page colours for the ra8_gfx blit.
Definition cpu1_main.c:140
@ k_erm33_glyph_h
ra8_gfx 8x16 font cell height, pixels.
Definition cpu1_main.c:141
@ k_erm33_paper
Page background colour (white).
Definition cpu1_main.c:142
@ k_erm33_ink
Glyph foreground colour (black).
Definition cpu1_main.c:143
static bool render_held_page(const void *base, uint32_t *out_crc, uint32_t *out_glyphs)
Re-render the held page from the validated book and fold its CRC.
Definition cpu1_main.c:579
m33_crc_bits_t
Bit-fold count for the bitwise CRC-32 inner loop.
Definition cpu1_main.c:164
@ k_crc32_bits
Bits folded per input byte.
Definition cpu1_main.c:165
static uint32_t collect_chapter_text(const void *base, uint32_t root, uint32_t node_count, char *out, uint32_t cap)
Collect a chapter's opening text into the page accumulator.
Definition cpu1_main.c:309
static void append_run(char *out, uint32_t *plen, uint32_t cap, const char *txt)
Append one NUL-terminated text run into the page accumulator.
Definition cpu1_main.c:214
static void cpu1_run_reader(void)
CPU1 reader entry: validate the book, render the held page, publish.
Definition cpu1_main.c:818
static void run_page_turns(volatile erm33_mailbox_t *mb, const void *base)
Hold the page and run the #150 page-turn handoff loop for the M85.
Definition cpu1_main.c:720
static void cpu1_fail(volatile erm33_mailbox_t *mb, uint32_t status)
Mark a failure status, publish done, and park the M33.
Definition cpu1_main.c:785
Annotation-attribute framework macros for ra8-firmware.
#define RA8_LOOP_BOUND(ceiling)
NASA Power-of-10 Rule 2: bind ONE loop to a compile-time ceiling.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
Software 2D graphics primitives layered on top of a caller-ownedframebuffer (DRW / D/AVE 2D / GLCDC r...
@ k_ra8_gfx_format_rgb565
16-bit RGB565, little-endian in memory.
Definition ra8_gfx.h:40
ra8_err_t ra8_gfx_clear(uint32_t color)
Fill the bound framebuffer's clip region with a single colour.
ra8_err_t ra8_gfx_text_out(int32_t x, int32_t y, const char *str, const ra8_gfx_font_t *font, uint32_t fg_color, uint32_t bg_color)
Render a NUL-terminated ASCII string.
ra8_err_t ra8_gfx_init(void *fb, uint16_t width, uint16_t height, ra8_gfx_format_t format)
Bind ra8_gfx to a caller-owned framebuffer.
const ra8_gfx_font_t ra8_gfx_font_8x16
Bundled 8x16 IBM PC VGA bitmap font, ASCII 0x20..0x7E.
Inter-Processor Communication (IPC) HAL driver – public API.
@ k_ra8_ipc_irq_event_0
RA8 ipc IRQ event 0.
ra8_err_t ra8_ipc_send_event(uint8_t channel, ra8_ipc_irq_event_id_t event_id)
Generate a maskable IRQ event on the peer core.
Definition ra8_ipc.c:355
One spine document (a renderable chapter) plus its TOC label.
Definition book.h:280
Fixed 100-byte prologue describing every table and pool in the blob.
Definition book.h:246
uint32_t format_version
book_version_t of this blob.
Definition book.h:248
uint32_t node_count
Number of DOM nodes.
Definition book.h:258
uint32_t chapter_count
Number of spine chapters.
Definition book.h:256
char magic[8]
Always "RABOOK1" (7 chars + NUL).
Definition book.h:247
uint32_t total_size
Total blob length in bytes.
Definition book.h:249
One DOM node.
Definition book.h:299
uint8_t kind
book_node_kind_t.
Definition book.h:300
uint32_t next_sibling
Index of next sibling node, or nil.
Definition book.h:307
uint32_t first_child
Index of first child node, or nil.
Definition book.h:306
Cross-core progress block backed by a fixed shared-SRAM address.
volatile uint32_t turn_done
M33->M85: re-render published for that turn.
volatile uint32_t fb_base
M33-published SDRAM framebuffer base address.
volatile uint32_t done
Set to 1 by the M33 once the page is published.
volatile uint32_t fb_crc
M33-folded CRC-32 over the rendered pixels.
volatile uint32_t turn_ack
M85->M33: heavy-work ack for the matching turn.
volatile uint32_t fb_format
M33-published ra8_gfx_format_t (RGB565).
volatile uint32_t turn_req
M33->M85: page-turn request, bumped per touch.
volatile uint32_t glyph_count
Characters the M33 laid onto the held page.
volatile uint32_t fb_stride
M33-published framebuffer stride in bytes.
volatile uint32_t m33_sig
M33 stamps k_erm33_m33_sig on boot.
volatile uint32_t status
Render status (erm33_const_t status codes).
volatile uint32_t fb_height
M33-published framebuffer height in pixels.
volatile uint32_t fb_width
M33-published framebuffer width in pixels.
Explicit DOM-walk stack (NASA Rule 1: iteration, never recursion).
Definition cpu1_main.c:247
uint32_t items[k_walk_stack_depth]
Pending node indices.
Definition cpu1_main.c:248
uint32_t sp
Count of pending entries.
Definition cpu1_main.c:249