SylixOS中SD驱动实现流程

1、概述

本文档以imx6实验平台为例,介绍SD设备驱动实现流程。

2、SylixOS中SD系统框架

SylixOS中SD协议栈(以下称作SD Stack)结构如图 2.1所示。

图 2.1 SD 协议栈结构

1)Host层:硬件控制器抽象层,SD控制器在不同的硬件平台上可能有不同的实现,因此需要实现具体的传输处理操作。所有的控制器驱动都向上(Core层)提供统一的操作接口。SD Stack已经提供了符合SD规范的标准控制器SDHCI驱动,在此情况下,控制器驱动的编写将更加简单。当然也可使用SPI传输。

2)Core层:主要封装了SD和SPI两种传输方式以及SD Memory和SDIO相关协议操作库,让Client层只需要关心与具体设备相关的SD协议处理,而不必考虑底层的硬件情况,详细介绍如下:

(a) sdLib为基于Core Xfer 为传输对象封装的SD Memory相关协议操作库;

(b) sdioLib: 与sdLib一样,是针对sdio类设备特殊操作的相关工具库,sdio类设备驱动使用此库可以使驱动的编写更简单。

(c) SDM: SD DRV Manager, 即SD 驱动管理层,这里的SD驱动包括SD 设备驱动和SD控制器驱动,这样两者的信息都由SDM管理维护,以此达到两者完全隔离的目的。

3)Client层:实现具体的设备类协议,主要包括SD Memory和SDIO BASE两个库,分别对应SD存储卡类设备和SDIO类设备,详细介绍如下:

(a) SD Memory 负责SD Memory 相关的协议处理(如初始化,块读写等),它同时完成与SylixOS块设备相关的接口创建(BLK_DEV)。

(b) SDIO BASE: sdio类基础驱动,它和SD Memory处于同一级别,它不会直接去创建实际的sdio类设备,主要是在完成sdio的基础初始化后,使用特定的sdio子类驱动来创建对应的设备。之所以设计sdio类基础驱动,是为了让驱动的管理更加统一,同时将原设计中的一些缺点(比如设备驱动要关心Host的一些信息)掩藏起来, 让sdio类设备驱动开发更简洁。

3、SD驱动实现

3.1 SD设备驱动安装

在安装控制器驱动前,需要先安装SD设备驱动,树要实现如图 3.1所示。

图 3.1 安装SD设备驱动

该函数中主要就是实现了SD memory设备的创建和删除方法,并将其链入设备驱动链表,以便于在有设备事件通知时,创建设备时根据设备类型调用。

3.2 SD控制器驱动安装

在imx6实验平台的bsp中,需要创建HOST控制器用来保存HOST相关信息,安装控制器驱动实现如图 3.2所示。

图 3.2 SD控制器驱动安装

图中相关实现解读如下:

  1. SD控制器参数初始化,主要填充HOST控制器相关参数,如卡状态、总线名、设备类型、时钟频率等;
  2. 端口初始化,即实现通道相关管脚的分配等;
  3. 通道扩展寄存器初始化,此函数可以暂时为空;
  4. 创建SD标准主控制器,主要实现寄存器访问驱动、解析主控制器的功能、创建传输事务、创建SDM层的HOST对象用来保存HOST信息等;
  5. 获取SDM层的HOST对象;
  6. 向SDM层通知当前设备事件(针对BOOT设备的特殊属性,直接创建设备,提高启动速度);
  7. 热插拔事件处理,主要针对SD卡等热插拔设备。

本文档主要针对eMMC,在实验平台上作为BOOT设备启动,所以,主要介绍上图⑥函数。

3.3 SDM设备创建

当SD设备作为启动设备时,通知事件相关调用关系如图 3.3所示。

图 3.3 SDM设备创建

图中,首先根据通知事件类型,直接调用__sdmDevCreate函数创建一个SDM设备,该函数中相关实现解读如下:

  1. 遍历SD驱动链表,根据设备驱动类型找到对应的设备驱动,并得到设备名;
  2. 创建一个CORE设备,将设备名和挂接的适配器名关联起来;
  3. 调用设备驱动创建一个SD设备。

3.4 SD设备的创建及初始化

SD规范主要定义了3种传输速率:低速(400KHZ时钟,通常用于设备初始化阶段);全速(25MHZ时钟,用户设备正常工作阶段);高速(50MHZ时钟,可支持高速设备)。SD规范中明确定义了设备和控制器必须支持低速和全速,高速模式为非必要实现,需要控制器和设备双方均支持才能正常工作。

设备的创建最终调用到从SD驱动链表中查找到的设备驱动函数__sdmemDevCreate,该函数中首先就是调用API_SdMemDevCreate接口创建一个SD记忆卡设备,而对SD设备的初始化__sdMemInit就在该函数中被调用,关于__sdMemInit解读如下:

  1. 发送命令前设置,如图 3.4所示。

图 3.4 初始化前准备

  1. 重启电源;
  2. 初始化时将时钟设置为低速400KHZ状态;
  3. 设置总线为1位总线模式。

2)进入idle状态,如图 3.5所示。

图 3.5 进入idle状态

3)       检查卡接口条件(cmd8),如图 3.6所示。

图 3.6 检查卡接口条件

  1. 获取HOST工作电压;
  2. 检查卡支持电压。

4)获取卡支持信息,并激活卡初始化(acmd41),如图 3.7所示。

图 3.7 获取卡支持信息

5)获取设备CID(cmd2),如图 3.8所示。

图 3.8 获取设备CID

6)获取设备RCA(cmd3),如图 3.9所示。

图 3.9 获取设备RCA

7)根据设备类型(sd/mmc设备)切换传输速率(即切换时钟频率),如图 3.10所示。

图 3.10 针对设备类型进行相应处理

  1. sd设备

    1. 设置当前时钟为全速传输状态(25mhz时钟);
    2. 获取当前设备可支持传输能力(即是否支持高速传输);
    3. 若设备支持高速传输,设置当前时钟为高速传输状态(50mhz时钟);
    4. 设置块传输长度(默认512);
    5. 设置总线宽度(4bit);
  2. mmc设备
    1. 设置块传输长度(默认512);
    2. 设置mmc卡的总线频率;
    3. 设置mmc卡的总线位宽。

3.5 挂载磁盘分区并打印磁盘信息

设备创建并初始化完成后即可进行分区挂载,如图 3.11所示。

图 3.11 挂载磁盘分区

至此SD驱动已基本实现。

4、参考资料

1. SD Memory Card Specifications Part1 Physical Layer Specification

2. SD Specifications Part 1 Physical Layer Simplified Specification

3. SD Specifications Part E1 SDIO Simplified Specification

4. SD Specifications Part A2 SD Host Controller Simplified Specification

5. http://blog.chinaunix.net/uid-30296321-id-5094936.html

时间: 2024-07-28 12:55:06

SylixOS中SD驱动实现流程的相关文章

SylixOS基于Nuc970平台的SD驱动移植

1. 适用范围 本文档为实现Nuc970平台的SD驱动总结,提供一些SylixOS SD驱动移植方法的参考. 2. 原理概述 2.1 控制器类型 SD控制器有两种类型,分为SD标准控制器(SDHCI)和SD非标准控制器. SylixOS Base代码中实现了SDHCI的驱动,但Nuc970的SD控制器是非标准控制器,其功能都需要在BSP中单独实现. 2.2  命令.应答.数据 SD传输过程中会有命令.应答和数据三个概念存在. 命令和应答都是在CMD线上传输的,数据在DAT线上进行传输. 2.2.

SylixOS BSP tick驱动流程

SylixOS BSP tick驱动流程 1. 开发环境 - 操作系统:SylixOS - 编程环境:RealEvo-IDE3.1 - 硬件平台:IMX6Q实验箱 2.技术实现 时钟节拍(clock tick)是特定的周期性中断.这个中断可以看做是系统心脏的脉动.时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,同时当任务等待事件发生时,提供等待超时的依据. 2.1 Tick的频率设置 Tick的频率需要根据具体的硬件性能来设置.频率越快,系统的额外开销也会越大.SylixOS中频率通

SylixOS中RTC设备驱动

1.概述 本文档基于SylixOS-EVB-i.MX6Q验证平台,介绍SylixOS中RTC设备驱动实现过程,可作为在SylixOS集成开发环境下进行字符设备驱动开发的参考. 2.RTC设备驱动 2.1硬件原理 实时时钟(RTC)的主要功能是在系统掉电的情况下,利用备用电源使时钟继续运行,保证不会丢失时间信息. i.MX6Q验证平台上使用的是外置实时时钟集成电路ISL1208.硬件接线如图 2.1所示. 图 2.1 RTC硬件接线 图中,X1和X2为内部反向放大器的输入和输出引脚,要求外置一个3

SylixOS SylixOS CAN总线驱动之三

SylixOS CAN报文传送流程 CAN报文传送流程框图 在SylixOS中CAN报文的传输框图如图 11所示. 图 11 SylixOS CAN报文传输框图 (注:此文档承接之前的文档编写,之前文档中详细介绍过的报文,传输结构体在此文档中不做详细介绍.) SylixOS CAN报文缓存机制 在SylixOS中CAN报文的传输不是底层和上层应用的直接传输.而是在底层和应用层中间加了一层系统缓存队列.所有收发的CAN报文都要先经过一个系统缓存机制传输到真正调用到它的地方. 系统CAN发送报文缓存

SylixOS字符设备驱动框架

1.概述 本文档主要介绍SylixOS中字符设备驱动框架,适用于在SylixOS集成开发环境下进行字符设备驱动开发的学习. 注:文中xxx是指具体设备名,编写对应驱动时,自行命名(如RTC.COMPASS等). 2.SylixOS字符设备驱动简介 字符设备是指只能以字节为单位进行读写的设备,读取数据需按照先后顺序,不能随机读取设备内存中某一数据.常见的字符设备如:鼠标.键盘.串口等. 在SylixOS中,每个字符设备都会在/dev目录下对应一个设备文件,用户程序可通过设备文件(或设备节点)来使用

debian下使用dynamic printk分析usb转串口驱动执行流程

看了一篇文章<debug by printing>,文中提到了多种通过printk来调试驱动的方法,其中最有用的就是"Dynamic debugging". “Dynamic debugging"的官方文档:http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/dynamic-debug-howto.txt?id=HEAD "Dyanmic de

SylixOS中pthread_cancel函数浅析

1 知识简介 1.1 概述 取消一个线程要确保该线程能够释放其所持有的任何锁.分配的内存,使整个系统保持一致性.在很多复杂情况下要保证这种正确性是有一定困难的. 一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡.在这种情况下,被取消线程所持有的的资源得不到释放.取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现.这种取消称为不受限制的异步取消. 还存在另外一种更安全的线程取消机制.一个线程可以以可靠的受控制的方式向进程的其他线程

5.2 应用程序和驱动程序中buffer的传输流程

摄像头采集的数据,是通过buffer的形式传到驱动程序中,然后驱动程序使能CSI设备来采集数据.之后将采集到的数据再次通过buffer的形式传递给应用程序中.这个过程中使用了VIDIOC_REQBUFS,VIDIOC_QUERYBUF,VIDIOC_QBUF,VIDIOC_STREAMON和VIDIOC_DQBUF这些ioctl调用.下面就来具体分析这个流程. 1. 内核中的数据结构 内核中有关V4L2的头文件是/include/uapi/linux/videodev2.h文件. 1.1 v4l

linux驱动开发流程

嵌入式linux驱动开发流程嵌入式系统中,操作系统是通过各种驱动程序来驾驭硬件设备的.设备驱动程序是操作系统内核和硬件设备之间的接口,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,可以像操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,完成以下功能:◇ 驱动程序的注册和注销.◇ 设备的打开和释放.◇ 设备的读写操作.◇ 设备的控制操作.◇ 设备的中断和轮询处理.Linux主要将设备分为三类:字符设备.块设备和网络设备.字符设备是指发送和接收数据以字符的