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