SDIO WIFI_主板usb接口没反应

SDIO WIFI_主板usb接口没反应SDIO接口的WIFI:1、WIFI是一个sdio卡设备2、具备wifi功能SDIO接口的WIFI驱动就是在WIFI外面套上一个SDIO驱动的外壳SDIO部分代码结构:drivers/mmc下有mmc卡、sd卡、sdio卡驱动。|-mmc||-card//因为记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分是实现将你的SD卡如何实现为块设备的||-core//是整个MMC的核心存,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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引脚

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188647.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux top 指定进程_linux top 排序

    linux top 指定进程_linux top 排序top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器第一行,任务队列信息,同uptime命令的执行结果第二行,Tasks—任务(进程)第三行,cpu状态信息第四行,内存状态第五行,swap交换分区信息第六行,空行第七行以下:各进程(任务)的状态监控详解top使用方法:使用格式:top[-][d][p][q][c]…

    2022年9月24日
    2
  • Quartus II 操作入门[通俗易懂]

    Quartus II 操作入门[通俗易懂]使用Quartus设计FPGA,简单包括以下流程:新建工程,写代码编译工程,找错误分配引脚,重编译下载配置,到硬件为保证设计的正确性,在编译后,一般还需要做仿真验证,然后下载至硬件,有两种仿真方式:-功能仿真-时序仿真新建工程,写代码创建工程文件夹在电脑上新建一个文件夹,例如E:\Lianxi_1。工程的文件将全都存在这个文件夹内,便于管理。一个工程对应一个文件夹。新建

    2022年10月15日
    2
  • springboot启动原理总结_Springboot启动流程

    springboot启动原理总结_Springboot启动流程说明:我这里只说结果,和简单的代码,面试应该是够了,毕竟源码内容不是所有人都能记住的,如果要学习源码请看其他大佬的文章,写的比较详细,而且差不多都一样。背景:面试经常会问道springboot启动流程或者原理,看了多数博友的文章,都是大同小异,但是面试的时候不可能那么多,所以我将启动流程总结一下。启动流程:1.启动springboot这需要执行SpringApplication执行类即可2.执行的时候执行两个重要的代码,@springBootAppli…

    2022年8月20日
    7
  • MySQL数据库:使用show profile命令分析性能

    MySQL数据库:使用show profile命令分析性能

    2021年4月9日
    182
  • matlab fopen fread_matlab中prctile函数

    matlab fopen fread_matlab中prctile函数matlab中length函数length(x)在matlab中是什么意思?小编能记住你的一点一滴,你却忘了小编的一丝一毫。iflength(h)>1||h<0||h>2*breturn是什么意思?爱的仓促,就像行走于沙漠,风一场就没有了后路。length(x0)为数列的长度,即它里面有多少个元素。n=length(A):如果A为非空数组,返回行数和列数两者之间数…

    2025年11月6日
    3
  • for while循环语句举例python_for循环高级用法

    for while循环语句举例python_for循环高级用法程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式1.循环控制语句在了解循环语句的使用方法之前,我们先来了解几个循环控制语句:1)…

    2022年4月19日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号