sdio是块stm32f4 sdio驱动sd卡还是字符

扫一扫体验手机阅读
Linux MMC/SD/SDIO体系结构
<span type="1" blog_id="423732" userid='
156篇文章,46W+人气,0粉丝
新西兰资深网工运维之道
¥51.00357人订阅
前百度高级工程师的架构高可用实战
¥51.00218人订阅
<span type="1" blog_id="423732" userid='Linux驱动试题_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Linux驱动试题
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
&#xe64e;加入VIP
还剩2页未读,
定制HR最喜欢的简历
你可能喜欢Linux MMC/SD/SDIO体系结构 - 谦虚 勤奋就能更强 - 51CTO技术博客
有关MMC/SD/SDIO相关的知识这里就不多讲了,请参考相关资料。这里主要涉及Linux下MMC相关内容。内核版本(2.6.36)首先说一下Linux相关MMC的代码分布,主要有两个目录,一个头文件目录和一个源代码目录。分别位置如下:include/linux/mmcdrivers/mmc要阅读MMC相关代码就必须要看这两个目录。在drivers/mmc目录下分别有三个子目录,其将对应接下来要讲的MMC的体系结构。这三个子目录分别为: card core host它们的内容后面讲到体系结构时自然就明了了。 现在来说说MMC的体系结构,其分为三层
/dev下设备文件访问MMC/SD/SDIO用户空间
|---------------------|-----------------------------------------------------内核空间
MMC Card层(对应具体的设备驱动,如MMC/SD卡块设备驱动,SDIO UART)
MMC core层(为上次设备驱动实现提供操作接口,和下层host注册提供机制)
Host层(具体MMC/SD/SDIO控制器驱动层。如S3C2440 MMC/SD控制器驱动)
\ /-----------------------------------------------------------------------------
硬件层对于我们来说,编写MMC/SD卡相关驱动主要涉及的就是Host层,其余层不用考虑。对于SDIO设备除了Host层以外,还有可能要编写MMC Card层的设备驱动。编 写Host层驱动,主要是填充mmc_host结构体相关内容和实现mmc_host_ops结构体中的函数。最后调用mmc_add_host向MMC core注册host驱动。可以参考S3C24XX的HOST驱动程序(drivers/mmc/host/s3cmci.c,s3cmci.h),上层 MMC Core主要调用mmc_host_ops中的函数来实现与硬件交互。如下是mmc_host_ops结构体里面的函数:
struct mmc_host_ops {
/*使能和禁止HOST控制器*/
int (*enable)(struct mmc_host *host);
int (*disable)(struct mmc_host *host, int lazy);
/*这个是关键的函数,所有对MMC/SD的操作,包括发命令和读数据,都通过该接口来实现,所以实现该接口时要处理是命令还是数据操作,另外要考虑是否使用DMA来进行数据传输。*/
(*request)(struct mmc_host *host, struct mmc_request *req);
/*用来设置MMC/SD的时钟,电压等操作*/
(*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
/*检查MMC/SD是否写保护了*/
(*get_ro)(struct mmc_host *host);
/*检查mmc/sd的插入和拔出*/
(*get_cd)(struct mmc_host *host);
(*enable_sdio_irq)(struct mmc_host *host, int enable);
/* optional callback for HC quirks */
(*init_card)(struct mmc_host *host, struct mmc_card *card);};博客http://blog.chinaunix.net/u3/101649/showart.php?id=2232724对S3C2440的HOST驱动进行了详细的分析。接下来说说MMC Core层。该层主要实现了几个结构体函数指针,用来构建整个MMC设备驱动模型。它们是:struct bus_type mmc_bus_type
/*mmc总线,用来管理sd/mmc卡设备和驱动*/struct mmc_bus_ops mmc_ops
/*MMC卡总线操作函数,主要是在电源管理方面*/struct mmc_bus_ops mmc_sd_op
/*SD卡总线操作函数,主要是在电源管理方面*/struct mmc_bus_ops mmc_sdio_ops
/*SDIO总线操作函数,主要是在电源管理方面*/struct bus_type sdio_bus_type
/*SDIO另外定义了一条总线*/core.c文件中实现了几个关键的函数,用来提供给上层MMC Card调用和对SD/MMC卡的侦测函数以及初始化。供给上层MMC Card调用主要有:void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq);int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd, int retries);mmc card层就是通过这些函数来操作mmc/sd卡。而这些函数最终调用的是mmc_host_ops 结构体中的request函数来进行具体的操作。对SD/MMC卡的侦测函数以及初始化,主要实现在void mmc_rescan(struct work_struct *work);函数中。host层在调用mmc_add_host时会引发该函数的调用,侦测/初始化顺序为:
先SDIO接口
* First we search for SDIO...
err = mmc_send_io_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sdio(host, ocr)) {
* ...then normal SD...
err = mmc_send_app_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sd(host, ocr))最后是MMC: /*
* ...and finally MMC.
err = mmc_send_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_mmc(host, ocr))其 中mmc_attach_xxx函数就是用来完成侦测和初始化的,选择相应的总线操作函数,并产生struct mmc_card结构体,并填充其内容,最后注册一个mmc_card(代表着一个设备),并在注册中由mmc_bus_type结构体的match和 probe函数来查找到适合该设备的驱动(这个又牵涉到设备驱动模型,可以查看设备驱动模型相关内容,了解设备和驱动匹配的过程),这里将匹配到mmc
card层的MMC_Block(MMC块设备驱动程序,由 struct mmc_driver代表)。在完成设备侦测和初始化以后,以后的操作就是mmc card层中相关的设备驱动程序发出的了。再说说MMC card层,该层主要实现具体的设备驱动程序,如MMC块设备驱动程序,通过mmc_register_driver注册。如果是SDIO就有可能是其它字符设备驱动程序了,其通过调用sdio_register_driver来注册设备驱动。总体概括来说:host层提供驱动相关MMC/SD/SDIO控制器的功能。Core层提供了具体MMC/SD/SDIO设备侦测和初始化功能,以及电源管理方面的内容和通用的操作功能。Card为实现具体的设备驱动层。这样的分层结构在Linux设备驱动中非常常见,如I2C,SPI等都提供了这样的驱动模型。最 后简单说说SDIO相关部分。在core层注册了新的sdio_bus_type总线,并且定义了新的sdio_driver来代表sdio设备驱动,并 定义了struct sdio_func来代表设备。所以在SDIO设备除了struct mmc_card来代表设备以外,还有struct sdio_func来代表具体功能设备。所以在mmc_attach_sdio函数中除了注册mmc_card以外,还注册了sdio_func。具体代
码如下:int mmc_attach_sdio(struct mmc_host *host, u32 ocr){
* First add the card to the driver model...
err = mmc_add_card(host-&card);
goto remove_
* ...then the SDIO functions.
for (i = 0;i & funcs i br style='font-size:14font-style:font-weight:color:rgb(85, 85, 85);' /&
err = sdio_add_func(host-&card-&sdio_func[i]);
goto remove_
....}所以它除了调用mmc_bus_type结构体的match和probe函数来查找到适合该设备的驱动外,也调用sdio_bus_type结构体的match和probe函数来查找到适合该设备的驱动。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Andrew Huang &&&转载请注明作者及网址.
&&手头的上课s3c6410开发板,带了SDIO接口的WiFi模块,但是没有Linux下的驱动,因此在上网络驱动时课参考s3c2440的实现试着分析和调试一下SDIO的WiFi驱动。
&& 我手头使用模块是WM-G-MR-09模块,其主控实际采用了marvell8686的IC来作为主控芯片,是由台湾环隆出的模块。网上能找到最接近的Linux驱动是针对 s3c2440的官方出的&
GSPI-8686-LINUX26-BULVERDE-9.70.3.p29-26409.P50.tar
&& & &官方的源码包提供的动态模块形式的
驱动和命令行工具。经过简单修改Makefile,并且调步几个iw_函数的调用后,成功的在linux 2.6.28下编译成功,但是其中部分代码拷贝自s3c2440,因此这个驱动必然不会正常运行。因此必须要分析其模块的来改写成s3c6410的模块。
&&首先这个模块是WiFi+Bluetooth 的2合一的模块。并且带了SDIO/G-SPI的接口与CPU进行交互.
&& &SDIO接口比较明白,是源于SD卡的交互接口,后来扩展到多个硬件模块的对接,比如SDIO的蓝牙,WIFI模块等。
&& &G-SPI是一个什么接口呢?它实际上是SPI总线的扩展。原来在早期推广SDIO接口,为了取得更大兼容性,在设计硬件接口时,留出几个PIN脚完全兼容SPI的接口。这样就能让只带SPI的总线接口的CPU上也能使用SD卡。
&& SPI是一个三线工业控制总线,它分别是 SPICLK(时钟线),MOSI(主设备发送/从设备接收线),MISO(主设备接收/从设备发送),完全的SPI还有一根片选线 (CS线),如果缺省这一根,则只能主设备固定为某一个设备。
&& &而G-SPI在这四根线上再进入扩展了一个CLK_REQ线和 一个外部中断线 G-SPI_SINTn
其中外部中断脚分析驱动象是用于唤醒和休眠的功能,而CLK_REQ是休眠时的时钟频率线(?)
两种接口的对应关系如下。
&&而CPU采用哪一种接口完全取决于硬件设计,在模块的说明到,取决于IF_SEL_1和IF_SEL_2两个pin脚的接法,即23/24号脚的接线,如果想配成SDIO的接口,两个脚悬空,否则则成焊上两个100K的下拉电阻.
在模块原理图也说得更清楚,即是否焊上r8,r9两个电阻就决定软件使用哪一个接口。
&虽然模块支持两个接口,但是所有代码提供都是G-SPI的实始化代码,硬件上也是如下设计.
&不巧的是手头的模块,以及学员手中模块居然全是没有焊r8/r9两个电阻的模块,即只能用使用SDIO接口。在打电话询问了做Marvell的FAE的学员,他也无法确定SDIO接口的命令格式与G-SPI的命令格式完全一致,因此用SDIO直接初始化模块的方案就放弃了。只采用G-SPI的接口来工作。
&&接收下来确定S3C6410 上是否也支持这种SDIO的管脚上复用SPI的用法。因为S3c6410同时支持SDIO和SPI的模块,但是如果 SDIO的PIN不能被SPI控制器接管,只能采用自行模拟时序的方法来通讯,这样无疑大大增加了工作量,因此我查询s3c6410的GPIO的配置,在GPIO的配置上,SPI的管脚是和SDIO复用的。但仔细分仔发现SDIO的管脚并没有完全与SPI的复用。如果想使用G-SPI,必须在接线直接接在SPI的管脚上,并且把G-SPI外部中断脚接在某一个外部中断的GPIO之中。
而且关于模块的中断脚,这只是一个简单低电平有效的外部中断.
而这个管脚按照原理图,它正好接在了GPH4上,即是第6组的第4个中断脚
至此,在s3c6410下的模块驱动移植工作就变成了如下两个工作.
&& 1.实现SPI S3c6410的驱动
&& 2.按对外部中断脚,实现wan_interrupt响应
其余工作重用官方驱动即可
&& 仔细分析s3c6410的关于SDIO的接口。发现在S3C6410有三个SDIO的channel 0使用GPG组,Channel 1使用GPH组。而channel 2使用 GPC组。但是只有channel 2才有SPI与SDIO管脚复用的可能性。而我手头开发板其接在channel 1上,即GPH组上。因此软件采用SPI的难度相当大。而且仔细分析,只能采用SDIO实现方法。
Linux 内核对Marvell网卡支持。
用Marvell关键字搜索 Linux 2.6.28 目录下的drivers/net/wireless目录,发现libertas就是对MW 8686的支持代码。从源码看直接 PCMIA接口(if_cs.c),USB接口(if_usb.c)和SDIO接口(if_sdio.c).并且分析源码,发现其支持
而最新的linux 2.6.38.5支持的接口更多。把g-spi接口的支持也增加进来(if_spi.c)。芯片支持更加丰富
&&因此在Linux 下可以直接使用SDIO的驱动驱动这一模块
相关标签/搜索2.3.7 SD和SDIO
本文所属图书&>&
本书首先介绍Linux设备驱动的基础。第1章简要地介绍了设备驱动,并从无操作系统的设备驱动引出了Linux操作系统下的设备驱动,介绍了本书所基于的开发环境。第2章系统地讲解了Linux驱动工程师应该掌握的硬件知识,&&立即去当当网订购
SD(Secure Digital)是一种关于Flash存储卡的标准,也就是一般常见的SD记忆卡,在设计上与MMC(Multi-Media Card)保持了兼容。SDHC(SD High Capacity)是大容量SD卡,支持的最大容量为32GB。2009年发布的SDXC(SD eXtended Capacity)则支持最大2TB大小的容量。
SDIO(Secure Digital Input and Output Card,安全数字输入输出卡)在SD标准的基础上,定义了除存储卡以外的外设接口。SDIO主要有两类应用&&可移动和不可移动。不可移动设备遵循相同的电气标准,但不要求符合物理标准。现在已经有非常多的手机或者手持装置都支持SDIO的功能,以连接WiFi、蓝牙、GPS等模块。
一般情况下,芯片内部集成的SD控制器同时支持MMC、SD卡,又支持SDIO卡,但是SD和SDIO的协议还是有不一样的地方,支持的命令也会有不同。
SD/SDIO的传输模式有:
表2.1显示了SDIO接口的引脚定义。其中CLK为时钟引脚,每个时钟周期传输一个命令或数据位;CMD是命令引脚,命令在CMD线上串行传输,是双向半双工的(命令从主机到从卡,而命令的响应是从卡发送到主机);DAT[0]~DAT[3]为数据线引脚;在SPI模式中,第8脚位被当成中断信号。图2.18给出了一个SDIO单模块读、写的典型时序。
eMMC(Embedded Multi Media Card)是当前移动设备本地存储的主流解决方案,目的在于简化手机存储器的设计。eMMC就是NAND Flash、闪存控制芯片和标准接口封装的集合,它把NAND和控制芯片直接封装在一起成为一个多芯片封装(Multi-Chip Package,MCP)芯片。eMMC支持DAT[0]~DAT[7] 8位的数据线。上电或者复位后,默认处于1位模式,只使用DAT[0],后续可以配置为4位或者8位模式。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
文章下载读书

我要回帖

更多关于 generic sdio驱动下载 的文章

 

随机推荐