WiFi模块 driver驱动框架(sdio接口、pcie接口)

本文详细介绍了SDIO-WiFi模块的工作原理和技术细节,包括SDIO-WiFi模块的特点、SDIO总线协议、SDIO-WiFi模块如何在系统中被识别及驱动流程。此外还探讨了SDIO的传输模式及其在Linux系统中的驱动架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、WiFi driver驱动框架

  • 应用层
  • BSD socket层
  • TCP/IP协议层
  • IP层
  • 网络设备层
  • MAC层(802.11)
    (包括扫描、认证、关联、省电状态)
  • 设备驱动层

2、SDIO-Wifi模块

1、SDIO-Wifi模块介绍

SDIO-Wifi模块是基于SDIO接口的符合WiFi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快,兼容SD、MMC接口等特点。

对于SDIO接口的WiFi,首先,它是一个SDIO的卡设备,然后具备了WiFi的功能。所以,注册的时候还是先以sdio设备去注册,然后检测到卡之后再去实现它的wifi功能。显然,他是用SDIO的协议,通过发命令和数据来控制实现WiFi功能。

SDIO 故名思义,就是 SD 的 I/O 接口(interface)的意思,不过这样解释可能还有点抽像。更具体的说明,SD 本来是记忆卡的标准,但是现在也可以把 SD 拿来插上一些外围接口使用,这样的技术便是 SDIO

所以 SDIO 本身是一种相当单纯的技术,透过 SD 的 I/O 引脚来连接外围,并且透过 SD 上的 I/O 数据引脚与这些外围传输数据,而且 SD 协会会员也推出很完整的 SDIO stack 驱动程序,使得 SDIO 外围(我们称为 SDIO 卡)的开发与应用变得相当热门。目前常见的 SDIO 外围(SDIO 卡)有:

  • Wi-Fi card(无线网络卡)
  • CMOS sensor card(照相模块)
  • GPS card
  • GSM/GPRS modem card
  • Bluetooth card

SD卡与SDIO卡的异同

1.SD卡使用的是SD卡协议,而SDIO卡使用的是SDIO协议;协议不一样,初始化/读写方式都不一样
2.ARK1600控制器既支持SD卡也支持SDIO卡,在驱动上完全可以做到同一个卡槽既支持SD卡也支持SDIO卡,甚至combo卡,因此在驱动上有个判断过程,判断插进来的是SD卡还是SDIO卡
3.两者的引脚定义不一样,尽管引脚个数都一样

2、SDIO的传输模式有三种:

  • SPI mode(required)
  • 1-bit mode
  • 4-bit mode

依据 SD 标准,所有的 SD(记忆卡)与 SDIO(外围)都必须支持 SPI mode,因此 SPI mode 是「required」。

3、SDIO的硬件电路
在这里插入图片描述
可以看到,SDIO接口总共有七个引脚,分别是DAT0-3(数据),CLK(时钟),CMD(命令),VIO(电源)。

4、MMC子系统框架

这里的MMC子系统框架包含了Linux的SDIO驱动架构,所以姑且将其看作SDIO的驱动架构。

linux/driver/mmc目录下有三个子目录:card 、core、host,分别表示区块层、核心层、主机控制层。其中card层、core层是Linux封装好的、标准的东西,不需要修改,需要修改的是host层,这一层需要驱动开发工程师根据平台来完成。
在这里插入图片描述
Linux MMC子系统主要分成三个部分:

  • MMC核心层:完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供接口函数;
  • Host 驱动层:针对不同主机端的SDHC、MMC控制器的驱动;
  • Client 驱动层:针对不同客户端的设备驱动程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等设备驱动。

wifi驱动怎么知道使用那个sdio控制器?

读到这里不知道你们是不是有疑问,我们的SOC上有很多的sdio控制器,有些sdio控制器接emmc flash,有些接wifi模块,wifi驱动怎么知道我接在那个sdio控制器上呢?
其实是在wifi厂商提供的驱动里面会注册一个sdio_register_driver,当上电的时候我的emmc驱动会去扫描sdio的外围设备,当确认扫描到设备的时候会去读取设备的id即wifi模块的pid和vid,如果设备id匹配上了之后会调用使用sdio_register_driver注册进去的probe函数,从而确认我们的设备是接到那个sdio设备上。

usb wifi和sdio的wifi也是一样的,wifi模块插入usb口的时候,会读取usb模块的vid和pid,如果读取到的vid和pid和使用usb_register注册进去的设备的vid和pid是一样证明驱动匹配上了,然后调用probe函数。

原文链接:https://blog.csdn.net/qq_27809619/article/details/120281476

5、SDIO总线协议

SDIO总线 和 USB总线 类似,SDIO也有两端,其中一端是HOST端,另一端是device端。所有的通信都是由HOST端发送命令开始的,Device端只要能解析命令,就可以相互通信。 对于SDIO总线,它的HOST端是开发板mmc控制器,而device端则是各种带SDIO接口的模块,比如SDIO WiFi模块。

SDIO协议是由SD卡协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52和CMD53命令。由于这个,SDIO和SD卡规范间的一个重要区别就是增加了低速标准。低速卡的目标应用是以最小的硬件来支持低速I/O能力。

SD总线通信是基于指令和数据比特流,起始位开始和停止位结束。SD总线通信有三个元素:

  • Command:由host发送到卡设备,使用CMD线发送;
  • Response:从card端发送到host端,作为对前一个CMD的相应,通过CMD线发送;
  • Data:即能从host传输到card,也能从card传输到host,通过data线传输。

详细的代码注册流程分析请参考:https://blog.csdn.net/weixin_45244289/article/details/110002248

https://blog.csdn.net/Enosji/article/details/121513074

<think>好的,我现在需要帮助用户解决关于AP6398S驱动代码导致的DHD通用适配器无法启动的问题。首先,我得回顾用户之前的问题和我的回答,确保这次回答有连贯性。用户之前提到DHD适配器无法上电,现在他们想查找AP6398S驱动相关的解决方案,可能关联到同样的电源问题。 首先,用户提供的引用内容中,引用[1]是关于加速度计的驱动入口函数,引用[2]是网络设置的环境变量,引用[3]是输入设备的检查。这些引用似乎和当前问题关联不大,但可能需要留意是否有潜在的硬件配置问题。不过用户明确提到AP6398S驱动代码,所以需要聚焦在这里。 我需要回忆AP6398S的相关知识。AP6398S是博通的一个WiFi+蓝牙模块,通常使用DHD(Dynamic Host Driver驱动驱动无法上电的问题可能涉及电源管理、固件加载、总线配置或硬件兼容性。 接下来,我应该考虑以下几个方面: 1. **电源管理流程**:检查驱动中电源控制函数是否正确调用,比如`wifi_platform_set_power`是否正确设置电源状态,是否有GPIO或PMIC的控制错误。 2. **固件加载**:确认固件路径是否正确,固件文件是否存在,权限是否足够,以及固件版本是否与硬件匹配。 3. **总线配置**:AP6398S通常使用SDIOPCIe接口,需要检查设备树(Device Tree)中的配置,如SDIO总线号、时钟频率、电压设置是否正确。 4. **驱动兼容性**:确认驱动模块是否针对当前内核版本编译,是否应用了必要的补丁,特别是针对AP6398S的特定配置。 5. **内核日志分析**:用户之前提到用dmesg查看日志,需要指导用户检查相关错误信息,比如SDIO探测失败、固件加载错误或电源控制失败的具体原因。 6. **硬件检查**:建议用户检查硬件连接,如SDIO线路是否正常,电源供应是否稳定,必要时更换模块测试。 另外,用户提供的引用中有设置网络环境变量和输入设备的信息,虽然可能不直接相关,但需要排除其他硬件配置冲突的可能性。例如,网络设置是否正确可能影响驱动的初始化,但可能性较低。 然后,我需要参考之前给出的解决方案中的步骤,确保结构一致,比如检查电源管理、验证硬件配置、分析内核日志等,并针对AP6398S的具体情况调整内容。 可能还需要提供具体的代码示例,比如设备树节点的配置,驱动中的电源控制函数,以及固件加载的路径设置。同时,提醒用户注意内核版本和驱动模块的兼容性,以及如何通过工具(如示波器)检测硬件信号。 最后,生成相关问题,帮助用户深入排查问题,例如询问如何调试SDIO总线初始化失败,或者如何验证固件是否正确加载。这些问题应该围绕用户当前的问题展开,有助于他们进一步诊断。</think>### AP6398S驱动代码解决方案:DHD通用适配器上电失败问题排查 --- #### **1. 驱动初始化验证(关键步骤)** AP6398S芯片的驱动初始化需确保以下几点: ```c // 驱动入口函数需包含电源控制逻辑(参考引用[1]结构) static int ap6398s_wifi_power_on(struct device *dev) { // 1. 启用电源域(需匹配硬件设计) if (regulator_enable(vdd_3v3) != 0) { dev_err(dev, "Failed to enable 3.3V regulator\n"); return -EIO; } // 2. 触发上电复位信号(GPIO配置需与原理图一致) gpio_direction_output(wifi_pwr_gpio, 1); msleep(50); // 保持复位时间 // 3. 检查芯片就绪状态 if (!gpio_get_value(wifi_ready_gpio)) { dev_err(dev, "AP6398S power-up timeout\n"); return -ETIMEDOUT; } return 0; } // 驱动入口函数注册(类似引用[1]的HDF驱动框架) static struct sdio_driver ap6398s_driver = { .probe = ap6398s_probe, .remove = ap6398s_remove, .name = "ap6398s_wifi", .id_table = ap6398s_ids, }; ``` - **验证点**: - 确认 `regulator` 名称与设备树中的电源节点匹配(如 `vdd-wifi-3v3`) - 检查 `wifi_pwr_gpio` 和 `wifi_ready_gpio` 的引脚编号是否正确[^1] --- #### **2. 设备树配置(硬件匹配核心)** AP6398S的SDIO接口需在设备树中明确定义(参考引用[3]的硬件探测逻辑): ```dts // 示例:i.MX6ULL平台SDIO节点配置 &usdhc2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usdhc2>; bus-width = <4>; non-removable; keep-power-in-suspend; mmc-pwrseq = <&wifi_pwrseq>; status = "okay"; ap6398s: wifi@1 { compatible = "brcm,bcm4329-fmac"; reg = <1>; // 电源控制GPIO定义 wifi-pwr-gpios = <&gpio4 19 GPIO_ACTIVE_HIGH>; // 示例GPIO wifi-ready-gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>; }; }; // 电源序列控制器(关键) wifi_pwrseq: wifi_pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&gpio4 18 GPIO_ACTIVE_LOW>; post-power-on-delay-ms = <50>; }; ``` - **验证点**: - 确认 `mmc-pwrseq` 中的 `reset-gpios` 对应硬件复位引脚 - 检查 `bus-width` 是否与SDIO接口位宽一致(通常为4线) --- #### **3. 固件加载配置** AP6398S依赖固件文件(如 `fw_bcm43436c0_ag.bin`),需在驱动中指定路径: ```c // 驱动加载固件代码段 if (request_firmware(&fw, "brcm/fw_bcm43436c0_ag.bin", dev) != 0) { dev_err(dev, "Failed to load firmware\n"); return -ENOENT; } ``` - **操作步骤**: 1. 将固件文件放置到 `/lib/firmware/brcm/` 目录 2. 设置权限:`chmod 644 /lib/firmware/brcm/fw_bcm43436c0_ag.bin` 3. 检查内核配置是否启用 `CONFIG_EXTRA_FIRMWARE` --- #### **4. 内核日志分析** 通过 `dmesg` 定位错误(类似引用[3]的硬件探测方法): ```bash dmesg | grep -E "ap6398s|dhd|sdio|brcmfmac" ``` - **关键错误类型**: - `brcmfmac: Firmware version = ...`(成功加载) - `brcmfmac: Failed to power up SDIO card`(电源控制失败) - `mmc1: card claims broken SDIO signaling`(总线时序问题) --- #### **5. 硬件信号测量** 若驱动初始化失败,需使用示波器验证: - **测量点**: - SDIO_CLK 频率(通常为25-50MHz) - 复位引脚(`wifi_pwr_gpio`)电平是否拉高 - 3.3V电源纹波(需 < 100mV) --- ### 相关问题 1. **如何解决AP6398S驱动加载后出现的 `brcmfmac: SDIO probe failed, err=-110` 错误?** *提示:检查SDIO总线时钟配置和电源稳定性* 2. **在嵌入式Linux中,如何为AP6398S编写自定义的mmc-pwrseq控制器?** *提示:需实现电源时序控制,包括复位信号延迟和电压稳定时间* 3. **AP6398S与DHD驱动的兼容性问题如何排查?** *提示:确认驱动版本与芯片修订版本(C0/C1)匹配,参考博通发布说明* [^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值