summaryrefslogtreecommitdiff
path: root/firmware/s1224/include
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/s1224/include')
-rw-r--r--firmware/s1224/include/afsk_profile.h35
-rw-r--r--firmware/s1224/include/afsk_soft.h32
-rw-r--r--firmware/s1224/include/banner.h12
-rw-r--r--firmware/s1224/include/baud_config.h10
-rw-r--r--firmware/s1224/include/board_pins.h39
-rw-r--r--firmware/s1224/include/config.h58
-rw-r--r--firmware/s1224/include/crystal_steer.h10
-rw-r--r--firmware/s1224/include/display.h17
-rw-r--r--firmware/s1224/include/hdlc.h49
-rw-r--r--firmware/s1224/include/kiss.h34
-rw-r--r--firmware/s1224/include/modem_probe.h14
-rw-r--r--firmware/s1224/include/ptt.h10
-rw-r--r--firmware/s1224/include/sense.h19
-rw-r--r--firmware/s1224/include/status.h23
-rw-r--r--firmware/s1224/include/usb_cmd.h11
-rw-r--r--firmware/s1224/include/version.h9
16 files changed, 382 insertions, 0 deletions
diff --git a/firmware/s1224/include/afsk_profile.h b/firmware/s1224/include/afsk_profile.h
new file mode 100644
index 0000000..da0fc29
--- /dev/null
+++ b/firmware/s1224/include/afsk_profile.h
@@ -0,0 +1,35 @@
+/**
+ * Mark/space tone pairs per build (Hz) — see product README.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef S1224_AFSK_PROFILE_H
+#define S1224_AFSK_PROFILE_H
+
+#include <stdint.h>
+
+#ifndef S1224_BITRATE
+#define S1224_BITRATE 1200
+#endif
+
+typedef struct {
+ uint32_t baud;
+ uint32_t mark_hz;
+ uint32_t space_hz;
+ const char *profile_name;
+} afsk_profile_t;
+
+static inline afsk_profile_t afsk_profile_get(void)
+{
+#if S1224_BITRATE == 300
+ return (afsk_profile_t){300, 1600, 1800, "HF-300 (1600/1800)"};
+#elif S1224_BITRATE == 1200
+ return (afsk_profile_t){1200, 1200, 2200, "Bell202-1200"};
+#elif S1224_BITRATE == 2400
+ /* c1224 Y2 / 6.5536 MHz field overclock class — NOT Dire Wolf 2400 */
+ return (afsk_profile_t){2400, 1775, 3250, "Y2-class-2400"};
+#else
+#error "S1224_BITRATE must be 300, 1200, or 2400"
+#endif
+}
+
+#endif /* S1224_AFSK_PROFILE_H */
diff --git a/firmware/s1224/include/afsk_soft.h b/firmware/s1224/include/afsk_soft.h
new file mode 100644
index 0000000..5a23141
--- /dev/null
+++ b/firmware/s1224/include/afsk_soft.h
@@ -0,0 +1,32 @@
+/**
+ * Softmodem AFSK — PWM/DDS TX + Goertzel RX (ADC when wired).
+ * Profile tones selected at compile time via S1224_BITRATE=300|1200|2400.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef S1224_AFSK_SOFT_H
+#define S1224_AFSK_SOFT_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifndef S1224_BITRATE
+#define S1224_BITRATE 1200
+#endif
+
+void afsk_soft_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);
+
+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);
+
+/** Carrier/energy sense for UI (softmodem — not chip CDT). */
+bool afsk_rx_carrier_active(void);
+
+#endif /* S1224_AFSK_SOFT_H */
diff --git a/firmware/s1224/include/banner.h b/firmware/s1224/include/banner.h
new file mode 100644
index 0000000..d9bc1a2
--- /dev/null
+++ b/firmware/s1224/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 S1224_BANNER_H
+#define S1224_BANNER_H
+
+/** Print fixed boot banner (call once after CDC ready). */
+void banner_print(void);
+
+#endif /* S1224_BANNER_H */
diff --git a/firmware/s1224/include/baud_config.h b/firmware/s1224/include/baud_config.h
new file mode 100644
index 0000000..28e07ee
--- /dev/null
+++ b/firmware/s1224/include/baud_config.h
@@ -0,0 +1,10 @@
+#ifndef S1224_BAUD_CONFIG_H
+#define S1224_BAUD_CONFIG_H
+
+typedef struct {
+ const char *label;
+} baud_profile_config_t;
+
+const baud_profile_config_t *baud_config_get(void);
+
+#endif
diff --git a/firmware/s1224/include/board_pins.h b/firmware/s1224/include/board_pins.h
new file mode 100644
index 0000000..0fb1a21
--- /dev/null
+++ b/firmware/s1224/include/board_pins.h
@@ -0,0 +1,39 @@
+/**
+ * T-Modem-s1224 pin map — softmodem service Pico (same PCB base as c1224).
+ * No TCM3105: PWM AF out bypasses chip socket (prototype jumper to AF path).
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef S1224_BOARD_PINS_H
+#define S1224_BOARD_PINS_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#define S1224_HAS_CHIP_MODEM 0
+
+/* I2C LCD (shared-kit class; level-shifted on board) */
+#define PIN_I2C_SDA 0
+#define PIN_I2C_SCL 1
+#define I2C_LCD_BAUDRATE 100000
+#define I2C_LCD_ADDR_DEFAULT 0x27
+
+/* GP6 · PCB net AF_TX · PWM AFSK out */
+#define PIN_AF_TX 6
+
+/* GP26 · PCB net AF_RX when routed · ADC channel 0 */
+#define PIN_AF_RX_ADC 26
+
+/* GP7/GP8 · NC on s1224 PCB · optional FW sense if wired */
+#define PIN_GP7_SENSE 7
+#define PIN_MODEM_RXD PIN_GP7_SENSE /* alias · was chip RXD name */
+#define PIN_MODEM_CDT 8 /* unused · NC on board */
+
+#define PIN_PTT_DRV 9 /* GP9 · PTT keying */
+
+#define PIN_LED_PTT 10
+#define PIN_LED_DCD 11
+#define PIN_LED_TXRX 12
+
+void board_pins_init(void);
+
+#endif /* S1224_BOARD_PINS_H */
diff --git a/firmware/s1224/include/config.h b/firmware/s1224/include/config.h
new file mode 100644
index 0000000..9792aed
--- /dev/null
+++ b/firmware/s1224/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 S1224_CONFIG_H
+#define S1224_CONFIG_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+
+#define S1224_TEXT_MAX 48
+
+typedef struct {
+ char starting[S1224_TEXT_MAX];
+ char ready[S1224_TEXT_MAX];
+ char fault[S1224_TEXT_MAX];
+ char sending[S1224_TEXT_MAX];
+ char signal[S1224_TEXT_MAX];
+ char packet[S1224_TEXT_MAX];
+ char power[S1224_TEXT_MAX];
+ char idle[S1224_TEXT_MAX];
+ /* Terminal-facing identity (CDC ID) */
+ char callsign[S1224_TEXT_MAX];
+ char device_id[S1224_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;
+} s1224_config_t;
+
+void config_init(void);
+const s1224_config_t *config_get(void);
+s1224_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/s1224/include/crystal_steer.h b/firmware/s1224/include/crystal_steer.h
new file mode 100644
index 0000000..43f0dd7
--- /dev/null
+++ b/firmware/s1224/include/crystal_steer.h
@@ -0,0 +1,10 @@
+#ifndef S1224_CRYSTAL_STEER_H
+#define S1224_CRYSTAL_STEER_H
+
+#include <stdbool.h>
+
+/** Softmodem — no-op (rate = compile-time S1224_BITRATE). */
+void crystal_steer_apply(void);
+bool crystal_steer_applied(void);
+
+#endif
diff --git a/firmware/s1224/include/display.h b/firmware/s1224/include/display.h
new file mode 100644
index 0000000..67b32ce
--- /dev/null
+++ b/firmware/s1224/include/display.h
@@ -0,0 +1,17 @@
+#ifndef S1224_DISPLAY_H
+#define S1224_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/s1224/include/hdlc.h b/firmware/s1224/include/hdlc.h
new file mode 100644
index 0000000..9b4cb22
--- /dev/null
+++ b/firmware/s1224/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 S1224_HDLC_H
+#define S1224_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 /* S1224_HDLC_H */
diff --git a/firmware/s1224/include/kiss.h b/firmware/s1224/include/kiss.h
new file mode 100644
index 0000000..66a890b
--- /dev/null
+++ b/firmware/s1224/include/kiss.h
@@ -0,0 +1,34 @@
+/**
+ * KISS frame encode/decode (FEND 0xC0).
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#ifndef S1224_KISS_H
+#define S1224_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 /* S1224_KISS_H */
diff --git a/firmware/s1224/include/modem_probe.h b/firmware/s1224/include/modem_probe.h
new file mode 100644
index 0000000..7e63904
--- /dev/null
+++ b/firmware/s1224/include/modem_probe.h
@@ -0,0 +1,14 @@
+#ifndef S1224_MODEM_PROBE_H
+#define S1224_MODEM_PROBE_H
+
+#include <stdbool.h>
+
+typedef struct {
+ bool softmodem_ok;
+ bool af_tx_pwm;
+ bool ready;
+} modem_probe_result_t;
+
+modem_probe_result_t modem_probe_run(void);
+
+#endif
diff --git a/firmware/s1224/include/ptt.h b/firmware/s1224/include/ptt.h
new file mode 100644
index 0000000..501c558
--- /dev/null
+++ b/firmware/s1224/include/ptt.h
@@ -0,0 +1,10 @@
+#ifndef S1224_PTT_H
+#define S1224_PTT_H
+
+#include <stdbool.h>
+
+void ptt_init(void);
+void ptt_set(bool on);
+bool ptt_get(void);
+
+#endif
diff --git a/firmware/s1224/include/sense.h b/firmware/s1224/include/sense.h
new file mode 100644
index 0000000..50933f3
--- /dev/null
+++ b/firmware/s1224/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 S1224_SENSE_H
+#define S1224_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/s1224/include/status.h b/firmware/s1224/include/status.h
new file mode 100644
index 0000000..3c62390
--- /dev/null
+++ b/firmware/s1224/include/status.h
@@ -0,0 +1,23 @@
+#ifndef S1224_STATUS_H
+#define S1224_STATUS_H
+
+#include <stdbool.h>
+
+typedef enum {
+ S1224_STATE_STARTING = 0,
+ S1224_STATE_READY,
+ S1224_STATE_FAULT,
+ S1224_STATE_SENDING,
+ S1224_STATE_SIGNAL, /* CDT active (Signal/RX) */
+ S1224_STATE_PACKET /* RXD packet sense (may coexist with signal) */
+} s1224_state_t;
+
+/** Operator-facing text for state (from INI). */
+const char *s1224_state_string(s1224_state_t st);
+void status_set(s1224_state_t st);
+s1224_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/s1224/include/usb_cmd.h b/firmware/s1224/include/usb_cmd.h
new file mode 100644
index 0000000..8f0ded6
--- /dev/null
+++ b/firmware/s1224/include/usb_cmd.h
@@ -0,0 +1,11 @@
+#ifndef S1224_USB_CMD_H
+#define S1224_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/s1224/include/version.h b/firmware/s1224/include/version.h
new file mode 100644
index 0000000..d1a288f
--- /dev/null
+++ b/firmware/s1224/include/version.h
@@ -0,0 +1,9 @@
+#ifndef S1224_VERSION_H
+#define S1224_VERSION_H
+/**
+ * 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
+ */
+#define S1224_FW_VERSION "1.0-prototype"
+#endif
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com