dev_sdio.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2012-01-15 weety first version
  9. */
  10. #ifndef __DEV_SDIO_H__
  11. #define __DEV_SDIO_H__
  12. #include <rtthread.h>
  13. #include <drivers/mmcsd_host.h>
  14. #include <drivers/mmcsd_card.h>
  15. #include <drivers/sdio_func_ids.h>
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. /*
  20. * Card Common Control Registers (CCCR)
  21. */
  22. #define SDIO_REG_CCCR_CCCR_REV 0x00
  23. #define SDIO_CCCR_REV_1_00 0 /* CCCR/FBR Version 1.00 */
  24. #define SDIO_CCCR_REV_1_10 1 /* CCCR/FBR Version 1.10 */
  25. #define SDIO_CCCR_REV_1_20 2 /* CCCR/FBR Version 1.20 */
  26. #define SDIO_CCCR_REV_3_00 3 /* CCCR/FBR Version 2.00 */
  27. #define SDIO_SDIO_REV_1_00 0 /* SDIO Spec Version 1.00 */
  28. #define SDIO_SDIO_REV_1_10 1 /* SDIO Spec Version 1.10 */
  29. #define SDIO_SDIO_REV_1_20 2 /* SDIO Spec Version 1.20 */
  30. #define SDIO_SDIO_REV_2_00 3 /* SDIO Spec Version 2.00 */
  31. #define SDIO_REG_CCCR_SD_REV 0x01
  32. #define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */
  33. #define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */
  34. #define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */
  35. #define SDIO_REG_CCCR_IO_EN 0x02
  36. #define SDIO_REG_CCCR_IO_RDY 0x03
  37. #define SDIO_REG_CCCR_INT_EN 0x04 /* Function/Master Interrupt Enable */
  38. #define SDIO_REG_CCCR_INT_PEND 0x05 /* Function Interrupt Pending */
  39. #define SDIO_REG_CCCR_IO_ABORT 0x06 /* function abort/card reset */
  40. #define SDIO_REG_CCCR_BUS_IF 0x07 /* bus interface controls */
  41. #define SDIO_BUS_WIDTH_1BIT 0x00
  42. #define SDIO_BUS_WIDTH_4BIT 0x02
  43. #define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */
  44. #define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */
  45. #define SDIO_BUS_ASYNC_INT 0x20
  46. #define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */
  47. #define SDIO_REG_CCCR_CARD_CAPS 0x08
  48. #define SDIO_CCCR_CAP_SDC 0x01 /* can do CMD52 while data transfer */
  49. #define SDIO_CCCR_CAP_SMB 0x02 /* can do multi-block xfers (CMD53) */
  50. #define SDIO_CCCR_CAP_SRW 0x04 /* supports read-wait protocol */
  51. #define SDIO_CCCR_CAP_SBS 0x08 /* supports suspend/resume */
  52. #define SDIO_CCCR_CAP_S4MI 0x10 /* interrupt during 4-bit CMD53 */
  53. #define SDIO_CCCR_CAP_E4MI 0x20 /* enable ints during 4-bit CMD53 */
  54. #define SDIO_CCCR_CAP_LSC 0x40 /* low speed card */
  55. #define SDIO_CCCR_CAP_4BLS 0x80 /* 4 bit low speed card */
  56. #define SDIO_REG_CCCR_CIS_PTR 0x09 /* common CIS pointer (3 bytes) */
  57. /* Following 4 regs are valid only if SBS is set */
  58. #define SDIO_REG_CCCR_BUS_SUSPEND 0x0c
  59. #define SDIO_REG_CCCR_FUNC_SEL 0x0d
  60. #define SDIO_REG_CCCR_EXEC_FLAG 0x0e
  61. #define SDIO_REG_CCCR_READY_FLAG 0x0f
  62. #define SDIO_REG_CCCR_FN0_BLKSIZE 0x10 /* 2bytes, 0x10~0x11 */
  63. #define SDIO_REG_CCCR_POWER_CTRL 0x12
  64. #define SDIO_POWER_SMPC 0x01 /* Supports Master Power Control */
  65. #define SDIO_POWER_EMPC 0x02 /* Enable Master Power Control */
  66. #define SDIO_REG_CCCR_SPEED 0x13
  67. #define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */
  68. #define SDIO_SPEED_EHS 0x02 /* Enable High-Speed mode */
  69. /*
  70. * Function Basic Registers (FBR)
  71. */
  72. #define SDIO_REG_FBR_BASE(f) ((f) * 0x100) /* base of function f's FBRs */
  73. #define SDIO_REG_FBR_STD_FUNC_IF 0x00
  74. #define SDIO_FBR_SUPPORTS_CSA 0x40 /* supports Code Storage Area */
  75. #define SDIO_FBR_ENABLE_CSA 0x80 /* enable Code Storage Area */
  76. #define SDIO_REG_FBR_STD_IF_EXT 0x01
  77. #define SDIO_REG_FBR_POWER 0x02
  78. #define SDIO_FBR_POWER_SPS 0x01 /* Supports Power Selection */
  79. #define SDIO_FBR_POWER_EPS 0x02 /* Enable (low) Power Selection */
  80. #define SDIO_REG_FBR_CIS 0x09 /* CIS pointer (3 bytes) */
  81. #define SDIO_REG_FBR_CSA 0x0C /* CSA pointer (3 bytes) */
  82. #define SDIO_REG_FBR_CSA_DATA 0x0F
  83. #define SDIO_REG_FBR_BLKSIZE 0x10 /* block size (2 bytes) */
  84. /* SDIO CIS Tuple code */
  85. #define CISTPL_NULL 0x00
  86. #define CISTPL_CHECKSUM 0x10
  87. #define CISTPL_VERS_1 0x15
  88. #define CISTPL_ALTSTR 0x16
  89. #define CISTPL_MANFID 0x20
  90. #define CISTPL_FUNCID 0x21
  91. #define CISTPL_FUNCE 0x22
  92. #define CISTPL_SDIO_STD 0x91
  93. #define CISTPL_SDIO_EXT 0x92
  94. #define CISTPL_END 0xff
  95. /* SDIO device id */
  96. #define SDIO_ANY_FUNC_ID 0xff
  97. #define SDIO_ANY_MAN_ID 0xffff
  98. #define SDIO_ANY_PROD_ID 0xffff
  99. struct rt_sdio_device_id
  100. {
  101. rt_uint8_t func_code;
  102. rt_uint16_t manufacturer;
  103. rt_uint16_t product;
  104. };
  105. struct rt_sdio_driver
  106. {
  107. char *name;
  108. rt_int32_t (*probe)(struct rt_mmcsd_card *card);
  109. rt_int32_t (*remove)(struct rt_mmcsd_card *card);
  110. struct rt_sdio_device_id *id;
  111. };
  112. rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host,
  113. rt_uint32_t ocr,
  114. rt_uint32_t *cmd5_resp);
  115. rt_int32_t sdio_io_rw_direct(struct rt_mmcsd_card *card,
  116. rt_int32_t rw,
  117. rt_uint32_t fn,
  118. rt_uint32_t reg_addr,
  119. rt_uint8_t *pdata,
  120. rt_uint8_t raw);
  121. rt_int32_t sdio_io_rw_extended(struct rt_mmcsd_card *card,
  122. rt_int32_t rw,
  123. rt_uint32_t fn,
  124. rt_uint32_t addr,
  125. rt_int32_t op_code,
  126. rt_uint8_t *buf,
  127. rt_uint32_t blocks,
  128. rt_uint32_t blksize);
  129. rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
  130. rt_int32_t rw,
  131. rt_uint32_t addr,
  132. rt_int32_t op_code,
  133. rt_uint8_t *buf,
  134. rt_uint32_t len);
  135. rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
  136. rt_uint32_t reg,
  137. rt_int32_t *err);
  138. rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
  139. rt_uint32_t reg,
  140. rt_uint8_t data);
  141. rt_uint16_t sdio_io_readw(struct rt_sdio_function *func,
  142. rt_uint32_t addr,
  143. rt_int32_t *err);
  144. rt_int32_t sdio_io_writew(struct rt_sdio_function *func,
  145. rt_uint16_t data,
  146. rt_uint32_t addr);
  147. rt_uint32_t sdio_io_readl(struct rt_sdio_function *func,
  148. rt_uint32_t addr,
  149. rt_int32_t *err);
  150. rt_int32_t sdio_io_writel(struct rt_sdio_function *func,
  151. rt_uint32_t data,
  152. rt_uint32_t addr);
  153. rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
  154. rt_uint32_t addr,
  155. rt_uint8_t *buf,
  156. rt_uint32_t len);
  157. rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
  158. rt_uint32_t addr,
  159. rt_uint8_t *buf,
  160. rt_uint32_t len);
  161. rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
  162. rt_uint32_t addr,
  163. rt_uint8_t *buf,
  164. rt_uint32_t len);
  165. rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
  166. rt_uint32_t addr,
  167. rt_uint8_t *buf,
  168. rt_uint32_t len);
  169. rt_int32_t init_sdio(struct rt_mmcsd_host *host, rt_uint32_t ocr);
  170. rt_int32_t sdio_attach_irq(struct rt_sdio_function *func,
  171. rt_sdio_irq_handler_t *handler);
  172. rt_int32_t sdio_detach_irq(struct rt_sdio_function *func);
  173. void sdio_irq_wakeup(struct rt_mmcsd_host *host);
  174. rt_int32_t sdio_enable_func(struct rt_sdio_function *func);
  175. rt_int32_t sdio_disable_func(struct rt_sdio_function *func);
  176. void sdio_set_drvdata(struct rt_sdio_function *func, void *data);
  177. void* sdio_get_drvdata(struct rt_sdio_function *func);
  178. rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
  179. rt_uint32_t blksize);
  180. rt_int32_t sdio_register_driver(struct rt_sdio_driver *driver);
  181. rt_int32_t sdio_unregister_driver(struct rt_sdio_driver *driver);
  182. void rt_sdio_init(void);
  183. #ifdef __cplusplus
  184. }
  185. #endif
  186. #endif