The MultiMediaCard (MMC)/Secure Digital (SD)/Secure Digital Input Output (SDIO) host driver implements a standard Linux driver interface to the SD/MMC host controller (SDMMC). The host driver is part of the Linux kernel MMC framework.

The STMicroelectronics STM32MP15 CPU has three SDMMC controllers.

On the ConnectCore MP15 system-on-module:

  • The three SDMMC interfaces are available at the LGA pads, multiplexed with other functionality.

  • SDMMC2 is available (4 data bits) at the castellated pads, multiplexed with other functionality.

  • SDMMC3 connects internally to the Murata LBEE5PK2AE-564 wireless chip using four data lines (on wireless variants).

On the ConnectCore MP15 Development Kit:

  • SDMMC2 is connected to the microSD card holder (using four data lines).

  • SDMMC3 is available at J1 RF EXPANSION connector footprint (to be used only on non-wireless variants).

The STM32MP15 can boot from an SD card from SDMMC1 by default. To boot from an SD card using a different interface, such as SDMMC2 on the ConnectCore MP15 Development Kit, you must blow certain OTP bits.

Kernel configuration

You can manage the SDMMC driver support through the following kernel configuration option:

  • STMicroelectronics STM32 SDMMC host controller (CONFIG_MMC_STM32_SDMMC)

This option is enabled as built-in on the default ConnectCore MP15 kernel configuration file.

Kernel driver

The driver for the SDMMC is located at:

File Description

drivers/mmc/host/mmci_stm32_sdmmc.c

SDMMC driver

Device tree bindings and customization

The SDMMC device tree binding is documented at Documentation/devicetree/bindings/mmc/arm,pl18x.yaml.

Common MMC device tree bindings are documented at Documentation/devicetree/bindings/mmc/mmc-controller.yaml.

The common STM32MP15 CPU device tree defines all the SDMMC ports. The platform device tree must:

  • Enable the required SDMMC port, by setting the status property to "okay".

  • Select the bus-width depending on the number of data lines to use.

  • Select optional properties (broken-cd, non-removable…​), depending on the interface (see binding documentation).

  • Configure the pinctrl of the pads to use for the interface.

ConnectCore MP15 device tree
/* SDMMC3 (Wireless) */
&sdmmc3 {
	pinctrl-names = "default", "opendrain", "sleep";
	pinctrl-0 = <&sdmmc3_b4_pins_a>;
	pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
	pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
	non-removable;
	no-1-8-v;
	st,neg-edge;
	bus-width = <4>;
	vmmc-supply = <&reg_rf_wl_en>;
	status = "disabled";
};

If you are using the non-wireless variant, you may use sdmmc3 interface on your carrier board.

User space usage

The MMC block driver handles the file system read/write calls and uses the low-level MMC host controller interface driver to send the commands to the SDMMC controller.

The MMC device driver exposes the device through the file system at /dev/mmcblkX where X is a number, starting at zero, that indicates the device index.

If the block device is partitioned, the partitions will appear as /dev/mmcblkXpY where Y is a number, starting at one, that indicates the partition index.

By default, formatted partitions are auto-mounted upon detection if they are block devices.

You can also mount a partition’s file system using the mount command with the partition node, the file system type, and the mount point:

# mkdir -p /run/media/mmcblk0p1
# mount -t vfat /dev/mmcblk0p1 /run/media/mmcblk0p1

Device node mapping

On the ConnectCore MP15 Development Kit device tree, the uSDHC interface is set up to be mapped by Linux as follows:

  • The microSD card (connected to SDMMC2) is mapped to /dev/mmcblk0.

microSD card detection

The microSD card holder on the ConnectCore MP15 Development Kit does not have a card detection line. However, the Linux driver supports card detection by polling for the presence of a card.

Formatted partitions are auto-mounted upon card insertion.

If the microSD is not partitioned, you can use fdisk to create one partition of type .vfat and then give it format with mkfs, for example:

# echo -e 'o\nn\np\n1\n\n\nt\nb\nw\n' | fdisk /dev/mmcblk0 > /dev/null
# mkfs.vfat /dev/mmcblk0p1

If the device is partitioned but you still want to re-partition or re-format it, you must first unmount all the mounted partitions.