# 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 密钥派生
