sdio.h 7.8 KB

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