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

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

#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.

// 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);