diff options
| author | info@mode42.com <info@mode42.com> | 2026-08-07 18:15:00 +0000 |
|---|---|---|
| committer | info@mode42.com <info@mode42.com> | 2026-08-07 18:15:00 +0000 |
| commit | d393e0c30192611d4cac65a5429fd7180ce1f49c (patch) | |
| tree | 7e47bd930340c75c4802801a81f3bd17c2469d9f /firmware/c1224/include | |
Initial pushmain
Diffstat (limited to 'firmware/c1224/include')
| -rw-r--r-- | firmware/c1224/include/afsk_bitbang.h | 30 | ||||
| -rw-r--r-- | firmware/c1224/include/banner.h | 12 | ||||
| -rw-r--r-- | firmware/c1224/include/baud_config.h | 14 | ||||
| -rw-r--r-- | firmware/c1224/include/board_pins.h | 52 | ||||
| -rw-r--r-- | firmware/c1224/include/config.h | 58 | ||||
| -rw-r--r-- | firmware/c1224/include/crystal_steer.h | 10 | ||||
| -rw-r--r-- | firmware/c1224/include/display.h | 17 | ||||
| -rw-r--r-- | firmware/c1224/include/hdlc.h | 49 | ||||
| -rw-r--r-- | firmware/c1224/include/kiss.h | 34 | ||||
| -rw-r--r-- | firmware/c1224/include/modem_probe.h | 15 | ||||
| -rw-r--r-- | firmware/c1224/include/ptt.h | 10 | ||||
| -rw-r--r-- | firmware/c1224/include/sense.h | 19 | ||||
| -rw-r--r-- | firmware/c1224/include/status.h | 23 | ||||
| -rw-r--r-- | firmware/c1224/include/usb_cmd.h | 11 | ||||
| -rw-r--r-- | firmware/c1224/include/version.h | 11 |
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 */ |
