Harmony鸿蒙南向驱动开发-SDIO接口使用

Harmony鸿蒙南向驱动开发-SDIO接口使用SDIO 接口兼容以前的 SD 卡 并且可以连接支持 SDIO 接口的其他设备

大家好,欢迎来到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独立服务模式结构图

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的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控制器

在使用SDIO进行通信前,首先要调用SdioOpen获取SDIO控制器的设备句柄,该函数会返回指定总线号的SDIO控制器的设备句柄。

DevHandle SdioOpen(int16_t mmcBusNum, struct SdioFunctionConfig *config);

表 2 SdioOpen函数的参数和返回值描述

参数 参数描述
mmcBusNum int16_t类型,总线号
config 结构体指针,SDIO功能配置信息
返回值 返回值描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137132.html

(0)
上一篇 2025-06-22 19:33
下一篇 2025-06-22 19:45

相关推荐

发表回复

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

关注微信