OpenHarmony(鸿蒙南向)——平台驱动开发【SDIO】

概述

功能简介

SDIO(Secure Digital Input and Output)由SD卡发展而来,与SD卡统称为MMC(MultiMediaCard),二者使用相同的通信协议。SDIO接口兼容以前的SD卡,并且可以连接支持SDIO接口的其他设备。

运作机制

在HDF框架中,SDIO的接口适配模式采用独立服务模式(如图1)。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,若设备过多可能增加内存占用。

独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:

  • 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。
  • device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。

SDIO模块各分层作用:

  • 接口层提供打开SDIO设备、设置块的大小、读取数据、写数据、设置公共信息、获取公共信息、刷新数据、独占HOST、释放Host、使能SDIO功能设备、去使能SDIO功能设备、申请中断、释放中断关闭SDIO设备的接口。

  • 核心层主要提供SDIO控制器的添加、移除及管理的能力,通过钩子函数与适配层交互。

  • 适配层主要是将钩子函数的功能实例化,实现具体的功能。

图 1 SDIO独立服务模式结构图

约束与限制

SDIO模块API当前仅支持内核态调用。

开发指导

场景介绍

SDIO的应用比较广泛,目前,有许多手机都支持SDIO功能,并且很多SDIO外设也被开发出来,使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。当驱动开发者需要将SDIO设备适配到OpenHarmony时,需要进行SDIO驱动适配,下文将介绍如何进行SDIO驱动适配。

接口说明

为了保证上层在调用SDIO接口时能够正确的操作硬件,核心层在//drivers/hdf_core/framework/model/storage/include/mmc/mmc_sdio.h中定义了以下钩子函数。驱动适配者需要在适配层实现这些函数的具体功能,并与这些钩子函数挂接,从而完成接口层与核心层的交互。

SdioDeviceOps定义:

struct SdioDeviceOps {
    int32_t (*incrAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);
    int32_t (*incrAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);
    int32_t (*fixedAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);
    int32_t (*fixedAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);
    int32_t (*func0ReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);
    int32_t (*func0WriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size);
    int32_t (*setBlockSize)(struct SdioDevice *dev, uint32_t blockSize);
    int32_t (*getCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType);
    int32_t (*setCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType);
    int32_t (*flushData)(struct SdioDevice *dev);
    int32_t (*enableFunc)(struct SdioDevice *dev);
    int32_t (*disableFunc)(struct SdioDevice *dev);
    int32_t (*claimIrq)(struct SdioDevice *dev, SdioIrqHandler *irqHandler);
    int32_t (*releaseIrq)(struct SdioDevice *dev);
    int32_t (*findFunc)(struct SdioDevice *dev, struct SdioFunctionConfig *configData);
    int32_t (*claimHost)(struct SdioDevice *dev);
    int32_t (*releaseHost)(struct SdioDevice *dev);
};
c

表 1 SdioDeviceOps结构体成员的钩子函数功能说明

函数 入参 出参 返回值 功能
incrAddrReadBytes dev:结构体指针,SDIO设备控制器
addr:uint32_t类型,地址值
size:uint32_t类型,大小
data:uint8_t类型指针,传出值 HDF_STATUS相关状态 从指定的SDIO地址增量读取给定长度的数据
incrAddrWriteBytes dev:结构体指针,SDIO设备控制器
data:uint8_t类型指针,传入值
addr:uint32_t类型,地址值
size:uint32_t类型,大小
HDF_STATUS相关状态 将给定长度的数据增量写入指定的SDIO地址
fixedAddrReadBytes dev:结构体指针,SDIO设备控制器
addr:uint32_t类型,地址值
size:uint32_t类型,大小
scatterLen:uint32_t类型,数据长度
data:uint8_t类型指针,传出值 HDF_STATUS相关状态 从固定SDIO地址读取给定长度的数据。
fixedAddrWriteBytes dev:结构体指针,SDIO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值