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
27
28#include <stddef.h>
29#include <stdint.h>
30
31#include "font_fixture.h"
32#include "ra8_board_ek_ra8d2.h"
33#include "ra8_boot_entry.h"
34#include "ra8_cgc.h"
35#include "ra8_err.h"
36#include "ra8_isr.h"
37#include "ra8_mstp.h"
38#include "ra8_time.h"
39#include "reflow.h"
40
42typedef enum : uint32_t {
43 k_al_view_w = 280U,
44 k_al_view_h = 360U,
46 k_al_ink = 0xFF101010U,
47 k_al_link_col = 0xFF2A52BEU,
48 k_al_uart_baud = 115200U,
49 k_al_fnv_offset = 2166136261U,
50 k_al_fnv_prime = 16777619U,
56
59
61static const char k_al_chapter[] =
62 "<html><body><h1 style=\"text-align:center\">Aligned</h1>"
63 "<p style=\"text-align:right\">Right aligned paragraph flush to the margin.</p>"
64 "<p style=\"text-align:center\">Centred paragraph line in the column.</p>"
65 "<p style=\"text-align:justify\">aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo "
66 "pp qq rr ss tt uu vv ww xx yy zz</p>"
67 "<p>Plain left paragraph as the default baseline.</p></body></html>";
68
69static const uint8_t k_msg_boot[] = "ereader-align-hil: boot\r\n";
70static const uint8_t k_msg_fail[] = "ereader-align-hil: FAIL init\r\n";
71static const uint8_t k_msg_lerr[] = "ereader-align-hil: FAIL layout\r\n";
72static const uint8_t k_msg_pre[] = "ereader-align-hil: glyphs=";
73static const uint8_t k_msg_geom[] = " geom=";
74static const uint8_t k_msg_eol[] = "\r\n";
75
77static void al_print(const uint8_t* msg, uint32_t len)
78{
79 (void)ra8_board_uart_console_write(msg, (size_t)len);
80}
81
83static void al_panic_halt(const uint8_t* msg, uint32_t len)
84{
85 al_print(msg, len);
86 __asm__ volatile("bkpt #0");
87 while (1) {
88 __asm__ volatile("wfi");
89 }
90}
91
93static void al_print_hex(uint32_t value)
94{
95 uint8_t buf[k_al_hex_nibbles];
96 for (uint32_t i = 0U; i < (uint32_t)k_al_hex_nibbles; i++) {
97 const uint32_t shift = ((uint32_t)k_al_hex_nibbles - 1U - i) * (uint32_t)k_al_nibble_bits;
98 const uint32_t nib = (value >> shift) & (uint32_t)k_al_nibble_mask;
99 buf[i] = (uint8_t)((nib < (uint32_t)k_al_dec_ten) ? ('0' + nib) : ('A' + (nib - k_al_dec_ten)));
100 }
101 al_print(buf, (uint32_t)k_al_hex_nibbles);
102}
103
105static void al_print_uint(uint32_t value)
106{
107 uint8_t buf[k_al_dec_ten];
108 uint32_t n = 0U;
109 if (value == 0U) {
110 buf[n] = '0';
111 n++;
112 }
113 while ((value > 0U) && (n < (uint32_t)k_al_dec_ten)) {
114 buf[n] = (uint8_t)('0' + (value % (uint32_t)k_al_dec_ten));
115 n++;
116 value /= (uint32_t)k_al_dec_ten;
117 }
118 for (uint32_t i = 0U; i < n; i++) {
119 al_print(&buf[n - 1U - i], 1U);
120 }
121}
122
124static uint32_t al_geom_hash(void)
125{
126 uint32_t hsh = (uint32_t)k_al_fnv_offset;
127 const size_t nbytes = sizeof(int32_t) * 2U; /* x + y per glyph */
128 for (uint32_t g = 0U; g < s_engine.glyph_count; g++) {
129 const int32_t coords[2] = {s_engine.glyphs[g].x, s_engine.glyphs[g].y};
130 const uint8_t* p = (const uint8_t*)coords;
131 for (size_t i = 0U; i < nbytes; i++) {
132 hsh = (hsh ^ (uint32_t)p[i]) * (uint32_t)k_al_fnv_prime;
133 }
134 }
135 return hsh;
136}
137
139static void al_setup_or_halt(void)
140{
141 uint32_t cpuclk0_hz = 0U;
142 if ((ra8_cgc_init() != k_ra8_ok) || (ra8_mstp_init() != k_ra8_ok)) {
143 al_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
144 }
146 al_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
147 }
148 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
149 al_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
150 }
152 al_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
153 }
154}
155
164void main(void)
165{
168 al_print(k_msg_boot, (uint32_t)sizeof(k_msg_boot) - 1U);
169
170 if (reflow_init((uint16_t)k_al_view_w,
171 (uint16_t)k_al_view_h,
173 (size_t)k_ahem_ttf_len,
174 (uint16_t)k_al_font_px,
175 (uint32_t)k_al_ink,
176 (uint32_t)k_al_link_col,
177 &s_engine) != k_ra8_ok) {
178 al_panic_halt(k_msg_fail, (uint32_t)sizeof(k_msg_fail) - 1U);
179 }
180 uint32_t pages = 0U;
182 (const uint8_t*)k_al_chapter,
183 (uint32_t)(sizeof(k_al_chapter) - 1U),
184 &pages) != k_ra8_ok) {
185 al_panic_halt(k_msg_lerr, (uint32_t)sizeof(k_msg_lerr) - 1U);
186 }
187
188 al_print(k_msg_pre, (uint32_t)sizeof(k_msg_pre) - 1U);
189 al_print_uint(s_engine.glyph_count);
190 al_print(k_msg_geom, (uint32_t)sizeof(k_msg_geom) - 1U);
192 al_print(k_msg_eol, (uint32_t)sizeof(k_msg_eol) - 1U);
193
194 while (1) {
195 __asm__ volatile("wfi");
196 }
197}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static const uint8_t k_msg_pre[]
Definition main.c:151
static const uint8_t k_msg_boot[]
Definition main.c:140
static const uint8_t k_msg_fail[]
Definition main.c:63
static reflow_t s_engine
Reflow engine (glyph / page / token / text pools live inside).
Definition main.c:199
static const uint8_t k_msg_eol[]
Definition main.c:328
static const uint8_t k_msg_geom[]
Definition main.c:73
static const uint8_t k_msg_lerr[]
Definition main.c:71
al_consts_t
Viewport / console / hash knobs (no magic numbers).
Definition main.c:42
@ k_al_ink
Body ink colour (ARGB).
Definition main.c:46
@ k_al_hex_nibbles
Hex digits in a 32-bit value.
Definition main.c:51
@ k_al_view_w
Layout viewport width, pixels.
Definition main.c:43
@ k_al_uart_baud
Console baud.
Definition main.c:48
@ k_al_font_px
Body font size, pixels.
Definition main.c:45
@ k_al_link_col
Anchor colour (ARGB).
Definition main.c:47
@ k_al_fnv_prime
FNV-1a-32 prime.
Definition main.c:50
@ k_al_dec_ten
Hex digit / decimal split.
Definition main.c:54
@ k_al_fnv_offset
FNV-1a-32 offset basis.
Definition main.c:49
@ k_al_view_h
Layout viewport height, pixels.
Definition main.c:44
@ k_al_nibble_mask
Low-nibble mask.
Definition main.c:53
@ k_al_nibble_bits
Bits per hex nibble.
Definition main.c:52
static void al_setup_or_halt(void)
Bring up clocks/MSTP/time + the SCI8 console; halt on failure.
Definition main.c:139
static void al_print(const uint8_t *msg, uint32_t len)
Emit a byte run on the SCI8 console.
Definition main.c:77
static uint32_t al_geom_hash(void)
FNV-1a-32 over every laid-out glyph's (x, y) position.
Definition main.c:124
static const char k_al_chapter[]
Baked chapter: right, centre, justified, and default-left paragraphs.
Definition main.c:61
static void al_panic_halt(const uint8_t *msg, uint32_t len)
Print the fail banner and trap (ra8_emulator halts on the BKPT).
Definition main.c:83
static void al_print_uint(uint32_t value)
Print a small unsigned integer in decimal.
Definition main.c:105
static void al_print_hex(uint32_t value)
Print a 32-bit value as 8 upper-case hex digits.
Definition main.c:93
static const uint8_t k_ahem_ttf[]
Ahem TTF bytes.
static const uint32_t k_ahem_ttf_len
Length of k_ahem_ttf in bytes.
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
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
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
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
HTML / CSS reflow + paginate engine for the ra8d2 ereader.
ra8_err_t reflow_layout_chapter(reflow_t *engine, const uint8_t *xhtml_buf, size_t xhtml_len, uint32_t *out_total_pages)
Parse + lay out one chapter of XHTML.
ra8_err_t reflow_init(uint16_t viewport_w, uint16_t viewport_h, const uint8_t *font_data, size_t font_len, uint16_t font_px, uint32_t body_color, uint32_t link_color, reflow_t *out_engine)
Initialise a reflow engine for a given viewport / font.
Reflow / pagination engine state.