From a7f23f24a708b71dfca904f9dc2f71f3b13972f6 Mon Sep 17 00:00:00 2001 From: ua1zbe Date: Sun, 12 Apr 2026 01:15:14 +0300 Subject: [PATCH] Add wiki content pages - Home: overview, quick start, controls - BuildGuide: full build instructions, flags, troubleshooting build - FlashingGuide: UART, SWD, USB flashing methods - POCSAG: decoder implementation details, BCH algorithm, API - Troubleshooting: common issues and solutions - Changelog: v1.0 beta release notes, future plans - _Sidebar: navigation sidebar --- BuildGuide.md | 173 ++++++++++++++++++++++++++++ Changelog.md | 95 ++++++++++++++++ FlashingGuide.md | 215 +++++++++++++++++++++++++++++++++++ Home.md | 63 +++++++++++ POCSAG.md | 256 +++++++++++++++++++++++++++++++++++++++++ Test2.md | 0 TestPage.md | 0 Troubleshooting.md | 275 +++++++++++++++++++++++++++++++++++++++++++++ _Sidebar.md | 13 +++ 9 files changed, 1090 insertions(+) delete mode 100644 Test2.md delete mode 100644 TestPage.md diff --git a/BuildGuide.md b/BuildGuide.md index e69de29..662ee90 100644 --- a/BuildGuide.md +++ b/BuildGuide.md @@ -0,0 +1,173 @@ +# Руководство по сборке + +## Требования + +### Программное обеспечение + +| Компонент | Версия | Установка | +|-----------|--------|-----------| +| **arm-none-eabi-gcc** | 9.2.1+ | `sudo apt-get install gcc-arm-none-eabi` | +| **GNU Make** | 4.0+ | Обычно предустановлен | +| **Python 3** (опционально) | 3.6+ | `sudo apt-get install python3` | +| **crcmod** (опционально) | — | `pip install crcmod` | + +### Проверка тулчейна + +```bash +arm-none-eabi-gcc --version +# Ожидаемый вывод: +# arm-none-eabi-gcc (15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release) +``` + +## Конфигурация сборки + +Все опции задаются в `Makefile` через переменные `ENABLE_*`. + +### Ключевые опции + +```makefile +# Основные функции +ENABLE_FMRADIO ?= 1 # FM-радио приёмник +ENABLE_SPECTRUM ?= 1 # Спектр-анализатор +ENABLE_POCSAG ?= 1 # POCSAG декодер +ENABLE_RSSI_BAR ?= 1 # Индикатор RSSI + +# Оптимизация +ENABLE_LTO ?= 1 # Link Time Optimization (экономия ~10 КБ) +ENABLE_OVERLAY ?= 0 # SRAM overlay (несовместимо с LTO) + +# Отключённые модули (для экономии Flash) +ENABLE_DTMF_CALLING ?= 0 # DTMF вызовы +ENABLE_VOICE ?= 0 # Голосовые подсказки +ENABLE_NOAA ?= 0 # NOAA метеорология +ENABLE_ALARM ?= 0 # Сигнализация +ENABLE_TX1750 ?= 0 # Тон 1750 Гц +ENABLE_FLASHLIGHT ?= 0 # Фонарик +ENABLE_VOX ?= 0 # VOX (голосовая активация) +``` + +### Экономия Flash + +Если прошивка не помещается в 60 КБ, отключите в порядке убывания экономии: + +| Опция | Экономия | Что теряется | +|-------|----------|-------------| +| `ENABLE_SPECTRUM = 0` | ~5 КБ | Спектр-анализатор | +| `ENABLE_POCSAG = 0` | ~4 КБ | POCSAG декодер | +| `ENABLE_FMRADIO = 0` | ~2 КБ | FM-радио | +| `ENABLE_BIG_FREQ = 0` | ~1 КБ | Крупный шрифт частоты | +| `ENABLE_RSSI_BAR = 0` | ~500 Б | Индикатор RSSI | + +## Команды сборки + +### Полная сборка + +```bash +cd uv-k5-ua1zbe-firmware +make clean && make +``` + +### Параллельная сборка (быстрее) + +```bash +make -j4 +``` + +### Только компиляция (без линковки) + +```bash +make -j4 firmware +``` + +### Проверка размера + +```bash +arm-none-eabi-size firmware +# text data bss dec hex filename +# 57708 204 3364 61276 ef5c firmware +``` + +### Проверка переполнения Flash + +```bash +SIZE=$(wc -c < firmware.bin) +if [ $SIZE -gt 61440 ]; then + echo "OVERFLOW! $SIZE > 61440" +else + echo "OK: $SIZE / 61440 bytes" +fi +``` + +## Флаги компилятора + +| Флаг | Описание | +|------|----------| +| `-Os` | Оптимизация по размеру кода | +| `-flto=auto` | Link Time Optimization | +| `-Wall -Wextra -Werror` | Все предупреждения = ошибки | +| `-std=gnu11` | Стандарт C с расширениями GNU | +| `-mcpu=cortex-m0` | Целевой процессор | +| `-fno-builtin` | Не использовать встроенные функции | +| `-fshort-enums` | Минимальный размер enum | +| `--specs=nano.specs` | Newlib-nano (меньше размер) | + +## Дата сборки + +Дата автоматически подставляется из системы: + +```c +#define BUILD_DATE "2026-04-12" +``` + +Используется в заставке при старте (третья строка). + +## Известные проблемы сборки + +### Ошибка: `[[fallthrough]]` not supported + +**Симптом:** +``` +error: expected expression before '[' token + [[fallthrough]]; +``` + +**Решение:** Заменить на `__attribute__((fallthrough))` во всех файлах: +```bash +sed -i 's/\[\[fallthrough\]\]/__attribute__((fallthrough))/g' \ + radio.c audio.c app/menu.c app/dtmf.c app/chFrScanner.c +``` + +### Ошибка: `static_assert` в C99 + +**Симптом:** +``` +error: expected declaration specifiers or '...' before '(' token +``` + +**Решение:** Использовать `-std=gnu11` вместо `-std=c99` (уже исправлено в Makefile). + +## Отладочные команды + +### Просмотр символов в прошивке + +```bash +arm-none-eabi-nm --size-sort firmware | tail -30 +``` + +### Дизассемблер функции + +```bash +arm-none-eabi-objdump -d firmware | grep -A20 ":" +``` + +### Размер каждой секции + +```bash +arm-none-eabi-size -A firmware | sort -n -k2 | tail -20 +``` + +### Количество функций после LTO + +```bash +arm-none-eabi-nm firmware | grep " [Tt] " | wc -l +``` diff --git a/Changelog.md b/Changelog.md index e69de29..59816c2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -0,0 +1,95 @@ +# История изменений + +## v1.0 Beta — 12.04.2026 + +Первая публичная бета-версия. + +### Новое + +- ✅ **VFO режим** — прямой ввод частоты с цифровой клавиатуры +- ✅ **POCSAG декодер** — поддержка 512/1200 бод, BCH(31,21) коррекция до 2 ошибок +- ✅ **Спектр-анализатор** — полноэкранный режим на базе egzumer spectrum +- ✅ **FM Радио** — базовый приём с отображением частоты +- ✅ **RSSI индикатор** — отображение в dBm в верхнем правом углу +- ✅ **Boot Splash** — кастомная заставка: `UA1ZBE` / `POCSAG pager` / дата сборки +- ✅ **Диспетчер режимов** — переключение: VFO ↔ POCSAG ↔ Spectrum ↔ FM +- ✅ **Zero malloc** — все буферы статические, нет динамической памяти + +### Известные ограничения + +| Проблема | Приоритет | Статус | +|----------|-----------|--------| +| POCSAG: недостаточно сэмплов (10мс вместо 125мкс) | 🔴 Критично | 📋 Запланировано | +| Нет отображения текста POCSAG сообщений | 🟡 Средний | 📋 Запланировано | +| Дублирование APP_TimeSlice в mode.c | 🟢 Низкий | 📋 Запланировано | +| Flash на пределе (94.3%) | 🟡 Средний | ℹ️ Принято | + +### Технические детали + +| Параметр | Значение | +|----------|----------| +| Flash | 57,912 / 61,440 байт (94.3%) | +| RAM | 3,568 / 16,384 байт (21.8%) | +| Компилятор | arm-none-eabi-gcc 9.2.1 | +| Оптимизация | -Os -flto=auto | +| Стандарт | -std=gnu11 | +| Предупреждения | -Wall -Wextra -Werror (0 предупреждений) | + +### Архитектура + +``` +main.c → MODE_Init() → MODE_TimeSlice10ms() + ├── MODE_VFO → APP_TimeSlice10ms() + RSSI_Draw() + ├── MODE_POCSAG → POCSAG_FeedSample() + pocsag_draw() + ├── MODE_SPECTRUM → MODE_Switch(MODE_VFO) + └── MODE_FM → FM_Start() +``` + +### Созданные файлы + +| Файл | Описание | Размер | +|------|----------|--------| +| `Makefile` | Конфигурация сборки | 9,838 Б | +| `main.c` | Точка входа | 4,217 Б | +| `syscalls.c` | Заглушка _sbrk | 358 Б | +| `app/boot_splash.c` | Заставка при старте | 1,504 Б | +| `app/display_rssi.c` | RSSI индикатор | 3,601 Б | +| `app/mode.c` | Диспетчер режимов | 7,763 Б | +| `app/pocsag/pocsag.c` | POCSAG декодер | 15,201 Б | +| `app/pocsag/bch31.c` | BCH коррекция | 7,101 Б | +| `DOCUMENTATION.md` | Полная документация | 8,428 Б | + +### Исправленные ошибки сборки + +1. `[[fallthrough]]` → `__attribute__((fallthrough))` +2. `static_assert` C99 → `-std=gnu11` +3. `uint8_t >= 576` → `uint16_t` +4. `dBmCorrTable` undeclared → `extern const int8_t dBmCorrTable[7]` +5. `sizeof` incomplete type → `#include "app/dtmf.h"` +6. 40+ undefined reference → возврат зависимых модулей +7. `_sbrk` undefined → `syscalls.c` + +--- + +## Планы на будущее + +### v1.1 (планируется) + +- [ ] Исправление POCSAG сэмплинга (80 сэмплов × 125мкс) +- [ ] Отображение текста POCSAG сообщений +- [ ] Фиксированная частота POCSAG по умолчанию +- [ ] Звуковой сигнал при новом сообщении + +### v1.2 (планируется) + +- [ ] Разделение APP_TimeSlice (убрать дублирование) +- [ ] Настройка POCSAG частоты через ввод с клавиатуры +- [ ] Журнал принятых POCSAG сообщений +- [ ] Увеличение буфера сообщений до 16 + +### v2.0 (планы) + +- [ ] Переключение VFO/MR режимы +- [ ] Сканирование POCSAG по диапазону частот +- [ ] Экспорт сообщений через UART +- [ ] Оптимизация размера (убрать unused код) diff --git a/FlashingGuide.md b/FlashingGuide.md index e69de29..d9dec89 100644 --- a/FlashingGuide.md +++ b/FlashingGuide.md @@ -0,0 +1,215 @@ +# Руководство по прошивке + +## Предупреждение + +> ⚠️ **Прошивка сторонним ПО аннулирует гарантию.** Неправильная прошивка может вывести устройство из строя. +> Все действия вы выполняете на свой страх и риск. + +## Подготовка + +### Файл прошивки + +Скачайте `firmware.bin` из [Релизов](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases) +или соберите самостоятельно: + +```bash +make clean && make +# firmware.bin будет в корневой директории +``` + +## Способ 1: UART Bootloader (рекомендуется) + +### Оборудование + +| Компонент | Описание | +|-----------|----------| +| UART адаптер | CH340, CP2102, FT232 (3.3V логика!) | +| Провода | 3 шт: TX, RX, GND | +| Паяльник | Для подпайки к контактам на плате (опционально) | + +### Подключение + +``` +UART адаптер UV-K5 (плата) +───────────────────────────────────── +TX ──────────────── RX (контакт U1) +RX ──────────────── TX (контакт U2) +GND ──────────────── GND (контакт U3) + +⚠️ НЕ подключайте VCC — питание от USB или батареи! +``` + +Контакты на плате обычно расположены рядом с процессором и подписаны как `TX`, `RX`, `GND`. + +### Установка k5prog + +```bash +# Вариант A: k5prog (piotr02) +git clone https://github.com/piotr02/k5prog.git +cd k5prog && make +sudo cp k5prog /usr/local/bin/ + +# Вариант B: k5prog (sq5bpf) +git clone https://github.com/sq5bpf/k5prog.git +cd k5prog && make +sudo cp k5prog /usr/local/bin/ +``` + +### Процесс прошивки + +```bash +# 1. Определите порт +ls /dev/ttyUSB* /dev/ttyACM* + +# 2. Переведите рацию в режим bootloader: +# - Выключите рацию +# - Зажмите боковую кнопку SK2 (нижнюю) +# - Включите рацию (не отпуская кнопку) +# - Через 2 секунды отпустите кнопку +# - Индикатор должен мигнуть + +# 3. Прошейте +k5prog -f firmware.bin -p /dev/ttyUSB0 -w + +# Ожидаемый вывод: +# Writing firmware.bin to radio... +# Write complete. +# Verify OK. +``` + +### Если k5prog не видит рацию + +1. Проверьте подключение UART (TX↔RX перекрёстно!) +2. Проверьте права на порт: `sudo chmod 666 /dev/ttyUSB0` +3. Попробуйте другой порт: `ls /dev/ttyUSB*` +4. Перезагрузите рацию и повторите вход в bootloader + +## Способ 2: SWD (J-Link) + +### Оборудование + +| Компонент | Описание | +|-----------|----------| +| J-Link | SEGGER J-Link (V9 или совместимый) | +| Провода | 4 шт: VTref, GND, SWDIO, SWCLK | + +### Подключение + +``` +J-Link UV-K5 (плата) +──────────────────────────────────────── +Pin 1 (VTref) ─── 3.3V +Pin 2 (GND) ─── GND +Pin 7 (SWDIO) ─── SWDIO (контакт рядом с MCU) +Pin 9 (SWCLK) ─── SWCLK (контакт рядом с MCU) +Pin 15 (RESET) ─── RESET (опционально) +``` + +### Установка OpenOCD + +```bash +# Из репозитория +sudo apt-get install openocd + +# Или сборка из исходников (для J-Link): +git clone https://github.com/raspberrypi/openocd.git +cd openocd +./bootstrap +./configure --enable-jlink +make -j4 +sudo make install +``` + +### Прошивка + +```bash +# Автоматически (через Makefile) +make flash + +# Вручную +openocd -f interface/jlink.cfg -f dp32g030.cfg \ + -c "write_image firmware.bin 0; shutdown;" + +# Ожидаемый вывод: +# Open On-Chip Debugger +# Info : J-Link ... +# Info : DP32G030 ... +# wrote ... bytes from firmware.bin +# shutdown command invoked +``` + +## Способ 3: USB (родной кабель) + +### Требования + +- Рация должна поддерживать USB bootloader +- Установлен драйвер (обычно определяется автоматически) + +### Процесс + +```bash +# 1. Переведите рацию в режим USB bootloader: +# - Выключите рацию +# - Зажмите PTT + боковую кнопку SK2 +# - Включите рацию +# - Должна определиться как USB device + +# 2. Проверьте подключение +lsusb | grep -i quansheng + +# 3. Прошейте +k5prog -f firmware.bin -w +``` + +## Проверка прошивки + +После успешной прошивки: + +1. **Выключите** и **включите** рацию +2. Должна появиться **заставка**: + ``` + ┌─────────────────┐ + │ UA1ZBE │ ← крупно + │ POCSAG pager │ ← по центру + │ 2026-04-12 │ ← дата сборки + └─────────────────┘ + ``` +3. Через 2 секунды → переход в **VFO режим** +4. Проверьте RSSI в верхнем правом углу экрана + +## Восстановление (если что-то пошло не так) + +### Симптомы «окирпичивания» + +- Экран не включается +- Экран включается, но нет реакции на кнопки +- Рация не определяется по USB/UART + +### Восстановление через SWD + +SWD — самый надёжный способ, так как работает на уровне процессора: + +```bash +# Полная перепрошивка с очисткой +openocd -f interface/jlink.cfg -f dp32g030.cfg \ + -c "reset init; flash erase_address 0x00000000 0xF000; \ + write_image firmware.bin 0; reset; shutdown;" +``` + +### Восстановление через UART + +1. Отключите батарею +2. Подключите UART +3. Зажмите SK2 +4. Подключите батарею (или USB) +5. Попробуйте прошить снова + +## Частые ошибки + +| Ошибка | Причина | Решение | +|--------|---------|---------| +| `Device not found` | Неверный порт | `ls /dev/ttyUSB*`, проверьте подключение | +| `Write failed` | Рация не в bootloader | Повторите вход (зажать SK2 при включении) | +| `Verify failed` | Повреждённый файл | Пересоберите: `make clean && make` | +| `Flash overflow` | Прошивка > 60 КБ | Отключите модули в Makefile | +| OpenOCD не подключается | Неверные пины SWD | Проверьте подключение J-Link | diff --git a/Home.md b/Home.md index e69de29..74ec28b 100644 --- a/Home.md +++ b/Home.md @@ -0,0 +1,63 @@ +# UA1ZBE Custom Firmware + +Кастомная прошивка для радиостанций **Quansheng UV-K5 / UV-K6 (5)** на базе [egzumer/uv-k5-firmware-custom](https://github.com/egzumer/uv-k5-firmware-custom). + +## Возможности + +| Режим | Описание | +|-------|----------| +| **VFO** | Основной режим — частотомер с прямым вводом с цифровой клавиатуры | +| **POCSAG** | Декодирование пейджинговых сообщений (512/1200 бод, BCH коррекция) | +| **Spectrum** | Полноэкранный спектр-анализатор (RSSI-сканирование) | +| **FM Radio** | Приём FM-радио с отображением частоты | +| **RSSI** | Индикатор уровня сигнала в верхнем правом углу (dBm + S-level) | + +## Быстрый старт + +```bash +# Клонировать репозиторий +git clone https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware.git +cd uv-k5-ua1zbe-firmware + +# Собрать +sudo apt-get install gcc-arm-none-eabi +make clean && make + +# Прошить (J-Link SWD) +make flash +``` + +## Управление + +| Кнопка | Действие | +|--------|----------| +| `0`–`9` | Прямой ввод частоты в VFO | +| **SK2** (нижняя боковая) | Переход в режим **POCSAG** | +| **SK1** (средняя боковая) | Переход в **Спектр-анализатор** | +| `0` (короткое нажатие) | Переход в **FM-радио** | +| **EXIT** | Возврат в VFO из любого режима | +| **F** или `*` (в POCSAG) | Переключение скорости: 512 ↔ 1200 бод | + +## Размеры прошивки + +``` + text data bss dec hex filename + 57708 204 3364 61276 ef5c firmware +``` + +- **Flash:** 57,912 / 61,440 байт (94.3%) +- **RAM:** 3,568 / 16,384 байт (21.8%) + +## Документация + +- [[BuildGuide|Полное руководство по сборке]] +- [[FlashingGuide|Руководство по прошивке]] +- [[POCSAG|POCSAG декодер — детали реализации]] +- [[Troubleshooting|Устранение неполадок]] +- [[Changelog|История изменений]] + +## Ссылки + +- 📦 [Релизы](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases) +- 📋 [Документация (DOCUMENTATION.md)](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/src/branch/main/DOCUMENTATION.md) +- 🌐 [Оригинальный проект egzumer](https://github.com/egzumer/uv-k5-firmware-custom) diff --git a/POCSAG.md b/POCSAG.md index e69de29..484c337 100644 --- a/POCSAG.md +++ b/POCSAG.md @@ -0,0 +1,256 @@ +# POCSAG декодер + +## Обзор + +POCSAG (Post Office Code Standardization Advisory Group) — стандарт пейджинговой связи. +Данный декодер реализует приём и декодирование POCSAG сигналов с частотами 512 и 1200 бод. + +## Протокол POCSAG + +### Структура передачи + +``` +┌─────────────────┬──────────────┬──────────────────────────┐ +│ Преамбула │ Sync word │ Batch 1 (32 слова) │ +│ 0xAAAAAAAB... │ 0x7CD21538 │ [Address/Data] × 32 │ +│ (≥576 бит) │ │ │ +└─────────────────┴──────────────┴──────────────────────────┘ + │ + ┌────────────────────────────────────┘ + ▼ + ┌──────────────────────────┐ + │ Batch 2 (32 слова) │ + │ + sync word │ + └──────────────────────────┘ +``` + +### Параметры + +| Параметр | Значение | +|----------|----------| +| **Скорость** | 512 или 1200 бод | +| **Модуляция** | FSK (FM) | +| **Кодирование** | BCH(31,21) | +| **Исправление ошибок** | До 2 бит на слово | +| **Длина слова** | 32 бита (21 данные + 10 BCH + 1 чётность) | +| **Преамбула** | 0x55555555... ≥ 576 бит, заканчивается на 1 | +| **Sync word** | 0x7CD21538 | +| **Idle word** | 0x7A89C197 | + +### Типы сообщений + +| Function bits | Тип | Описание | +|---------------|-----|----------| +| `00` | Numeric | Числовой пейджер (BCD цифры) | +| `01` | Reserved | Зарезервировано | +| `10` | Alpha | Алфавитный пейджер (7-bit ASCII) | +| `11` | Reserved | Зарезервировано | + +## Архитектура декодера + +### Файлы + +| Файл | Описание | +|------|----------| +| `app/pocsag/pocsag.c` | Основной декодер | +| `app/pocsag/pocsag.h` | Заголовочный файл, API | +| `app/pocsag/bch31.c` | BCH(31,21) коррекция ошибок | +| `app/pocsag/bch31.h` | Заголовочный файл BCH | + +### Цепочка обработки + +``` +┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ +│ BK4819 │───▶│ Zero-crossing│───▶│ Bit slicing │───▶│ POCSAG decode │ +│ FM demod │ │ detection │ │ (averaging) │ │ (state machine)│ +└──────────┘ └──────────────┘ └──────────────┘ └───────────────┘ + │ + ┌─────────────────────────────────────────┘ + ▼ + ┌──────────────┐ + │ BCH correct │ + │ (up to 2 err)│ + └──────────────┘ + │ + ▼ + ┌──────────────┐ + │ Ring buffer │ + │ (8 messages) │ + └──────────────┘ +``` + +### Машина состояний + +``` + ┌─────────┐ + │ IDLE │ + └────┬────┘ + │ 576 alternating bits + ▼ + ┌──────────────┐ + ┌───────▶│ PREAMBLE │ + │ └──────┬───────┘ +timeout │ │ sync word found (0x7CD21538) + │ ▼ + │ ┌──────────────┐ + │ │ SYNC │ + │ └──────┬───────┘ + │ │ 32-bit word valid + │ ▼ + │ ┌──────────────┐ + └────────│ DATA │ + sync lost └──────────────┘ +``` + +## Алгоритм BCH(31,21) + +### Параметры кода + +| Параметр | Значение | +|----------|----------| +| **Длина кода (n)** | 31 бит | +| **Информационные биты (k)** | 21 бит | +| **Проверочные биты** | 10 бит | +| **Мин. расстояние (d_min)** | 5 | +| **Исправление ошибок** | До 2 бит | + +### Генераторный полином + +``` +g(x) = x^10 + x^9 + x^8 + x^6 + x^5 + x^3 + 1 + = 0x72D (binary: 111 0010 1101) +``` + +### Процесс коррекции + +``` +1. Проверка чётности (even parity) + └─ Если OK и синдром = 0 → нет ошибок + +2. Вычисление синдрома S(x) = R(x) mod g(x) + └─ Если S(x) = 0 → нет ошибок + +3. Поиск одиночной ошибки + └─ S(x) = x^i mod g(x) для позиции i + └─ Если найдено → исправить бит i + +4. Поиск двойной ошибки (перебор пар) + └─ S(x) = x^i + x^j mod g(x) для пар (i, j) + └─ 465 комбинаций для 31 бита + └─ Если найдено → исправить биты i и j + +5. Если не найдено → слово отбрасывается +``` + +### Оптимизация для Cortex-M0 + +Cortex-M0 не имеет аппаратного деления. Все операции в GF(2) реализованы через сдвиги и XOR: + +```c +// Умножение на x в GF(2^10 / g(x)) +test_syn <<= 1; +if (test_syn & 0x0400U) { // Если бит 10 установлен + test_syn ^= BCH31_GEN_POLY; // XOR с генератором +} +test_syn &= 0x03FFU; // Оставляем 10 бит +``` + +## Конфигурация BK4819 + +Для приёма POCSAG радиочип настраивается следующим образом: + +```c +// Узкая полоса (POCSAG обычно narrow FM) +BK4819_SetFilterBandwidth(BK4819_FILTER_BW_NARROW, true); + +// Отключение шумоподавления (непрерывный приём аудио) +BK4819_SetupSquelch(0, 0, 0, 0, 255, 0); + +// Включение RX链路 +BK4819_WriteRegister(BK4819_REG_30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_RX_DSP); + +// AF output — демодулированный FM сигнал +BK4819_SetAF(BK4819_AF_FM); +``` + +## Известные ограничения + +### Сэмплинг (критично) + +**Проблема:** `POCSAG_FeedSample()` вызывается ~1 раз в 10 мс из timeslice. Для корректного декодирования POCSAG 1200 бод требуется ~1 раз в 125 мкс (8000 сэмплов/сек). + +**Текущее состояние:** Преамбула НЕ будет обнаружена при текущей частоте сэмплирования. BCH коррекция работает правильно, но до неё дело не доходит. + +**Планируемое исправление:** + +```c +// В MODE_TimeSlice10ms(), case MODE_POCSAG: +for (int i = 0; i < 80; i++) { + uint16_t audio = BK4819_GetVoiceAmplitudeOut(); + POCSAG_FeedSample(audio); + SYSTEM_DelayUs(125); // 8 kHz sampling rate +} +``` + +### Ограничения памяти + +| Ресурс | Использование | +|--------|--------------| +| Кольцевой буфер сообщений | 8 сообщений × ~80 байт = 640 байт | +| Статические буферы декодера | ~200 байт | +| BCH таблица синдромов | 0 байт (вычисляется на лету) | + +## API декодера + +### Инициализация + +```c +// Инициализация с baud rate 1200 +POCSAG_Init(POCSAG_BAUD_1200); + +// Настройка радиочасти на частоту 145.525 MHz +POCSAG_ConfigureRadio(145525000); +``` + +### Переключение скорости + +```c +// Переключение 1200 -> 512 бод +POCSAG_SwitchBaud(POCSAG_BAUD_512); + +// Текущая скорость +uint32_t baud = POCSAG_GetBaud(); +``` + +### Проверка сообщений + +```c +// Проверка наличия декодированных сообщений +if (POCSAG_MessageAvailable()) { + pocsag_msg_t msg; + if (POCSAG_GetMessage(&msg)) { + // msg.address — адрес (21 бит) + // msg.func — function code (2 бита) + // msg.text — текст сообщения + // msg.is_alpha — true = алфавитный, false = числовой + } +} +``` + +### Состояние декодера + +```c +pocsag_state_t state = POCSAG_GetState(); +// POCSAG_STATE_IDLE — ожидание +// POCSAG_STATE_PREAMBLE — обнаружение преамбулы +// POCSAG_STATE_SYNC — поиск sync слова +// POCSAG_STATE_DATA — приём данных + +bool signal = POCSAG_SignalDetected(); // true если sync найден +``` diff --git a/Test2.md b/Test2.md deleted file mode 100644 index e69de29..0000000 diff --git a/TestPage.md b/TestPage.md deleted file mode 100644 index e69de29..0000000 diff --git a/Troubleshooting.md b/Troubleshooting.md index e69de29..e9f5a74 100644 --- a/Troubleshooting.md +++ b/Troubleshooting.md @@ -0,0 +1,275 @@ +# Устранение неполадок + +## Прошивка не устанавливается + +### k5prog не находит рацию + +**Симптомы:** +``` +Device not found +``` + +**Решение:** + +1. **Проверьте порт:** + ```bash + ls /dev/ttyUSB* /dev/ttyACM* + # Если ничего нет — адаптер не определяется + ``` + +2. **Проверьте подключение:** + - TX адаптера → RX рации + - RX адаптера → TX рации + - GND → GND + - **НЕ** подключайте VCC + +3. **Проверьте права:** + ```bash + sudo chmod 666 /dev/ttyUSB0 + # Или добавьте пользователя в группу dialout: + sudo usermod -a -G dialout $USER + ``` + +4. **Попробуйте другой порт:** + ```bash + k5prog -f firmware.bin -p /dev/ttyUSB1 -w + ``` + +### Ошибка записи + +**Симптомы:** +``` +Write failed at address 0x... +``` + +**Решение:** + +1. Убедитесь что рация в режиме bootloader (зажать SK2 при включении) +2. Попробуйте ещё раз +3. Проверьте целостность файла: `md5sum firmware.bin` + +### Ошибка верификации + +**Симптомы:** +``` +Verify failed +``` + +**Решение:** + +1. Пересоберите прошивку: `make clean && make` +2. Проверьте что файл не повреждён +3. Попробуйте другой UART адаптер + +## Рация не включается после прошивки + +### Чёрный экран + +**Причины:** +- Прошивка не записалась полностью +- Прошивка для другой модели +- Ошибка в коде инициализации + +**Решение:** + +1. **SWD восстановление (самый надёжный):** + ```bash + openocd -f interface/jlink.cfg -f dp32g030.cfg \ + -c "reset init; write_image firmware.bin 0; reset; shutdown;" + ``` + +2. **UART восстановление:** + - Отключите батарею + - Подключите UART + - Зажмите SK2 + - Подключите батарею + - Прошейте заново + +### Экран включается, но нет реакции на кнопки + +**Причина:** Зависание в boot loop или ошибка инициализации + +**Решение:** + +1. Зажмите все кнопки на 10 секунд +2. Выключите рацию +3. Перепрошейте + +## Экран + +### Артефакты на экране + +**Причина:** Неправильная инициализация ST7565 + +**Решение:** +- Проверьте что используется правильный Makefile +- Пересоберите: `make clean && make` + +### Нет RSSI индикатора + +**Причина:** `ENABLE_RSSI_BAR = 0` в Makefile + +**Решение:** +```makefile +ENABLE_RSSI_BAR = 1 +``` + +### Заставка не появляется + +**Причина:** Файл `boot_splash.c` не компилируется + +**Решение:** +- Проверьте что `app/boot_splash.o` есть в Makefile +- Проверьте дату сборки: `grep BUILD_DATE Makefile` + +## POCSAG + +### Не декодирует сообщения + +**Причина:** Недостаточная частота сэмплирования (см. [[POCSAG#Сэмплинг]]) + +**Текущее состояние:** BETA — требуется доработка. + +**Временное решение:** +```c +// В mode.c, case MODE_POCSAG — читать чаще: +for (int i = 0; i < 80; i++) { + uint16_t audio = BK4819_GetVoiceAmplitudeOut(); + POCSAG_FeedSample(audio); + SYSTEM_DelayUs(125); +} +``` + +### Показывает "IDLE" постоянно + +**Причина:** Нет POCSAG сигнала на текущей частоте + +**Решение:** +- Убедитесь что настроена правильная частота +- Попробуйте известные POCSAG частоты: 145.525, 433.500 MHz + +### Показывает "SEARCHING" но не находит SYNC + +**Причина:** +- Слабый сигнал +- Неверная baud rate +- Помехи + +**Решение:** +1. Переключите baud rate: `F` или `*` +2. Подойдите ближе к передатчику +3. Проверьте антенну + +## Спектр-анализатор + +### Зависает в режиме спектра + +**Причина:** `APP_RunSpectrum()` — блокирующая функция + +**Решение:** +- Нажмите `EXIT` для возврата в VFO +- Если не реагирует — выключите и включите рацию + +### Спектр не отображается + +**Причина:** `ENABLE_SPECTRUM = 0` в Makefile + +**Решение:** +```makefile +ENABLE_SPECTRUM = 1 +``` + +## FM Радио + +### Нет звука + +**Причина:** Громкость на минимум или аудио путь не включён + +**Решение:** +1. Проверьте громкость (кнопки вверх/вниз) +2. Убедитесь что есть сигнал + +### FM не запускается + +**Причина:** `ENABLE_FMRADIO = 0` в Makefile + +**Решение:** +```makefile +ENABLE_FMRADIO = 1 +``` + +## Ошибки компиляции + +### `undefined reference to '_sbrk'` + +**Решение:** Убедитесь что `syscalls.c` есть в Makefile: +```makefile +OBJS += syscalls.o +``` + +### `comparison is always false due to limited range of data type` + +**Причина:** Сравнение unsigned переменной с числом больше её максимума + +**Решение:** Измените тип переменной на больший (например `uint8_t` → `uint16_t`) + +### `fatal error: xxx.h: No such file or directory` + +**Решение:** Проверьте путь в include: +```c +// Правильно: +#include "app/display_rssi.h" +#include "pocsag/pocsag.h" + +// Неправильно: +#include "display_rssi.h" +``` + +## Ошибки линковки + +### `undefined reference` (много штук) + +**Причина:** Отсутствуют объектные файлы в Makefile + +**Решение:** Проверьте что все зависимые модули включены: +```makefile +OBJS += ui/ui.o ui/inputbox.o ui/menu.o +OBJS += app/menu.o app/generic.o app/action.o app/dtmf.o +``` + +### Flash overflow + +**Симптомы:** +``` +region `FLASH' overflowed by XXXX bytes +``` + +**Решение:** Отключите ненужные модули (см. [[BuildGuide#Экономия-Flash]]) + +## Сбор системы + +```bash +# Проверьте ядро +uname -a + +# Проверьте права USB +ls -la /dev/ttyUSB* +groups + +# Проверьте тулчейн +arm-none-eabi-gcc --version +arm-none-eabi-size --version +``` + +## Логирование + +Если ничего не помогает, включите UART лог: + +```makefile +ENABLE_UART = 1 +``` + +Затем подключите UART адаптер и смотрите вывод: +```bash +minicom -D /dev/ttyUSB0 -b 38400 +``` diff --git a/_Sidebar.md b/_Sidebar.md index e69de29..3744062 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -0,0 +1,13 @@ +## Навигация + +- [[Главная|Home]] +- [[BuildGuide|Руководство по сборке]] +- [[FlashingGuide|Руководство по прошивке]] +- [[POCSAG|POCSAG декодер]] +- [[Troubleshooting|Устранение неполадок]] +- [[Changelog|История изменений]] + +## Ссылки + +- [Репозиторий](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware) +- [Релизы](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases)