8.1. Bluetooth / FM controller firmware (WCN3990 “Cherokee”)¶
bluetooth_a is not an MBN/ELF firmware image like the coprocessor
partitions — it is a FAT filesystem holding the patch and NVM (non-volatile
config) files for the on-package Bluetooth + FM controller. Unlike the PIL
images (TZ, HYP, ADSP, …) which XBL loads and authenticates at boot, these files
are pushed into the controller by the kernel’s Bluetooth driver after the OS
is up — but the firmware itself is below the Android userspace, so it is in scope
here.
The device tree names the part exactly (artifacts/boot_a/board.dts):
bt_wcn3990 { compatible = "qca,wcn3990"; };
wcn3990 { compatible = "qcom,btfmslim_slave";
qcom,btfm-slim-ifd = "btfmslim_slave_ifd";
qcom,btfm-slim-ifd-elemental-addr = [00 00 20 02 17 02]; };
so the connectivity part is the Qualcomm QCA WCN3990 — an integrated
WLAN + Bluetooth + FM combo. Its WLAN side is the Helium firmware
(WLAN.HL.3.3.1-01884 in core_nhlos_a, loaded via qcom,icnss into
wlan_fw_region@0x8b500000 — MSA phandle 0xb9 in Base kernel device tree (the SoC boot contract));
its Bluetooth/FM side is the Cherokee firmware in this partition. The two
are the two subsystems of the same WCN3990 die. (NFC is a separate device;
cellular MPSS is dormant, ADSP and CDSP firmware.)
8.1.1. Container¶
FAT (MSDOS5.0 BPB, volume label “NO NAME”), partition size 1 MiB. The BPB
uses 4096-byte sectors (matching the UFS logical block size,
Partition map and checksums), 4 sectors/cluster, 2 FATs. Files use VFAT long
names; the payload is the standard QCA Cherokee set — crbtfwNN.tlv (BT patch,
TLV-framed) paired with crnvNN.bin (BT NVM/calibration defaults), one pair per
controller ROM revision:
Type |
Size(s) |
Role |
|---|---|---|
|
230,260 (×2), 125,120, 56,180, 56,052, 29,368 |
|
|
5,516 (×2), 4,875, 4,710, 3,936, 2,798, 1,243 |
|
8.1.2. Version inventory¶
Embedded QC_IMAGE-style tags identify the Cherokee firmware revisions carried
— selected at runtime by the driver based on the reported rom_version/
build_version (see Load mechanism below); that these five tags
correspond to distinct silicon-stepping variants, specifically, is inferred
from the naming/count, not confirmed from any Qualcomm document:
BTFM.CHE.1.1.0-00027-QCACHROM-1BTFM.CHE.2.0.0-00082-QCACHROMZ-1BTFM.CHE.2.1.5-00291-QCACHROMZ-1BTFM.CHE.3.2.1-00273-QCACHROMZ-2CI_BTFM.CHE.2.0.0-00076.1-QCACHROM-16(a CI build)
BTFM.CHE = Bluetooth + FM, CHErokee (the WCN3990 BT/FM core);
QCACHROMZ is the build variant. Multiple revisions (1.1 → 3.2) are shipped
together, consistent with covering more than one WCN3990 stepping variant —
the same inference as above, not confirmed from any Qualcomm document.
8.1.3. Load mechanism¶
The controller reports its own ROM identity, logged with the legacy patch-download format string retained from the earlier “Rome” combo:
Rome Patch... rom_version(0x%04x), build_version(0x%04x)
The host driver reads rom_version / build_version from the WCN3990 BT
core, selects the matching crbtfwNN.tlv + crnvNN.bin, and downloads the
TLV patch and NVM over the BT transport before the controller is brought up.
(The “Rome Patch” wording is the historical name for this TLV patch mechanism; the
silicon here is Cherokee/WCN3990, per the device tree, not Rome.)
8.1.4. Controller features (from firmware strings)¶
Coexistence with the on-die WLAN and with LTE:
MCI_LOG BT WAIT CAL TO,MCI_LOG WLAN GRANT BT CAL(MCI = the WLAN↔BT message/coexistence interface), plus_COEX_MWS_,LTE STATE_IND/E_INDandSEND BT CAL/BT CAL DONE— the MWS (Mobile Wireless Standards) coex and BT calibration hand-shakes.BLE Audio-over-LE (AoLE):
AOLE: Voice,AOLE: SM,B_LE_AoL,SDB_LE_Ao— LE audio / voice streaming state machine.BLE multi-advertising (
MultiAdvInf) and temperature calibration (TempCal/Write_TempCal) — RF drift compensation.FM radio shares the die; BT/FM audio is routed over SLIMbus (
btfmslim_slave, elemental address00 00 20 02 17 02above) to the audio codec, distinct from the HCI control transport.
8.1.5. Relationship to the rest of the platform¶
This partition is one of the connectivity firmwares; the picture across the WCN3990 combo is:
Subsystem |
Firmware |
Loaded by / into |
|---|---|---|
WLAN |
Helium |
|
Bluetooth / FM |
Cherokee |
host BT driver → WCN3990 BT core; audio via SLIMbus |
Unlike the boot-critical PIL images, bluetooth_a is not part of the
authenticated boot chain — it is plain FAT content read at runtime — so a
bootloader replacement neither loads it nor is constrained by it. It is documented
here to complete the connectivity firmware census alongside the WLAN image.
8.1.6. Provenance¶
- Source:
_READONLY/lun4/bluetooth_a.bin(read-only); part identity fromartifacts/boot_a/board.dts(qca,wcn3990/btfmslim_slavenodes).- Method:
BPB/FAT header read; VFAT long-name and 8.3 directory-entry enumeration (file names/sizes);
stringscensus for theBTFM.CHEversion tags, the patch-download log format, and the coex / AoLE / TempCal feature tokens. No code executed; no files extracted.- Cross-refs:
ADSP and CDSP firmware (WLAN Helium firmware, MPSS), Base kernel device tree (the SoC boot contract) (ICNSS WLAN MSA region, connectivity DT nodes), Partition map and checksums (FAT partition, UFS block size), Secure world and coprocessors (TZ, HYP, trustlets) (contrast: PIL-authenticated coprocessors).