aic8800 0.1.0

AIC8800 Wi-Fi driver core (SDIO, firmware, WPA2, SoftAP). OS-independent; runtime capabilities are injected via aic8800::WifiRuntime.
# aic8800

AIC8800 系列 WiFi 芯片驱动核心,通过 SDIO 总线通信。**OS 无关**:核心代码不直接
依赖任何操作系统运行时;定时、休眠、让步、任务派生等能力通过 `aic8800::WifiRuntime`
trait 注入,由上层 OS glue 在初始化时调用 `aic8800::set_runtime` 安装。

支持芯片:AIC8801、AIC8800DC、AIC8800D80、AIC8800D80X2。

## 用法

平台相关的资源(MMIO 映射、SDHCI 枚举、IRQ 注册)由上层 OS glue 负责;本 crate 从
一个已就绪的 SDIO host 开始完成芯片侧 bring-up,并返回一个 `AicWifiNetDev`——它
同时是数据面(`rd_net::Net` 设备)和控制面(实现 `rd_net::WifiControl`)。

```rust
// 1. OS glue 注入运行时能力(一次,进程级)
aic8800::set_runtime(MY_RUNTIME);

// 2. 用已枚举好的 SDIO host 探测芯片,得到设备句柄
let mut wifi = aic8800::probe(sdio)?;   // -> AicWifiNetDev

// 3. SoftAP 或 STA(rd_net::WifiControl)
wifi.start_ap_open(b"MyAP", 6)?;          // 开放 SoftAP
// wifi.connect("SSID", "password")?;     // 或连接 STA

// 4. 把设备交给 ax-driver 注册进 rd-net / ax-net 设备模型
```

运行时能力通过 trait 注入,不直接依赖 OS crate:

- `aic8800::WifiRuntime``now_nanos` / `sleep_ms` / `yield_now` /
  轮询任务派生等,由 OS glue 实现并经 `set_runtime` 安装。
- 接收数据帧的唤醒走 `rd_net::WifiControl::set_rx_wake` 注册的回调(SDIO Wi-Fi
  走带外 RX,不经以太网 IRQ 框架)。

## 模块

```
src/
├── lib.rs              # crate 入口,re-export(probe / WifiRuntime / set_runtime)
├── common/             # 芯片型号、SDIO 寄存器地址、CRC 等常量
├── runtime.rs          # WifiRuntime 注入点(全局 set-once)
├── wireless/           # probe() 入口
├── fw/                 # 固件加载
│   ├── chip/           #   芯片版本检测与验证
│   ├── config.rs       #   BSP 系统配置常量
│   ├── firmware/       #   固件二进制选择与上传
│   └── protocol/       #   IPC 传输层 (SDIO CMD53 内存读写)
└── fdrv/               # WiFi 驱动核心
    ├── consts.rs       #   协议常量
    ├── core/           #   总线管理、SDIO 传输、初始化、PollSet
    ├── crypto/         #   WPA2-PSK 四次握手 (PRF、AES-CCM、MIC)
    ├── net/            #   网络设备适配 (rd-net / rdif-eth)
    ├── protocol/       #   LMAC 命令/响应、扫描、连接、密钥安装
    ├── thread/         #   RX/TX/AP 轮询任务
    └── wifi/           #   高级 API (WifiClient) 和连接管理
```

## 支持的安全模式

- Open (无加密)
- WPA2-PSK / CCMP

## 固件

固件二进制(AICSemi 厂商 blob)**不随 crate 分发**,也不提交到仓库、不进发布
tarball。`build.rs` 在编译时把它们准备到 `OUT_DIR/firmware/`,`src/fw/firmware/data.rs`
再从那里 `include_bytes!` 嵌入;每个文件都按 SHA-256 逐字节校验。

`build.rs` 的固件来源优先级(命中即止):

1. `$AIC8800_FIRMWARE_DIR/<name>` — 显式本地缓存 / 离线镜像目录。
2. 仓库内 `components/aic8800/firmware/<name>` — 由 `cargo xtask` 预下载填充;
   在本仓库内(含离线)编译时走这条,**不联网**3. 从上游 pin 的 commit 下载 — 用于脱离本仓库的独立构建(如 crates.io)。

清单、摘要与上游 pin 见 [`build.rs`](build.rs) 与
[`scripts/axbuild/src/firmware.rs`](../../scripts/axbuild/src/firmware.rs)(两份保持同步),
来源与文件列表见 [`firmware/README.md`](firmware/README.md)。

> 因此发布包可独立构建:`cargo publish` 校验 tarball 时会执行本 crate 的
> `build.rs` 自行准备固件,不依赖仓库根目录 `cargo xtask` 的预下载副作用。

## 依赖

- `sdio-host-cv1800` — SDIO 总线抽象 trait
- `sdhci-cv1800` — SG2002 SDHCI 控制器实现
- `rd-net` / `rdif-eth` / `dma-api` — 网络设备能力与 `WifiControl` 控制面 trait
- `aes`, `hmac`, `sha1`, `pbkdf2` — WPA2 密钥派生