summaryrefslogtreecommitdiff
path: root/firmware/c1224/include
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/c1224/include')
-rw-r--r--firmware/c1224/include/afsk_bitbang.h30
-rw-r--r--firmware/c1224/include/banner.h12
-rw-r--r--firmware/c1224/include/baud_config.h14
-rw-r--r--firmware/c1224/include/board_pins.h52
-rw-r--r--firmware/c1224/include/config.h58
-rw-r--r--firmware/c1224/include/crystal_steer.h10
-rw-r--r--firmware/c1224/include/display.h17
-rw-r--r--firmware/c1224/include/hdlc.h49
-rw-r--r--firmware/c1224/include/kiss.h34
-rw-r--r--firmware/c1224/include/modem_probe.h15
-rw-r--r--firmware/c1224/include/ptt.h10
-rw-r--r--firmware/c1224/include/sense.h19
-rw-r--r--firmware/c1224/include/status.h23
-rw-r--r--firmware/c1224/include/usb_cmd.h11
-rw-r--r--firmware/c1224/include/version.h11
15 files changed, 365 insertions, 0 deletions
diff --git a/firmware/c1224/include/afsk_bitbang.h b/firmware/c1224/include/afsk_bitbang.h
new file mode 100644
index 0000000..886b912
--- /dev/null
+++ b/firmware/c1224/include/afsk_bitbang.h
@@ -0,0 +1,30 @@
+/**
+ * Bitbang / timed NRZI on TCM3105 TXD (GP6) and RXD (GP7).
+ * Rate matches stuffed crystal — compile C1224_BITRATE=1200|2400.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_AFSK_BITBANG_H
+#define C1224_AFSK_BITBANG_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifndef C1224_BITRATE
+#define C1224_BITRATE 1200
+#endif
+
+void afsk_bitbang_init(void);
+
+/** Transmit HDLC info payload (AX.25 frame without flags/FCS). Auto-PTT. */
+bool afsk_tx_frame(const uint8_t *info, size_t info_len);
+
+/** Poll RX sampler; call often from main loop. May emit via callback. */
+typedef void (*afsk_rx_frame_fn)(const uint8_t *info, size_t len);
+void afsk_rx_set_callback(afsk_rx_frame_fn fn);
+void afsk_rx_poll(void);
+
+bool afsk_tx_busy(void);
+unsigned afsk_bitrate(void);
+
+#endif /* C1224_AFSK_BITBANG_H */
diff --git a/firmware/c1224/include/banner.h b/firmware/c1224/include/banner.h
new file mode 100644
index 0000000..1592eb7
--- /dev/null
+++ b/firmware/c1224/include/banner.h
@@ -0,0 +1,12 @@
+/**
+ * Fixed CDC boot banner — source text only (not INI / CDC keys).
+ * Always printed once after USB ready; quiet does not suppress it.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_BANNER_H
+#define C1224_BANNER_H
+
+/** Print fixed boot banner (call once after CDC ready). */
+void banner_print(void);
+
+#endif /* C1224_BANNER_H */
diff --git a/firmware/c1224/include/baud_config.h b/firmware/c1224/include/baud_config.h
new file mode 100644
index 0000000..268ca15
--- /dev/null
+++ b/firmware/c1224/include/baud_config.h
@@ -0,0 +1,14 @@
+#ifndef C1224_BAUD_CONFIG_H
+#define C1224_BAUD_CONFIG_H
+
+/**
+ * Informational only — physical rate = stuffed crystal (Y1/Y2).
+ * One FW image; no baud switch; no dual UF2.
+ */
+typedef struct {
+ const char *label; /* "crystal" — rate is board stuffing */
+} baud_crystal_config_t;
+
+const baud_crystal_config_t *baud_config_get(void);
+
+#endif
diff --git a/firmware/c1224/include/board_pins.h b/firmware/c1224/include/board_pins.h
new file mode 100644
index 0000000..1422335
--- /dev/null
+++ b/firmware/c1224/include/board_pins.h
@@ -0,0 +1,52 @@
+/**
+ * T-Modem-c1224 pin map (service Pico — not softmodem).
+ * Frozen copper intent (v0.25 schematic) reused as planning default for 180×180.
+ * GP14/GP15 = unused mux placeholders for v1.0 (single-XTAL; stuff matches image).
+ */
+#ifndef C1224_BOARD_PINS_H
+#define C1224_BOARD_PINS_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/* I2C LCD (shared-kit class; level-shifted on board) */
+#define PIN_I2C_SDA 0 /* GP0 */
+#define PIN_I2C_SCL 1 /* GP1 */
+#define I2C_LCD_BAUDRATE 100000
+#define I2C_LCD_ADDR_DEFAULT 0x27 /* common PCF8574 backpack; probe may fail → log-only */
+
+/* Modem chip digital (TCM3105-class) — Pico does NOT generate AFSK */
+#define PIN_MODEM_TXD 6 /* GP6 → chip TXD */
+#define PIN_MODEM_RXD 7 /* GP7 ← chip RXD → Packet UI sense (required · status only) */
+#define PIN_MODEM_CDT 8 /* GP8 ← chip CDT → Signal/RX (required) */
+
+/* PTT keying: Pico GPIO → OC → radio PTT (USB CDC service). Not the TX LED. */
+#define PIN_PTT_DRV 9 /* GP9 · required for USB PTT ON */
+
+/*
+ * Status LEDs (c1224 copper — active-high source via series R; LED cathode = GND).
+ * LED_PWR is NOT a GPIO: +5V_OR → R_LED1 → LED_PWR → GND (rail Power indicator).
+ *
+ * Settled UI (2026-07-26):
+ * - Dual sense REQUIRED: CDT→GP8 Signal/RX · RXD→GP7 Packet (status only, not data bridge).
+ * - CDT = carrier/tone · RXD activity ≠ full AX.25 decode.
+ * - LED_PTT (GP10) = OPTIONAL/SPARE — not required product TX indicator.
+ * - Display TX optional; PTT keying GPIO (GP9) stays separate from LED_PTT.
+ * - LED_TXRX = spare/activity.
+ */
+#define PIN_LED_PTT 10 /* GP10 · LED_PTT_N · optional/spare (not required TX LED) */
+#define PIN_LED_DCD 11 /* GP11 · LED_DCD_N · optional RX mirror of CDT */
+#define PIN_LED_TXRX 12 /* GP12 · LED_TXRX_N · spare / optional activity */
+
+/*
+ * Crystal mux placeholders — UNUSED for v1.0.
+ * Product: one crystal stuffed matching flash (Y1 4.4336 / Y2 6.5536).
+ * Dual/mux path abandoned; crystal_steer is a no-op.
+ * Optional keep defines if mux ever returns later.
+ */
+#define PIN_XTAL_SEL_A 14 /* GP14 — unused v1.0 */
+#define PIN_XTAL_SEL_B 15 /* GP15 — unused v1.0 */
+
+void board_pins_init(void);
+
+#endif /* C1224_BOARD_PINS_H */
diff --git a/firmware/c1224/include/config.h b/firmware/c1224/include/config.h
new file mode 100644
index 0000000..07b1093
--- /dev/null
+++ b/firmware/c1224/include/config.h
@@ -0,0 +1,58 @@
+/**
+ * Operator INI texts + sense tuning — defaults in FW, overlay from flash.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_CONFIG_H
+#define C1224_CONFIG_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+
+#define C1224_TEXT_MAX 48
+
+typedef struct {
+ char starting[C1224_TEXT_MAX];
+ char ready[C1224_TEXT_MAX];
+ char fault[C1224_TEXT_MAX];
+ char sending[C1224_TEXT_MAX];
+ char signal[C1224_TEXT_MAX];
+ char packet[C1224_TEXT_MAX];
+ char power[C1224_TEXT_MAX];
+ char idle[C1224_TEXT_MAX];
+ /* Terminal-facing identity (CDC ID) */
+ char callsign[C1224_TEXT_MAX];
+ char device_id[C1224_TEXT_MAX];
+ /* Extra CDC ASCII — quiet=1 default; never suppresses fixed boot banner */
+ bool quiet; /* true = no unsolicited STATUS/PROBE/CONFIG ASCII */
+ /* Sense tuning */
+ bool cdt_active_high; /* false = active-low (default pull-up idle) */
+ uint16_t packet_hold_ms;
+ uint16_t packet_edge_min;
+ uint16_t packet_window_ms;
+} c1224_config_t;
+
+void config_init(void);
+const c1224_config_t *config_get(void);
+c1224_config_t *config_mutable(void);
+/** True when extra unsolicited CDC ASCII (STATUS/PROBE/CONFIG) is allowed. */
+bool config_unsolicited_ok(void);
+
+/** Apply defaults (RAM only). */
+void config_load_defaults(void);
+/** Load overlay from flash INI region if valid. */
+bool config_load_flash(void);
+/** Persist current config as INI text to flash. */
+bool config_save_flash(void);
+/** Erase flash overlay (next boot = defaults only until SAVE). */
+bool config_erase_flash(void);
+
+/** SET KEY=value (case-insensitive key). Returns false if unknown key. */
+bool config_set_kv(const char *key, const char *value);
+/** GET KEY → copy value into buf. */
+bool config_get_kv(const char *key, char *buf, size_t buflen);
+
+/** Dump INI-like text to USB (printf). */
+void config_dump_ini(void);
+
+#endif
diff --git a/firmware/c1224/include/crystal_steer.h b/firmware/c1224/include/crystal_steer.h
new file mode 100644
index 0000000..9aa55f9
--- /dev/null
+++ b/firmware/c1224/include/crystal_steer.h
@@ -0,0 +1,10 @@
+#ifndef C1224_CRYSTAL_STEER_H
+#define C1224_CRYSTAL_STEER_H
+
+#include <stdbool.h>
+
+/** v1.0 no-op — rate = stuffed crystal; no XTAL mux. */
+void crystal_steer_apply(void);
+bool crystal_steer_applied(void);
+
+#endif
diff --git a/firmware/c1224/include/display.h b/firmware/c1224/include/display.h
new file mode 100644
index 0000000..1cd78f1
--- /dev/null
+++ b/firmware/c1224/include/display.h
@@ -0,0 +1,17 @@
+#ifndef C1224_DISPLAY_H
+#define C1224_DISPLAY_H
+
+#include <stdbool.h>
+
+/**
+ * I2C HD44780 via PCF8574 backpack (0x27/0x3F). USB always logs.
+ * Shows Power/ready, Signal, Packet from INI texts.
+ */
+void display_init(void);
+bool display_present(void);
+/** Refresh LCD from current status + sense (uses INI texts). */
+void display_update(void);
+/** Legacy single-line push (also used before full UI ready). */
+void display_show(const char *line);
+
+#endif
diff --git a/firmware/c1224/include/hdlc.h b/firmware/c1224/include/hdlc.h
new file mode 100644
index 0000000..1d64278
--- /dev/null
+++ b/firmware/c1224/include/hdlc.h
@@ -0,0 +1,49 @@
+/**
+ * HDLC frame helpers — flags, bit-stuff, FCS-CCITT (AX.25).
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_HDLC_H
+#define C1224_HDLC_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#define HDLC_FLAG 0x7Eu
+#define HDLC_FCS_INIT 0xFFFFu
+#define HDLC_FCS_GOOD 0xF0B8u
+#define HDLC_MAX_INFO 512
+
+uint16_t hdlc_fcs_update(uint16_t fcs, uint8_t byte);
+uint16_t hdlc_fcs_final(uint16_t fcs);
+
+/**
+ * Build on-wire bit stream (NRZI already applied by caller after this):
+ * FLAG + stuffed(info + FCS_lo + FCS_hi) + FLAG(+optional trailing flags).
+ * Returns bit count written to bits[] (MSB-first within each stuffed byte stream
+ * is not used — output is a raw bit array, LSB-first per AX.25 bit order).
+ *
+ * bits_cap is capacity in bits. Returns 0 on overflow / bad args.
+ */
+size_t hdlc_encode_bits(const uint8_t *info, size_t info_len,
+ uint8_t *bits, size_t bits_cap,
+ unsigned trailing_flags);
+
+/**
+ * Feed one NRZ bit (after NRZI decode). Returns true when a complete good
+ * frame is available in out[] (info only, FCS stripped).
+ */
+typedef struct {
+ uint8_t buf[HDLC_MAX_INFO + 2];
+ size_t len;
+ uint8_t ones;
+ bool in_frame;
+ bool stuffing;
+ uint8_t byte_acc;
+ uint8_t bit_count;
+} hdlc_rx_t;
+
+void hdlc_rx_init(hdlc_rx_t *rx);
+bool hdlc_rx_bit(hdlc_rx_t *rx, bool bit, uint8_t *out, size_t *out_len);
+
+#endif /* C1224_HDLC_H */
diff --git a/firmware/c1224/include/kiss.h b/firmware/c1224/include/kiss.h
new file mode 100644
index 0000000..0312bb4
--- /dev/null
+++ b/firmware/c1224/include/kiss.h
@@ -0,0 +1,34 @@
+/**
+ * KISS frame encode/decode (FEND 0xC0).
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_KISS_H
+#define C1224_KISS_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#define KISS_FEND 0xC0u
+#define KISS_FESC 0xDBu
+#define KISS_TFEND 0xDCu
+#define KISS_TFESC 0xDDu
+#define KISS_CMD_DATA 0x00u
+#define KISS_MAX_PAYLOAD 512
+
+typedef struct {
+ uint8_t buf[KISS_MAX_PAYLOAD + 4];
+ size_t len;
+ bool in_frame;
+ bool esc;
+} kiss_rx_t;
+
+void kiss_rx_init(kiss_rx_t *kx);
+/** Feed one byte. Returns true when a DATA payload is ready in out. */
+bool kiss_rx_byte(kiss_rx_t *kx, uint8_t b, uint8_t *out, size_t *out_len);
+
+/** Write KISS DATA frame to dst; returns bytes written (0 on overflow). */
+size_t kiss_encode_data(const uint8_t *payload, size_t len,
+ uint8_t *dst, size_t dst_cap);
+
+#endif /* C1224_KISS_H */
diff --git a/firmware/c1224/include/modem_probe.h b/firmware/c1224/include/modem_probe.h
new file mode 100644
index 0000000..402e485
--- /dev/null
+++ b/firmware/c1224/include/modem_probe.h
@@ -0,0 +1,15 @@
+#ifndef C1224_MODEM_PROBE_H
+#define C1224_MODEM_PROBE_H
+
+#include <stdbool.h>
+
+typedef struct {
+ bool crystal_driven;
+ bool cdt_readable;
+ bool rxd_readable;
+ bool ready;
+} modem_probe_result_t;
+
+modem_probe_result_t modem_probe_run(void);
+
+#endif
diff --git a/firmware/c1224/include/ptt.h b/firmware/c1224/include/ptt.h
new file mode 100644
index 0000000..ca5e7d8
--- /dev/null
+++ b/firmware/c1224/include/ptt.h
@@ -0,0 +1,10 @@
+#ifndef C1224_PTT_H
+#define C1224_PTT_H
+
+#include <stdbool.h>
+
+void ptt_init(void);
+void ptt_set(bool on);
+bool ptt_get(void);
+
+#endif
diff --git a/firmware/c1224/include/sense.h b/firmware/c1224/include/sense.h
new file mode 100644
index 0000000..25009e8
--- /dev/null
+++ b/firmware/c1224/include/sense.h
@@ -0,0 +1,19 @@
+/**
+ * Dual sense: CDT→Signal/RX, RXD→Packet (HDLC 0x7E / edge activity).
+ * Status only — not a Host↔Chip data bridge.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_SENSE_H
+#define C1224_SENSE_H
+
+#include <stdbool.h>
+
+void sense_init(void);
+/** Poll GPIO / heuristics; call from main loop (~10 ms). */
+void sense_poll(void);
+
+bool sense_signal_active(void); /* CDT carrier/tone */
+bool sense_packet_active(void); /* RXD activity or flag seen (held) */
+bool sense_packet_flag(void); /* last window saw 0x7E */
+
+#endif
diff --git a/firmware/c1224/include/status.h b/firmware/c1224/include/status.h
new file mode 100644
index 0000000..fefe6e8
--- /dev/null
+++ b/firmware/c1224/include/status.h
@@ -0,0 +1,23 @@
+#ifndef C1224_STATUS_H
+#define C1224_STATUS_H
+
+#include <stdbool.h>
+
+typedef enum {
+ C1224_STATE_STARTING = 0,
+ C1224_STATE_READY,
+ C1224_STATE_FAULT,
+ C1224_STATE_SENDING,
+ C1224_STATE_SIGNAL, /* CDT active (Signal/RX) */
+ C1224_STATE_PACKET /* RXD packet sense (may coexist with signal) */
+} c1224_state_t;
+
+/** Operator-facing text for state (from INI). */
+const char *c1224_state_string(c1224_state_t st);
+void status_set(c1224_state_t st);
+c1224_state_t status_get(void);
+/** Recompute composite state from PTT + sense; publish if changed. */
+void status_tick(void);
+void status_publish(void);
+
+#endif
diff --git a/firmware/c1224/include/usb_cmd.h b/firmware/c1224/include/usb_cmd.h
new file mode 100644
index 0000000..e0fb513
--- /dev/null
+++ b/firmware/c1224/include/usb_cmd.h
@@ -0,0 +1,11 @@
+#ifndef C1224_USB_CMD_H
+#define C1224_USB_CMD_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+void usb_cmd_init(void);
+void usb_cmd_poll(void);
+void usb_cmd_on_rx_frame(const uint8_t *info, size_t len);
+
+#endif
diff --git a/firmware/c1224/include/version.h b/firmware/c1224/include/version.h
new file mode 100644
index 0000000..a2c81ad
--- /dev/null
+++ b/firmware/c1224/include/version.h
@@ -0,0 +1,11 @@
+/**
+ * Firmware version SSoT — bump here; banner and docs follow.
+ * Matches product tag style without leading 'v' (tag: v1.0-prototype).
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef C1224_VERSION_H
+#define C1224_VERSION_H
+
+#define C1224_FW_VERSION "1.0-prototype"
+
+#endif /* C1224_VERSION_H */
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com