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
48
49#include <stddef.h>
50#include <stdint.h>
51
52#include "ra8_board_ek_ra8d2.h"
53#include "ra8_boot_entry.h"
54#include "ra8_cgc.h"
55#include "ra8_err.h"
56#include "ra8_gpio_constants.h"
57#include "ra8_isr.h"
58#include "ra8_modem_at.h"
59#include "ra8_mstp.h"
60#include "ra8_port_utils.h"
61#include "ra8_sci.h"
62#include "ra8_time.h"
63
64/* =============================================================================
65 * App-wide tunables
66 * =============================================================================
67 */
68
78
80typedef enum : uint16_t {
83
85typedef enum : uint32_t {
90
92typedef enum : uint8_t {
97
107
109typedef enum : uint8_t {
113
114/* =============================================================================
115 * Module state (file scope -- NASA P10 Rule 6)
116 * =============================================================================
117 */
118
126static uint8_t s_creg_stat;
127
135static bool s_creg_seen;
136
137/* Banner strings scraped by ra8_emulator / the HIL rig. The success line is
138 * "modem: rssi=17 reg=1 attach=1 cme=ok PASS"; a failed verdict swaps PASS for
139 * FAIL and reflects the actual cme= token. */
140static const uint8_t k_modem_banner_prefix[] = "modem: rssi=";
141static const uint8_t k_modem_str_reg[] = " reg=";
142static const uint8_t k_modem_str_attach[] = " attach=";
143static const uint8_t k_modem_str_cme[] = " cme=";
144static const uint8_t k_modem_str_ok[] = "ok";
145static const uint8_t k_modem_str_no[] = "no";
146static const uint8_t k_modem_str_pass[] = " PASS\r\n";
147static const uint8_t k_modem_str_fail[] = " FAIL\r\n";
148
149/* =============================================================================
150 * Pure decision logic (mirrored + MC/DC-tested in tests/mocks/src/test_app_modem_at_demo.c)
151 * =============================================================================
152 */
153
170static bool modem_creg_registered(uint32_t stat)
171{
172 return (stat == (uint32_t)k_modem_creg_home) || (stat == (uint32_t)k_modem_creg_roaming);
173}
174
197static bool modem_signal_valid(uint32_t rssi)
198{
199 return (rssi != (uint32_t)k_modem_csq_unknown) && (rssi >= (uint32_t)k_modem_csq_min_bars);
200}
201
226static bool modem_step_passed(bool is_cme_probe, ra8_err_t err)
227{
228 return (is_cme_probe && (err == k_ra8_err_hw_error)) || ((!is_cme_probe) && (err == k_ra8_ok));
229}
230
251static bool
252modem_run_ok(bool sim_ready, bool signal_ok, bool registered, bool attached, bool cme_ok)
253{
254 return sim_ready && signal_ok && registered && attached && cme_ok;
255}
256
257/* =============================================================================
258 * Pure parsing helpers (also mirrored + tested on the host)
259 * =============================================================================
260 */
261
282static bool modem_parse_first_uint(const char* line, uint32_t* out)
283{
284 if ((line == nullptr) || (out == nullptr)) {
285 return false;
286 }
287 uint32_t i = 0U;
288 while ((i < (uint32_t)k_modem_scan_max) && (line[i] != '\0') && (line[i] != ':')) {
289 i++;
290 }
291 if ((i >= (uint32_t)k_modem_scan_max) || (line[i] != ':')) {
292 return false;
293 }
294 i++;
295 while ((i < (uint32_t)k_modem_scan_max) && (line[i] == ' ')) {
296 i++;
297 }
298 if ((i >= (uint32_t)k_modem_scan_max) || (line[i] < '0') || (line[i] > '9')) {
299 return false;
300 }
301 uint32_t v = 0U;
302 while ((i < (uint32_t)k_modem_scan_max) && (line[i] >= '0') && (line[i] <= '9')) {
303 v = (v * (uint32_t)k_modem_dec_base) + (uint32_t)(line[i] - '0');
304 i++;
305 }
306 *out = v;
307 return true;
308}
309
331static bool modem_parse_last_uint(const char* line, uint32_t* out)
332{
333 if ((line == nullptr) || (out == nullptr)) {
334 return false;
335 }
336 bool found = false;
337 uint32_t v = 0U;
338 uint32_t i = 0U;
339 while ((i < (uint32_t)k_modem_scan_max) && (line[i] != '\0')) {
340 if ((line[i] >= '0') && (line[i] <= '9')) {
341 v = 0U;
342 while ((i < (uint32_t)k_modem_scan_max) && (line[i] >= '0') && (line[i] <= '9')) {
343 v = (v * (uint32_t)k_modem_dec_base) + (uint32_t)(line[i] - '0');
344 i++;
345 }
346 found = true;
347 } else {
348 i++;
349 }
350 }
351 if (found) {
352 *out = v;
353 }
354 return found;
355}
356
373static bool modem_line_contains(const char* line, const char* needle)
374{
375 if ((line == nullptr) || (needle == nullptr)) {
376 return false;
377 }
378 for (uint32_t i = 0U; (i < (uint32_t)k_modem_scan_max) && (line[i] != '\0'); i++) {
379 uint32_t j = 0U;
380 while ((j < (uint32_t)k_modem_scan_max) && (needle[j] != '\0') && (line[i + j] == needle[j])) {
381 j++;
382 }
383 if (needle[j] == '\0') {
384 return true;
385 }
386 }
387 return false;
388}
389
390/* =============================================================================
391 * Small integer serialiser + console emit helpers
392 * =============================================================================
393 */
394
410static uint32_t modem_u32_to_dec(uint32_t value, uint8_t* out)
411{
412 uint8_t tmp[k_modem_dec_cap] = {};
413 uint32_t n = 0U;
414 if (value == 0U) {
415 tmp[n] = (uint8_t)'0';
416 n++;
417 } else {
418 while ((value > 0U) && (n < (uint32_t)k_modem_dec_cap)) {
419 tmp[n] = (uint8_t)('0' + (uint8_t)(value % (uint32_t)k_modem_dec_base));
420 n++;
421 value = value / (uint32_t)k_modem_dec_base;
422 }
423 }
424 for (uint32_t i = 0U; i < n; i++) {
425 out[i] = tmp[n - 1U - i];
426 }
427 return n;
428}
429
443static void modem_tx(const uint8_t* bytes, uint32_t len)
444{
445 (void)ra8_board_uart_console_write(bytes, (size_t)len);
446}
447
462static void modem_emit_kv(const uint8_t* label, uint32_t label_len, uint32_t value)
463{
464 uint8_t buf[k_modem_dec_cap] = {};
465 modem_tx(label, label_len);
466 const uint32_t n = modem_u32_to_dec(value, buf);
467 modem_tx(buf, n);
468}
469
470/* =============================================================================
471 * ra8_modem_at transport adapters (SCI7, polled)
472 * =============================================================================
473 */
474
475static ra8_err_t modem_tx_byte(void* ctx, uint8_t byte)
476{
477 (void)ctx;
478 return ra8_sci_putc_polling((uint8_t)k_modem_uart_channel, byte);
479}
480
481static ra8_err_t modem_rx_byte(void* ctx, uint8_t* out_byte)
482{
483 (void)ctx;
484 return ra8_sci_getc_polling((uint8_t)k_modem_uart_channel, out_byte);
485}
486
487static uint32_t modem_now_ms(void* ctx)
488{
489 (void)ctx;
490 return ra8_now_ms();
491}
492
511static void modem_on_creg_urc(const char* line, void* ctx)
512{
513 (void)ctx;
514 if (line == nullptr) {
515 return;
516 }
517 uint32_t stat = 0U;
518 if (modem_parse_last_uint(line, &stat)) {
519 s_creg_stat = (uint8_t)stat;
520 s_creg_seen = true;
521 }
522}
523
524/* =============================================================================
525 * Bring-up helpers (kept out of main() for NASA P10 Rule 4)
526 * =============================================================================
527 */
528
536static void modem_panic_halt(void)
537{
538 while (1) {
539 __asm__ volatile("wfi");
540 }
541}
542
555static void modem_clocks_or_halt(uint32_t* out_pclka_hz)
556{
557 uint32_t cpuclk0_hz = 0U;
558 if (ra8_cgc_init() != k_ra8_ok) {
560 }
563 }
564 if (ra8_cgc_get_clock_hz(k_ra8_clock_id_pclka, out_pclka_hz) != k_ra8_ok) {
566 }
567 if (ra8_mstp_init() != k_ra8_ok) {
569 }
570 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
572 }
573}
574
584static void modem_pfs_or_halt(void)
585{
588 "modem_at_demo.txd7") != k_ra8_ok) {
590 }
593 "modem_at_demo.rxd7") != k_ra8_ok) {
595 }
596}
597
607static void modem_setup_or_halt(void)
608{
609 uint32_t pclka_hz = 0U;
610 modem_clocks_or_halt(&pclka_hz);
612
615 }
616 const ra8_sci_cfg_t cfg = {
617 .baud = (uint32_t)k_modem_baud,
618 .data_bits = k_ra8_sci_data_8,
619 .parity = k_ra8_sci_parity_none,
620 .stop_bits = k_ra8_sci_stop_1,
621 .pclk_hz = pclka_hz,
622 };
623 if (ra8_sci_init((uint8_t)k_modem_uart_channel, &cfg) != k_ra8_ok) {
625 }
628 }
631 }
632}
633
651static ra8_err_t modem_bind(uint8_t* line_buf, uint16_t line_buf_len)
652{
653 const ra8_modem_at_cfg_t cfg = {
654 .io = {.tx_byte = modem_tx_byte,
655 .rx_byte = modem_rx_byte,
656 .now_ms = modem_now_ms,
657 .ctx = nullptr},
658 .line_buf = line_buf,
659 .line_buf_len = line_buf_len,
660 .default_timeout_ms = (uint16_t)k_modem_cmd_timeout_ms,
661 };
662 const ra8_err_t ierr = ra8_modem_at_init(&cfg);
663 if (ierr != k_ra8_ok) {
664 return ierr;
665 }
667}
668
682static ra8_err_t modem_cmd_ok(const char* cmd)
683{
684 return ra8_modem_at_send_cmd(cmd, nullptr, (uint16_t)k_modem_cmd_timeout_ms);
685}
686
702static ra8_err_t modem_query(const char* cmd, char* buf, size_t cap)
703{
704 return ra8_modem_at_send_cmd_capture(cmd, buf, cap, (uint16_t)k_modem_cmd_timeout_ms);
705}
706
719static void modem_fail(const uint8_t* step, uint32_t step_len)
720{
721 static const uint8_t k_pfx[] = "modem: ";
722 static const uint8_t k_sfx[] = " FAIL\r\n";
723 modem_tx(k_pfx, (uint32_t)(sizeof(k_pfx) - 1U));
724 modem_tx(step, step_len);
725 modem_tx(k_sfx, (uint32_t)(sizeof(k_sfx) - 1U));
728}
729
730/* =============================================================================
731 * AT script phases
732 * =============================================================================
733 */
734
746static void modem_phase_sync(void)
747{
748 static const uint8_t k_step[] = "sync";
749 if (modem_cmd_ok("AT") != k_ra8_ok) {
750 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
751 }
752 if (modem_cmd_ok("ATE0") != k_ra8_ok) {
753 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
754 }
755 if (modem_cmd_ok("AT+CMEE=1") != k_ra8_ok) {
756 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
757 }
758}
759
773static bool modem_phase_sim(void)
774{
775 static const uint8_t k_step[] = "cpin";
776 char buf[k_modem_capture_cap] = {};
777 if (modem_query("AT+CPIN?", buf, sizeof buf) != k_ra8_ok) {
778 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
779 }
780 return modem_line_contains(buf, "READY");
781}
782
795static bool modem_phase_signal(uint32_t* out_rssi)
796{
797 static const uint8_t k_step[] = "csq";
798 char buf[k_modem_capture_cap] = {};
799 if (modem_query("AT+CSQ", buf, sizeof buf) != k_ra8_ok) {
800 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
801 }
802 uint32_t rssi = (uint32_t)k_modem_csq_unknown;
803 (void)modem_parse_first_uint(buf, &rssi);
804 *out_rssi = rssi;
805 modem_emit_kv(k_modem_banner_prefix, (uint32_t)(sizeof(k_modem_banner_prefix) - 1U), rssi);
806 return modem_signal_valid(rssi);
807}
808
821{
822 static const uint8_t k_step[] = "creg";
823 if (modem_cmd_ok("AT+CREG=1") != k_ra8_ok) {
824 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
825 }
826 /* Drain + dispatch the unsolicited "+CREG: <stat>" the modem emits on enable. */
827 (void)ra8_modem_at_poll();
828 if (modem_cmd_ok("AT+CREG?") != k_ra8_ok) {
829 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
830 }
831 modem_emit_kv(k_modem_str_reg, (uint32_t)(sizeof(k_modem_str_reg) - 1U), (uint32_t)s_creg_stat);
832 return s_creg_seen && modem_creg_registered((uint32_t)s_creg_stat);
833}
834
846static bool modem_phase_attach(void)
847{
848 static const uint8_t k_step[] = "cgatt";
849 char buf[k_modem_capture_cap] = {};
850 if (modem_query("AT+CGATT?", buf, sizeof buf) != k_ra8_ok) {
851 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
852 }
853 uint32_t flag = (uint32_t)k_modem_cgatt_detached;
854 (void)modem_parse_first_uint(buf, &flag);
855 modem_emit_kv(k_modem_str_attach, (uint32_t)(sizeof(k_modem_str_attach) - 1U), flag);
856 return flag == (uint32_t)k_modem_cgatt_attached;
857}
858
870static bool modem_phase_error(void)
871{
872 const ra8_err_t err = modem_cmd_ok("AT+NOSUCHCMD");
873 return modem_step_passed(true, err);
874}
875
876/* =============================================================================
877 * Main
878 * =============================================================================
879 */
880
891void main(void)
892{
895
896 static uint8_t s_line[k_modem_capture_cap * 2U];
897 if (modem_bind(s_line, (uint16_t)sizeof s_line) != k_ra8_ok) {
898 static const uint8_t k_step[] = "init";
899 modem_fail(k_step, (uint32_t)(sizeof(k_step) - 1U));
900 }
901
903 const bool sim_ready = modem_phase_sim();
904 uint32_t rssi = (uint32_t)k_modem_csq_unknown;
905 const bool signal_ok = modem_phase_signal(&rssi);
906 const bool registered = modem_phase_registration();
907 const bool attached = modem_phase_attach();
908 const bool cme_ok = modem_phase_error();
909
910 const bool ok = modem_run_ok(sim_ready, signal_ok, registered, attached, cme_ok);
911 /* "ok"/"no" are both 2 bytes and " PASS\r\n"/" FAIL\r\n" both 7, so one length
912 * expression per pair keeps -Wduplicated-branches happy. */
913 modem_tx(k_modem_str_cme, (uint32_t)(sizeof(k_modem_str_cme) - 1U));
914 modem_tx(cme_ok ? k_modem_str_ok : k_modem_str_no, (uint32_t)(sizeof(k_modem_str_ok) - 1U));
915 modem_tx(ok ? k_modem_str_pass : k_modem_str_fail, (uint32_t)(sizeof(k_modem_str_pass) - 1U));
916
917 while (1) {
920 }
921
923}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static ra8_err_t modem_tx_byte(void *ctx, uint8_t byte)
Definition main.c:475
static bool modem_run_ok(bool sim_ready, bool signal_ok, bool registered, bool attached, bool cme_ok)
Overall run verdict: every probed condition must hold.
Definition main.c:252
static bool modem_phase_error(void)
Error-path phase: send an unsupported command, expect +CME ERROR.
Definition main.c:870
static bool modem_parse_first_uint(const char *line, uint32_t *out)
Parse the first unsigned integer after the : in an AT reply line.
Definition main.c:282
static bool s_creg_seen
True once at least one +CREG line has been parsed.
Definition main.c:135
static uint32_t modem_now_ms(void *ctx)
Definition main.c:487
static const uint8_t k_modem_str_no[]
Definition main.c:145
static bool modem_phase_sim(void)
SIM phase: query AT+CPIN? and confirm READY.
Definition main.c:773
modem_csq_t
CSQ (signal-quality) sentinels: RSSI range 0..31, 99 = unknown.
Definition main.c:92
@ k_modem_csq_min_bars
Minimum RSSI treated as a usable signal.
Definition main.c:93
@ k_modem_csq_unknown
CSQ "not known / not detectable".
Definition main.c:95
@ k_modem_csq_max
Highest valid CSQ RSSI index.
Definition main.c:94
static bool modem_line_contains(const char *line, const char *needle)
Does line contain the substring needle?
Definition main.c:373
static const uint8_t k_modem_str_attach[]
Definition main.c:142
static void modem_fail(const uint8_t *step, uint32_t step_len)
Print a modem: <step> FAIL banner, latch LED2, and park.
Definition main.c:719
static void modem_panic_halt(void)
Park forever after a fatal error.
Definition main.c:536
static const uint8_t k_modem_str_reg[]
Definition main.c:141
static uint8_t s_creg_stat
Latest registration status parsed from a +CREG line.
Definition main.c:126
modem_timeout_t
Per-command timeout handed to ra8_modem_at (ms).
Definition main.c:80
@ k_modem_cmd_timeout_ms
Modem cmd timeout ms.
Definition main.c:81
static void modem_phase_sync(void)
Sync phase: probe (AT), disable echo (ATE0), numeric CME errors.
Definition main.c:746
static bool modem_signal_valid(uint32_t rssi)
Is a CSQ RSSI reading a known, usable signal?
Definition main.c:197
static const uint8_t k_modem_str_ok[]
Definition main.c:144
static const uint8_t k_modem_str_cme[]
Definition main.c:143
modem_const_t
App-wide numeric tunables (typed enum – no magic numbers).
Definition main.c:70
@ k_modem_heartbeat_ms
LED heartbeat period after PASS.
Definition main.c:73
@ k_modem_baud
SIM7600/BG95 default line rate.
Definition main.c:71
@ k_modem_dec_base
Radix for integer-to-ASCII.
Definition main.c:74
@ k_modem_console_baud
J-Link OB VCOM console line rate.
Definition main.c:72
@ k_modem_uart_channel
SCI7.
Definition main.c:76
static bool modem_step_passed(bool is_cme_probe, ra8_err_t err)
Did an AT step return the outcome the app expected?
Definition main.c:226
modem_cgatt_t
CGATT PS-attach flag values.
Definition main.c:109
@ k_modem_cgatt_attached
Attached to the PS domain.
Definition main.c:111
@ k_modem_cgatt_detached
Not attached to the PS domain.
Definition main.c:110
static void modem_on_creg_urc(const char *line, void *ctx)
URC handler for unsolicited + solicited +CREG lines.
Definition main.c:511
static ra8_err_t modem_cmd_ok(const char *cmd)
Send an AT command and require a bare OK.
Definition main.c:682
static uint32_t modem_u32_to_dec(uint32_t value, uint8_t *out)
Convert an unsigned 32-bit int into a decimal ASCII string.
Definition main.c:410
static void modem_setup_or_halt(void)
Bring CGC + console (SCI8) + modem UART (SCI7) + LEDs up.
Definition main.c:607
static bool modem_creg_registered(uint32_t stat)
Is the modem registered on a network (home or roaming)?
Definition main.c:170
static bool modem_phase_signal(uint32_t *out_rssi)
Signal phase: query AT+CSQ and parse + print the RSSI.
Definition main.c:795
static ra8_err_t modem_rx_byte(void *ctx, uint8_t *out_byte)
Definition main.c:481
static bool modem_parse_last_uint(const char *line, uint32_t *out)
Parse the LAST unsigned integer anywhere in an AT reply line.
Definition main.c:331
static void modem_emit_kv(const uint8_t *label, uint32_t label_len, uint32_t value)
Emit a labelled unsigned integer: <label><value>.
Definition main.c:462
static void modem_clocks_or_halt(uint32_t *out_pclka_hz)
Bring CGC + SysTick + MSTP up; publish PCLKA via out_pclka_hz.
Definition main.c:555
static bool modem_phase_attach(void)
Attach phase: query AT+CGATT? and parse + print the flag.
Definition main.c:846
static void modem_pfs_or_halt(void)
Route the MikroBUS UART pins (TXD7 / RXD7) via PFS.
Definition main.c:584
static ra8_err_t modem_query(const char *cmd, char *buf, size_t cap)
Send an AT query and capture its response payload.
Definition main.c:702
static void modem_tx(const uint8_t *bytes, uint32_t len)
Emit a byte run on the J-Link OB VCOM console (SCI8).
Definition main.c:443
static const uint8_t k_modem_str_pass[]
Definition main.c:146
static const uint8_t k_modem_str_fail[]
Definition main.c:147
static bool modem_phase_registration(void)
Registration phase: enable +CREG URCs, poll one, then query.
Definition main.c:820
static ra8_err_t modem_bind(uint8_t *line_buf, uint16_t line_buf_len)
Bind ra8_modem_at to the SCI7 transport + register the URC handler.
Definition main.c:651
static const uint8_t k_modem_banner_prefix[]
Definition main.c:140
modem_creg_stat_t
+CREG registration-status codes (3GPP 27.007).
Definition main.c:99
@ k_modem_creg_home
Registered, home network.
Definition main.c:101
@ k_modem_creg_roaming
Registered, roaming.
Definition main.c:105
@ k_modem_creg_denied
Registration denied.
Definition main.c:103
@ k_modem_creg_unknown
Unknown (e.g.
Definition main.c:104
@ k_modem_creg_searching
Not registered, searching.
Definition main.c:102
@ k_modem_creg_not_registered
Not registered, not searching.
Definition main.c:100
modem_cap_t
Small fixed buffer capacities.
Definition main.c:85
@ k_modem_capture_cap
Capture buffer for one response payload.
Definition main.c:87
@ k_modem_scan_max
Static bound for every line-scan loop.
Definition main.c:88
@ k_modem_dec_cap
Digits for a uint32_t decimal (+ slack).
Definition main.c:86
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
@ k_ra8_board_mikrobus_uart_sci_channel
P808/P809 -> RXD7/TXD7 = SCI7 (SW4-4 ON).
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_mikrobus_rx
J22.3 RX – UART RX (RXD7, SW4-4 ON).
@ k_ra8_board_mikrobus_tx
J22.4 TX – UART TX (TXD7, SW4-4 ON).
@ 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
@ k_ra8_clock_id_pclka
PCLKA.
Definition ra8_cgc.h:73
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
@ k_ra8_err_hw_error
Generic hardware fault detected (error flag set, fault interrupt).
Definition ra8_err.h:310
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
PSEL codes for peripheral pin routing on the RA8D2.
@ k_ra8_psel_sci_async
00100b: SCI async serial (UART).
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Cellular modem AT command/response driver layered on UART.
ra8_err_t ra8_modem_at_poll(void)
Pump the RX path without sending a command.
ra8_err_t ra8_modem_at_send_cmd_capture(const char *cmd, char *out_buf, size_t buf_len, uint16_t timeout_ms)
Send an AT command and capture the response payload.
ra8_err_t ra8_modem_at_register_unsolicited_handler(const char *prefix, ra8_modem_at_urc_fn_t fn, void *ctx)
Register a URC (unsolicited result code) handler.
ra8_err_t ra8_modem_at_send_cmd(const char *cmd, const char *expected_response, uint16_t timeout_ms)
Send an AT command and wait for OK/ERROR/expected.
ra8_err_t ra8_modem_at_init(const ra8_modem_at_cfg_t *cfg)
Bind transport, buffer and timeout policy.
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
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_pfs_route_peripheral(ra8_port_pin_t pin, ra8_psel_t psel, const char *owner)
Route a pin to a non-IRQ peripheral function via PFS.PSEL.
Definition gpio.c:238
Full-featured Serial Communications Interface driver.
@ k_ra8_sci_stop_1
RA8 SCI stop 1.
Definition ra8_sci.h:81
@ k_ra8_sci_parity_none
RA8 SCI parity none.
Definition ra8_sci.h:71
ra8_err_t ra8_sci_init(uint8_t channel, const ra8_sci_cfg_t *cfg)
Initialise an SCI channel using the descriptor.
Definition ra8_sci.c:410
ra8_err_t ra8_sci_getc_polling(uint8_t channel, uint8_t *out_byte)
Poll-receive one byte (blocking, bounded spin).
Definition ra8_sci.c:496
@ k_ra8_sci_data_8
RA8 SCI data 8.
Definition ra8_sci.h:91
ra8_err_t ra8_sci_putc_polling(uint8_t channel, uint8_t byte)
Poll-send one byte (blocking, bounded by ra8_hw_err spin budget).
Definition ra8_sci.c:476
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
uint32_t ra8_now_ms(void)
Short-form alias for ra8_time_ms().
Definition timer.c:19
Configuration handed to ra8_modem_at_init.
Configuration descriptor for ra8_sci_init.
Definition ra8_sci.h:103