嵌入式Linux知识:S3C2440上 MMC/SD卡驱动实例开发讲解(1)

Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇 回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的。 CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为HOST 层的驱动提供了接口函数。 CARD 部分:因为这些记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将你的SD 卡如何实现为块设备的。 它们 阅读详情
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能 给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。

一、开发环境

  • 主  机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4
  • 编译器:arm-linux-gcc-4.3.2

二、MMC/SD介绍及SDI主机控制器

  首先我们来理清几个概念:
  1. MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准。
  2. SD:(Secure Digital Memory Card)由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制的新一代记忆卡标准,已完全兼容MMC标准。
  3. SDIO:(Secure Digital Input and Output Card)安全数字输入输出卡。 SDIO是在SD标 准上定义了一种外设接口,通过 SD 的I/O接脚 来连接外围设备,并且通过SD 上的 I/O 数据接位与这些外围设备进行数据传输。是目前较热门的技术,如下图中的一些设备:GPS、相机、Wi-Fi、调频广播、条形码读卡器、蓝牙等。

  4. 工作模式:工作模式是针对主机控制器来说的。也就是说,S3C2440中的SDI 控制器可以在符合MMC的标准下工作,或者可以在符合SD的标准下工作,或者可以在符合SDIO的标准下工作。故就分别简称为:MMC模式、SD模式和 SDIO模式。
  5. 传输模式:传输模式也是针对主机控制器来说的,指控制器与卡之间数据的传输模式, 或者说是总线类型。S3C2440中的SDI控制器可支持SPI、1位和4位的三种传输模式(总线类型)。那么什么又是SPI呢?请参考这里: SPI协议简介 ;至于1位和4位又是什么意思呢?他们是指传输数据总线的线宽,具体参考数据手册。

  下面使用表格列出了MMC、SD、SDIO的电气特性及性能和不同工作模式下支持的传输模式情况:


  那么,我们现在怎样让主机控制器在我们所要求的工作模式和传输模式上工作呢?很简单,就是对主机控制器的各个寄存器进行相应的配置 即可。下面来简单介绍一下SDI主机控制器的结构和各寄存器的用途。

S3C2440内的SDI主机控制器结构图如下:

  如上图所示,SDI主机控制器是使用1个串行时钟线与5条数据线同步进行信息移位和采样。传输频率通过设定SDIPRE寄存器的相应位的设定来 控制,可以修改频率来调节波特率数据寄存器的值。

各主要寄存器介绍,对于具体的寄存器位的设置就参考数据手册:

  1. SDICON:控制寄存器,完成SD卡基础配置,包括大小端,中断允许,模式选择,时钟使能 等。
  2. SDIPRE:波特率预定标器寄存器,对SDCLK的配置。
  3. SDICmdArg:指令参数寄存器,指令的参数存放在这里。
  4. SDICCON:控制指令形式的寄存器,配置SPI还是SDI指令,指令的反馈长 度,是否等待反馈,是否运行指令,指令的索引等。
  5. SDICmdSta:指令状态寄存器,指令是否超时,传送,结束,CRC是否正确 等。
  6. SDIRSP0-3:反映SD的状态。
  7. SDIDTimer:设置超时时间。
  8. SDIBSize:模块大小寄存器。
  9. SDIDatCon:数据控制寄存器,配置是几线传输,数据发送方向,数据传送方 式等。
  10. SDIDatSta:数据状态寄存器,数据是否发送完,CRC效验,超时等。
  11. SDIFSTA:FIFO状态寄存器,DMA传输是否判断FIFO。
  12. SDIIntMsk:中断屏蔽寄存器。
  13. SDIDAT:SDI数据寄存器。

SDI主机控制器在SD/MMC工作模式下的设置步骤:(注意:因为SD模式兼容MMC模式,所以我们只需了解SD模式的即可,而SDIO的工作模 式则是针对SDIO设备的,所以这里就不讨论了)

  1. 设置SDICON寄存器来配置适当的时钟及中断使能;
  2. 设置SDIPRE寄存器适当的值;
  3. 等待74个SDCLK时钟以初始化卡;
  4. 命令操作步骤:
    a. 写命令参数32位到SDICmdArg寄存器;
    b. 设置命令类型并通过设置SDICCON寄存器开始命令传输;
    c. 当SDICSTA寄存器的特殊标志被置位,确认命令操作完成;
    d. 如果命令类型相应,标志是RspFin,否则标志是CmdSend;
    e. 通过对相应位写1,清除SDICmdSta的标志。
  5. 数据操作步骤:
    a. 写数据超时时间到SDIDTimer寄存器;
    b. 写模块大小到SDIBSize寄存器(通常是0x80字节);
    c. 确定模块模式、总线线宽、DMA等且通过设置SDIDatCon寄存器开始数据传输;
    d. 发送数据->写数据到SDIDAT寄存器,当发送FIFO有效(TFDET置位),或一半(TFHalf置位),或空(TFEmpty置位);
    e. 接收数据->从数据寄存器SDIDAT读数据,当接收FIFO有效(RFDET置位),或满(RFFull置位),或一半(RFHalf置位),或 准备最后数据(RFLast置位);
    f. 当SDIDatSta寄存器的DatFin标志置位,确认数据操作完成;
    g. 通过对相应位写1,清除SDIDatSta的标志。

三、MMC/SD协议

  这 里我并不是要讨论MMC/SD的整个通信协议(详细的协议请看MMC/SD规范),而是遵循MMC/SD协议了解一下MMC/SD在被驱动的 过程中卡所处的各种阶段和状态。根据协议,MMC/SD卡的驱动被分为:卡识别阶段和数据传输阶段。在卡识别阶段通过命令使MMC/SD处于:空闲 (idle)、准备(ready)、识别(ident)、等待(stby)、不活动(ina)几种不同的状态;而在数据传输阶段通过命令使MMC/SD处 于:发送(data)、传输(tran)、接收(rcv)、程序(prg)、断开连接(dis)几种不同的状态。所以可以总结MMC/SD在工作的整个过 程中分为两个阶段和十种状态。下面使用图形来描述一下在两个阶段中这十种状态之间的转换关系。

卡识别阶段,如下图:

数据传输阶段,如下图:

 

 

四、MMC/SD设备驱动在Linux中的结构层次

     我 们翻开MMC/SD设备驱动代码在Linux源码中的位置 /linux-2.6.30.4/drivers/mmc/,乍一看,分别有card、core和host三个文件夹,那哪一个文件才是我们要找的驱动代 码文件啊?答案是他们都是。不是吧,听起来有些可怕,三个文件夹下有多少代码啊。呵呵,还是先放下对庞大而又神秘代码的恐惧感吧,因为在实际驱动开发中, 其实只需要在host文件夹下实现你具体的MMC/SD设备驱动部分代码,现在你的心情是不是要好点了。具体的MMC/SD设备是什么意思呢?他包括 RAM芯片中的SDI控制器(支持对MMC/SD卡的控制,俗称MMC/SD主机控制器)和SDI控制器与MMC/SD卡的硬件接口电路。

    那为什么刚才又说card、core和host都是MMC/SD设备的驱动呢?这就好比我们建房子,建房子首先要的是什么,地皮对吧, 有了地皮然后要到政府部门备案,备案后才能开始建,是这样的吧。在Linux中MMC/SD卡的记忆体都当作块设备。那么,我们这里的card层就是要把 操作的数据以块设备的处理方式写到记忆体上或从记忆体上读取,就好比是在地皮上填沙石、挖地基等;core层则是将数据以何种格式,何种方式在 MMC/SD主机控制器与MMC/SD卡的记忆体(即块设备)之间进行传递,这种格式、方式被称之为规范或协议,就好比到政府部门备案,备案就会要求你的 房子应该按照怎样的行业标准进行建造;最后只剩下host层了,上面也讲到了,host层下的代码就是你要动手实现的具体MMC/SD设备驱动了,就好比 现在地皮买好挖好了,建房的标准也定好了,剩下的就需要人开始动工了。
 
    那么, card、core和host这三层的关系,我们用一幅图来进行描述,图如下:
    从这幅图中的关系可以看出,整个MMC/SD模块中最重要的部分是Core核心层,他提供了一系列的接口函数,对上提供了将主机驱动注册到系统,给应用程 序提供设备访问接口,对下提供了对主机控制器控制的方法及块设备请求的支持。对于主机控制器的操作就是对相关寄存器进行读写,而对于MMC/SD设备的请 求处理则比较复杂。那么在主机驱动层中的一个请求处理是怎么通过核心层提交到块设备请求层的呢?
 
在网上找到一副图来说明他们之间的关联和处理流程,如下图:

 
 
命令、数据发送流程如下图:
 
 
其中,黑色粗线部分为命令发送或者数据发送都要经过的流程,橙色方框部分判断所有类型的请 求是否完成。
 
下面我们就来具体实例分析一个MMC/SD卡设备驱动程序。

http://www.linuxidc.com/Linux/2011-02/32646p3.htm
Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作 前面对SD卡控制器有了一个基本的介绍。其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装有操作方法的数据结构,那便是即将闪亮登场的struct mmc_host_ops....对应的host文件为s3cmci.c。     接下来就来揭开与之对应的struct mmc_host_ops 阅读详情

相关推荐

S3C2440平台SD卡驱动开发实战详解

SD卡驱动是嵌入式系统中实现主机处理器与SD存储卡通信的关键软件模块,运行于操作系统内核层,负责抽象底层硬件差异并提供统一访问接口。其主要职责包括:上电初始化、卡类型识别(MMC/SD/SDHC)、命令发送与响应解析、块数据读写控制以及错误处理与恢复机制。驱动通过标准总线协议(如MMC/SD规范)与SD控制器交互,控制CLK、CMD和DAT线上的时序与电平变化,完成OCR协商、CID/CSD寄存器读取、RCA分配等关键流程,并支持PIO与DMA两种数据传输模式,确保数据完整性与系统效率。

weixin_35811662的博客 869

S3C2440读写sd卡的一些总结

整理硬盘的时候发现这个文档,以前写2440操作sd卡程序的时候总结的。 1.我的2440 sdi对sd卡发送ACMD41时总是反馈crc fail,但是可以得到正确的response,sd卡可以正常使用。 2 sd卡可以没有mbr,在物理的0 block上面直接开始dbr。我的山寨kingston 1g mini sd在板子自带的测试程序读写后,0 block被覆盖,插到电脑上之后提示未格式化,用Windows格式化之后,用winhex查看physical sector no.和logical ..

ba_wang_mao的专栏 563

S3C2440_使用SDIO驱动SD卡例子

详细介绍SD卡原理及开发.包括文件系统原理及各测试源码.

linux2.6.20 sd/mmc卡驱动学习日记1(基于s3c2440)

首先,我们来看Makefile文件吧,Makefile中文件的目标文件的顺序是很重要的,因为这个会涉及到模块的依赖关系,比如说,如果这些源文件中有module_init(),则这些module_init就按在Makefile中的顺序链接进内核,之后也按照链接的顺序进行调用。根据我们的内核配置选项,将要编译进内核的文件就只有mmc.c,mmc_sysfs.c,mmc_block.c,mmc_queue.c,s3cmci.c这几个文件。其中mmc.c与mmc_queue.c主要是定义了一些其他文件中将要使用的函

menuconfig的专栏 1258

2021英伟达暑期实习面经(芯片设计)

2021英伟达暑期实习面经(芯片设计前端/DFT) 准备了将近一个月,终于赶在三月的最后一天拿到了offer,暑期实习算是上岸了,后面还有阿里/华为等一些国内公司的面试,但既然拿到了nv的offer,后面的先就当积累面试经验吧~ 网上关于nv的实习or秋招面经很少,硬件岗的更少(约等于没有好吧)。之前准备面试的时候,在网上找了半天,好像就只在牛客网上见过一篇关于nv硬件岗的面经,幸好当时认真看了哈哈。所以既然幸运上岸了,想趁自己还记得,record一下,希望可以帮到有缘人呀~ 好了,废话不多说,开始正题。

Hadleysjtu的博客 1万+

一位海外开发者的 OpenSPG KAG 实践分享

KAG 是一个以创建和操作知识图谱为核心的框架。知识图谱是数据之间相互关联的可视化和结构化表示,对于搜索引擎、推荐系统和机器学习等应用至关重要。KAG 的目标是提供一个强大的平台,使开发者能够:轻松构建图谱;通过增强算法丰富数据;集成人工智能,以进行更精确的推理。通过理解 KAG,可以明显看出,这个框架旨在帮助从初学者到专业开发者,在项目中创造更优的解决方案。它在简便性和集成方面的优势,使其成为下一代基于数据的应用程序的前景工具。

金融机器智能社区 3405

内核配置与裁剪浅析

Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下, #tar xzvf linux-2.6.38.4.tar.gz -----解压缩. ii) 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux. (2)设置内核. # cd /usr/s...

weixin_30802171的博客 1023

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 417

linux2.6.20 sd/mmc卡驱动学习日记2(基于s3c2440)

我们接着来到s3cmci.c文件 s3cmci_init----->platform_driver_register(&s3cmci_driver_2440)------------>s3cmci_probe_2440----->s3cmci_probe 在s3cmci_probe中主要是分配及初始化 struct mmc_host *mmc; struct s3cmci_host *host; 这两个结构体。分配DMA通道,注册irq中断。 以下对个别函数的

menuconfig的专栏 1488

Python 爬虫进阶:爬取 APP 数据(Charles 抓包 + Requests)

本文详细介绍了APP数据爬取的完整技术方案。首先通过Charles抓包工具配置HTTPS代理和证书,解析APP通信协议;然后分析请求参数、反爬机制和动态签名生成规则;接着使用Python的Requests库实现模拟请求、分页爬取和数据存储;最后针对证书问题、Token失效等常见问题提供解决方案。文章强调抓包分析、参数逆向和请求模拟三大核心技术,同时提醒开发者需遵守法律法规,合理控制爬取频率。该方案适用于移动端数据采集场景,为无法直接获取网页数据的情况提供了有效解决方案。

2503_91057718的博客 2120

PCL学习笔记(四)——点云曲面重建

文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在

dayuhaitang1的博客 6912

S3C2440上 MMC/SD卡驱动实例开发讲解

首先我们来理清几个概念: 1. MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准。 2. SD:(Secure Digital Memory Card)由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制的新一代记忆卡标准,已完全兼容MMC标准。 3. SDIO:(Secure Digital Input and Output Card)安全数字输入输出卡。SDIO是在SD标 准上定义了一种外设接

menuconfig的专栏 2351

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2440

嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(一)

http://blog.ednchina.com/mcuandme/1787530/Message.aspx   http://blog.chinaunix.net/u3/101649/showart_2232724.html 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。

keep moving 3185

别再用LabelImg了!我手搓了一个C#“一站式”YOLO工具箱,标注训练推理全搞定

这个工具箱目前已经在两个小型产线项目中试用,反馈非常好。效率提升:原本需要 2 天完成的“数据准备 - 训练 - 验证”循环,现在缩短到了 2 小时。门槛降低:产线技术员经过 10 分钟培训,就能独立完成新产品的模型迭代。当然,它还有改进空间未来计划集成主动学习功能:自动筛选出置信度低的图片,推荐优先标注。支持多模型管理:方便在不同产品型号间快速切换。增加PLC 通信模块:直接在推理界面配置 IO 信号,实现真正的软硬联动。最后想说工具的本质是服务于人。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 442

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大,联网采集不复杂。

若云流风的专栏 2496

嵌入式Linux知识:S3C2440上 MMC/SD卡驱动实例开发讲解(2)

从电路原理图上可以看出,SD分别使用S3C2440的复用IO端口GPE7-10作为4根数据信号线、使用 GPE6作命令信号线、使用GPE5作时钟信号线,使用复用端口GPG8的外部中断功能来作SD卡的插拔检测,使用GPH8端口来判断SD卡是否写有保 护。

menuconfig的专栏 1706

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MMC/SD卡驱动实例开发讲解(一)

transition平台工作linuxioc 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载:http://hbhuanggang.cublog.cn 一、开发环境 主  机:VMWare--Fedora 9 开发板:Mi

wuyuwei45的专栏 1637

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

s3c2440上MMC/SD卡驱动的分析(一)

一、开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、MMC/SD介绍及SDI主机控制器   首先我们来理清几个概念: MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体

阿戟哥哥的专栏 1666

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SD卡驱动程序解析

一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、MMC/SD介绍及SDI主机控制器 首先我们来理清几个概念: MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准。 SD:(S...

u010783226的专栏 3462

S3C2440+Linux2.6mmc/sd驱动程序

S3C2440+Linux2.6mmc/sd驱动程序  这几天要做SD卡方面的事情了,看了看相关资料,从网上得到了 s3c2440 在2.6下的驱动,经过修改,目前可以工作了,现拿出与大家分享.希望共同学习讨论.     1 /*      2  *  linux/drivers/mmc/s3c2410mci.h - Samsung S3C2410 SDI Interface driver

阶廷成长日记 2661

嵌入式linux sd卡读写,嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(二)...

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。一、开发环境主 机:VMWare--Fedora 9开发板:Mini2440--64MB Nand, Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.26. s3cmci_ops SDI主机控制器操作接口函...

weixin_27224119的博客 739
上一篇: S3C2440上 MMC/SD卡驱动实例开发讲解
下一篇: 嵌入式Linux知识:S3C2440上 MMC/SD卡驱动实例开发讲解(2)
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值