blob: 9efc99bec9464d42932411da009cab9321c801db [file] [log] [blame]
mmc
---
The MMC driver provides support for SPI based MMC/SDcard interfaces. It
exports a ``disk_ops`` struct that can be used by any FS. Currently only
``fatfs`` can run over MMC.
Initialization
^^^^^^^^^^^^^^
.. code:: c
int mmc_init(int spi_num, void *spi_cfg, int ss_pin)
Initializes the mmc driver to be used by a FS.
MMC uses the ``hal_gpio`` interface to access the SPI ``ss_pin`` and the
``hal_spi`` interface for the communication with the card. ``spi_cfg``
must be a hw dependent structure used by ``hal_spi_init`` to initialize
the SPI subsystem.
Dependencies
^^^^^^^^^^^^
To include the ``mmc`` driver on a project, just include it as a
dependency in your pkg.yml:
::
pkg.deps:
- "@apache-mynewt-core/hw/drivers/mmc"
Returned values
^^^^^^^^^^^^^^^
MMC functions return one of the following status codes:
+-------------------------+--------------------------------------------------------+
| Return code | Description |
+=========================+========================================================+
| MMC\_OK | Success. |
+-------------------------+--------------------------------------------------------+
| MMC\_CARD\_ERROR | General failure on the card. |
+-------------------------+--------------------------------------------------------+
| MMC\_READ\_ERROR | Error reading from the card. |
+-------------------------+--------------------------------------------------------+
| MMC\_WRITE\_ERROR | Error writing to the card. |
+-------------------------+--------------------------------------------------------+
| MMC\_TIMEOUT | Timed out waiting for the execution of a command. |
+-------------------------+--------------------------------------------------------+
| MMC\_PARAM\_ERROR | An invalid parameter was given to a function. |
+-------------------------+--------------------------------------------------------+
| MMC\_CRC\_ERROR | CRC error reading card. |
+-------------------------+--------------------------------------------------------+
| MMC\_DEVICE\_ERROR | Tried to use an invalid device. |
+-------------------------+--------------------------------------------------------+
| MMC\_RESPONSE\_ERROR | A command received an invalid response. |
+-------------------------+--------------------------------------------------------+
| MMC\_VOLTAGE\_ERROR | The interface doesn't support the requested voltage. |
+-------------------------+--------------------------------------------------------+
| MMC\_INVALID\_COMMAND | The interface haven't accepted some command. |
+-------------------------+--------------------------------------------------------+
| MMC\_ERASE\_ERROR | Error erasing the current card. |
+-------------------------+--------------------------------------------------------+
| MMC\_ADDR\_ERROR | Tried to access an invalid address. |
+-------------------------+--------------------------------------------------------+
Header file
^^^^^^^^^^^
.. code:: c
#include "mmc/mmc.h"
Example
^^^^^^^
This example runs on the STM32F4-Discovery and prints out a listing of
the root directory on the currently installed card.
.. code:: c
// NOTE: error handling removed for clarity!
struct stm32f4_hal_spi_cfg spi_cfg = {
.ss_pin = SPI_SS_PIN,
.sck_pin = SPI_SCK_PIN,
.miso_pin = SPI_MISO_PIN,
.mosi_pin = SPI_MOSI_PIN,
.irq_prio = 2
};
mmc_init(0, &spi_cfg, spi_cfg.ss_pin);
disk_register("mmc0", "fatfs", &mmc_ops);
fs_opendir("mmc0:/", &dir);
while (1) {
rc = fs_readdir(dir, &dirent);
if (rc == FS_ENOENT) {
break;
}
fs_dirent_name(dirent, sizeof(out_name), out_name, &u8_len);
printf("%s\n", out_name);
}
fs_closedir(dir);