# 3.1.1.5. SD, eMMC and USB¶

The commands for using SD cards, eMMC flash and USB mass storage devices (hard drives, flash drives, card readers, etc) are all very similar. The biggest difference is that on some hardware we may not be able to run U-Boot out of ROM from the storage device as it is unsupported. Once U-Boot is running however, any of these may be used for the kernel and the root filesystem.

Usually in all the platforms there will be two MMC instances of which one would be SD and the other would be eMMC. The index of them can vary from one class of platforms to the other. For a given platform, the device number (device num) can be found in the following way,

U-Boot# mmc list
sdhci@fa10000: 0 (eMMC)
sdhci@fa00000: 1 (SD)


## 3.1.1.5.1. Partitioning eMMC from U-Boot¶

The eMMC device typically ships without any partition table. We make use of the GPT support in U-Boot to write a GPT partition table to eMMC. In this case we need to use the uuidgen program on the host to create the UUIDs used for the disk and each partition.

$uuidgen ...first uuid...$ uuidgen
...second uuid...

U-Boot # printenv partitions
uuid_disk=${uuid_gpt_disk};name=rootfs,start=2MiB,size=-,uuid=${uuid_gpt_rootfs}
U-Boot # setenv uuid_gpt_disk ...first uuid...
U-Boot # setenv uuid_gpt_rootfs ...second uuid...

## 3.1.1.5.3. Updating an SD card or eMMC using DFU¶

To see the list of available places to write to (in DFU terms, altsettings) use the mmc part command to list the partitions on the MMC device and printenv dfu_alt_settings_mmc or dfu_alt_settings_emmc to see how they are mapped and exposed to dfu-util.

U-Boot# mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Partition     Start Sector     Num Sectors     Type
1                   63          144522       c Boot
2               160650         1847475      83
3              2024190         1815345      83
U-Boot# printenv dfu_alt_info_mmc
dfu_alt_info=boot part 0 1;rootfs part 0 2;MLO fat 0 1;u-boot.img fat 0 1;uEnv.txt fat 0 1"


Note

The above command mmc part lists the partitions in the current selected device. So, to list the partitions in eMMC or SD one needs to switch to the required device by using the command mmc dev <device num>.

This means that you can tell dfu-util to write anything to any of:

• boot
• rootfs
• MLO
• u-boot.img
• uEnv.txt

And that the MLO, u-boot.img and uEnv.txt files are to be written to a FAT filesystem.

To start DFU on the target on the first MMC device:

U-Boot # setenv dfu_alt_info ${dfu_alt_info_mmc} U-Boot # dfu 0 mmc 0  On boards like AM57x GP EVM or BeagleBoard x15, where the second USB instance is used as USB client, the dfu command becomes: U-Boot # dfu 1 mmc 0  Then on the host PC to write MLO to an existing boot partition: $ sudo dfu-util -D MLO -a MLO


On the host PC to overwrite the current boot partition contents with a new created on the host FAT filesystem image:

$sudo dfu-util -D fat.img -a boot  ## 3.1.1.5.4. Booting Linux from SD card or eMMC¶ Within the default environment for each board that supports SD/MMC there is a boot command called mmcboot that will set the boot arguments correctly and start the kernel. In this case however, you must first run loaduimagefat or loaduimage to first load the kernel into memory. For the exact details of each use printenv on the mmcboot, loaduimagefat and loaduimage variables and then in turn printenv other sub-sections of the command. The most important variables here are mmcroot and mmcrootfstype. ## 3.1.1.5.5. Booting tiboot3.bin, tispl.bin and u-boot.img from eMMC boot partition (For K3 class of SoCs)¶ The K3 based processors support booting from the eMMC boot partition. The following commands can be used to download tiboot3.bin, tispl.bin and u-boot.img from an SD card and write them to the eMMC boot0 partition at respective addresses. => mmc dev 0 1 => fatload mmc 1${loadaddr} tiboot3.bin
=> mmc write ${loadaddr} 0x0 0x400 => fatload mmc 1${loadaddr} tispl.bin
=> mmc write ${loadaddr} 0x400 0x1000 => fatload mmc 1${loadaddr} u-boot.img
=> mmc write ${loadaddr} 0x1400 0x2000 => fatload mmc 1${loadaddr} sysfw.itb
=> mmc write ${loadaddr} 0x3600 0x800  For loading images from a FAT partition on a different media, replace mmc with the required media. For example, to load images from a FAT partition on a USB Storage device connected to the zeroth instance of usb, => fatload usb 0${loadaddr} <file name>


To give the ROM access to the boot partition, the following commands must be used for the first time:

=> mmc partconf 0 1 1 1
=> mmc bootbus 0 2 0 0

• eMMC layout:
           boot0 partition (8 MB)                        user partition
0x0+----------------------------------+      0x0+-------------------------+
|     tiboot3.bin (512 KB)         |         |                         |
0x400+----------------------------------+         |                         |
|       tispl.bin (2 MB)           |         |                         |
0x1400+----------------------------------+         |        rootfs           |
|       u-boot.img (4 MB)          |         |                         |
0x3400+----------------------------------+         |                         |
|      environment (128 KB)        |         |                         |
0x3500+----------------------------------+         |                         |
|   backup environment (128 KB)    |         |                         |
0x3600+----------------------------------+         |                         |
|          sysfw (1 MB)            |         |                         |
0x3E00+----------------------------------+         +-------------------------+


Note

rootfs is written to the user partition. The user partition is first required to be formatted as a ext4 file system and then the rootfs has to be written. It is not possible to format a partition to ext4 in U-Boot. It is required to boot to kernel and write rootfs to user partition after formatting it to ext4. Kernel image and DT are expected to be present in the /boot folder of rootfs.

To boot kernel from eMMC, use the following commands after writing rootfs to user partition:

=> setenv mmcdev 0
=> setenv bootpart 0
=> boot


## 3.1.1.5.6. Booting to U-Boot prompt from USB storage¶

Note

While using usb reset or usb start command in U-Boot, or booting from a USB Mass storage device, some of the USB devices fail to get detected. This issue is seen because these USB devices are failing to follow the spec for power good delay. It can be resolved by overriding the power good delay using the environment variable usb_pgood_delay. Setting it to 2000 should be good enough for all cases.