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
173
BuildGuide.md
173
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 "<POCSAG_FeedSample>:"
|
||||
```
|
||||
|
||||
### Размер каждой секции
|
||||
|
||||
```bash
|
||||
arm-none-eabi-size -A firmware | sort -n -k2 | tail -20
|
||||
```
|
||||
|
||||
### Количество функций после LTO
|
||||
|
||||
```bash
|
||||
arm-none-eabi-nm firmware | grep " [Tt] " | wc -l
|
||||
```
|
||||
|
||||
95
Changelog.md
95
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 код)
|
||||
|
||||
215
FlashingGuide.md
215
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 |
|
||||
|
||||
63
Home.md
63
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)
|
||||
|
||||
256
POCSAG.md
256
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 найден
|
||||
```
|
||||
|
||||
0
Test2.md
0
Test2.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
|
||||
```
|
||||
|
||||
13
_Sidebar.md
13
_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)
|
||||
|
||||
Reference in New Issue
Block a user