SDIO使用实例

SDIO设备完整的使用示例如下所示,首先打开总线号为1的SDIO控制器,然后独占HOST、使能设备、注册中断,接着进行SDIO通信(读写等),通信完成之后,释放中断、去使能设备、释放HOST,最后关闭SDIO控制器。

  1. #include "hdf_log.h"
  2. #include "sdio_if.h"
  3. #define TEST_FUNC_NUM 1 /* 本测试用例中,使用编号为1的I/O function */
  4. #define TEST_FBR_BASE_ADDR 0x100 /* 编号为1的I/O function的FBR基地址 */
  5. #define TEST_ADDR_OFFSET 9 /* 本测试用例中,需要读写的寄存器的地址偏移 */
  6. #define TEST_DATA_LEN 3 /* 本测试用例中,读写数据的长度 */
  7. #define TEST_BLOCKSIZE 2 /* 本测试用例中,数据块的大小,单位字节 */
  8. /* 中断服务函数,需要根据各自平台的情况去实现 */
  9. static void SdioIrqFunc(void *data)
  10. {
  11. if (data == NULL) {
  12. HDF_LOGE("SdioIrqFunc: data is NULL.\n");
  13. return;
  14. }
  15. /* 需要开发者自行添加具体的实现 */
  16. }
  17. void SdioTestSample(void)
  18. {
  19. int32_t ret;
  20. struct DevHandle *handle = NULL;
  21. uint8_t data[TEST_DATA_LEN] = {0};
  22. int16_t busNum = 1;
  23. uint8_t val;
  24. uint32_t addr;
  25. /* 打开总线号为1的SDIO设备 */
  26. handle = SdioOpen(busNum);
  27. if (handle == NULL) {
  28. HDF_LOGE("SdioOpen: failed!\n");
  29. return;
  30. }
  31. /* 独占HOST */
  32. SdioClaimHost(handle);
  33. /* 使能SDIO设备 */
  34. ret = SdioEnableFunc(handle);
  35. if (ret != 0) {
  36. HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret);
  37. goto ENABLE_ERR;
  38. }
  39. /* 注册中断 */
  40. ret = SdioClaimIrq(handle, SdioIrqFunc);
  41. if (ret != 0) {
  42. HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret);
  43. goto CLAIM_IRQ_ERR;
  44. }
  45. /* 设置块大小为2字节 */
  46. ret = SdioSetBlockSize(handle, TEST_BLOCKSIZE);
  47. if (ret != 0) {
  48. HDF_LOGE("SdioSetBlockSize: failed, ret %d\n", ret);
  49. goto COMM_ERR;
  50. }
  51. /* 从SDIO设备增量地址读取3字节的数据 */
  52. addr = TEST_FBR_BASE_ADDR * TEST_FUNC_NUM + TEST_ADDR_OFFSET;
  53. ret = SdioReadBytes(handle, data, addr, TEST_DATA_LEN, 0);
  54. if (ret != 0) {
  55. HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret);
  56. goto COMM_ERR;
  57. }
  58. /* 向SDIO设备增量地址写入3字节的数据 */
  59. ret = SdioWriteBytes(handle, data, addr, TEST_DATA_LEN, 0);
  60. if (ret != 0) {
  61. HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret);
  62. goto COMM_ERR;
  63. }
  64. /* 从SDIO设备读取1字节的数据 */
  65. ret = SdioReadBytes(handle, &val, addr, 1, 0);
  66. if (ret != 0) {
  67. HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret);
  68. goto COMM_ERR;
  69. }
  70. /* 向SDIO设备写入1字节的数据 */
  71. ret = SdioWriteBytes(handle, &val, addr, 1, 0);
  72. if (ret != 0) {
  73. HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret);
  74. goto COMM_ERR;
  75. }
  76. /* 从SDIO设备固定地址读取3字节的数据 */
  77. ret = SdioReadBytesFromFixedAddr(handle, data, addr, TEST_DATA_LEN, 0);
  78. if (ret != 0) {
  79. HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret);
  80. goto COMM_ERR;
  81. }
  82. /* 向SDIO设备固定地址写入1字节的数据 */
  83. ret = SdioWriteBytesToFixedAddr(handle, data, addr, 1, 0);
  84. if (ret != 0) {
  85. HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret);
  86. goto COMM_ERR;
  87. }
  88. /* 从SDIO function 0读取1字节的数据 */
  89. addr = 0x02;
  90. ret = SdioReadBytesFromFunc0(handle, &val, addr, 1, 0);
  91. if (ret != 0) {
  92. HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret);
  93. goto COMM_ERR;
  94. }
  95. /* 向SDIO function 0写入1字节的数据 */
  96. ret = SdioWriteBytesToFunc0(handle, &val, addr, 1, 0);
  97. if (ret != 0) {
  98. HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret);
  99. goto COMM_ERR;
  100. }
  101. COMM_ERR:
  102. /* 释放中断 */
  103. ret = SdioReleaseIrq(handle);
  104. if (ret != 0) {
  105. HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret);
  106. }
  107. CLAIM_IRQ_ERR:
  108. /* 去使能SDIO设备 */
  109. ret = SdioDisableFunc(handle);
  110. if (ret != 0) {
  111. HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret);
  112. }
  113. ENABLE_ERR:
  114. /* 释放HOST */
  115. SdioReleaseHost(handle);
  116. /* 关闭SDIO设备 */
  117. SdioClose(handle);
  118. }