mirror of
https://github.com/espressif/esp-idf.git
synced 2026-05-04 03:52:01 +02:00
Merge branch 'feature/sdio_slave_c6' into 'master'
sdio: c6 support Closes IDF-5809 See merge request espressif/esp-idf!21486
This commit is contained in:
@@ -24,7 +24,9 @@ Peripherals API
|
||||
:SOC_MCPWM_SUPPORTED: mcpwm
|
||||
:SOC_PCNT_SUPPORTED: pcnt
|
||||
:SOC_RMT_SUPPORTED: rmt
|
||||
:SOC_SDMMC_HOST_SUPPORTED: sd_pullup_requirements
|
||||
:esp32: sd_pullup_requirements
|
||||
:esp32s3: sd_pullup_requirements
|
||||
:esp32c6: sd_pullup_requirements
|
||||
:SOC_SDMMC_HOST_SUPPORTED: sdmmc_host
|
||||
sdspi_host
|
||||
:SOC_SDIO_SLAVE_SUPPORTED: sdio_slave
|
||||
|
||||
@@ -4,35 +4,57 @@ SDIO Card Slave Driver
|
||||
Overview
|
||||
--------
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
The ESP32 SDIO Card peripherals (Host, Slave) shares two sets of pins as below table.
|
||||
The first set is usually occupied by SPI0 bus which is responsible for the SPI flash holding the code to run.
|
||||
This means SDIO slave driver can only runs on the second set of pins while SDIO host is not using it.
|
||||
|
||||
The SDIO slave can run under 3 modes: SPI, 1-bit SD and 4-bit SD modes, which
|
||||
is detected automatically by the hardware. According to the SDIO
|
||||
specification, CMD and DAT0-3 lines should be pulled up no matter in 1-bit,
|
||||
4-bit or SPI mode.
|
||||
The SDIO slave can run under 3 modes: SPI, 1-bit SD and 4-bit SD modes, which
|
||||
is detected automatically by the hardware. According to the SDIO
|
||||
specification, CMD and DAT0-3 lines should be pulled up no matter in 1-bit,
|
||||
4-bit or SPI mode.
|
||||
|
||||
Connections
|
||||
^^^^^^^^^^^
|
||||
|
||||
+----------+---------------+-------+-------+
|
||||
| Pin Name | Corresponding | Slot1 | Slot2 |
|
||||
+ + pins in SPI +-------+-------+
|
||||
| | mode | GPIO Number |
|
||||
+==========+===============+=======+=======+
|
||||
| CLK | SCLK | 6 | 14 |
|
||||
+----------+---------------+-------+-------+
|
||||
| CMD | MOSI | 11 | 15 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT0 | MISO | 7 | 2 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT1 | Interrupt | 8 | 4 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT2 | N.C. (pullup) | 9 | 12 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT3 | #CS | 10 | 13 |
|
||||
+----------+---------------+-------+-------+
|
||||
.. only:: esp32
|
||||
|
||||
+----------+---------------+-------+-------+
|
||||
| Pin Name | Corresponding | Slot1 | Slot2 |
|
||||
+ + pins in SPI +-------+-------+
|
||||
| | mode | GPIO Number |
|
||||
+==========+===============+=======+=======+
|
||||
| CLK | SCLK | 6 | 14 |
|
||||
+----------+---------------+-------+-------+
|
||||
| CMD | MOSI | 11 | 15 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT0 | MISO | 7 | 2 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT1 | Interrupt | 8 | 4 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT2 | N.C. (pullup) | 9 | 12 |
|
||||
+----------+---------------+-------+-------+
|
||||
| DAT3 | #CS | 10 | 13 |
|
||||
+----------+---------------+-------+-------+
|
||||
|
||||
.. only:: esp32c6
|
||||
|
||||
+----------+--------------------------------+---------------+
|
||||
| Pin Name | Corresponding pins in SPI mode | GPIO Number |
|
||||
+==========+================================+===============+
|
||||
| CLK | SCLK | 19 |
|
||||
+----------+--------------------------------+---------------+
|
||||
| CMD | MOSI | 18 |
|
||||
+----------+--------------------------------+---------------+
|
||||
| DAT0 | MISO | 20 |
|
||||
+----------+--------------------------------+---------------+
|
||||
| DAT1 | Interrupt | 21 |
|
||||
+----------+--------------------------------+---------------+
|
||||
| DAT2 | N.C. (pullup) | 22 |
|
||||
+----------+--------------------------------+---------------+
|
||||
| DAT3 | #CS | 23 |
|
||||
+----------+--------------------------------+---------------+
|
||||
|
||||
- 1-bit SD mode: Connect CLK, CMD, DAT0, DAT1 pins and the ground.
|
||||
- 4-bit SD mode: Connect all pins and the ground.
|
||||
@@ -45,23 +67,25 @@ Connections
|
||||
:ref:`compatibility_overview_espressif_hw_sdio` to see whether your
|
||||
development boards have such pullups.
|
||||
|
||||
.. note:: Most official modules have conflicts on strapping pins with the
|
||||
SDIO slave function. If you are using a ESP32 module with 3.3 V flash
|
||||
inside, you have to burn the EFUSE when you are developing on the module
|
||||
for the first time. See :ref:`compatibility_overview_espressif_hw_sdio` to
|
||||
see how to make your modules compatible with the SDIO.
|
||||
.. only:: esp32
|
||||
|
||||
Here is a list for modules/kits with 3.3 V flash:
|
||||
.. note:: Most official modules have conflicts on strapping pins with the
|
||||
SDIO slave function. If you are using a ESP32 module with 3.3 V flash
|
||||
inside, you have to burn the EFUSE when you are developing on the module
|
||||
for the first time. See :ref:`compatibility_overview_espressif_hw_sdio` to
|
||||
see how to make your modules compatible with the SDIO.
|
||||
|
||||
- Modules: ESP32-PICO-D4, ESP32-WROOM-32 series (including ESP32-SOLO-1),
|
||||
ESP32-WROVER-B and ESP32-WROVER-IB
|
||||
- Kits: ESP32-PICO-KIT, ESP32-DevKitC (till v4), ESP32-WROVER-KIT
|
||||
(v4.1 (also known as ESP32-WROVER-KIT-VB), v2, v1 (also known as DevKitJ
|
||||
v1))
|
||||
Here is a list for modules/kits with 3.3 V flash:
|
||||
|
||||
You can tell the version of your ESP23-WROVER-KIT version from the module
|
||||
on it: v4.1 are with ESP32-WROVER-B modules, v3 are with ESP32-WROVER
|
||||
modules, while v2 and v1 are with ESP32-WROOM-32 modules.
|
||||
- Modules: ESP32-PICO-D4, ESP32-WROOM-32 series (including ESP32-SOLO-1),
|
||||
ESP32-WROVER-B and ESP32-WROVER-IB
|
||||
- Kits: ESP32-PICO-KIT, ESP32-DevKitC (till v4), ESP32-WROVER-KIT
|
||||
(v4.1 (also known as ESP32-WROVER-KIT-VB), v2, v1 (also known as DevKitJ
|
||||
v1))
|
||||
|
||||
You can tell the version of your ESP23-WROVER-KIT version from the module
|
||||
on it: v4.1 are with ESP32-WROVER-B modules, v3 are with ESP32-WROVER
|
||||
modules, while v2 and v1 are with ESP32-WROOM-32 modules.
|
||||
|
||||
Refer to :doc:`sd_pullup_requirements` for more technical details of the pullups.
|
||||
|
||||
@@ -90,7 +114,7 @@ Terminology
|
||||
The SDIO slave driver uses the following terms:
|
||||
|
||||
- Transfer: a transfer is always started by a command token from the host, and may contain a reply and several data
|
||||
blocks. ESP32 slave software is based on transfers.
|
||||
blocks. {IDF_TARGET_NAME} SDIO slave software is based on transfers.
|
||||
- Sending: slave to host transfers.
|
||||
- Receiving: host to slave transfers.
|
||||
|
||||
@@ -109,29 +133,29 @@ The SDIO slave driver uses the following terms:
|
||||
- Requested length: The length requested in one transfer determined by the FIFO address.
|
||||
- Transfer length: The length requested in one transfer determined by the CMD53 byte/block count field.
|
||||
|
||||
.. note:: Requested length is different from the transfer length. ESP32 slave DMA base on the *requested length* rather
|
||||
.. note:: Requested length is different from the transfer length. {IDF_TARGET_NAME} SDIO slave DMA base on the *requested length* rather
|
||||
than the *transfer length*. The *transfer length* should be no shorter than the *requested length*, and the rest
|
||||
part will be filled with 0 (sending) or discard (receiving).
|
||||
|
||||
- Receiving buffer size: The buffer size is pre-defined between the host and the slave before communication starts.
|
||||
Slave application has to set the buffer size during initialization by the ``recv_buffer_size`` member of
|
||||
``sdio_slave_config_t``.
|
||||
- Interrupts: the esp32 slave support interrupts in two directions: from host to slave (called slave interrupts below)
|
||||
- Interrupts: the {IDF_TARGET_NAME} SDIO slave support interrupts in two directions: from host to slave (called slave interrupts below)
|
||||
and from slave to host (called host interrupts below). See more in :ref:`interrupts`.
|
||||
- Registers: specific address in Function 1 access by CMD52 or CMD53.
|
||||
|
||||
Communication with ESP SDIO Slave
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The host should initialize the ESP32 SDIO slave according to the standard
|
||||
The host should initialize the {IDF_TARGET_NAME} SDIO slave according to the standard
|
||||
SDIO initialization process (Sector 3.1.2 of `SDIO Simplified
|
||||
Specification <https://www.sdcard.org/downloads/pls/>`_), which is described
|
||||
briefly in :ref:`esp_slave_init`.
|
||||
|
||||
Furthermore, there's an ESP32-specific upper-level communication protocol upon the CMD52/CMD53 to
|
||||
Furthermore, there's an {IDF_TARGET_NAME}-specific upper-level communication protocol upon the CMD52/CMD53 to
|
||||
Func 1. Please refer to :ref:`esp_slave_protocol_layer`. There is also a component
|
||||
:doc:`ESP Serial Slave Link </api-reference/protocols/esp_serial_slave_link>`
|
||||
for ESP32 master to communicate with ESP32 SDIO slave, see example :example:`peripherals/sdio`
|
||||
for {IDF_TARGET_NAME} master to communicate with {IDF_TARGET_NAME} SDIO slave, see example :example:`peripherals/sdio`
|
||||
when programming your host.
|
||||
|
||||
|
||||
@@ -222,7 +246,7 @@ following functions instead:
|
||||
If non-blocking call is needed, set ``wait=0``. If the ``wait`` is not ``portMAX_DELAY`` (wait until success),
|
||||
application has to check the result to know whether the data is put in to the queue or discard.
|
||||
|
||||
2. Call ``sdio_slave_send_get_finished`` to get and deal with a finished transfer. A buffer should be keep unmodified
|
||||
2. Call ``sdio_slave_send_get_finished`` to get and deal with a finished transfer. A buffer should be kept unmodified
|
||||
until returned from ``sdio_slave_send_get_finished``. This means the buffer is actually sent to the host, rather
|
||||
than just staying in the queue.
|
||||
|
||||
@@ -281,5 +305,3 @@ API Reference
|
||||
|
||||
.. include-build-file:: inc/sdio_slave_types.inc
|
||||
.. include-build-file:: inc/sdio_slave.inc
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ The services provided by the SDIO Slave peripheral of the {IDF_TARGET_NAME} chip
|
||||
ESP SDIO Slave Initialization
|
||||
-----------------------------
|
||||
|
||||
The host should initialize the ESP32 SDIO slave according to the standard SDIO initialization process (Section 3.1.2 of `SDIO Simplified Specification <https://www.sdcard.org/downloads/pls/>`_). In this specification as well as below, the SDIO slave is called an (SD)IO card. Here is a brief example of an ESP SDIO Slave initialization process:
|
||||
The host should initialize the {IDF_TARGET_NAME} SDIO slave according to the standard SDIO initialization process (Section 3.1.2 of `SDIO Simplified Specification <https://www.sdcard.org/downloads/pls/>`_). In this specification as well as below, the SDIO slave is called an (SD)IO card. Here is a brief example of an ESP SDIO Slave initialization process:
|
||||
|
||||
1. SDIO reset
|
||||
CMD52 (Write 0x6=0x8)
|
||||
@@ -171,7 +171,7 @@ Interrupts
|
||||
|
||||
SDIO interrupts are "level sensitive". For host interrupts, the slave sends an interrupt by pulling the DAT1 line down at a proper time. The host detects when the interrupt line is pulled down and reads the INT_ST register to determine the source of the interrupt. After that, the host can clear the interrupt bits by writing the INT_CLR register and process the interrupt. The host can also mask unneeded sources by clearing the bits in the INT_ENA register corresponding to the sources. If all the sources are cleared (or masked), the DAT1 line goes inactive.
|
||||
|
||||
On ESP32, the corresponding host_int bits are: bit 0 to bit 7.
|
||||
On {IDF_TARGET_NAME}, the corresponding host_int bits are: bit 0 to bit 7.
|
||||
|
||||
For slave interrupts, the host sends a transfer to write the SLAVE_INT register. Once a bit is set to 1, the slave hardware and the driver will detect it and inform the application.
|
||||
|
||||
@@ -199,4 +199,3 @@ To read the slave's sending FIFO, the host should complete the following steps:
|
||||
3. **If new packets are ready, read the PKT_LEN register**. Before reading the packets, determine the length of data to be read. As the host keeps the length of data already read from the slave, subtract this value from PKT_LEN, the result will be the maximum length of data available for reading. If no data has been added to the sending FIFO yet, wait and poll until the slave is ready and update PKT_LEN.
|
||||
4. **Read from the FIFO using CMD53**. Note that the *requested length* should not be greater than calculated at Step 3, and the FIFO address is related to *requested length*.
|
||||
5. **Update the read length**.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user