wifi驱动适配源码实现分析 概述它是典型的适配器模式——屏蔽底层 HCI 操作细节给上层提供统一的扫描发现能力上层 (shareservice 等) ↓ 调用标准接口 driver_ble_discovery.c ← 适配层承上启下 ↓ 操作 HCI socket Linux 内核蓝牙协议栈1. 向上提供统一接口通过 softbus_ble_discovery_interface.h 对上层暴露标准接口如SoftbusBleDiscoveryStartScan— 开始扫描SoftbusBleDiscoveryStopScan— 停止扫描SoftbusBleDiscoveryRegisterScanListener— 注册扫描监听SoftbusBleDiscoveryUnRegisterScanListener— 反注册扫描监听上层如 shareservice只调用这些接口不关心底层实现。2. 向下适配 Linux HCI 层通过直接操作 Linux Bluetooth HCI socket 实现扫描功能DriverExtendBleScanSwitch— 发送 HCI 命令控制扫描开关ExtendedEventListenerThread— 通过 HCI socket 轮询读取 BLE 广播包ProcessExtendedBleAdvEvent— 解析 HCI 层上报的扩展广播数据SoftbusBleDiscoveryStartScan参数说明scannerId扫描通道ID项目定义了8个通道可实际上只用到了1个1号。每个通道包含| 字段 | 含义 | |----------------|-----------------------| | isUsed | 该通道是否已被注册占用 | | isScanning | 该通道是否正在扫描 | | scannerId | 通道编号等于数组下标| | scanCallback | 上层注册的回调函数 |softbusscanparams----HCI扫描物理参数typedef struct { uint8_t scanType; // 扫描类型被动扫描(0) / 主动扫描(1) uint8_t scanPhy; // 扫描物理信道1M PHY / 2M PHY / Coded PHY uint8_t scanFilterPolicy; // 过滤策略接受所有 / 只接受白名单 uint8_t frameType; // 帧类型 uint16_t scanInterval; // 扫描间隔单位 0.625ms uint16_t scanWindow; // 扫描窗口单位 0.625ms } SoftBusBcScanParams;这些参数会通过ConvertSoftbus2HciExtScanParams转换成 HCI 命令直接下发给蓝牙控制器控制硬件层面怎么扫描参数作用举例scanInterval每隔多久扫描一次100即 62.5msscanWindow每次扫描持续多久50即 31.25msscanPhy用哪个物理信道Coded PHY远距离scanType主动扫描会发 SCAN_REQ 请求更多数据主动扫描可获取 ScanRspSoftBusBcScanFilter *scanFilter— 过滤条件数组typedef struct { uint16_t serviceUuid; // 服务 UUID uint32_t serviceDataLength; // 服务数据长度 uint16_t manufactureId; // 厂商 ID uint32_t manufactureDataLength; // 厂商数据长度 int8_t *address; // 设备 MAC 地址 int8_t *deviceName; // 设备名称 uint8_t *serviceData; // 服务数据 uint8_t *serviceDataMask; // 服务数据掩码 uint8_t *manufactureData; // 厂商数据 uint8_t *manufactureDataMask; // 厂商数据掩码 uint8_t filterIndex; // 过滤器索引 } SoftBusBcScanFilter;作用启动蓝牙扫描阶段一参数校验① 检查入参 param / scanFilter / filterSize 是否合法 ② 检查 scanCallback 是否已注册否则启动后无法回调通知上层LOGI(Enter scannerId%d, scannerId); if (param NULL || scanFilter NULL || filterSize 0) { LOGE(invalid param, scannerId%d, scannerId); return SOFTBUS_INVALID_PARAM; } // 调用启动回调 if (g_scanChannel[scannerId].scanCallback NULL || g_scanChannel[scannerId].scanCallback-OnStartScanCallback NULL) { LOGE(invalid param, OnStartScanCallback is null); return SOFTBUS_INVALID_PARAM; }阶段二状态检查作用检查通道未注册或者已经在扫描就提前解锁返回错误加锁 g_scannerLock → 检查扫描通道是否已注册isUsed → 检查是否已经在扫描isScanning 解锁 g_scannerLock// 获取互斥锁 if (pthread_mutex_lock(g_scannerLock) ! 0) { LOGE(lock failed, scannerId%d, scannerId); return SOFTBUS_LOCK_ERR; } // 检查扫描通道状态 if (!CheckScanChannelInUsed(scannerId)) { LOGE(scanner is not in used, scannerId%d, scannerId); pthread_mutex_unlock(g_scannerLock); return SOFTBUS_BC_ADAPTER_NOT_IN_USED_FAIL; } // 检查是否已经在扫描 if (g_scanChannel[scannerId].isScanning) { LOGE(already scanning, scannerId%d, btScanId%d, scannerId, g_scanChannel[scannerId].scannerId); pthread_mutex_unlock(g_scannerLock); return SOFTBUS_ALREADY_TRIGGERED; } pthread_mutex_unlock(g_scannerLock);sharkit暂时先看到这吧PL和我说让我负责文件互传模块WiFi适配暂时搁置阶段三启动底层扫描调用 DriverBleDiscoveryStartScan() → 向 HCI 层发送扫描命令 再次加锁 g_scannerLock → 根据 HCI 返回值更新 isScanning 状态 解锁 g_scannerLock阶段四通知上层启动结果作用不直接在当前线程回调上层而是丢到线程池异步执行。这是为了避免回调中如果上层又调用了其他接口比如 StopScan形成同线程递归调用导致死锁。malloc 一个 ScanResultReportData ThreadPoolAdd(ThreadOnStartScanCallback) → 通过线程池异步回调上层阶段五启动事件监听线程作用事件监听线程通过 HCI socket 持续读取 BLE 广播包。如果线程创建失败会回滚调用DriverExtendBleScanSwitch(false)停止 HCI 扫描并将isScanning置回 false。设置全局 g_scannerId scannerId pthread_create(ExtendedEventListenerThread) → 创建事件监听线程

相关新闻

最新新闻

高效D类音频放大系统设计与实现

高效D类音频放大系统设计与实现

1. 项目概述:构建高效D类音频放大系统在DIY音频和嵌入式系统开发领域,如何在小体积内实现高保真、大功率的音频输出一直是个挑战。传统AB类放大器虽然音质优秀,但发热量大、效率低下;而D类放大器通过PWM调制技术,能在保…

2026/7/3 19:48:45
如何修复Android设备认证问题:Play Integrity Fix完全指南

如何修复Android设备认证问题:Play Integrity Fix完全指南

如何修复Android设备认证问题:Play Integrity Fix完全指南 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 你是否曾经遇到过这种情况:解锁…

2026/7/3 19:48:45
IDM激活脚本:安全冻结30天试用期的开源解决方案

IDM激活脚本:安全冻结30天试用期的开源解决方案

IDM激活脚本:安全冻结30天试用期的开源解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为IDM试用期到期而烦恼吗?每次重置都…

2026/7/3 19:48:45
ComfyUI工作流自动化技术方案:高效转换架构解析

ComfyUI工作流自动化技术方案:高效转换架构解析

ComfyUI工作流自动化技术方案:高效转换架构解析 【免费下载链接】ComfyUI-to-Python-Extension A powerful tool that translates ComfyUI workflows into executable Python code. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-to-Python-Extension …

2026/7/3 19:48:45
经典游戏焕新计划:用WidescreenFixesPack告别拉伸时代

经典游戏焕新计划:用WidescreenFixesPack告别拉伸时代

经典游戏焕新计划:用WidescreenFixesPack告别拉伸时代 【免费下载链接】WidescreenFixesPack Plugins to make or improve widescreen resolutions support in games, add more features and fix bugs. 项目地址: https://gitcode.com/gh_mirrors/wi/WidescreenFi…

2026/7/3 19:48:45
DeepChem分子指纹终极指南:ECFP与FCFP如何选择?新手必看!

DeepChem分子指纹终极指南:ECFP与FCFP如何选择?新手必看!

DeepChem分子指纹终极指南:ECFP与FCFP如何选择?新手必看! 【免费下载链接】deepchem Democratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology 项目地址: https://gitcode.com/GitHub_Trending…

2026/7/3 19:43:45

周新闻

月新闻