sdio.h 6.9 KB

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