ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
emu_args.c
Go to the documentation of this file.
1
14
15#include "emu_args.h"
16
17#include <ctype.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21
22#include "board_periph_eink.h"
23#include "board_periph_modem.h"
24#include "board_periph_sd.h"
26#include "emu_seams.h"
27#include "emu_view.h"
28
44{
46 "usage: ra8_emulator <firmware.elf> [--view] [--ppm <out.ppm>]"
47 " [--panel <file.toml>] [--size WxH] [--click X Y] [--touch-seq S] [--input <str>]"
48 " [--sd <image>]"
49 " [--usb-in <str>] [--button <1|2>] [--reboot <N>] [--dump-sym <name>]"
50 " [--stop-sym <name> <N>]"
51 " [--trace-sym <name>] [--sd-new <N[k|m|g][:fat16|fat32]>] [--save-sd <out>] [--fast-sd]"
52 " [--eink] [--device ra8d2|ra8p1]\n"
53 " --view open a macOS window: live board view; click panel"
54 " (touch) / on-screen SW1/SW2, type -> UART\n"
55 " --ppm <file> write the final composite (panel + status) to a PPM\n"
56 " --record <dir> record frames (panel + status) to <dir>/frame_NNNNNN.ppm\n"
57 " --record-secs N headless: record N emulated seconds, then stop (~20 fps)\n"
58 " --rotate DEG display rotation 90/180/270 (e.g. portrait)\n"
59 " --panel <file> display descriptor (name/width/height) to size the panel\n"
60 " --size WxH panel size in pixels; overrides --panel (default 1024x600)\n"
61 " --click X Y headless: inject one touch at X,Y once the UI is up\n"
62 " --touch-seq S headless: queue raw GT911 taps \"x0:y0,x1:y1,...\" served\n"
63 " one per drained frame (multi-tap flows, e.g. touch_cal)\n"
64 " --input <str> feed <str> to the console UART RX (SCI8); \\n / \\r / \\t ok\n"
65 " --keys <str> type <str> via the window-key path -> console UART RX\n"
66 " --usb-in <str> feed <str> to the USB CDC bulk OUT pipe (echo test)\n"
67 " --button <1|2> hold user switch SW1 (P009) / SW2 (P008) pressed\n"
68 " --battery <pct> set the fuel-gauge state-of-charge (0..100; MAX17048 @ 0x36)\n"
69 " --charge mark the battery charging (fuel-gauge CRATE reads positive)\n"
70 " --reboot <N> warm-reboot N times (re-run from reset vector; VBATT-backup\n"
71 " + reset-cause survive) to exercise reset-survival apps\n"
72 " --sd <image> serve a FAT/exFAT image as the microSD card (read + write)\n"
73 " --sd-new <N[k|m|g][:fat16|fat32]> blank FAT card of N MiB (k/m/g unit; e.g. 30g)\n"
74 " --save-sd <out> after the run, dump the SD card image (with firmware writes)\n"
75 " --fast-sd serve SD blocks direct from the image (skip the per-byte SPI\n"
76 " protocol; byte-identical render) so a big book loads fast; opt-in\n"
77 " --eink attach a modelled IT8951 e-paper controller on SPI_B (drives\n"
78 " the ra8_epaper path: HRDY ready, GET_DEV_INFO, load + display)\n"
79 " --dump-sym <s> print 32-bit global <s> from memory after the run (memprobe)\n"
80 " --stop-sym <s> <N> end the run once 32-bit global <s> reaches N (counter memprobe)\n"
81 " --trace-sym <s> log every entry to function <s> (+LR): trace a bring-up path\n"
82 " --trace log each LED/GPIO transition + NVIC IRQ as it happens\n"
83 " --primary-core m85|m33 label the primary core; m33 leaves the M85-only\n"
84 " instruction seams (MVE / long-shift) off (default m85)\n"
85 " --device ra8d2|ra8p1 select the emulated part (default ra8d2). ra8p1 adds\n"
86 " the Ethos-U55 NPU (0x40140000) as a mapped-but-unmodelled\n"
87 " window; else identical to the RA8D2 model\n"
88 " --low-power model the M33's 4:1-slower clock (1/4 chunk budget); the\n"
89 " GUI low-power button toggles it live under --view\n");
90}
91
110RA8_INTERNAL static void internal_args_defaults(const char* elf_path, emu_args_t* out)
111{
112 *out = (emu_args_t){};
113 out->elf_path = elf_path;
114 out->rotate_deg = (uint32_t)k_rotate_0;
115 out->click_x = -1;
116 out->click_y = -1;
117 out->battery_soc = -1;
118 out->view_w = (uint16_t)k_view_default_w;
119 out->view_h = (uint16_t)k_view_default_h;
121}
122
145RA8_INTERNAL static bool internal_args_try_mode(int argc, char** argv, int* i, emu_args_t* out)
146{
147 const int idx = *i;
148 if (strncmp(argv[idx], "--view", sizeof("--view")) == 0) {
149 out->want_view = true;
150 } else if (strncmp(argv[idx], "--usbhs-loop", sizeof("--usbhs-loop")) == 0) {
151 /* Model the on-chip USBHS host controller (board_periph_usbhs_host.c) and
152 * bridge it to the USBFS device, instead of the ra8_usb_host_* function
153 * seam: for apps whose HS host enumerates the SAME chip's FS device. */
154 out->usbhs_loop = true;
155 } else if (strncmp(argv[idx], "--trace", sizeof("--trace")) == 0) {
156 out->want_trace = true;
157 } else if (strncmp(argv[idx], "--low-power", sizeof("--low-power")) == 0) {
158 emu_set_low_power(true);
159 } else if (strncmp(argv[idx], "--fast-sd", sizeof("--fast-sd")) == 0) {
161 } else if (strncmp(argv[idx], "--eink", sizeof("--eink")) == 0) {
162 (void)board_eink_attach(); /* answer the ra8_epaper SPI path (IT8951 model) */
163 } else if (strncmp(argv[idx], "--modem", sizeof("--modem")) == 0) {
164 (void)board_modem_attach(); /* answer the ra8_modem_at AT path (SCI7 modem model) */
165 } else if ((strncmp(argv[idx], "--primary-core", sizeof("--primary-core")) == 0) &&
166 ((idx + 1) < argc)) {
167 emu_set_primary_core((strncmp(argv[idx + 1], "m33", sizeof("m33")) == 0) ? k_core_m33
168 : k_core_m85);
169 (*i)++;
170 } else if ((strncmp(argv[idx], "--device", sizeof("--device")) == 0) && ((idx + 1) < argc)) {
171 /* Select the emulated part; anything but "ra8p1" (incl. "ra8d2") = RA8D2. */
172 out->emu_device = (strncmp(argv[idx + 1], "ra8p1", sizeof("ra8p1")) == 0)
175 (*i)++;
176 } else {
177 return false;
178 }
179 return true;
180}
181
202RA8_INTERNAL static bool internal_args_try_display(int argc, char** argv, int* i, emu_args_t* out)
203{
204 const int idx = *i;
205 if ((strncmp(argv[idx], "--ppm", sizeof("--ppm")) == 0) && ((idx + 1) < argc)) {
206 out->ppm_path = argv[idx + 1];
207 (*i)++;
208 } else if ((strncmp(argv[idx], "--record-secs", sizeof("--record-secs")) == 0) &&
209 ((idx + 1) < argc)) {
210 const long s = strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
211 out->record_secs = (s > 0L) ? (uint32_t)s : 0U;
212 (*i)++;
213 } else if ((strncmp(argv[idx], "--record", sizeof("--record")) == 0) && ((idx + 1) < argc)) {
214 out->record_dir = argv[idx + 1];
215 (*i)++;
216 } else if ((strncmp(argv[idx], "--rotate", sizeof("--rotate")) == 0) && ((idx + 1) < argc)) {
217 const long deg = strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
218 if ((deg == (long)k_rotate_90) || (deg == (long)k_rotate_180) || (deg == (long)k_rotate_270)) {
219 out->rotate_deg = (uint32_t)deg;
220 }
221 (*i)++;
222 } else if ((strncmp(argv[idx], "--panel", sizeof("--panel")) == 0) && ((idx + 1) < argc)) {
223 out->panel_path = argv[idx + 1];
224 (*i)++;
225 } else if ((strncmp(argv[idx], "--size", sizeof("--size")) == 0) && ((idx + 1) < argc)) {
226 char* end = nullptr;
227 const long w = strtol(argv[idx + 1], &end, (int)k_strtol_base10);
228 const long h =
229 ((end != nullptr) && (*end == 'x')) ? strtol(end + 1, nullptr, (int)k_strtol_base10) : 0L;
230 if ((w > 0L) && (w <= (long)k_max_panel_px) && (h > 0L) && (h <= (long)k_max_panel_px)) {
231 out->view_w = (uint16_t)w;
232 out->view_h = (uint16_t)h;
233 out->size_set = true;
234 }
235 (*i)++;
236 } else {
237 return false;
238 }
239 return true;
240}
241
262RA8_INTERNAL static bool internal_args_try_input(int argc, char** argv, int* i, emu_args_t* out)
263{
264 const int idx = *i;
265 if ((strncmp(argv[idx], "--ns", sizeof("--ns")) == 0) && ((idx + 1) < argc)) {
266 /* Second ELF: the Non-Secure image of a two-image TrustZone app (the e-reader).
267 * Loaded at its LMA so the Secure boot's NS-image copy + BLXNS land on it. */
268 out->ns_elf_path = argv[idx + 1];
269 (*i)++;
270 } else if ((strncmp(argv[idx], "--input", sizeof("--input")) == 0) && ((idx + 1) < argc)) {
271 out->input_str = argv[idx + 1];
272 (*i)++;
273 } else if ((strncmp(argv[idx], "--keys", sizeof("--keys")) == 0) && ((idx + 1) < argc)) {
274 out->keys_str = argv[idx + 1];
275 (*i)++;
276 } else if ((strncmp(argv[idx], "--touch-seq", sizeof("--touch-seq")) == 0) &&
277 ((idx + 1) < argc)) {
278 out->touch_seq_str = argv[idx + 1];
279 (*i)++;
280 } else if ((strncmp(argv[idx], "--usb-in", sizeof("--usb-in")) == 0) && ((idx + 1) < argc)) {
281 out->usb_in_str = argv[idx + 1];
282 (*i)++;
283 } else if ((strncmp(argv[idx], "--click", sizeof("--click")) == 0) && ((idx + 2) < argc)) {
284 out->click_x = (int)strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
285 out->click_y = (int)strtol(argv[idx + 2], nullptr, (int)k_strtol_base10);
286 out->want_click = (out->click_x >= 0) && (out->click_y >= 0);
287 *i += 2;
288 } else {
289 return false;
290 }
291 return true;
292}
293
315RA8_INTERNAL static void internal_args_attach_blank_sd(const char* spec)
316{
317 char* endp = nullptr;
318 const long num = strtol(spec, &endp, (int)k_strtol_base10);
319 uint64_t mult =
320 (uint64_t)k_sectors_per_mib * (uint64_t)k_bytes_per_sector; /* default unit: MiB. */
321 /* Cast the whole conditional: it promotes both arms to int. */
322 const char unit = (char)(((endp != nullptr) && (*endp != '\0')) ? tolower((int)*endp) : 'm');
323 if (unit == 'k') {
324 mult = (uint64_t)k_size_kib;
325 } else if (unit == 'g') {
326 mult = (uint64_t)k_size_kib * (uint64_t)k_size_kib * (uint64_t)k_size_kib;
327 } else if (unit == 't') {
328 mult =
329 (uint64_t)k_size_kib * (uint64_t)k_size_kib * (uint64_t)k_size_kib * (uint64_t)k_size_kib;
330 }
331 const uint64_t bytes = (num > 0L) ? ((uint64_t)num * mult) : 0ULL;
332 const uint64_t sectors = bytes / (uint64_t)k_bytes_per_sector;
333 const char* colon = (endp != nullptr) ? strchr(endp, ':') : nullptr;
334 const uint64_t fat32_min_bytes =
335 (uint64_t)k_fat32_min_mib * (uint64_t)k_size_kib * (uint64_t)k_size_kib;
336 uint8_t fat = (bytes >= fat32_min_bytes) ? (uint8_t)32U : (uint8_t)16U;
337 if (colon != nullptr) {
338 fat = (strstr(colon, "32") != nullptr) ? (uint8_t)32U : (uint8_t)16U;
339 }
340 if ((sectors > 0ULL) && (sectors <= (uint64_t)k_sd_u32_max)) {
341 (void)board_sd_attach_blank((uint32_t)sectors, fat, "RA8EMU");
342 } else if (sectors > (uint64_t)k_sd_u32_max) {
343 (void)priv_emu_io_errf("ra8_emulator: --sd-new: size exceeds the 2 TiB FAT limit\n");
344 }
345}
346
368RA8_INTERNAL static bool internal_args_try_sd(int argc, char** argv, int* i, emu_args_t* out)
369{
370 const int idx = *i;
371 if ((strncmp(argv[idx], "--sd", sizeof("--sd")) == 0) && ((idx + 1) < argc)) {
372 (void)board_sd_attach(argv[idx + 1]); /* serve this FAT image to ra8_sdmmc_spi */
373 (*i)++;
374 } else if ((strncmp(argv[idx], "--sd-new", sizeof("--sd-new")) == 0) && ((idx + 1) < argc)) {
375 /* "<N>[k|m|g|t][:fat16|fat32]" -- create + attach a blank formatted card.
376 * A bare number is MiB; a k/m/g/t suffix sets the unit (so "30g" = 30 GiB).
377 * Format defaults by size (FAT32 >= 512 MiB) like a real SD card; FAT16
378 * cannot exceed its cluster ceiling, so multi-GB cards are FAT32. */
379 internal_args_attach_blank_sd(argv[idx + 1]);
380 (*i)++;
381 } else if ((strncmp(argv[idx], "--save-sd", sizeof("--save-sd")) == 0) && ((idx + 1) < argc)) {
382 out->save_sd_path = argv[idx + 1];
383 (*i)++;
384 } else {
385 return false;
386 }
387 return true;
388}
389
412RA8_INTERNAL static bool internal_args_try_sym(int argc, char** argv, int* i, emu_args_t* out)
413{
414 const int idx = *i;
415 if ((strncmp(argv[idx], "--dump-sym", sizeof("--dump-sym")) == 0) && ((idx + 1) < argc)) {
416 if (out->dump_sym_n < (uint32_t)k_dump_sym_max) {
417 out->dump_sym_names[out->dump_sym_n] = argv[idx + 1];
418 out->dump_sym_n++;
419 }
420 (*i)++;
421 } else if ((strncmp(argv[idx], "--stop-sym", sizeof("--stop-sym")) == 0) && ((idx + 2) < argc)) {
422 /* End the run the instant 32-bit global <name> reaches <threshold> -- the
423 * counter analog of RA8_EMU_STOP_ON, for the jlink_memprobe EIL mode: a
424 * free-running progress counter that hits its floor stops the run at once,
425 * so a passing probe finishes in a few chunks instead of the full budget. */
426 out->stop_sym_name = argv[idx + 1];
427 out->stop_sym_thresh = (uint32_t)strtoul(argv[idx + 2], nullptr, (int)k_strtol_base10);
428 *i += 2;
429 } else if ((strncmp(argv[idx], "--trace-sym", sizeof("--trace-sym")) == 0) &&
430 ((idx + 1) < argc)) {
431 if (out->trace_sym_n < (uint32_t)k_trace_sym_max) {
432 out->trace_sym_names[out->trace_sym_n] = argv[idx + 1];
433 out->trace_sym_n++;
434 }
435 (*i)++;
436 } else {
437 return false;
438 }
439 return true;
440}
441
463RA8_INTERNAL static bool internal_args_try_control(int argc, char** argv, int* i, emu_args_t* out)
464{
465 const int idx = *i;
466 if ((strncmp(argv[idx], "--button", sizeof("--button")) == 0) && ((idx + 1) < argc)) {
467 out->button_press = (int)strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
468 *i += 1;
469 } else if ((strncmp(argv[idx], "--battery", sizeof("--battery")) == 0) && ((idx + 1) < argc)) {
470 out->battery_soc = (int)strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
471 out->battery_opt = true;
472 *i += 1;
473 } else if (strncmp(argv[idx], "--charge", sizeof("--charge")) == 0) {
474 out->battery_charging = true;
475 out->battery_opt = true;
476 } else if ((strncmp(argv[idx], "--reboot", sizeof("--reboot")) == 0) && ((idx + 1) < argc)) {
477 out->reboot_count = (int)strtol(argv[idx + 1], nullptr, (int)k_strtol_base10);
478 *i += 1;
479 } else {
480 return false;
481 }
482 return true;
483}
484
485bool emu_args_parse(int argc, char** argv, emu_args_t* out)
486{
487 if (argc < 2) {
489 return false;
490 }
491 internal_args_defaults(argv[1], out);
492 for (int i = 2; i < argc; i++) {
493 (void)(internal_args_try_mode(argc, argv, &i, out) ||
494 internal_args_try_display(argc, argv, &i, out) ||
495 internal_args_try_input(argc, argv, &i, out) ||
496 internal_args_try_sd(argc, argv, &i, out) ||
497 internal_args_try_sym(argc, argv, &i, out) ||
498 internal_args_try_control(argc, argv, &i, out));
499 }
500 return true;
501}
@ k_board_device_ra8p1
Renesas RA8P1: adds the Ethos-U55 NPU.
@ k_board_device_ra8d2
Renesas RA8D2 (default): no NPU.
IT8951 e-paper SPI-device model for ra8_emulator (attached to SPI_B).
bool board_eink_attach(void)
Attach (arm) the modelled IT8951 e-paper controller.
Cellular AT-modem device model for ra8_emulator (attached to SCI7 UART).
bool board_modem_attach(void)
Attach (arm) the modelled AT cellular modem.
SD-card-over-SPI device model for ra8_emulator (attached to SPI_B).
bool board_sd_attach(const char *path)
Attach an SD-card image from a host file.
bool board_sd_attach_blank(uint32_t total_sectors, uint8_t fat_bits, const char *label)
Create a blank, FAT-formatted sparse SD card and attach it.
static bool internal_args_try_control(int argc, char **argv, int *i, emu_args_t *out)
Parse the button / battery / reboot run-control options.
Definition emu_args.c:463
static void internal_args_print_usage(void)
Print the ra8_emulator CLI usage text to injected error sink.
Definition emu_args.c:43
static void internal_args_defaults(const char *elf_path, emu_args_t *out)
Seed the parsed-args struct with every option's default.
Definition emu_args.c:110
static bool internal_args_try_sym(int argc, char **argv, int *i, emu_args_t *out)
Parse the symbol-probe options.
Definition emu_args.c:412
static bool internal_args_try_sd(int argc, char **argv, int *i, emu_args_t *out)
Parse the microSD options.
Definition emu_args.c:368
bool emu_args_parse(int argc, char **argv, emu_args_t *out)
Parse the ra8_emulator command line into out (or print usage).
Definition emu_args.c:485
static bool internal_args_try_input(int argc, char **argv, int *i, emu_args_t *out)
Parse the input-injection options.
Definition emu_args.c:262
static bool internal_args_try_display(int argc, char **argv, int *i, emu_args_t *out)
Parse the display / output options.
Definition emu_args.c:202
static void internal_args_attach_blank_sd(const char *spec)
Parse a --sd-new size spec and attach a blank formatted card.
Definition emu_args.c:315
static bool internal_args_try_mode(int argc, char **argv, int *i, emu_args_t *out)
Parse the mode / core / device / attach-flag options.
Definition emu_args.c:145
ra8_emulator command-line parsing (usage text + option decoding)
Bounded raw-descriptor I/O seam for the RA8 emulator.
emu_io_result_t priv_emu_io_err_text(const char *text)
Write a NUL-terminated literal to the injected error descriptor.
emu_io_result_t priv_emu_io_errf(const char *format,...)
Format bounded text and write it to the injected error descriptor.
@ k_sectors_per_mib
512-byte sectors per MiB (–sd-new).
Definition emu_run.h:98
@ k_max_panel_px
Largest –size dimension.
Definition emu_run.h:95
@ k_dump_sym_max
Max –dump-sym globals per run.
Definition emu_run.h:97
@ k_fat32_min_mib
FAT32 default threshold, in MiB.
Definition emu_run.h:106
@ k_bytes_per_sector
SD logical sector size in bytes.
Definition emu_run.h:103
@ k_size_kib
One kibibyte (k suffix multiplier).
Definition emu_run.h:104
@ k_sd_u32_max
32-bit sector-count ceiling.
Definition emu_run.h:105
Armv8.1-M instruction-emulation seams (M85 ops on Unicorn's M33).
void emu_fast_sd_enable(void)
Opt in to the –fast-sd block-serving seam for this run.
@ k_trace_sym_max
Max –trace-sym functions per run.
Definition emu_trace.h:45
Board-view presentation: frames, composition, input routing, panels.
void emu_set_primary_core(board_primary_core_t core)
Select the primary core (CLI –primary-core).
Definition emu_view.c:639
@ k_rotate_0
Native orientation.
Definition emu_view.h:78
@ k_rotate_90
90 deg clockwise (-> portrait).
Definition emu_view.h:79
@ k_rotate_270
90 deg counter-clockwise.
Definition emu_view.h:81
@ k_rotate_180
Upside down.
Definition emu_view.h:80
@ k_strtol_base10
Base-10 radix for strtol parses.
Definition emu_view.h:85
void emu_set_low_power(bool on)
Set the low-power clock model (CLI –low-power / GUI toggle).
Definition emu_view.c:651
@ k_core_m33
Cortex-M33 primary: the M85-only instruction seams stay off.
Definition emu_view.h:65
@ k_core_m85
Cortex-M85 primary (default): MVE/long-shift seams armed.
Definition emu_view.h:64
@ k_view_default_h
Default window height (EK-RA8D2 panel).
Definition emu_view.h:44
@ k_view_default_w
Default window width (EK-RA8D2 panel).
Definition emu_view.h:43
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
int strncmp(const char *s1, const char *s2, size_t n)
Compare two strings up to a specified length.
char * strstr(const char *haystack, const char *needle)
Locate substring in string.
char * strchr(const char *s, int c)
Locate first occurrence of character in string.
Every value the ra8_emulator CLI parse produces for the setup phase.
Definition emu_args.h:51
uint32_t stop_sym_thresh
–stop-sym stop threshold.
Definition emu_args.h:66
int click_x
–click column (-1 = unset).
Definition emu_args.h:74
const char * elf_path
Firmware ELF path (argv[1]).
Definition emu_args.h:52
const char * touch_seq_str
–touch-seq raw-point FIFO string.
Definition emu_args.h:61
int click_y
–click row (-1 = unset).
Definition emu_args.h:75
const char * stop_sym_name
–stop-sym watch global (NULL = off).
Definition emu_args.h:65
uint32_t trace_sym_n
Count of –trace-sym entries.
Definition emu_args.h:68
uint16_t view_w
Panel width in pixels.
Definition emu_args.h:81
uint32_t dump_sym_n
Count of –dump-sym entries.
Definition emu_args.h:64
const char * usb_in_str
–usb-in CDC bulk OUT string.
Definition emu_args.h:62
int battery_soc
–battery pct (-1 = model default).
Definition emu_args.h:78
bool usbhs_loop
–usbhs-loop chip-internal self-loop.
Definition emu_args.h:84
bool want_view
–view live window.
Definition emu_args.h:53
const char * panel_path
–panel descriptor path (NULL = none).
Definition emu_args.h:58
const char * trace_sym_names[k_trace_sym_max]
–trace-sym functions to log.
Definition emu_args.h:67
int button_press
–button: 1=SW1, 2=SW2, 0=none.
Definition emu_args.h:76
bool battery_opt
Any battery flag given.
Definition emu_args.h:80
const char * ns_elf_path
–ns second (NS) image path.
Definition emu_args.h:70
bool want_trace
–trace transition logging.
Definition emu_args.h:73
const char * save_sd_path
–save-sd dump path (NULL = off).
Definition emu_args.h:69
int reboot_count
–reboot N warm reboots.
Definition emu_args.h:77
uint16_t view_h
Panel height in pixels.
Definition emu_args.h:82
const char * dump_sym_names[k_dump_sym_max]
–dump-sym globals to read.
Definition emu_args.h:63
bool battery_charging
–charge given.
Definition emu_args.h:79
const char * record_dir
–record directory (NULL = off).
Definition emu_args.h:55
board_device_t emu_device
–device selected part (RA8D2 default).
Definition emu_args.h:83
bool size_set
–size given (wins over –panel).
Definition emu_args.h:71
const char * keys_str
–keys window-key path string.
Definition emu_args.h:60
const char * ppm_path
–ppm output path (NULL = off).
Definition emu_args.h:54
bool want_click
–click armed with valid coordinates.
Definition emu_args.h:72
uint32_t record_secs
–record-secs bound (0 = unbounded).
Definition emu_args.h:56
uint32_t rotate_deg
–rotate display rotation (0 default).
Definition emu_args.h:57
const char * input_str
–input console RX string.
Definition emu_args.h:59