sdmmc.rst 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. SDMMC Host Peripheral
  2. =====================
  3. Overview
  4. --------
  5. SDMMC peripheral supports SD and MMC memory cards and SDIO cards. SDMMC software builds on top of SDMMC driver and consists of the following parts:
  6. 1. SDMMC host driver (``driver/sdmmc_host.h``) — this driver provides APIs to send commands to the slave device(s), send and receive data, and handling error conditions on the bus.
  7. 2. SDMMC protocol layer (``sdmmc_cmd.h``) — this component handles specifics of SD protocol such as card initialization and data transfer commands. Despite the name, only SD (SDSC/SDHC/SDXC) cards are supported at the moment. Support for MCC/eMMC cards can be added in the future.
  8. Protocol layer works with the host via ``sdmmc_host_t`` structure. This structure contains pointers to various functions of the host. This design makes it possible to implement an SD host using SPI interface later.
  9. Application Example
  10. -------------------
  11. An example which combines SDMMC driver with FATFS library is provided in ``examples/storage/sd_card`` directory. This example initializes the card, writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information.
  12. Protocol layer APIs
  13. -------------------
  14. Protocol layer is given ``sdmmc_host_t`` structure which describes the SD/MMC host driver, lists its capabilites, and provides pointers to functions of the driver. Protocol layer stores card-specific information in ``sdmmc_card_t`` structure. When sending commands to the SD/MMC host driver, protocol layer uses ``sdmmc_command_t`` structure to describe the command, argument, expected return value, and data to transfer, if any.
  15. Normal usage of the protocol layer is as follows:
  16. 1. Call the host driver functions to initialize the host (e.g. ``sdmmc_host_init``, ``sdmmc_host_init_slot``).
  17. 2. Call ``sdmmc_card_init`` to initialize the card, passing it host driver information (``host``) and a pointer to ``sdmmc_card_t`` structure which will be filled in (``card``).
  18. 3. To read and write sectors of the card, use ``sdmmc_read_sectors`` and ``sdmmc_write_sectors``, passing the pointer to card information structure (``card``).
  19. 4. When card is not used anymore, call the host driver function to disable SDMMC host peripheral and free resources allocated by the driver (e.g. ``sdmmc_host_deinit``).
  20. Most applications need to use the protocol layer only in one task; therefore the protocol layer doesn't implement any kind of locking on the ``sdmmc_card_t`` structure, or when accessing SDMMC host driver. Such locking has to be implemented in the higher layer, if necessary (e.g. in the filesystem driver).
  21. .. doxygenstruct:: sdmmc_host_t
  22. :members:
  23. .. doxygendefine:: SDMMC_HOST_FLAG_1BIT
  24. .. doxygendefine:: SDMMC_HOST_FLAG_4BIT
  25. .. doxygendefine:: SDMMC_HOST_FLAG_8BIT
  26. .. doxygendefine:: SDMMC_HOST_FLAG_SPI
  27. .. doxygendefine:: SDMMC_FREQ_DEFAULT
  28. .. doxygendefine:: SDMMC_FREQ_HIGHSPEED
  29. .. doxygendefine:: SDMMC_FREQ_PROBING
  30. .. doxygenstruct:: sdmmc_command_t
  31. :members:
  32. .. doxygenstruct:: sdmmc_card_t
  33. :members:
  34. .. doxygenstruct:: sdmmc_csd_t
  35. :members:
  36. .. doxygenstruct:: sdmmc_cid_t
  37. :members:
  38. .. doxygenstruct:: sdmmc_scr_t
  39. :members:
  40. .. doxygenfunction:: sdmmc_card_init
  41. .. doxygenfunction:: sdmmc_write_sectors
  42. .. doxygenfunction:: sdmmc_read_sectors
  43. SDMMC host driver APIs
  44. ----------------------
  45. On the ESP32, SDMMC host peripheral has two slots:
  46. - Slot 0 (``SDMMC_HOST_SLOT_0``) is an 8-bit slot. It uses ``HS1_*`` signals in the PIN MUX.
  47. - Slot 1 (``SDMMC_HOST_SLOT_1``) is a 4-bit slot. It uses ``HS2_*`` signals in the PIN MUX.
  48. Card Detect and Write Protect signals can be routed to arbitrary pins using GPIO matrix. To use these pins, set ``gpio_cd`` and ``gpio_wp`` members of ``sdmmc_slot_config_t`` structure when calling ``sdmmc_host_init_slot``.
  49. Of all the funtions listed below, only ``sdmmc_host_init``, ``sdmmc_host_init_slot``, and ``sdmmc_host_deinit`` will be used directly by most applications. Other functions, such as ``sdmmc_host_set_bus_width``, ``sdmmc_host_set_card_clk``, and ``sdmmc_host_do_transaction`` will be called by the SD/MMC protocol layer via function pointers in ``sdmmc_host_t`` structure.
  50. .. doxygenfunction:: sdmmc_host_init
  51. .. doxygendefine:: SDMMC_HOST_SLOT_0
  52. .. doxygendefine:: SDMMC_HOST_SLOT_1
  53. .. doxygendefine:: SDMMC_HOST_DEFAULT
  54. .. doxygendefine:: SDMMC_SLOT_WIDTH_DEFAULT
  55. .. doxygenfunction:: sdmmc_host_init_slot
  56. .. doxygenstruct:: sdmmc_slot_config_t
  57. :members:
  58. .. doxygendefine:: SDMMC_SLOT_NO_CD
  59. .. doxygendefine:: SDMMC_SLOT_NO_WP
  60. .. doxygendefine:: SDMMC_SLOT_CONFIG_DEFAULT
  61. .. doxygenfunction:: sdmmc_host_set_bus_width
  62. .. doxygenfunction:: sdmmc_host_set_card_clk
  63. .. doxygenfunction:: sdmmc_host_do_transaction
  64. .. doxygenfunction:: sdmmc_host_deinit