SDIO接口的WIFI:
1、WIFI是一个sdio卡设备
2、具备wifi功能
SDIO接口的WIFI驱动就是在WIFI外面套上一个SDIO驱动的外壳

SDIO部分代码结构:
drivers/mmc 下有 mmc卡、sd卡、sdio 卡驱动。
|- mmc
| |- card // 因为记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分是实现将你的SD卡如何实现为块设备的
| |- core // 是整个MMC的核心存,这部分完成了不同协议和规范的实现,为host提供接口函数
| |- host // 针对不同主机的驱动程序,是需要程序员自己开发的

SDIO驱动仍然符合设备驱动的分层与分离思想。
card 设备驱动层(wifi 设备): | core 核心层(向上向下提供接口) | host 主机驱动层(实现 SDIO 驱动)
我们主要关心 core 目录(CORE 层),其中是媒体卡的通用代码。包括 core.c host.c stdio.c。
CORE 层完成:

  1. 不同协议和规范的实现
  2. 为 HOST 层的驱动提供了接口函数
  3. 完成了 SDIO 总线注册
  4. 对应 ops 操作
  5. 以及支持 mmc 的代码

host 目录(HOST 层)是根据不通平台而编写的 host 驱动。

WIFI厂商源码:
厂商提供的源码可以直接提供到源码或者编译成xxx.ko加载
| - src
| | - bcmsdio
| | - dhd
| | - dongle
| | - include
| | - shared
| | - wl
这里主要内容到bcmsdio,dhd和wl三个目录下,驱动的入口在dhd/sys/dhd_linux.c文件中的dhd_module()函数,设备的初始化和相关驱动注册都从这里开始。

[/include/linux/mmc/host.h]SDIO接口驱动的实现,数据结构体
struct mmc_host 用来描述卡控制器
struct mmc_card 用来描述卡
struct mmc_host_ops 用来描述卡控制器操作接口函数功能,用于从 主机控制器层向 core 层注册操作函数,从而将core 层与具体的主机控制器隔离。也就是说 core 要操作主机控制器,就用这个 ops 当中给的函数指针操作,不能直接调用具体主控制器的函数。

SDIO
card 设备驱动层(wifi 设备): | core 核心层(向上向下提供接口) | host 主机驱动层(实现 SDIO 驱动)
核心层根据需要构造各种MMC/SD命令,这些命令怎么发送给MMC/SD卡?
通过主机控制器层来实现:
1、在host 主机驱动层进行一些底层设置,比如相关使能引脚的配置,注册中断处理函数等
2、向上层的core 核心层添加一个主机

识别设备:
查看WIFI设备命令
cd /sys/bus/sdio/devices
cat uevent

扫描mmc硬件总线,也就是检测mmc硬件总线上是否有挂载card。(卡槽上是否有插入card ?)
mmc core在什么情况下会去扫描mmc硬件总线?

启动一个host的时候扫描当前的card的状态,需要调用mmc_detect_change进行第一次扫描
mmc_start_host(host); // 启动mmc_host

为了实现card热插拔,底层硬件发现card插入状态变化触发某个GPIO产生中断 ———— 中断处理中调用mmc_detect_change进行扫描mmc硬件总线并作出相应的处理
devm_request_irq(host->dev, host->irq, dw_mci_interrupt,
host->irq_flags, “dw-mci”, host);
dw_mci_interrupt最终也是调用 mmc_schedule_delayed_work(&host->detect, delay);

为了实现card热插拔,host要求轮询sd card插入状态的情况下,进行轮询操作
一般来说,在host无法根据硬件来及时获取card插入状态发生变化的情况下,会要求mmc_core每隔一段时间(一般是HZ,一秒)扫描一次mmc硬件总线。 在这种情况下,mmc_host的MMC_CAP_NEEDS_POLL属性会被设置。

INIT_DELAYED_WORK(&host->detect, mmc_rescan); // 在mmc_alloc_host中已经被设置了 mmc_rescan才是扫描的核心

解析mmc_rescan:
mmc_rescan-> struct mmc_host *host = container_of(work, struct mmc_host, detect.work);    // 根据host->detect.work来获取mmc_host                                                                        -> if (host->rescan_disable)         // 如果host还没有初始化完成的话,会设置rescan_disable,此时是不允许扫描硬件总线的return;                                                                                                                                                        -> if ((host->caps & MMC_CAP_NONREMOVABLE) && host->rescan_entered)  // MMC_CAP_NONREMOVABLE 的host,card是不能移除的,只要扫描一次return;-> if (host->bus_ops && !host->bus_dead && !(host->caps & MMC_CAP_NONREMOVABLE))    // 先处理mmc硬件总线上原来已经存在card的情况host->bus_ops->detect(host);         // 1、在mmc_bus_ops被设置被设置的情况下(也就是已经和card绑定了)2、调用mmc_bus_ops->detect来检测card是否被移除,如果是的话,进行相应的释放动作 3、同时,会销毁mmc_bus_ops-> if (host->bus_ops != NULL) {  goto out; }    // 说明card并没有被移除,不需要进行什么动作了,直接退出                                                                                                                                      -> if (!(host->caps & MMC_CAP_NONREMOVABLE) && host->ops->get_cd && host->ops->get_cd(host) == 0) { goto out; }                   // 到这里,说明之前并没有card插入,或者说card的拔出动作已经处理完成,根据host->ops->get_cd来获取当前card的插入状态,为0说明当前没有card插入->    for (i = 0; i < ARRAY_SIZE(freqs); i++) {if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min)))      // 说明当前有card插入,调用mmc_rescan_try_freq,以最小的工作频率来识别和初始化card                                                                                                 break;if (freqs[i] <= host->f_min)break;}-> out: if (host->caps & MMC_CAP_NEEDS_POLL)mmc_schedule_delayed_work(&host->detect, HZ);                                             // 在需要轮询的情况下,间隔HZ工作之后,重新调度工作host->detect,也就是mmc_rescan// 就是通过这里实现轮询的机制的。

如何获取card插入状态
上面提到通过host->ops->get_cd(host)来获取card状态,如何实现?

有两种方式获取当前CARD插入状态:
1、GPIO获取方法
可以通过card的card detect引脚来判断当前时候有card插入
2、host寄存器获取
某些host在硬件上有识别card是否插入的能力。通过读取host寄存器获取当前是否有card插入

mmc_gpio_request_cd来为host定义自己的cd-detect引脚

01 WIFI ----- SDIO接口驱动相关推荐

  1. Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析

    SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转 ...

  2. 关于SDIO接口的wifi和通用SD卡的一些记录

    在使用SDIO接口操作SD卡时,需要CONFIG_MMC_DW该宏,来开启dw_mmc的支持. 在注册platform_device时,指定名字为dw_mmc即可自动执行SD卡相关的初始化进程. 但是 ...

  3. 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  4. android蓝牙双通道意义,BCM43598双通道SDIO接口双频11ac级蓝牙WiFi

    这是一款可同时双频工作的双通道SDIO接口WiFi支持11ac级双频.蓝牙支持BT5.0标准的蓝牙WiFi二合一模块;其中蓝牙和WiFi共用天线: 芯片:BCM43598; 尺寸:15*13*1.5m ...

  5. Linux驱动学习--WPA扫描相关流程及WIFI通用接口NL80211/WEXT分析

    目录 1.引言 2.WIFI通用接口介绍 3.wifi协议接口层 4.Android wpa_supplicant源码分析–扫描scan过程 4.1 wpa_supplicant.conf配置文件的分 ...

  6. WIFI模块RTL8723BU驱动移植

    这里写目录标题 1.硬件平台 2.移植步骤 1.硬件平台 正点原子imx6ull开发板,RTL8723BU模块,很多板载的就是这种,这个模块还有蓝牙功能.一般有USB接口的,sdio接口的,串口wif ...

  7. 【STM32H7】第3章 ThreadX FileX移植SDIO接口SD的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第3章   ThreadX FileX移植SDIO接 ...

  8. 基于I.MX6UL平台的WIFI模块AP6214A 驱动移植

    基于I.MX6UL平台的WIFI模块AP6214A 驱动移植 IoT-6ULX简要介绍 IoT-6ULX,主要面向Internet Of Things应用,该产品集成了 ARM Cortex-A7 9 ...

  9. STM32的SD卡与SDIO接口

    STM32的SD卡与SDIO接口 一.SD卡的简介 1.SD卡的主要参数 2.SD卡的SDIO 模式和SPI 模式 3.SD卡寄存器 二.命令和响应 1.SD卡的操作过程   主机(单片机等)发起&q ...

  10. MMC子系统之SDIO卡驱动

    SDIO说明 图 1-1 显示了 SDIO 相关规范. SDIO 总线规范由物理层规范和SDIO简化规范定义.Combo Card的内存部分由物理层规范指定. SDIO 和 Combo Card 在后 ...

最新文章

  1. 怎么样给下拉框加载背景色
  2. 目前的计算机聪原理上讲,计算机组成原理-第23-24讲(第7章)+课件.ppt
  3. gin框架长连接_gin框架教程一: go框架gin的基本使用
  4. SD-WAN与传统WAN设备相比
  5. excel大数据重采样批量操作(每两列中插入新一列,新一列为左右两列的平均值)
  6. keras框架:目标检测Faster-RCNN思想及代码
  7. vue vant Area组件使用详解
  8. ssis 表达式任务_SSIS表达式任务与将变量作为表达式求值
  9. totalspider爬虫批量重启报错Connection Error
  10. spring注释_Spring注释
  11. 无法正常启动,错误0xc0150002
  12. python面板数据模型操作步骤_面板模型回归操作指南,适合初学者!
  13. Xcode12 在Segue下切换视图时不充满屏幕的问题
  14. 计算机打开资源管理器停止工作,windows资源管理器已停止工作,教您windows资源管理器已停止工作怎么解决...
  15. python爬虫02 - 爬虫请求模块 request库 json数据
  16. [转]NHibernate中DateTime,int,bool空值的处理方法
  17. 量化基金投资常用策略简介
  18. ai钢笔工具怎么描线_ps钢笔工具怎么用——绘制直线、平滑曲线、转折曲线
  19. 世界级软件平台企业,永洪科技要的就是这个范儿
  20. Gallery 简易图片浏览

热门文章

  1. 计算机毕业设计JAVA鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  2. 学生选课系统—软件工程课程设计
  3. 国产操作系统之统信UOS安装
  4. 【HDL系列】半减器、全减器和减法器原理和设计
  5. 索尼pha2 android手机,国砖的噩梦?索尼NW-A35捆绑PHA-2A小评
  6. calendar控件使用 extjs_Calendar 日历控件使用
  7. pandas_计算夏普比率
  8. 《腾讯是怎么长大的》读书笔记
  9. 《Java从入门到放弃》JavaSE入门篇:异常
  10. redo日志和undo日志