http://trac.gateworks.com/wiki/MMC
eMMC PARTITION_CONFIG (Boot partition selection)
Because eMMC provides multiple hardware partitions but only one can be selected at a time. A non-volatile register in the eMMC device provides a PARTITION_CONFIG that is used to determine what partition is selected at power-up for boot devices. To access this data you need to read/write a 'Card Specific Data' or CSD register (EXT_CSD[179] - EXT_CSC_PART_CONFIG). This can be done both in Linux (see below) or U-Boot (see below).
U-Boot Support ¶
U-Boot provides access to eMMC devices through the
mmc
command and interface but adds an additional argument to the mmc
interface to describe the hardware partition. The interface is therefore described as 'mmc <dev> <part>' where 'dev' is the mmc device (some boards have more than one) and 'part' is the hardware partition: 0=user, 1=boot0, 2=boot1.
Use the
mmc dev
command to specify the device and partition:mmc dev 0 0 # select user hw partition mmc dev 0 1 # select boot0 hw partition mmc dev 0 2 # select boot1 hw partition
If U-Boot has been built with
CONFIG_SUPPORT_EMMC_BOOT
some additional mmc commands are available:- mmc bootbus <dev> <boot_bus_width> <reset_boot_bus_width> <boot_mode>
- mmc bootpart-resize <dev> <boot-part-size-mb> <rpmb-part-size-mb>
- mmc partconf <dev> <boot_ack> <boot-partition> <partition-access> # set PARTITION_CONFIG field
- mmc rst-function <dev> <value> # change RST_n_FUNCTION field between 0|1|2 (write-once)
The
mmc partconf
command can be used to configure the PARTITION_CONFIG specifying what hardware partition to boot from:mmc partconf 0 0 0 0 # disable boot partition (default unset condition; boots from user partition) mmc partconf 0 1 1 0 # set boot0 partition (with ack) mmc partconf 0 1 2 0 # set boot1 partition (with ack) mmc partconf 0 1 7 0 # set user partition (with ack)
If U-Boot has been built with
CONFIG_SUPPORT_EMMC_RPMB
the mmc rpmb
command is available for reading, writing and programming the key for the Replay Protection Memory Block (RPMB) partition in eMMC.
When using U-Boot to write to eMMC (or microSD) it is often useful to use the
gzwrite
command. For example if you have a compressed 'disk image' you can write it to your eMMC (assuming it is mmc dev 0) with:tftpboot ${loadaddr} disk-image.gz && gzwrite mmc 0 ${loadaddr} ${filesize}
- The
disk-image.gz
contains a partition table at offset 0x0 as well as partitions at their respective offsets (according to the partition table) and has been compressed with gzip - If you know the flash offset of a specific partition (which you can determine using the
part list mmc 0
command) you can also use gzwrite to flash a compressed partition image
Linux Support
Linux presents the various hardware partitions as separate devices:
- /dev/mmcblk0boot0 - BOOT0 partition
- /dev/mmcblk0boot1 - BOOT1 partition
- /dev/mmcblk0rpmb - RPMB partition
- /dev/mmcblk0 - USER partition
Note that the BOOT partitions by default are read-only as they are typically used for sensitive boot firmware. To write to them you can disable
force_ro
in sysfs via:echo 0 > /sys/class/block/mmcblk0boot0/force_ro
The Linux
mmc
application provides access to eMMC configuration through CSD registers. This open-source application is available at http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/.- To build it:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc-utils.git cd mmc-utils make
- Alternatively you can install this from a pre-built deb:
- Newport (arm64):
wget http://dev.gateworks.com/images/mmc-utils_0~gita3d3331-3~armbian5.35+1_arm64.deb dpkg -i mmc-utils_0~gita3d3331-3~armbian5.35+1_arm64.deb
- Newport (arm64):
- Ventana (armhf):
wget http://dev.gateworks.com/images/mmc-utils_0~gita3d3331-3~armbian5.35+1_armhf.deb dpkg -i mmc-utils_0~gita3d3331-3~armbian5.35+1_armhf.deb
You can use the
mmc
utility to configure the eMMC PARTITION_CONFIG to specify the boot device on power-up via mmc bootpart enable <boot_partition> <send_ack> <device>
where boot_partition specifies the hardware partition (1=boot0, 2=boot1, 7=user), send_ack specifies the device must send an awknoledgement (for fast boot), and device is the root mmc block device of the eMMC:# set boot partition to boot0 mmc bootpart enable 1 0 /dev/mmcblk0 # set boot partition to boot1 mmc bootpart enable 2 0 /dev/mmcblk0 # set boot partition to user mmc bootpart enable 7 0 /dev/mmcblk0
Some additional use cases:
# show PARTITION_CONFIG: mmc extcsd read /dev/mmcblk0 | grep PARTITION_CONFIG # show BUS CONFIG: mmc extcsd read /dev/mmcblk0 | grep BOOT_BUS_CONDITIONS # disable boot partition mmc bootpart enable 0 0 /dev/mmcblk0
References:
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.