Add DAB ANTCAP calibration and fix BT1035 boot banner timing
Extend the FM-only ANTCAP antenna-varactor override to DAB, mirroring the existing mechanism end to end (driver, tuner, service, EEPROM storage, HTTP API). Live sweep on real hardware found no ANTCAP value beating auto-tune on the ensembles tested, so DAB stays on auto-tune by default. Also fix BT1035 boot: the module's real boot banner doesn't appear until ~18-24s after RESET# releases, not the 3.5s previously waited; add a 2-attempt retry and a baud-rate probe fallback for diagnostics. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ implemented in \texttt{SetupWebServer}. Request bodies are parsed into
|
||||
domain types in the pure core (\texttt{components/core}) before any
|
||||
persistence or driver call. Exact C++ signatures live in the generated
|
||||
Doxygen output under \texttt{docs/api/}; this chapter documents the
|
||||
wire protocol and behaviour as shipped in firmware~0.8.5.
|
||||
wire protocol and behaviour as shipped in firmware~0.9.0.
|
||||
|
||||
\section{Transport and reachability}
|
||||
|
||||
@@ -36,7 +36,7 @@ Returns a health-check DTO serialised by
|
||||
|
||||
\begin{drnote}[Response schema]
|
||||
\begin{drcode}[JSON]
|
||||
{"status":"ok","fw":"0.8.5","serialNumber":"0004A3123456",
|
||||
{"status":"ok","fw":"0.9.0","serialNumber":"0004A3123456",
|
||||
"chips":{"si4684":true,"adau1701":true,"bt1035":true}}
|
||||
\end{drcode}
|
||||
\begin{itemize}
|
||||
@@ -172,7 +172,13 @@ or
|
||||
{"band":"fm","frequency_khz":101500}
|
||||
\end{drcode}
|
||||
DAB \texttt{freq\_index} is 0--37; FM \texttt{frequency\_khz} is
|
||||
64\,000--108\,000.
|
||||
64\,000--108\,000. FM accepts an optional \texttt{antcap} (0--128):
|
||||
overrides the front-end antenna varactor for this one tune, e.g. while
|
||||
running a calibration sweep. Omit it (the normal case) to use the board's
|
||||
saved calibration --- see
|
||||
\texttt{POST /api/tuner/calibrate-antenna}
|
||||
(Section~\ref{sec:api-tuner-calibrate-antenna}) --- or hardware auto-tune
|
||||
if never calibrated. Ignored for \texttt{"dab"}.
|
||||
\end{drnote}
|
||||
|
||||
On success returns the updated status JSON (same shape as
|
||||
@@ -267,6 +273,33 @@ per-station poll budget ran out.
|
||||
HTTP status: \textbf{200 OK}; \textbf{409} on a hardware/driver failure
|
||||
mid-sweep; \textbf{503} when the tuner service is unavailable.
|
||||
|
||||
\apiendpoint{POST}{/api/tuner/calibrate-antenna}
|
||||
\label{sec:api-tuner-calibrate-antenna}
|
||||
|
||||
Commits an FM ANTCAP value (AN851 Appendix A front-end calibration) as the
|
||||
board's permanent default, found by sweeping \texttt{antcap} on
|
||||
\texttt{POST /api/tuner/tune} (Section~\ref{sec:api-tuner-tune}) across
|
||||
0--128 and comparing \texttt{rssi\_dbuv}/\texttt{snr\_db}. Persists to the
|
||||
24AA025E48 EEPROM's user-writable region (separate from the factory-locked
|
||||
EUI-48) and takes effect immediately on the live tuner --- no reboot
|
||||
required, though it also survives one since \texttt{HardwareBootstrap::boot()}
|
||||
reloads it at every boot. Once saved, every ordinary FM tune (seek, scan,
|
||||
station recall, live UI) uses this value automatically instead of the
|
||||
chip's own front-end auto-tune, unless a request explicitly overrides
|
||||
\texttt{antcap} for that one call.
|
||||
|
||||
\begin{drnote}[Request schema]
|
||||
\begin{drcode}[JSON]
|
||||
{"antcap":102}
|
||||
\end{drcode}
|
||||
\texttt{antcap} is required, 0--128.
|
||||
\end{drnote}
|
||||
|
||||
Success response: \texttt{\{"status":"saved","antcap":102\}}. HTTP status:
|
||||
\textbf{200 OK}; \textbf{400} for invalid/missing \texttt{antcap};
|
||||
\textbf{500} on an EEPROM write failure; \textbf{503} when the tuner
|
||||
service is unavailable.
|
||||
|
||||
\apiendpoint{GET}{/api/audio/profile}
|
||||
\label{sec:api-audio-profile-get}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ added in the same change that introduces the class. A tooling check keeps
|
||||
this chapter in step with the code, so it is always current.
|
||||
\end{drnote}
|
||||
|
||||
The class reference tracks firmware~0.8.5 on \texttt{main}. Public classes
|
||||
The class reference tracks firmware~0.9.0 on \texttt{main}. Public classes
|
||||
are grouped by layer: domain core, application services, and hardware drivers.
|
||||
|
||||
% ------------------------------------------------------------------
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
DigiRadio is an open-source, high-fidelity digital radio receiver. It
|
||||
receives DAB+ and FM broadcasts, processes the audio through a dedicated
|
||||
signal processor, and streams the result over Bluetooth using a
|
||||
high-resolution codec. Firmware~0.8.5 on \texttt{main} provides encrypted
|
||||
high-resolution codec. Firmware~0.9.0 on \texttt{main} provides encrypted
|
||||
storage, a tabbed configuration web UI, and the full REST API documented
|
||||
in Chapter~\ref{ch:api}. The whole project --- hardware and firmware --- is
|
||||
released as open source for the maker and audio community to study,
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
\vfill
|
||||
{\color{drInk}\large Michele Bigi\par}
|
||||
\vspace{2mm}
|
||||
{\color{drGray}Firmware 0.8.5 \quad\textbullet\quad 2026\par}
|
||||
{\color{drGray}Firmware 0.9.0 \quad\textbullet\quad 2026\par}
|
||||
\vspace{2mm}
|
||||
{\color{drGray}Hardware: CERN-OHL-S v2 \quad\textbullet\quad Firmware: Apache-2.0\par}
|
||||
\vspace{2mm}
|
||||
|
||||
Reference in New Issue
Block a user