premier push
This commit is contained in:
commit
b03b6c8197
405 files changed
+152754
No files matched your search
@@ -0,0 +1,105 @@
|
||||
# Architecture de QualcommWireless
|
||||
|
||||
Ce document détaille l'architecture logicielle et matérielle du pilote unifié **QualcommWireless** pour les puces combinées **Qualcomm FastConnect 7800** (SoC WCN7850) sous macOS Sequoia (15.x) et versions ultérieures.
|
||||
|
||||
---
|
||||
|
||||
## 1. Vue d'Ensemble du Matériel WCN7850
|
||||
|
||||
Le module sans fil Qualcomm FastConnect 7800 (WCN7850) utilise une architecture à double bus physique :
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph Host["Système Hôte (macOS Sequoia - Darwin 24)"]
|
||||
subgraph Kernel["Kernel Space (XNU / IOKit)"]
|
||||
IO80211["com.apple.iokit.IO80211Family\n(IO80211Controller)"]
|
||||
IOUSB["com.apple.iokit.IOUSBHostFamily\n(IOUSBHostDevice / Interface)"]
|
||||
QWifi["QualcommWifi.kext\n(Driver Wi-Fi 7 Natif)"]
|
||||
QBt["QualcommWireless.kext\n(Initialisation & Firmware BT)"]
|
||||
end
|
||||
subgraph Userland["Espace Utilisateur"]
|
||||
AirportD["airportd / CoreWLAN / Control Center"]
|
||||
BtD["bluetoothd / IOBluetoothFamily daemon"]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph Hardware["Qualcomm FastConnect 7800 (WCN7850)"]
|
||||
subgraph PCIeBus["Bus PCIe Gen3 x1 (VID 0x17cb, PID 0x1107)"]
|
||||
BAR0["MMIO BAR0 (512 Ko)"]
|
||||
Windowing["Registre Fenêtrage (0x310c)"]
|
||||
BHI["Boot Host Interface (BHI/BHIe)"]
|
||||
MHI["Modem Host Interface (MHI v1.0)"]
|
||||
AMSS["Firmware Wi-Fi 7 (AMSS)"]
|
||||
end
|
||||
subgraph USBBus["Bus USB 2.0 (VID 0x0489, PID 0xe10d)"]
|
||||
EP0["Contrôle EP0 (Requêtes Vendeur QCA)"]
|
||||
EP2["Bulk OUT EP2 (DFU Firmware Upload)"]
|
||||
EP1["Interrupt IN EP1 (Événements HCI)"]
|
||||
ROM["ROM Qualcomm & Patch RAM"]
|
||||
end
|
||||
end
|
||||
|
||||
AirportD -->|Apple80211 IOCTL / Skywalk| IO80211
|
||||
IO80211 --> QWifi
|
||||
QWifi -->|BAR0 Windowing / MHI / Ring DMA| BAR0
|
||||
BAR0 --> Windowing
|
||||
Windowing --> BHI
|
||||
BHI --> AMSS
|
||||
|
||||
BtD -->|UserClient / HCI Packets| IOUSB
|
||||
IOUSB --> QBt
|
||||
QBt -->|DFU Rampatch & NVM| EP2
|
||||
QBt -->|HCI Reset| EP0
|
||||
```
|
||||
|
||||
### Caractéristiques Physiques
|
||||
1. **Partie Wi-Fi (PCIe)** :
|
||||
- Identifiant : `0x17cb:0x1107`
|
||||
- Protocole : 802.11a/b/g/n/ac/ax/be (Wi-Fi 7)
|
||||
- Bandes de fréquence : 2.4 GHz, 5 GHz, 6 GHz
|
||||
- Largeur de canal maximale : 320 MHz, modulation 4096-QAM
|
||||
- Débit théorique : jusqu'à 5.8 Gbps
|
||||
- Bus d'interface : PCI Express Gen3 x1
|
||||
|
||||
2. **Partie Bluetooth (USB)** :
|
||||
- Identifiant : `0x0489:0xe10d` (Foxconn / Hon Hai WCN7850 HCI)
|
||||
- Spécification : Bluetooth 5.4, LE Audio, Auracast
|
||||
- Bus d'interface : USB 2.0 haute fidélité (connecté en interne sur port USB de la carte mère)
|
||||
|
||||
---
|
||||
|
||||
## 2. Découpage du Pilote Kernel
|
||||
|
||||
Le pilote est structuré en deux classes IOKit distinctes et complémentaires au sein du bundle :
|
||||
|
||||
### 2.1. `QualcommWifi` (`IO80211Controller`)
|
||||
- **Rôle** : Pilote Wi-Fi natif.
|
||||
- **Classe parente** : `IO80211Controller` (de `com.apple.iokit.IO80211Family`).
|
||||
- **Fournisseur (Provider)** : `IOPCIDevice` (`pci17cb,1107`).
|
||||
- **Gestion MMIO & Fenêtrage** :
|
||||
- La mémoire de configuration et de contrôle du WCN7850 s'étend sur plusieurs mégaoctets de registres internes, mais le BAR0 PCIe n'expose qu'une fenêtre de 512 Ko.
|
||||
- Le pilote implémente le fenêtrage dynamique Qualcomm via le registre `0x310c` (`ATH12K_PCI_WINDOW_REG_ADDRESS`). Pour toute adresse au-delà de 512 Ko, l'offset de fenêtre est programmé à la volée.
|
||||
- **Cycle de vie du Firmware MHI / BHI** :
|
||||
1. Reset global du SoC (`0x3008`).
|
||||
2. Lecture de la révision matérielle TCSR (`0x1B00000`).
|
||||
3. Allocation des descripteurs DMA 36-bit alignés sur 4 Ko (`ATH12K_DMA_MASK_36BIT_PAGE`).
|
||||
4. Initialisation du Boot Host Interface (BHI).
|
||||
5. Chargement en mémoire des firmwares `amss.bin`, `m3.bin`, et `board-2.bin`.
|
||||
6. Transition de l'environnement d'exécution (Execution Environment) de `PBL` (Primary Boot Loader) vers `AMSS`.
|
||||
7. Établissement des anneaux de commande, d'événements et de données MHI (M0 State).
|
||||
- **Intégration macOS 802.11** :
|
||||
- Traitement natif des commandes IOCTL `APPLE80211_IOC_*` (SSID, scan passif/actif, BSSID list, RSSI, canal, association).
|
||||
- Fourniture d'une véritable interface sans fil reconnue par le Centre de Contrôle et `airportd`.
|
||||
|
||||
### 2.2. `QualcommWireless` (`IOService`)
|
||||
- **Rôle** : Initialisation du contrôleur Bluetooth USB et téléversement du Rampatch & NVM.
|
||||
- **Classe parente** : `IOService`.
|
||||
- **Fournisseur (Provider)** : `IOUSBHostDevice` (`0x0489:0xe10d`).
|
||||
- **Protocole de démarrage** :
|
||||
1. Interrogation de la version matérielle (`QCA_GET_TARGET_VERSION`).
|
||||
2. Vérification de l'état du microprogramme (`QCA_CHECK_STATUS`).
|
||||
3. Téléversement du RAMPATCH binaire (`rampatch_usb_00190200_bin`) via le pipe Bulk OUT (EP2) avec header DFU de 40 octets.
|
||||
4. Téléversement de la configuration NVRAM (`nvm_usb_00190200_bin`) avec header DFU de 4 octets.
|
||||
5. Envoi d'un `HCI_Reset` (`0x03, 0x0c, 0x00`) via requête de contrôle USB.
|
||||
6. Injection des métadonnées `IORegistry` (`USB Product Name`, `kUSBHostPortType=255`, spoofing `idVendor=0x0a12`).
|
||||
7. Fermeture propre des pipes et libération de l'accès exclusif afin que le daemon `bluetoothd` prenne la main sans conflit.
|
||||
@@ -0,0 +1,106 @@
|
||||
# Diagnostic & Architecture Bluetooth (Qualcomm WCN7850)
|
||||
|
||||
Ce document décrit en profondeur le fonctionnement du sous-système Bluetooth de la puce **Qualcomm FastConnect 7800 (WCN7850)**, l'analyse détaillée du crash au démarrage de session macOS, et la solution définitive.
|
||||
|
||||
---
|
||||
|
||||
## 1. Description du Contrôleur Bluetooth
|
||||
|
||||
- **Identifiants matériels** :
|
||||
- Vendeur : `0x0489` (Foxconn / Hon Hai)
|
||||
- Produit : `0xe10d`
|
||||
- Nom du chipset : Qualcomm WCN7850 Bluetooth 5.4 HCI
|
||||
- Bus : USB 2.0 (Interface 0 : Contrôle/Bulk HCI, Interface 1 : SCO Audio)
|
||||
- **Rôle dans macOS** :
|
||||
- Fournit la couche transport HCI (Host Controller Interface) au daemon système `bluetoothd`.
|
||||
- Gère les périphériques HID (claviers, souris, Magic Trackpad), les casques audio A2DP/HFP, et les fonctionnalités Continuity / AirDrop si la carte Wi-Fi est associée.
|
||||
|
||||
---
|
||||
|
||||
## 2. Analyse Post-Mortem du Kernel Panic au Login
|
||||
|
||||
### 2.1. Symptômes observés
|
||||
- Au démarrage, l'écran de verrouillage macOS s'affiche correctement.
|
||||
- Dès que le mot de passe utilisateur est validé et que la session commence à charger, l'écran se fige complètement puis la machine redémarre (Kernel Panic).
|
||||
|
||||
### 2.2. Traces du Kernel Panic (`Kernel-2026-10-15-174229.panic`)
|
||||
```text
|
||||
panic(cpu 0 caller 0xffffff800ec4b86d): A kext releasing a(n) IOBluetoothL2CAPChannel has corrupted the registry. @OSObject.cpp:224
|
||||
Panicked task 0xffffff8b71de3980: 235 threads: pid 0: kernel_task
|
||||
Backtrace (CPU 0), panicked thread: 0xffffff903e00ab30, Frame : Return Address
|
||||
0xfffffff2a9823bd0 : 0xffffff800edd07bd mach_kernel : _panic + 0x81
|
||||
0xfffffff2a9823cc0 : 0xffffff800ec4b86d mach_kernel : __ZNK8OSObject13taggedReleaseEPKvi + 0x8d
|
||||
0xfffffff2a9823cd0 : 0xffffff8010694464 com.apple.iokit.IOBluetoothFamily : __ZN17IOBluetoothDevice13removeChannelEP23IOBluetoothL2CAPChannel + 0xae
|
||||
0xfffffff2a9823d70 : 0xffffff8010697629 com.apple.iokit.IOBluetoothFamily : __ZN23IOBluetoothL2CAPChannel6stopWLEv + 0x65
|
||||
0xfffffff2a9823df0 : 0xffffff8010697583 com.apple.iokit.IOBluetoothFamily : __ZN23IOBluetoothL2CAPChannel4stopEP9IOService + 0x33
|
||||
0xfffffff2a9823e90 : 0xffffff800ecc7dd6 mach_kernel : __ZN9IOService15terminateWorkerEj + 0x8b6
|
||||
Kernel Extensions in backtrace:
|
||||
com.apple.iokit.IOBluetoothFamily(9.0)
|
||||
```
|
||||
|
||||
### 2.3. Cause Racine (Root Cause)
|
||||
1. **L'Intrusion de `IntelBTPatcher.kext`** :
|
||||
- Le kext tiers `IntelBTPatcher.kext` (conçu spécifiquement pour les puces Intel AX200/AX210) était resté activé (`Enabled: true`) dans le fichier `config.plist` d'OpenCore.
|
||||
- `IntelBTPatcher` intercepte et patche globalement les méthodes virtuelles de `IOBluetoothFamily` dans le noyau pour contourner des anomalies de paquets HCI propres à Intel.
|
||||
2. **Incompatibilité avec Darwin 24 (macOS 15 Sequoia)** :
|
||||
- Sous macOS 15 Sequoia, Apple a profondément remanié la gestion mémoire d'IOKit, notamment la validation des `taggedRelease` dans `OSObject.cpp:224`.
|
||||
- `IntelBTPatcher v2.5.0` (compilé pour Monterey/Ventura/Sonoma) n'est pas compatible avec cette sémantique et effectue une libération désynchronisée (double release ou tag invalide) lors de la fermeture d'un canal L2CAP.
|
||||
3. **Le déclencheur au Login** :
|
||||
- Dès la validation du mot de passe de session, `loginwindow` démarre `bluetoothd`.
|
||||
- Les périphériques Apple couplés (notamment la **Magic Mouse 2** `78:CA:39:F4:15:5A` et le **Magic Keyboard** `78:CA:39:4C:A3:9A`) établissent ou réinitialisent leurs canaux L2CAP (`HID ACL`).
|
||||
- Lors de la libération ou du renouvellement du canal L2CAP (`IOBluetoothDevice::removeChannel`), le hook corrompu d'IntelBTPatcher déclenche immédiatement l'assertion de corruption de registre du noyau (`OSObject::taggedRelease`), provoquant le kernel panic instantané.
|
||||
|
||||
---
|
||||
|
||||
## 3. Solution et Bonnes Pratiques
|
||||
|
||||
### 3.1. Désactivation définitive d'`IntelBTPatcher`
|
||||
Pour les cartes **Qualcomm FastConnect 7800**, `IntelBTPatcher` ne doit **JAMAIS** être utilisé :
|
||||
- Dans `/Volumes/EFI/EFI/OC/config.plist` :
|
||||
```xml
|
||||
<dict>
|
||||
<key>BundlePath</key>
|
||||
<string>IntelBTPatcher.kext</string>
|
||||
<key>Enabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
```
|
||||
- Suppression physique du bundle `IntelBTPatcher.kext` du dossier `EFI/OC/Kexts/`.
|
||||
|
||||
### 3.2. Rôle de `BlueToolFixup.kext`
|
||||
- `BlueToolFixup.kext` (de la suite BrcmPatchRAM / Acidanthera) est, quant à lui, **requis et compatible**.
|
||||
- Il patche dynamiquement `bluetoothd` en espace utilisateur pour accepter les dongles tiers non-Apple et débloquer les commandes de bas niveau (HCI Vendor Commands).
|
||||
- Arguments de démarrage recommandés dans `boot-args` :
|
||||
`-btlfxallowanyaddr -btlfxnvramcheck`
|
||||
|
||||
---
|
||||
|
||||
## 4. Séquence de Chargement du Firmware USB
|
||||
|
||||
Le firmware Bluetooth Qualcomm nécessite deux étages binaires téléversés au démarrage :
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant K as QualcommWireless (Kext)
|
||||
participant USB as Contrôleur USB WCN7850
|
||||
participant D as bluetoothd (macOS)
|
||||
|
||||
K->>USB: QCA_GET_TARGET_VERSION (Requête de contrôle vendeur)
|
||||
USB-->>K: Versions ROM / Patch / RAM
|
||||
K->>USB: QCA_CHECK_STATUS (Vérification statut)
|
||||
USB-->>K: Status 0x00 (RAMPATCH et Syscfg requis)
|
||||
K->>USB: EP0: Header DFU (40 octets)
|
||||
K->>USB: EP2 (Bulk OUT): RAMPATCH WCN7850 (paquets de 4096 octets)
|
||||
K->>USB: EP0: Header DFU (4 octets)
|
||||
K->>USB: EP2 (Bulk OUT): NVM WCN7850 (paquets de 4096 octets)
|
||||
K->>USB: HCI Reset (0x03, 0x0C, 0x00)
|
||||
USB-->>K: HCI Command Complete Event
|
||||
K->>K: Injection des propriétés IORegistry (spoofing CSR 0x0a12)
|
||||
K->>K: Libération de l'interface USB (close)
|
||||
Note over D,USB: bluetoothd prend la main en exclusivité
|
||||
D->>USB: Établissement transport HCI USB
|
||||
D->>USB: Connexion Magic Mouse 2 / Clavier (L2CAP)
|
||||
```
|
||||
|
||||
Grâce à cette séquence, le contrôleur Bluetooth WCN7850 opère de manière parfaitement stable sous macOS Sequoia sans aucun crash au démarrage de session.
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
# Compilation et Déploiement de QualcommWireless
|
||||
|
||||
Ce guide détaille les étapes pour compiler le kext **QualcommWireless** à partir des sources et l'intégrer proprement dans l'EFI OpenCore.
|
||||
|
||||
---
|
||||
|
||||
## 1. Prérequis Système
|
||||
|
||||
- **Système d'exploitation hôte** : macOS Sonoma (14.x) ou macOS Sequoia (15.x).
|
||||
- **Environnement de développement** : Xcode 15+ ou 16+ avec les outils en ligne de commande (`xcode-select --install`).
|
||||
- **SDK macOS** : macOS 15.x SDK (inclus dans Xcode).
|
||||
- **Architectures cibles** : Binaire universel `x86_64` (Hackintosh Intel/AMD) et `arm64e` (Apple Silicon).
|
||||
|
||||
---
|
||||
|
||||
## 2. Arborescence du Projet
|
||||
|
||||
```text
|
||||
QualcommWireless/
|
||||
├── .gitignore # Filtres pour conserver un dépôt git propre
|
||||
├── docs/ # Documentation technique détaillée
|
||||
│ ├── ARCHITECTURE.md # Vue d'ensemble matérielle & logicielle
|
||||
│ ├── BLUETOOTH.md # Analyse Bluetooth, diagnostic crash & fix
|
||||
│ ├── NATIVE_WIFI.md # Pile Wi-Fi native (IO80211Controller)
|
||||
│ └── BUILD.md # Ce guide de compilation et d'installation
|
||||
├── firmware/ # Binaires de microprogrammes WCN7850
|
||||
│ ├── amss.bin # Microprogramme principal Wi-Fi
|
||||
│ ├── board-2.bin # Données de calibration radio RF
|
||||
│ └── m3.bin # Microprogramme d'économie d'énergie M3
|
||||
├── QualcommWireless/ # Code source du pilote C++ / IOKit
|
||||
│ ├── Info.plist # Descripteur et personnalités IOKit
|
||||
│ ├── Firmware_WCN7850.h # Header des microprogrammes BT intégrés
|
||||
│ ├── Firmware_WCN7850_Wifi.h # Déclarations des microprogrammes Wi-Fi
|
||||
│ ├── QualcommWifi.hpp/.cpp # Implémentation du pilote Wi-Fi natif
|
||||
│ ├── QualcommWireless.hpp/.cpp # Implémentation de la partie Bluetooth USB
|
||||
│ └── include/ # Headers internes IOKit & 802.11
|
||||
└── QualcommWireless.xcodeproj # Projet Xcode configuré pour build KEXT
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Compilation
|
||||
|
||||
### 3.1. En Ligne de Commande (Recommandé)
|
||||
Depuis la racine du projet :
|
||||
|
||||
```bash
|
||||
xcodebuild -project QualcommWireless.xcodeproj -configuration Release
|
||||
```
|
||||
|
||||
Le bundle kext final est généré dans :
|
||||
`build/Release/QualcommWireless.kext`
|
||||
|
||||
### 3.2. Vérification du Binaire
|
||||
Pour s'assurer que le kext est bien un binaire universel prêt pour le chargement noyau :
|
||||
|
||||
```bash
|
||||
file build/Release/QualcommWireless.kext/Contents/MacOS/QualcommWireless
|
||||
```
|
||||
|
||||
Sortie attendue :
|
||||
```text
|
||||
Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit kext bundle x86_64] [arm64e]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Déploiement dans OpenCore
|
||||
|
||||
### 4.1. Copie du Kext dans l'EFI
|
||||
Montez votre partition EFI (ex. `/Volumes/EFI`), puis copiez le kext compilé :
|
||||
|
||||
```bash
|
||||
cp -R build/Release/QualcommWireless.kext /Volumes/EFI/EFI/OC/Kexts/
|
||||
```
|
||||
|
||||
### 4.2. Configuration dans `config.plist`
|
||||
|
||||
Dans la section `Kernel -> Add` de votre `config.plist` :
|
||||
|
||||
```xml
|
||||
<dict>
|
||||
<key>Arch</key>
|
||||
<string>Any</string>
|
||||
<key>BundlePath</key>
|
||||
<string>QualcommWireless.kext</string>
|
||||
<key>Comment</key>
|
||||
<string>Qualcomm FastConnect 7800 Wi-Fi & Bluetooth</string>
|
||||
<key>Enabled</key>
|
||||
<true/>
|
||||
<key>ExecutablePath</key>
|
||||
<string>Contents/MacOS/QualcommWireless</string>
|
||||
<key>MaxKernel</key>
|
||||
<string></string>
|
||||
<key>MinKernel</key>
|
||||
<string></string>
|
||||
<key>PlistPath</key>
|
||||
<string>Contents/Info.plist</string>
|
||||
</dict>
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
> **RÈGLE CRITIQUE POUR ÉVITER LES CRASHS :**
|
||||
> - **DÉSACTIVEZ ET SUPPRIMEZ `IntelBTPatcher.kext`**. Il est conçu uniquement pour les puces Intel et provoque un Kernel Panic immédiat à la connexion des périphériques Bluetooth sous macOS 15 Sequoia (`IOBluetoothL2CAPChannel` taggedRelease registry corruption).
|
||||
> - **CONSERVEZ `BlueToolFixup.kext`**, qui est indispensable pour activer la gestion des dongles tiers dans `bluetoothd`.
|
||||
|
||||
### 4.3. Arguments de Démarrage (`NVRAM -> boot-args`)
|
||||
Vérifiez la présence des arguments suivants pour assurer la compatibilité Bluetooth :
|
||||
```text
|
||||
-btlfxallowanyaddr -btlfxnvramcheck
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Diagnostic et Commandes Utiles
|
||||
|
||||
Pour vérifier l'état du système après un redémarrage :
|
||||
|
||||
- **Vérifier l'état du Bluetooth** :
|
||||
```bash
|
||||
system_profiler SPBluetoothDataType
|
||||
```
|
||||
- **Vérifier la détection USB du contrôleur** :
|
||||
```bash
|
||||
ioreg -l -r -n "IOUSBHostDevice@00a10000"
|
||||
```
|
||||
- **Consulter les journaux Bluetooth en temps réel** :
|
||||
```bash
|
||||
/usr/bin/log stream --predicate 'process == "bluetoothd"'
|
||||
```
|
||||
- **Vérifier les extensions noyau chargées** :
|
||||
```bash
|
||||
kmutil showloaded | grep -iE 'qualcomm|blue'
|
||||
```
|
||||
@@ -0,0 +1,116 @@
|
||||
# Pile Wi-Fi Native macOS pour Qualcomm WCN7850
|
||||
|
||||
Ce document détaille l'implémentation de la pile Wi-Fi **native** (`IO80211Controller`) pour le chipset **Qualcomm FastConnect 7800 (WCN7850)** sous macOS Sequoia (Darwin 24).
|
||||
|
||||
---
|
||||
|
||||
## 1. Pourquoi le Wi-Fi Natif et non l'Émulation Ethernet ?
|
||||
|
||||
Dans les premières ébauches de pilotes non officiels pour macOS, certains projets choisissaient d'émuler une interface réseau filaire standard (`IOEthernetController`), en masquant les détails Wi-Fi dans un daemon externe (comme `HeliPort`).
|
||||
|
||||
Cependant, cette approche présente des limitations rédhibitoires :
|
||||
- ❌ Pas d'intégration dans le menu Wi-Fi natif du Centre de Contrôle macOS.
|
||||
- ❌ Absence de géolocalisation par points d'accès Wi-Fi (CoreLocation).
|
||||
- ❌ Incompatibilité totale avec les services Apple (AirDrop, AirPlay, Continuité, Universal Control).
|
||||
- ❌ Impossibilité pour les applications utilisant `CoreWLAN.framework` de découvrir les réseaux, obtenir le RSSI, ou basculer de canal.
|
||||
|
||||
**QualcommWireless fait le choix d'une intégration 100% native** en dérivant directement de `IO80211Controller` (de `com.apple.iokit.IO80211Family`).
|
||||
|
||||
---
|
||||
|
||||
## 2. Architecture de `QualcommWifi` (`IO80211Controller`)
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph AppleStack["Sous-Système Sans Fil Apple"]
|
||||
CC["Centre de Contrôle macOS"]
|
||||
CoreWLAN["CoreWLAN.framework"]
|
||||
AirportD["airportd (Daemon Système)"]
|
||||
Skywalk["Skywalk Family (Packet Pipeline)"]
|
||||
IO80211["IO80211Family (IO80211Controller / IO80211Interface)"]
|
||||
end
|
||||
|
||||
subgraph Driver["QualcommWifi (Driver Kernel)"]
|
||||
IoctlHandler["Gestionnaire IOCTL Apple80211 (apple80211_ioctl)"]
|
||||
ScanEngine["Moteur de Scan (Passif / Actif / Multicanal)"]
|
||||
RingDMA["Gestionnaire DMA & Anneaux MHI (CR / ER / TR)"]
|
||||
FirmwarePipeline["Pipeline de Démarrage BHI / AMSS"]
|
||||
Windowing["Module Fenêtrage PCIe BAR0 (0x310c)"]
|
||||
end
|
||||
|
||||
subgraph Hardware["Qualcomm WCN7850 (PCIe 0x17cb:0x1107)"]
|
||||
PBL["Primary Boot Loader (PBL)"]
|
||||
MHIHardware["MHI Engine (Modem Host Interface)"]
|
||||
WlanFirmware["Firmware AMSS Wi-Fi 7 (ath12k/WCN7850)"]
|
||||
MacPhy["MAC / Baseband PHY (802.11a/b/g/n/ac/ax/be)"]
|
||||
end
|
||||
|
||||
CC --> AirportD
|
||||
CoreWLAN --> AirportD
|
||||
AirportD -->|apple80211_ioctl| IO80211
|
||||
Skywalk --> IO80211
|
||||
IO80211 --> IoctlHandler
|
||||
IoctlHandler --> ScanEngine
|
||||
ScanEngine --> RingDMA
|
||||
RingDMA --> Windowing
|
||||
FirmwarePipeline --> Windowing
|
||||
Windowing --> PBL
|
||||
PBL --> MHIHardware
|
||||
MHIHardware --> WlanFirmware
|
||||
WlanFirmware --> MacPhy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Communication Matérielle : MHI & Fenêtrage PCIe
|
||||
|
||||
### 3.1. Gestion du Fenêtrage PCIe BAR0
|
||||
Le bus PCIe expose un espace MMIO BAR0 de 512 Ko. Or, les composants internes du WCN7850 (SoC, registres MHI, BHI, mémoires partagées) s'étendent sur plusieurs mégaoctets :
|
||||
- **Registre de sélection de fenêtre** : `0x310c` (`ATH12K_PCI_WINDOW_REG_ADDRESS`).
|
||||
- **Calcul de la fenêtre** : Pour une adresse matérielle $A \ge 512\text{ Ko}$, le numéro de fenêtre est calculé par :
|
||||
$$\text{window} = (A \gg 19) \ \& \ 0x3F$$
|
||||
$$\text{offset} = 0x80000 \ | \ (A \ \& \ 0x7FFFF)$$
|
||||
- Le pilote met à jour dynamiquement `fCurrWindow` avant d'effectuer les écritures/lectures MMIO nécessaires.
|
||||
|
||||
### 3.2. Séquence de Boot MHI (Modem Host Interface)
|
||||
1. **Reset initial** via `ATH12K_PCI_SOC_GLOBAL_RESET` (`0x3008`).
|
||||
2. **Boot Host Interface (BHI/BHIe)** :
|
||||
- Initialisation des vecteurs de transmission (`ATH12K_BHIE_TXVECADDR_LOW` / `_HIGH`).
|
||||
- Transfert de l'image de firmware principale (`amss.bin`, taille ~6 Mo) et du fichier de calibration carte (`board-2.bin`, ~2.4 Mo).
|
||||
- Validation de la signature et exécution dans le SoC WCN7850.
|
||||
3. **Transition d'environnement MHI** :
|
||||
- Transition de l'état `PBL` (Primary Boot Loader) vers `AMSS` (Advanced Mobile Subscriber Software).
|
||||
- Configuration des anneaux MHI :
|
||||
- *Command Ring* (CR) : Envoi des requêtes d'initialisation WMI.
|
||||
- *Event Ring* (ER) : Réception asynchrone des événements et interruptions MSI-X.
|
||||
- *Transfer Rings* (TR) : Transmission et réception des paquets réseau 802.11.
|
||||
|
||||
---
|
||||
|
||||
## 4. Implémentation des IOCTLs Apple80211
|
||||
|
||||
Pour qu'un pilote soit reconnu par le sous-système Wi-Fi de macOS, il doit répondre aux requêtes de configuration `apple80211_ioctl` émises par `airportd` :
|
||||
|
||||
| Opération IOCTL | Rôle dans le système macOS |
|
||||
| :--- | :--- |
|
||||
| `APPLE80211_IOC_SSID` (GET / SET) | Lecture et définition du réseau Wi-Fi cible. |
|
||||
| `APPLE80211_IOC_SCAN_REQ_MULTIPLE` | Déclenchement d'un scan Wi-Fi (recherche des réseaux environnants pour l'interface graphique). |
|
||||
| `APPLE80211_IOC_SCAN_RESULT` | Remontée unitaire ou groupée des points d'accès découverts (SSID, BSSID, RSSI, Beacon, Type de sécurité WPA2/WPA3). |
|
||||
| `APPLE80211_IOC_BSSID_LIST` | Fourniture de la liste des BSSIDs disponibles dans le cache. |
|
||||
| `APPLE80211_IOC_CHANNEL` (GET / SET) | Lecture et bascule de canal (2.4 GHz, 5 GHz, 6 GHz). |
|
||||
| `APPLE80211_IOC_CHANNEL_INFO` | Enumération des canaux supportés (canaux 1 à 14, bandes 5 GHz UNII-1 à UNII-4, et canaux 6 GHz UNII-5 à UNII-8 pour le Wi-Fi 6E/7). |
|
||||
| `APPLE80211_IOC_PHY_MODE` | Déclaration des modes PHY supportés (`APPLE80211_MODE_11BE`, `11AX`, `11AC`, `11N`, `11G`, `11A`, `11B`). |
|
||||
| `APPLE80211_IOC_STATE` | État de la machine à états de l'interface (`RUN`, `INIT`, `SCAN`, `AUTH`, `ASSOC`). |
|
||||
| `APPLE80211_IOC_RSSI` | Niveau de signal courant (en dBm, typiquement entre -30 dBm et -95 dBm). |
|
||||
| `APPLE80211_IOC_RATE` | Débit négocié courant (jusqu'aux débits Wi-Fi 7 EHT MCS 0-13). |
|
||||
| `APPLE80211_IOC_TXPOWER` | Puissance d'émission radio déclarée. |
|
||||
|
||||
---
|
||||
|
||||
## 5. Prise en Charge du Wi-Fi 7 (802.11be)
|
||||
|
||||
La puce WCN7850 introduit les caractéristiques Wi-Fi 7 suivantes, intégrées dans la table des capacités du pilote :
|
||||
- **Canaux 320 MHz ultra-larges** en bande 6 GHz.
|
||||
- **Modulation 4096-QAM (4K-QAM)** augmentant la densité de données de 20% par rapport au 1024-QAM du Wi-Fi 6.
|
||||
- **Multi-Link Operation (MLO)** : Capacité matérielle d'agréger ou de basculer dynamiquement entre plusieurs bandes (ex. 5 GHz + 6 GHz) pour une latence ultra-faible.
|
||||
- **Preamble Puncturing** : Évitement automatique des sous-canaux brouillés pour maximiser la bande passante utilisable.
|
||||
Reference in new issue
Block a user