SDIO使用指导

    图 1 SDIO使用流程图

    打开SDIO控制器

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

    struct DevHandle *SdioOpen(int16_t busNum);

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

    打开SDIO控制器的示例如下:

    独占HOST

    获取到SDIO控制器的设备句柄之后,需要先独占HOST才能进行SDIO后续的一系列操作,独占HOST函数如下所示:

    void SdioClaimHost(struct DevHandle *handle);

    表 2 SdioClaimHost函数的参数描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    独占HOST示例如下:

    在访问寄存器之前,需要先使能SDIO设备,使能SDIO设备的函数如下所示:

    int32_t SdioEnableFunc(struct DevHandle *handle);

    表 3 SdioEnableFunc函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    返回值

    返回值描述

    0

    SDIO使能成功

    负数

    SDIO使能失败

    使能SDIO设备的示例如下:

    1. int32_t ret;
    2. /* 使能SDIO设备 */
    3. ret = SdioEnableFunc(handle);
    4. if (ret != 0) {
    5. HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret);
    6. }

    注册SDIO中断

    在通信之前,还需要注册SDIO中断,注册SDIO中断函数如下图所示:

    int32_t SdioClaimIrq(struct DevHandle *handle, SdioIrqHandler *handler);

    表 4 SdioClaimIrq函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    handler

    中断服务函数指针

    返回值

    返回值描述

    0

    注册中断成功

    负数

    注册中断失败

    注册SDIO中的示例如下:

    1. /* 中断服务函数需要根据各自平台的情况去实现 */
    2. static void SdioIrqFunc(void *data)
    3. {
    4. if (data == NULL) {
    5. HDF_LOGE("SdioIrqFunc: data is NULL.\n");
    6. return;
    7. }
    8. /* 需要开发者自行添加具体实现 */
    9. }
    10. /* 注册SDIO中断 */
    11. ret = SdioClaimIrq(handle, SdioIrqFunc);
    12. if (ret != 0) {
    13. HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret);

    进行SDIO通信

    • 向SDIO设备增量写入指定长度的数据

    对应的接口函数如下所示:

    int32_t SdioWriteBytes(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);

    表 5 SdioWriteBytes函数的参数和返回值描述

    向SDIO设备增量写入指定长度的数据的示例如下:

    • 从SDIO设备增量读取指定长度的数据

    int32_t SdioReadBytes(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);

    表 6 SdioReadBytes函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    data

    接收读取数据的指针

    addr

    待读取数据的起始地址

    size

    待读取数据的长度

    timeOut

    读取数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。

    返回值

    返回值描述

    0

    SDIO读数据成功

    负数

    SDIO读数据失败

    从SDIO设备增量读取指定长度的数据的示例如下:

    1. int32_t ret;
    2. uint8_t rbuff[5] = {0};
    3. uint32_t addr = 0x100 + 0x09;
    4. /* 从SDIO设备起始地址0x109,增量读取5个字节的数据 */
    5. ret = SdioReadBytes(handle, rbuff, addr, 5, 0);
    6. if (ret != 0) {
    7. HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret);
    8. }
    • 向SDIO设备的固定地址写入指定长度的数据

      对应的接口函数如下所示:

      int32_t SdioWriteBytesToFixedAddr(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut)

      表 7 SdioWriteBytesToFixedAddr函数的参数和返回值描述

      参数

      参数描述

      handle

      SDIO控制器的设备句柄

      data

      待写入数据的指针

      addr

      待写入数据的固定地址

      size

      待写入数据的长度

      timeOut

      写入数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。

      返回值

      返回值描述

      0

      SDIO写数据成功

      负数

      SDIO写数据失败

      向SDIO设备的固定地址写入指定长度的数据的示例如下:

      1. int32_t ret;
      2. uint8_t wbuff[] = {12345};
      3. uint32_t addr = 0x100 + 0x09;
      4. /* 向SDIO设备固定地址0x109写入5个字节的数据 */
      5. ret = SdioWriteBytesToFixedAddr(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0);
      6. if (ret != 0) {
      7. HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret);
      8. }
    • 从SDIO设备的固定地址读取指定长度的数据

      对应的接口函数如下所示:

      int32_t SdioReadBytesFromFixedAddr(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut)

      表 8 SdioReadBytesFromFixedAddr函数的参数和返回值描述

      参数

      参数描述

      handle

      SDIO控制器的设备句柄

      data

      接收读取数据的指针

      addr

      待读取数据的起始地址

      size

      待读取数据的长度

      timeOut

      读取数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。

      返回值

      返回值描述

      0

      SDIO读数据成功

      负数

      SDIO读数据失败

      从SDIO设备的固定地址读取指定长度的数据的示例如下:

      1. int32_t ret;
      2. uint8_t rbuff[5] = {0};
      3. /* 从SDIO设备固定地址0x109中读取5个字节的数据 */
      4. ret = SdioReadBytesFromFixedAddr(handle, rbuff, addr, 5, 0);
      5. HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret);
      6. }
    • 向SDIO function 0的指定地址空间写入指定长度的数据

    当前只支持写入一个字节的数据,对应的接口函数如下所示:

    int32_t SdioWriteBytesToFunc0(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);

    表 9 SdioWriteBytesToFunc0函数的参数和返回值描述

    向SDIO function 0的指定地址空间写入指定长度的数据的示例如下:

    • 从SDIO function 0的指定地址空间读取指定长度的数据

    当前只支持读取一个字节的数据,对应的接口函数如下所示:

    int32_t SdioReadBytesFromFunc0(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);

    表 10 SdioReadBytesFromFunc0函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    data

    接收读取数据的指针

    addr

    待读取数据的起始地址

    size

    待读取数据的长度

    timeOut

    读取数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。

    返回值

    返回值描述

    0

    SDIO读数据成功

    负数

    SDIO读数据失败

    从SDIO function 0的指定地址空间读取指定长度的数据的示例如下:

    1. int32_t ret;
    2. uint8_t rbuff;
    3. /* 从SDIO function 0设备地址0x2中读取1字节的数据 */
    4. ret = SdioReadBytesFromFunc0(handle, &rbuff, 0x2, 1, 0);
    5. if (ret != 0) {
    6. HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret);
    7. }

    通信完成之后,需要释放SDIO中断,函数如下所示:

    int32_t SdioReleaseIrq(struct DevHandle *handle);

    表 11 SdioReleaseIrq函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    返回值

    返回值描述

    0

    释放SDIO中断成功

    负数

    释放SDIO中断失败

    释放SDIO中断的示例如下:

    1. int32_t ret;
    2. /* 释放SDIO中断 */
    3. ret = SdioReleaseIrq(handle);
    4. if (ret != 0) {
    5. HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret);
    6. }

    去使能SDIO设备

    通信完成之后,还需要去使能SDIO设备,函数如下所示:

    int32_t SdioDisableFunc(struct DevHandle *handle);

    表 12 SdioDisableFunc函数的参数和返回值描述

    参数

    参数描述

    handle

    SDIO控制器的设备句柄

    返回值

    返回值描述

    0

    去使能SDIO设备成功

    负数

    去使能SDIO设备失败

    去使能SDIO设备的示例如下:

    1. int32_t ret;
    2. /* 去使能SDIO设备 */
    3. ret = SdioDisableFunc(handle);
    4. if (ret != 0) {
    5. HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret);
    6. }

    释放HOST

    通信完成之后,还需要释放去HOST,函数如下所示:

    void SdioReleaseHost(struct DevHandle *handle);

    表 13 SdioReleaseHost函数的参数描述

    释放HOST的示例如下:

    SDIO通信完成之后,最后需要关闭SDIO控制器,函数如下所示:

    void SdioClose(struct DevHandle *handle);

    该函数会释放掉申请的资源。

    表 14 SdioClose函数的参数描述

    参数

    参数描述

    handle

    关闭SDIO控制器的示例如下: