210 lines
17 KiB
TeX
210 lines
17 KiB
TeX
\contentsline {chapter}{\numberline {1}Introduction}{8}{chapter.1}%
|
|
\contentsline {section}{\numberline {1.1}What DigiRadio is}{8}{section.1.1}%
|
|
\contentsline {section}{\numberline {1.2}Who this manual is for}{8}{section.1.2}%
|
|
\contentsline {section}{\numberline {1.3}Licensing summary}{9}{section.1.3}%
|
|
\contentsline {chapter}{\numberline {2}Hardware Overview}{10}{chapter.2}%
|
|
\contentsline {section}{\numberline {2.1}Design philosophy}{10}{section.2.1}%
|
|
\contentsline {section}{\numberline {2.2}System block diagram}{10}{section.2.2}%
|
|
\contentsline {section}{\numberline {2.3}The tuner: Si4684}{11}{section.2.3}%
|
|
\contentsline {subsection}{\numberline {2.3.1}Control interface}{11}{subsection.2.3.1}%
|
|
\contentsline {subsection}{\numberline {2.3.2}Firmware image upload}{11}{subsection.2.3.2}%
|
|
\contentsline {section}{\numberline {2.4}The audio DSP: ADAU1701}{12}{section.2.4}%
|
|
\contentsline {subsection}{\numberline {2.4.1}Control and program loading}{12}{subsection.2.4.1}%
|
|
\contentsline {subsection}{\numberline {2.4.2}Click-free parameter updates}{12}{subsection.2.4.2}%
|
|
\contentsline {section}{\numberline {2.5}The Bluetooth module: FSC-BT1035}{12}{section.2.5}%
|
|
\contentsline {subsection}{\numberline {2.5.1}Control interface}{13}{subsection.2.5.1}%
|
|
\contentsline {section}{\numberline {2.6}The host: ESP32-S3}{13}{section.2.6}%
|
|
\contentsline {section}{\numberline {2.7}Bus architecture}{13}{section.2.7}%
|
|
\contentsline {section}{\numberline {2.8}Power}{14}{section.2.8}%
|
|
\contentsline {section}{\numberline {2.9}RF and antennas}{14}{section.2.9}%
|
|
\contentsline {section}{\numberline {2.10}Inter-chip connections (GPIO map)}{14}{section.2.10}%
|
|
\contentsline {subsection}{\numberline {2.10.1}System and control lines}{14}{subsection.2.10.1}%
|
|
\contentsline {subsection}{\numberline {2.10.2}Si4684 tuner (SPI)}{14}{subsection.2.10.2}%
|
|
\contentsline {subsection}{\numberline {2.10.3}ADAU1701 DSP (I\textsuperscript {2}C)}{14}{subsection.2.10.3}%
|
|
\contentsline {subsection}{\numberline {2.10.4}Device-identity EEPROM (24AA025E48)}{15}{subsection.2.10.4}%
|
|
\contentsline {subsection}{\numberline {2.10.5}FSC-BT1035 Bluetooth}{15}{subsection.2.10.5}%
|
|
\contentsline {subsection}{\numberline {2.10.6}Audio bus (I\textsuperscript {2}S)}{15}{subsection.2.10.6}%
|
|
\contentsline {subsection}{\numberline {2.10.7}Completeness}{17}{subsection.2.10.7}%
|
|
\contentsline {section}{\numberline {2.11}Design validation and critical checks}{17}{section.2.11}%
|
|
\contentsline {subsection}{\numberline {2.11.1}Si4684 tuner}{17}{subsection.2.11.1}%
|
|
\contentsline {subsection}{\numberline {2.11.2}ADAU1701 DSP}{18}{subsection.2.11.2}%
|
|
\contentsline {subsection}{\numberline {2.11.3}FSC-BT1035 (QCC3056)}{19}{subsection.2.11.3}%
|
|
\contentsline {subsection}{\numberline {2.11.4}System-level summary}{19}{subsection.2.11.4}%
|
|
\contentsline {chapter}{\numberline {3}DSP Configuration (SigmaStudio)}{21}{chapter.3}%
|
|
\contentsline {section}{\numberline {3.1}Overview}{21}{section.3.1}%
|
|
\contentsline {section}{\numberline {3.2}Hardware Configuration}{21}{section.3.2}%
|
|
\contentsline {subsection}{\numberline {3.2.1}Multipurpose pin (MP) assignment}{22}{subsection.3.2.1}%
|
|
\contentsline {section}{\numberline {3.3}Signal-processing chain}{23}{section.3.3}%
|
|
\contentsline {subsection}{\numberline {3.3.1}Block-by-block}{23}{subsection.3.3.1}%
|
|
\contentsline {subsection}{\numberline {3.3.2}Signal flow}{24}{subsection.3.3.2}%
|
|
\contentsline {section}{\numberline {3.4}Equaliser}{24}{section.3.4}%
|
|
\contentsline {section}{\numberline {3.5}Master volume and limiters}{25}{section.3.5}%
|
|
\contentsline {section}{\numberline {3.6}Runtime-controllable parameters}{25}{section.3.6}%
|
|
\contentsline {section}{\numberline {3.7}Virtual enhancements (stereo depth and bass boost)}{25}{section.3.7}%
|
|
\contentsline {section}{\numberline {3.8}Exporting the program}{26}{section.3.8}%
|
|
\contentsline {chapter}{\numberline {4}Firmware Architecture}{27}{chapter.4}%
|
|
\contentsline {section}{\numberline {4.1}Design principles}{27}{section.4.1}%
|
|
\contentsline {section}{\numberline {4.2}Layered structure}{27}{section.4.2}%
|
|
\contentsline {section}{\numberline {4.3}Audio signal path}{28}{section.4.3}%
|
|
\contentsline {section}{\numberline {4.4}Chip control and boot}{29}{section.4.4}%
|
|
\contentsline {paragraph}{Si4684 (tuner).}{29}{paragraph*.2}%
|
|
\contentsline {paragraph}{ADAU1701 (DSP).}{29}{paragraph*.3}%
|
|
\contentsline {paragraph}{FSC-BT1035 (Bluetooth).}{29}{paragraph*.4}%
|
|
\contentsline {section}{\numberline {4.5}Configuration, storage, and user interface}{29}{section.4.5}%
|
|
\contentsline {paragraph}{Implemented (fw 0.8.3).}{30}{paragraph*.5}%
|
|
\contentsline {paragraph}{Legacy note (Slices 1--2).}{30}{paragraph*.6}%
|
|
\contentsline {section}{\numberline {4.6}Companion-chip boot at power-up}{30}{section.4.6}%
|
|
\contentsline {section}{\numberline {4.7}Error-handling model}{31}{section.4.7}%
|
|
\contentsline {section}{\numberline {4.8}Toolchain}{31}{section.4.8}%
|
|
\contentsline {chapter}{\numberline {5}Si4684 DAB+/FM Tuner}{32}{chapter.5}%
|
|
\contentsline {section}{\numberline {5.1}Role in the audio chain}{32}{section.5.1}%
|
|
\contentsline {section}{\numberline {5.2}Firmware images}{32}{section.5.2}%
|
|
\contentsline {subsection}{\numberline {5.2.1}Where images come from}{33}{subsection.5.2.1}%
|
|
\contentsline {subsection}{\numberline {5.2.2}Refreshing blobs}{33}{subsection.5.2.2}%
|
|
\contentsline {section}{\numberline {5.3}Boot sequence (HOST\_LOAD)}{34}{section.5.3}%
|
|
\contentsline {section}{\numberline {5.4}Si4684Driver API}{35}{section.5.4}%
|
|
\contentsline {subsection}{\numberline {5.4.1}Bring-up and diagnostics}{35}{subsection.5.4.1}%
|
|
\contentsline {subsection}{\numberline {5.4.2}FM operations}{35}{subsection.5.4.2}%
|
|
\contentsline {subsection}{\numberline {5.4.3}DAB operations}{36}{subsection.5.4.3}%
|
|
\contentsline {subsection}{\numberline {5.4.4}Typical DAB session}{37}{subsection.5.4.4}%
|
|
\contentsline {subsection}{\numberline {5.4.5}Typical FM session}{37}{subsection.5.4.5}%
|
|
\contentsline {subsection}{\numberline {5.4.6}Choosing DAB or FM}{37}{subsection.5.4.6}%
|
|
\contentsline {subsection}{\numberline {5.4.7}HTTP API mapping (web UI)}{38}{subsection.5.4.7}%
|
|
\contentsline {section}{\numberline {5.5}Integration at power-up}{38}{section.5.5}%
|
|
\contentsline {section}{\numberline {5.6}Further reading}{39}{section.5.6}%
|
|
\contentsline {chapter}{\numberline {6}ADAU1701 Audio DSP}{40}{chapter.6}%
|
|
\contentsline {section}{\numberline {6.1}Role in the audio chain}{40}{section.6.1}%
|
|
\contentsline {section}{\numberline {6.2}Program image (SigmaStudio export)}{41}{section.6.2}%
|
|
\contentsline {subsection}{\numberline {6.2.1}Refreshing after a SigmaStudio change}{41}{subsection.6.2.1}%
|
|
\contentsline {section}{\numberline {6.3}Boot sequence (I\textsuperscript {2}C RAM load)}{42}{section.6.3}%
|
|
\contentsline {section}{\numberline {6.4}Software architecture}{42}{section.6.4}%
|
|
\contentsline {section}{\numberline {6.5}Adau1701Driver API}{43}{section.6.5}%
|
|
\contentsline {subsection}{\numberline {6.5.1}Bring-up and state}{43}{subsection.6.5.1}%
|
|
\contentsline {subsection}{\numberline {6.5.2}Full profile and partial updates}{43}{subsection.6.5.2}%
|
|
\contentsline {subsection}{\numberline {6.5.3}Gain and EQ coefficient path}{44}{subsection.6.5.3}%
|
|
\contentsline {section}{\numberline {6.6}Parameter address map}{44}{section.6.6}%
|
|
\contentsline {section}{\numberline {6.7}Safeload mechanism}{45}{section.6.7}%
|
|
\contentsline {section}{\numberline {6.8}Domain model and persistence}{45}{section.6.8}%
|
|
\contentsline {section}{\numberline {6.9}audio::AudioService}{46}{section.6.9}%
|
|
\contentsline {section}{\numberline {6.10}HTTP and web UI}{46}{section.6.10}%
|
|
\contentsline {section}{\numberline {6.11}Typical usage patterns}{47}{section.6.11}%
|
|
\contentsline {subsection}{\numberline {6.11.1}C++ firmware (direct service access)}{47}{subsection.6.11.1}%
|
|
\contentsline {subsection}{\numberline {6.11.2}HTTP client}{47}{subsection.6.11.2}%
|
|
\contentsline {subsection}{\numberline {6.11.3}After SigmaStudio EQ layout change}{47}{subsection.6.11.3}%
|
|
\contentsline {section}{\numberline {6.12}Error handling}{48}{section.6.12}%
|
|
\contentsline {section}{\numberline {6.13}Integration at power-up}{48}{section.6.13}%
|
|
\contentsline {section}{\numberline {6.14}Further reading}{48}{section.6.14}%
|
|
\contentsline {chapter}{\numberline {7}FSC-BT1035 Bluetooth Transmitter}{49}{chapter.7}%
|
|
\contentsline {section}{\numberline {7.1}Role in the audio chain}{49}{section.7.1}%
|
|
\contentsline {section}{\numberline {7.2}Control interface}{49}{section.7.2}%
|
|
\contentsline {subsection}{\numberline {7.2.1}UART parameters}{49}{subsection.7.2.1}%
|
|
\contentsline {subsection}{\numberline {7.2.2}Response handling}{50}{subsection.7.2.2}%
|
|
\contentsline {section}{\numberline {7.3}Mandatory Line-In mode}{50}{section.7.3}%
|
|
\contentsline {section}{\numberline {7.4}Boot sequence}{50}{section.7.4}%
|
|
\contentsline {section}{\numberline {7.5}Software architecture}{51}{section.7.5}%
|
|
\contentsline {section}{\numberline {7.6}Supported AT command subset}{51}{section.7.6}%
|
|
\contentsline {section}{\numberline {7.7}Bt1035Driver API}{52}{section.7.7}%
|
|
\contentsline {subsection}{\numberline {7.7.1}Error codes}{52}{subsection.7.7.1}%
|
|
\contentsline {section}{\numberline {7.8}Integration at power-up}{52}{section.7.8}%
|
|
\contentsline {section}{\numberline {7.9}Typical usage (firmware developer)}{53}{section.7.9}%
|
|
\contentsline {section}{\numberline {7.10}Further reading}{53}{section.7.10}%
|
|
\contentsline {chapter}{\numberline {8}HTTP API}{54}{chapter.8}%
|
|
\contentsline {section}{\numberline {8.1}Transport and reachability}{54}{section.8.1}%
|
|
\contentsline {section}{\numberline {8.2}Endpoints}{54}{section.8.2}%
|
|
\contentsline {subsection}{\numberline {8.2.1}\texttt {GET /api/health}}{54}{subsection.8.2.1}%
|
|
\contentsline {subsection}{\numberline {8.2.2}\texttt {POST /api/wifi}}{55}{subsection.8.2.2}%
|
|
\contentsline {subsection}{\numberline {8.2.3}\texttt {GET /api/tuner/status}}{56}{subsection.8.2.3}%
|
|
\contentsline {subsection}{\numberline {8.2.4}\texttt {GET /api/tuner/services}}{57}{subsection.8.2.4}%
|
|
\contentsline {subsection}{\numberline {8.2.5}\texttt {POST /api/tuner/tune}}{57}{subsection.8.2.5}%
|
|
\contentsline {subsection}{\numberline {8.2.6}\texttt {POST /api/tuner/play}}{58}{subsection.8.2.6}%
|
|
\contentsline {subsection}{\numberline {8.2.7}\texttt {POST /api/tuner/seek}}{58}{subsection.8.2.7}%
|
|
\contentsline {subsection}{\numberline {8.2.8}\texttt {GET /api/audio/profile}}{58}{subsection.8.2.8}%
|
|
\contentsline {subsection}{\numberline {8.2.9}\texttt {PUT /api/audio/profile}}{59}{subsection.8.2.9}%
|
|
\contentsline {subsection}{\numberline {8.2.10}\texttt {POST /api/dsp/program}}{59}{subsection.8.2.10}%
|
|
\contentsline {subsection}{\numberline {8.2.11}\texttt {POST /api/system/ota}}{60}{subsection.8.2.11}%
|
|
\contentsline {subsection}{\numberline {8.2.12}\texttt {POST /api/audio/reset}}{60}{subsection.8.2.12}%
|
|
\contentsline {subsection}{\numberline {8.2.13}\texttt {POST /api/audio/stereo-enhance}}{61}{subsection.8.2.13}%
|
|
\contentsline {subsection}{\numberline {8.2.14}\texttt {POST /api/audio/bass-enhance}}{61}{subsection.8.2.14}%
|
|
\contentsline {subsection}{\numberline {8.2.15}\texttt {GET /api/bluetooth/status}}{61}{subsection.8.2.15}%
|
|
\contentsline {subsection}{\numberline {8.2.16}\texttt {POST /api/bluetooth/pair}}{61}{subsection.8.2.16}%
|
|
\contentsline {subsection}{\numberline {8.2.17}\texttt {POST /api/bluetooth/pair/stop}}{62}{subsection.8.2.17}%
|
|
\contentsline {subsection}{\numberline {8.2.18}\texttt {POST /api/bluetooth/disconnect}}{62}{subsection.8.2.18}%
|
|
\contentsline {subsection}{\numberline {8.2.19}\texttt {GET /api/bluetooth/paired}}{62}{subsection.8.2.19}%
|
|
\contentsline {subsection}{\numberline {8.2.20}\texttt {POST /api/bluetooth/auto-reconnect}}{62}{subsection.8.2.20}%
|
|
\contentsline {subsection}{\numberline {8.2.21}\texttt {GET /api/stations}}{62}{subsection.8.2.21}%
|
|
\contentsline {subsection}{\numberline {8.2.22}\texttt {POST /api/stations}}{63}{subsection.8.2.22}%
|
|
\contentsline {subsection}{\numberline {8.2.23}\texttt {POST /api/stations/remove}}{63}{subsection.8.2.23}%
|
|
\contentsline {subsection}{\numberline {8.2.24}\texttt {POST /api/stations/reorder}}{63}{subsection.8.2.24}%
|
|
\contentsline {subsection}{\numberline {8.2.25}\texttt {POST /api/stations/tune}}{63}{subsection.8.2.25}%
|
|
\contentsline {section}{\numberline {8.3}Boot and network state machine}{63}{section.8.3}%
|
|
\contentsline {section}{\numberline {8.4}Credential storage (Slice~2)}{64}{section.8.4}%
|
|
\contentsline {chapter}{\numberline {9}Class Reference}{65}{chapter.9}%
|
|
\contentsline {section}{\numberline {9.1}FirmwareVersion}{65}{section.9.1}%
|
|
\contentsline {section}{\numberline {9.2}FrequencyKHz}{65}{section.9.2}%
|
|
\contentsline {section}{\numberline {9.3}HealthStatus}{66}{section.9.3}%
|
|
\contentsline {section}{\numberline {9.4}Eui48}{66}{section.9.4}%
|
|
\contentsline {section}{\numberline {9.5}DeviceIdentity}{66}{section.9.5}%
|
|
\contentsline {section}{\numberline {9.6}IDeviceIdentitySource}{66}{section.9.6}%
|
|
\contentsline {section}{\numberline {9.7}SoftApConfig}{66}{section.9.7}%
|
|
\contentsline {section}{\numberline {9.8}SoftApHost}{67}{section.9.8}%
|
|
\contentsline {section}{\numberline {9.9}SetupWebServer}{67}{section.9.9}%
|
|
\contentsline {section}{\numberline {9.10}NetBootstrap}{67}{section.9.10}%
|
|
\contentsline {section}{\numberline {9.11}Secret}{67}{section.9.11}%
|
|
\contentsline {section}{\numberline {9.12}WifiSsid}{67}{section.9.12}%
|
|
\contentsline {section}{\numberline {9.13}WifiCredentials}{68}{section.9.13}%
|
|
\contentsline {section}{\numberline {9.14}ISecureStore}{68}{section.9.14}%
|
|
\contentsline {section}{\numberline {9.15}StaClient}{68}{section.9.15}%
|
|
\contentsline {section}{\numberline {9.16}NvsSecureStore}{68}{section.9.16}%
|
|
\contentsline {section}{\numberline {9.17}IFirmwareBlobReader}{68}{section.9.17}%
|
|
\contentsline {section}{\numberline {9.18}EmbeddedBlobReader}{69}{section.9.18}%
|
|
\contentsline {section}{\numberline {9.19}Si4684EmbeddedImages}{69}{section.9.19}%
|
|
\contentsline {section}{\numberline {9.20}Si4684Driver}{69}{section.9.20}%
|
|
\contentsline {section}{\numberline {9.21}Bt1035PairedDevice}{69}{section.9.21}%
|
|
\contentsline {section}{\numberline {9.22}Bt1035Driver}{70}{section.9.22}%
|
|
\contentsline {section}{\numberline {9.23}Adau1701Driver}{70}{section.9.23}%
|
|
\contentsline {section}{\numberline {9.24}Eeprom24aa}{70}{section.9.24}%
|
|
\contentsline {section}{\numberline {9.25}Adau1701Dsp}{70}{section.9.25}%
|
|
\contentsline {section}{\numberline {9.26}RegisterWrite}{70}{section.9.26}%
|
|
\contentsline {section}{\numberline {9.27}DspProgram}{71}{section.9.27}%
|
|
\contentsline {section}{\numberline {9.28}IDspProgramSource}{71}{section.9.28}%
|
|
\contentsline {section}{\numberline {9.29}EmbeddedDspProgramSource}{71}{section.9.29}%
|
|
\contentsline {section}{\numberline {9.30}FlashDspProgramSource}{71}{section.9.30}%
|
|
\contentsline {section}{\numberline {9.31}FallbackDspProgramSource}{71}{section.9.31}%
|
|
\contentsline {section}{\numberline {9.32}GainDb}{71}{section.9.32}%
|
|
\contentsline {section}{\numberline {9.33}FrequencyHz}{72}{section.9.33}%
|
|
\contentsline {section}{\numberline {9.34}EqBandIndex}{72}{section.9.34}%
|
|
\contentsline {section}{\numberline {9.35}EqProfile}{72}{section.9.35}%
|
|
\contentsline {section}{\numberline {9.36}IDsp}{72}{section.9.36}%
|
|
\contentsline {section}{\numberline {9.37}IAudioProfileStore}{72}{section.9.37}%
|
|
\contentsline {section}{\numberline {9.38}ITuner}{73}{section.9.38}%
|
|
\contentsline {section}{\numberline {9.39}TunerService}{73}{section.9.39}%
|
|
\contentsline {section}{\numberline {9.40}Si4684Tuner}{73}{section.9.40}%
|
|
\contentsline {section}{\numberline {9.41}AudioService}{73}{section.9.41}%
|
|
\contentsline {section}{\numberline {9.42}EnhanceLevel}{73}{section.9.42}%
|
|
\contentsline {section}{\numberline {9.43}NvsAudioProfileStore}{74}{section.9.43}%
|
|
\contentsline {section}{\numberline {9.44}StationName}{74}{section.9.44}%
|
|
\contentsline {section}{\numberline {9.45}BroadcastLabel}{74}{section.9.45}%
|
|
\contentsline {section}{\numberline {9.46}RdsMetadataAccumulator}{74}{section.9.46}%
|
|
\contentsline {section}{\numberline {9.47}DabDynamicLabelAccumulator}{74}{section.9.47}%
|
|
\contentsline {section}{\numberline {9.48}PresetSlot}{74}{section.9.48}%
|
|
\contentsline {section}{\numberline {9.49}Station}{75}{section.9.49}%
|
|
\contentsline {section}{\numberline {9.50}StationList}{75}{section.9.50}%
|
|
\contentsline {section}{\numberline {9.51}StationService}{75}{section.9.51}%
|
|
\contentsline {section}{\numberline {9.52}IntegrationService}{75}{section.9.52}%
|
|
\contentsline {section}{\numberline {9.53}BluetoothService}{75}{section.9.53}%
|
|
\contentsline {section}{\numberline {9.54}OtaService}{76}{section.9.54}%
|
|
\contentsline {chapter}{\numberline {10}Building and Flashing}{77}{chapter.10}%
|
|
\contentsline {section}{\numberline {10.1}Toolchain}{77}{section.10.1}%
|
|
\contentsline {section}{\numberline {10.2}Si4684 firmware blobs (local only)}{77}{section.10.2}%
|
|
\contentsline {section}{\numberline {10.3}Device build}{78}{section.10.3}%
|
|
\contentsline {section}{\numberline {10.4}Host unit tests}{78}{section.10.4}%
|
|
\contentsline {section}{\numberline {10.5}Documentation}{78}{section.10.5}%
|
|
\contentsline {section}{\numberline {10.6}Continuous integration}{79}{section.10.6}%
|
|
\contentsline {section}{\numberline {10.7}Hardware validation}{80}{section.10.7}%
|
|
\contentsline {chapter}{\numberline {11}Licensing}{81}{chapter.11}%
|
|
\contentsline {section}{\numberline {11.1}Hardware}{81}{section.11.1}%
|
|
\contentsline {section}{\numberline {11.2}Firmware}{81}{section.11.2}%
|
|
\contentsline {section}{\numberline {11.3}Documentation and project pages}{81}{section.11.3}%
|
|
\contentsline {section}{\numberline {11.4}Third-party components}{82}{section.11.4}%
|
|
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file
|