BTUSB 探测、固件与电源管理
1. Probe
btusb_probe()匹配USB ID/interface class和driver_info quirks:
-找到interrupt、bulk、isoc endpoints;
-分配 btusb_data和 hci_dev;
-设置 open/close/flush/send/notify;
-按Intel/Realtek/Broadcom/MediaTek等覆盖setup回调;
-claim相关interface;
-hci_register_dev()。
2. RX URBs
- interrupt IN:HCI events;
- bulk IN:ACL;
- isochronous IN:SCO;
-部分设备用bulk传ISO。
Completion校验status/length,提交HCI frame并在运行状态下resubmit。
3. TX
- command走control URB;
- ACL走bulk OUT;
- SCO走isoc OUT;
-ISO依设备能力。
Anchor跟踪in-flight URBs,close/disconnect时统一kill。
4. SCO
Voice连接数变化触发work,选择alternate setting和isoc packet size。USB bandwidth或altsetting错误表现为A2DP正常但HFP语音失败。
5. 厂商初始化
USB ID/版本决定:
-Intel firmware和bootloader mode;
-Realtek patch/config;
-Broadcom patchram;
-MediaTek firmware;
-QCA/Atheros下载或quirk。
不能只按USB VID推断firmware文件名。
6. Suspend
btusb_suspend():
-阻止新TX;
-检查/等待busy计数;
-停止URBs;
-保存wake相关状态。
btusb_resume()重提RX URBs、恢复isoc和queued deferred TX。USB autosuspend由 enable_autosuspend及Kconfig默认控制。
7. Remote wake
控制器、USB host和平台电源域均需支持。若combo module电源被Rockchip rfkill切断,USB remote wake无法弥补。
8. Disconnect
必须处理主interface和isoc/diag interface先后disconnect,避免二次unregister。
9. 调试
1 | lsusb -t |
频繁 -71/-110通常先检查USB信号、电源和autosuspend,而不是HCI协议。
正在加载留言…