Опознание БЕЗ разбора рации, по схеме RT4DDLT01 (Radtel v2.1): DMR-модуль «FM100B» = один чип U700 HF6853 — одночиповый DMR-SoC семейства Auctus A6 (внутри RDA8809): CPU + ВЧ-трансивер + DSP + AMBE-вокодер + аудио-кодек в одном кристалле, прошивка во внешнем SPI-flash, кварц 26 МГц. Прежняя версия «Sicomm SCT3258TD» неверна (SCT3258 — baseband-only без ВЧ; и нативный протокол другой). Скрытый ATE/CPS-интерфейс полностью реверснут (jhart99/a6tools, вендорен в research/a6tools). Даёт КОНКРЕТНУЮ починку нашей TX-проблемы: AT+GETFREQERR / AT+DMOFREQERR=N, offset=-2500+10*N, ±2500 Гц — наши ~1100 Гц внутри диапазона. Плюс DMR_ADJTXSYMDEV (девиация), FGU_AFC, DMOSETPOWER, CPS chanInfo, дамп прошивки модуля. - docs/hf6853-auctus-a6.md — идентификация + протокол + план TX-fix - tools/a6_freqfix.py — заготовка тула (probe/read/write, не запускать вслепую) - research/a6tools/ — вендоренный реверс (MIT), atcommands.md/cpecommands.md - docs/dmr-tx-recovery.md, README — путь 0 (AT+DMOFREQERR) как лучший - research/rt4ddlt01-dmr-module-sheet.png — рендер листа схемы DMR-модуля Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NikMGoqQWWk9wy2ww2vJAr
46 строки
1.9 KiB
Python
46 строки
1.9 KiB
Python
#!/usr/bin/env python3
|
|
""" Frequency offset fix for AUCTUS A6 based radios
|
|
|
|
This program takes a measured frequency and a desired frequency and
|
|
then reads a TCXO error programmed into the radio and sets a new TCXO
|
|
offset in the radio. The radio needs to have its channel changed
|
|
after for the new setting to take effect.
|
|
|
|
This fixes the high BER seen on some radios like my GOCOM GD900 which
|
|
had a 800 Hz offset from the factory which while within spec was
|
|
outside what my poor MMDVM board could tolerate.
|
|
|
|
"""
|
|
|
|
from a6 import SerialIO, get_freq_err, set_freq_err
|
|
|
|
__author__ = "jhart99"
|
|
__license__ = "MIT"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import argparse
|
|
parser = argparse.ArgumentParser(description='Auctus A6 Frequency Error Fixer')
|
|
parser.add_argument('-p', '--port', default='/dev/ttyUSB0',
|
|
type=str, help='serial port')
|
|
parser.add_argument('-b','--baudrate', default=921600,
|
|
type=int, help='baud rate')
|
|
parser.add_argument('-v','--verbosity', default=0, action='count',
|
|
help='print sent and received frames to stderr for debugging')
|
|
parser.add_argument('-V', '--version', action='version',
|
|
version='%(prog)s 0.0.1',
|
|
help='display version information and exit')
|
|
parser.add_argument('current', type=int,
|
|
help='the measured frequency the radio is currently transmitting in Hz')
|
|
parser.add_argument('target', type=int,
|
|
help='the programmed frequency in the radio in Hz')
|
|
args = parser.parse_args()
|
|
|
|
uart = SerialIO(args.port, args.baudrate, args.verbosity)
|
|
|
|
delta = args.target - args.current
|
|
curerr = get_freq_err()
|
|
target = curerr + delta
|
|
if abs(target) > 2500:
|
|
raise ValueError("Desired offset exceeds maximum of 2500 Hz")
|
|
set_freq_err(int((target + 2500)/10)) |