SDIO使用指导
使用流程
使用SDIO的一般流程如图1所示。
图 1 SDIO使用流程图

打开SDIO控制器
在使用SDIO进行通信前,首先要调用SdioOpen获取SDIO控制器的设备句柄,该函数会返回指定总线号的SDIO控制器的设备句柄。
struct DevHandle *SdioOpen(int16_t busNum);
表 1 SdioOpen函数的参数和返回值描述
| 参数 | 参数描述 |
|---|---|
| busNum | SDIO的总线号 |
| 返回值 | 返回值描述 |
| NULL | 获取SDIO控制器的设备句柄失败 |
| 设备句柄 | SDIO控制器的设备句柄 |
打开SDIO控制器的示例如下:
1. struct DevHandle *handle = NULL;
2. int16_t busNum = 1;
3. /* 打开总线号为1的SDIO控制器 */
4. handle = SdioOpen(busNum);
5. if (handle == NULL) {
6. HDF_LOGE("SdioOpen: failed!\n");
7. }
独占HOST
获取到SDIO控制器的设备句柄之后,需要先独占HOST才能进行SDIO后续的一系列操作,独占HOST函数如下所示:
void SdioClaimHost(struct DevHandle *handle);
表 2 SdioClaimHost函数的参数描述
| 参数 | 参数描述 |
|---|---|
| handle | SDIO控制器的设备句柄 |
独占HOST示例如下:
1. SdioClaimHost(handle); /* 独占HOST */
使能SDIO设备
在访问寄存器之前,需要先使能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. }
11. int32_t ret;
12. /* 注册SDIO中断 */
13. ret = SdioClaimIrq(handle, SdioIrqFunc);
14. if (ret != 0) {
15. HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret);
16. }
进行SDIO通信
- 向SDIO设备增量写入指定长度的数据
对应的接口函数如下所示:
int32_t SdioWriteBytes(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);
表 5 SdioWriteBytes函数的参数和返回值描述
| 参数 | 参数描述 |
|---|---|
| handle | SDIO控制器的设备句柄 |
| data | 待写入数据的指针 |
| addr | 待写入数据的起始地址 |
| size | 待写入数据的长度 |
| timeOut | 写入数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。 |
| 返回值 | 返回值描述 |
| 0 | SDIO写数据成功 |
| 负数 | SDIO写数据失败 |
向SDIO设备增量写入指定长度的数据的示例如下:
1. int32_t ret;
2. uint8_t wbuff[] = {1,2,3,4,5};
3. uint32_t addr = 0x100 + 0x09;
4. /* 向SDIO设备起始地址0x109,增量写入5个字节的数据 */
5. ret = SdioWriteBytes(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0);
6. if (ret != 0) {
7. HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret);
8. }
- 从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设备的固定地址写入指定长度的数据的示例如下:
```
- int32_t ret;
- uint8_t wbuff[] = {1,2,3,4,5};
- uint32_t addr = 0x100 + 0x09;
- / 向SDIO设备固定地址0x109写入5个字节的数据 /
- ret = SdioWriteBytesToFixedAddr(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0);
- if (ret != 0) {
- HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret);
- } ``` - 从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设备的固定地址读取指定长度的数据的示例如下:
```
- int32_t ret;
- uint8_t rbuff[5] = {0};
- uint32_t addr = 0x100 + 0x09;
- / 从SDIO设备固定地址0x109中读取5个字节的数据 /
- ret = SdioReadBytesFromFixedAddr(handle, rbuff, addr, 5, 0);
- if (ret != 0) {
- HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret);
- } ```
- 向SDIO function 0的指定地址空间写入指定长度的数据
当前只支持写入一个字节的数据,对应的接口函数如下所示:
int32_t SdioWriteBytesToFunc0(struct DevHandle *handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t timeOut);
表 9 SdioWriteBytesToFunc0函数的参数和返回值描述
| 参数 | 参数描述 |
|---|---|
| handle | SDIO控制器的设备句柄 |
| data | 待写入数据的指针 |
| addr | 待写入数据的起始地址 |
| size | 待写入数据的长度 |
| timeOut | 写入数据的最大时间限制,单位毫秒。如果该字段为0,则使用平台对应的默认值。 |
| 返回值 | 返回值描述 |
| 0 | SDIO写数据成功 |
| 负数 | SDIO写数据失败 |
向SDIO function 0的指定地址空间写入指定长度的数据的示例如下:
1. int32_t ret;
2. uint8_t wbuff = 1;
3. /* 向SDIO function 0地址0x2中写入1字节的数据 */
4. ret = SdioWriteBytesToFunc0(handle, &wbuff, 0x2, 1, 0);
5. if (ret != 0) {
6. HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret);
7. }
- 从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中断
通信完成之后,需要释放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函数的参数描述
| 参数 | 参数描述 |
|---|---|
| handle | SDIO控制器的设备句柄 |
释放HOST的示例如下:
1. SdioReleaseHost(handle); /* 释放HOST */
关闭SDIO控制器
SDIO通信完成之后,最后需要关闭SDIO控制器,函数如下所示:
void SdioClose(struct DevHandle *handle);
该函数会释放掉申请的资源。
表 14 SdioClose函数的参数描述
| 参数 | 参数描述 |
|---|---|
| handle | SDIO控制器的设备句柄 |
关闭SDIO控制器的示例如下:
1. SdioClose(handle); /* 关闭SDIO控制器 */
