diff options
Diffstat (limited to 'firmware/s1224/include')
| -rw-r--r-- | firmware/s1224/include/afsk_profile.h | 35 | ||||
| -rw-r--r-- | firmware/s1224/include/afsk_soft.h | 32 | ||||
| -rw-r--r-- | firmware/s1224/include/banner.h | 12 | ||||
| -rw-r--r-- | firmware/s1224/include/baud_config.h | 10 | ||||
| -rw-r--r-- | firmware/s1224/include/board_pins.h | 39 | ||||
| -rw-r--r-- | firmware/s1224/include/config.h | 58 | ||||
| -rw-r--r-- | firmware/s1224/include/crystal_steer.h | 10 | ||||
| -rw-r--r-- | firmware/s1224/include/display.h | 17 | ||||
| -rw-r--r-- | firmware/s1224/include/hdlc.h | 49 | ||||
| -rw-r--r-- | firmware/s1224/include/kiss.h | 34 | ||||
| -rw-r--r-- | firmware/s1224/include/modem_probe.h | 14 | ||||
| -rw-r--r-- | firmware/s1224/include/ptt.h | 10 | ||||
| -rw-r--r-- | firmware/s1224/include/sense.h | 19 | ||||
| -rw-r--r-- | firmware/s1224/include/status.h | 23 | ||||
| -rw-r--r-- | firmware/s1224/include/usb_cmd.h | 11 | ||||
| -rw-r--r-- | firmware/s1224/include/version.h | 9 |
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 |
