大家好,欢迎来到IT知识分享网。
功能简介
SDIO是安全数字输入输出接口(Secure Digital Input and Output)的缩写,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD卡,并且可以连接支持SDIO接口的其他设备。
SDIO接口定义了操作SDIO的通用方法集合,包括:
- 打开/关闭SDIO控制器
- 独占/释放HOST
- 使能/去使能设备
- 申请/释放中断
- 读写、获取/设置公共信息
运作机制
在HDF框架中,SDIO的接口适配模式采用独立服务模式。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,若设备过多可能增加内存占用。
独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:
- 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。
- device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。
SDIO模块各分层作用:
- 接口层提供打开SDIO设备、设置块的大小、读取数据、写数据、设置公共信息、获取公共信息、刷新数据、独占HOST、释放Host、使能SDIO功能设备、去使能SDIO功能设备、申请中断、释放中断关闭SDIO设备的接口。
- 核心层主要提供SDIO控制器的添加、移除及管理的能力,通过钩子函数与适配层交互。
- 适配层主要是将钩子函数的功能实例化,实现具体的功能。
图 1 SDIO独立服务模式结构图
SDIO总线有两端,其中一端是主机端(HOST),另一端是设备端(DEVICE)。所有的通信都是由HOST端发出命令开始的,在DEVICE端只要能解析HOST的命令,就可以同HOST进行通信了。SDIO的HOST可以连接多个DEVICE,如图2所示:
- CLK信号:HOST给DEVICE的时钟信号。
- VDD信号:电源信号。
- VSS信号:Ground信号。
- D0-3信号:4条数据线,其中,DAT1信号线复用为中断线,在1BIT模式下DAT0用来传输数据,在4BIT模式下DAT0-DAT3用来传输数据。
- CMD信号:用于HOST发送命令和DEVICE回复响应。
图 2 SDIO的HOST-DEVICE连接示意图
约束与限制
SDIO模块API当前仅支持内核态调用。
使用指导
场景介绍
SDIO的应用比较广泛,目前,有许多手机都支持SDIO功能,并且很多SDIO外设也被开发出来,使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。
接口说明
SDIO模块提供的主要接口如表1所示,具体API详见//drivers/hdf_core/framework/include/platform/sdio_if.h。
表 1 SDIO驱动API接口功能介绍
接口名 | 接口描述 |
---|---|
DevHandle SdioOpen(int16_t mmcBusNum, struct SdioFunctionConfig *config) | 打开指定总线号的SDIO控制器 |
void SdioClose(DevHandle handle) | 关闭SDIO控制器 |
int32_t SdioReadBytes(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size) | 从指定地址开始,增量读取指定长度的数据 |
int32_t SdioWriteBytes(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size) | 从指定地址开始,增量写入指定长度的数据 |
int32_t SdioReadBytesFromFixedAddr(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen) | 从固定地址读取指定长度的数据 |
int32_t SdioWriteBytesToFixedAddr(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen) | 向固定地址写入指定长度的数据 |
int32_t SdioReadBytesFromFunc0(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size) | 从SDIO function 0的指定地址空间读取指定长度的数据 |
int32_t SdioWriteBytesToFunc0(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size) | 向SDIO function 0的指定地址空间写入指定长度的数据 |
int32_t SdioSetBlockSize(DevHandle handle, uint32_t blockSize) | 设置块的大小 |
int32_t SdioGetCommonInfo(DevHandle handle, SdioCommonInfo *info, SdioCommonInfoType infoType) | 获取公共信息 |
int32_t SdioSetCommonInfo(DevHandle handle, SdioCommonInfo *info, SdioCommonInfoType infoType) | 设置公共信息 |
int32_t SdioFlushData(DevHandle handle) | 刷新数据 |
void SdioClaimHost(DevHandle handle) | 独占Host |
void SdioReleaseHost(DevHandle handle) | 释放Host |
int32_t SdioEnableFunc(DevHandle handle) | 使能SDIO功能设备 |
int32_t SdioDisableFunc(DevHandle handle) | 去使能SDIO功能设备 |
int32_t SdioClaimIrq(DevHandle handle, SdioIrqHandler *irqHandler) | 申请中断 |
int32_t SdioReleaseIrq(DevHandle handle) | 释放中断 |
使用流程
使用SDIO的一般流程如图3所示。
图 3 SDIO使用流程图
打开SDIO控制器
在使用SDIO进行通信前,首先要调用SdioOpen获取SDIO控制器的设备句柄,该函数会返回指定总线号的SDIO控制器的设备句柄。
DevHandle SdioOpen(int16_t mmcBusNum, struct SdioFunctionConfig *config);
表 2 SdioOpen函数的参数和返回值描述
参数 | 参数描述 |
---|---|
mmcBusNum | int16_t类型,总线号 |
config | 结构体指针,SDIO功能配置信息 |
返回值 | 返回值描述 |
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137132.html