- Last edited 2 years ago ago
How to populate the SD card with dd command
Contents
1 Introduction
STMicroelectronics delivers also a script runing on Linux host PC to populate ONLY the microSD card device.
This script is located here : build-<DISTRO>-<MACHINE>/tmp-glibc/deploy/images/<MACHINE>/scripts/
This script is also located in the Starter Package/<VERSION>/ images/stm32mp1/scripts.
This script as STM32CubeProgrammer tool is using Flashlayout.tsv file in input parameter
This script creates a raw file <FlashLayoutName>.raw and a txt file <FlashLayoutName>.how_to_update.txt
Then you can use this raw file to populate your microSD card inserted on your HOST PC
2 Usage
cd build-<DISTRO>-<MACHINE>/tmp-glibc/deploy/images/<MACHINE>/scripts
./create_sdcard_from_flashlayout.sh ../flashlayout_<built-image>/<FlashLayout file>
Example :
PC $> cd build-openstlinuxweston-stm32mp1/tmp-glibc/deploy/images/stm32mp1/scripts/ PC $> ./create_sdcard_from_flashlayout.sh ../flashlayout_st-image-weston/FlashLayout_sdcard_stm32mp157c-ev1-trusted.tsv Create Raw empty image: ../flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw of 1536MB Create partition table: [CREATED] part 1: fsbl1 [partition size 256.0 KiB] [CREATED] part 2: fsbl2 [partition size 256.0 KiB] [CREATED] part 3: ssbl [partition size 2.5 MiB] [CREATED] part 4: bootfs [partition size 64.0 MiB] [CREATED] part 5: vendorfs [partition size 16.0 MiB] [CREATED] part 6: rootfs [partition size 750.4 MiB] [CREATED] part 7: userfs [partition size 702.5 MiB] Partition table from ../flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw Disk ../flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw: 3145728 sectors, 1.5 GiB Logical sector size: 512 bytes Disk identifier (GUID): 8E3FE74B-3B58-4617-B71B-5EC498875478 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 3145694 Partitions will be aligned on 2-sector boundaries Total free space is 0 sectors (0 bytes) Number Start (sector) End (sector) Size Code Name 1 34 545 256.0 KiB 8300 fsbl1 2 546 1057 256.0 KiB 8300 fsbl2 3 1058 6177 2.5 MiB 8300 ssbl 4 6178 137249 64.0 MiB 8300 bootfs 5 137250 170017 16.0 MiB 8300 vendorfs 6 170018 1706881 750.4 MiB 8300 rootfs 7 1706882 3145694 702.5 MiB 8300 userfs Populate raw image with image content: [ FILLED ] part 1: fsbl1, image: tf-a-stm32mp157c-ev1-trusted.stm32 [ FILLED ] part 2: fsbl2, image: tf-a-stm32mp157c-ev1-trusted.stm32 [ FILLED ] part 3: ssbl, image: u-boot-stm32mp157c-ev1-trusted.stm32 [ FILLED ] part 4: bootfs, image: st-image-bootfs-openstlinux-weston-stm32mp1.ext4 [ FILLED ] part 5: vendorfs, image: st-image-vendorfs-openstlinux-weston-stm32mp1.ext4 [ FILLED ] part 6: rootfs, image: st-image-weston-openstlinux-weston-stm32mp1.ext4 [ FILLED ] part 7: userfs, image: st-image-userfs-openstlinux-weston-stm32mp1.ext4 ########################################################################### ########################################################################### RAW IMAGE generated: ../flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw WARNING: before to use the command dd, please umount all the partitions associated to SDCARD. sudo umount `lsblk --list | grep mmcblk0 | grep part | gawk '{ print $7 }' | tr '\n' ' '` To put this raw image on sdcard: sudo dd if=../flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw of=/dev/mmcblk0 bs=8M conv=fdatasync (mmcblk0 can be replaced by: sdX if it's a device dedicated to receive the raw image (where X can be a, b, c, d, e) ########################################################################### ###########################################################################
3 Populate the microSD card inserted on your linux host PC with the created raw file
You need first to retrieve the volume name of your drive (USB Key or MMC card)
To connect a USB device to the virtual machine manually, select VM > Removable Devices > Device Name > Connect (Disconnect from host)
More explanations for this specific case here
Insert your drive then use the following command :
- In this example, the volume name is sdd (microSD card is inserted with USB key)
PC $> cat /proc/partitions major minor #blocks name 8 0 488386584 sda 8 1 999424 sda1 8 2 1 sda2 8 5 487384064 sda5 11 0 1048575 sr0 252 0 487382016 dm-0 252 1 19996672 dm-1 252 2 8335360 dm-2 252 3 459046912 dm-3 8 48 1921024 sdd
- In this example, the volume name is mmcblk0 (microSD card is inserted directly with microSD card adapter)
PC $> cat /proc/partitions major minor #blocks name 8 0 488386584 sda 8 1 999424 sda1 8 2 1 sda2 8 5 487384064 sda5 11 0 1048575 sr0 252 0 487382016 dm-0 252 1 19996672 dm-1 252 2 8335360 dm-2 252 3 459046912 dm-3 8 48 1921024 mmcblk0
- Before using the command dd, please umount all the partitions associated to microSD card.
sudo umount `lsblk --list | grep mmcblk0 | grep part | gawk '{ print $7 }' | tr '\n' ' '`
- Populate microSD card with dd command:
cd build-openstlinuxweston-stm32mp1/tmp-glibc/deploy/images/stm32mp1/scripts/
sudo dd if=../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.raw of=/dev/mmcblk0 bs=8M conv=fdatasync status=progress
The dd command takes few minutes (depending mainly of your rootfs size)
4 Update manually some partitions with dd command
Once you have populated your microSD card with the raw file, it is possible to update manually some partitions as explained in txt file.
Example :
PC $> cat flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157c-ev1-trusted.how_to_update.txt This file describes how to update manually the partition of SDCARD: 1. SDCARD schema of partition 2. How to populate each partition 3. How to update the kernel/devicetree 1. SDCARD schema of partition: ------------------------------ ============================================================================================ = = = = = = = = = fsbl1 = fsbl2 = ssbl = bootfs = vendorfs = rootfs = userfs = = = = = = = = = = mmcblk0p1 = mmcblk0p2 = mmcblk0p3 = mmcblk0p4 = mmcblk0p5 = mmcblk0p6 = mmcblk0p7 = = (1 ) = (2 ) = (3 ) = (4 ) = (5 ) = (6 ) = (7 ) = = = = = = = = = ============================================================================================ (1): Device: /dev/mmcblk0p1 Label: fsbl1 Image: tf-a-stm32mp157c-ev1-trusted.stm32 (2): Device: /dev/mmcblk0p2 Label: fsbl2 Image: tf-a-stm32mp157c-ev1-trusted.stm32 (3): Device: /dev/mmcblk0p3 Label: ssbl Image: u-boot-stm32mp157c-ev1-trusted.stm32 (4): Device: /dev/mmcblk0p4 Label: bootfs Image: st-image-bootfs-openstlinux-weston-stm32mp1.ext4 (5): Device: /dev/mmcblk0p5 Label: vendorfs Image: st-image-vendorfs-openstlinux-weston-stm32mp1.ext4 (6): Device: /dev/mmcblk0p6 Label: rootfs Image: st-image-weston-openstlinux-weston-stm32mp1.ext4 (7): Device: /dev/mmcblk0p7 Label: userfs Image: st-image-userfs-openstlinux-weston-stm32mp1.ext4 2. How to populate each partition --------------------------------- - Populate partition fsbl1 (/dev/mmcblk0p1) dd if=tf-a-stm32mp157c-ev1-trusted.stm32 of=/dev/mmcblk0p1 bs=1M conv=fdatasync - Populate partition fsbl2 (/dev/mmcblk0p2) dd if=tf-a-stm32mp157c-ev1-trusted.stm32 of=/dev/mmcblk0p2 bs=1M conv=fdatasync - Populate partition ssbl (/dev/mmcblk0p3) dd if=u-boot-stm32mp157c-ev1-trusted.stm32 of=/dev/mmcblk0p3 bs=1M conv=fdatasync - Populate partition bootfs (/dev/mmcblk0p4) dd if=st-image-bootfs-openstlinux-weston-stm32mp1.ext4 of=/dev/mmcblk0p4 bs=1M conv=fdatasync - Populate partition vendorfs (/dev/mmcblk0p5) dd if=st-image-vendorfs-openstlinux-weston-stm32mp1.ext4 of=/dev/mmcblk0p5 bs=1M conv=fdatasync - Populate partition rootfs (/dev/mmcblk0p6) dd if=st-image-weston-openstlinux-weston-stm32mp1.ext4 of=/dev/mmcblk0p6 bs=1M conv=fdatasync - Populate partition userfs (/dev/mmcblk0p7) dd if=st-image-userfs-openstlinux-weston-stm32mp1.ext4 of=/dev/mmcblk0p7 bs=1M conv=fdatasync 3. How to update the kernel/devicetree -------------------------------------- The kernel and devicetree are present on "bootfs" partition. To change kernel and devicetree, you can copy the file on this partition: - plug SDCARD on your PC - copy kernel uImage on SDCARD sudo cp uImage /media/$USER/bootfs/ - copy devicetree uImage on SDCARD sudo cp stm32mp1*.dtb /media/$USER/bootfs/ - umount partitions of SDCARD sudo umount /media/$USER/bootfs/ (dont't forget to umount the other partitions of SDCARD: sudo umount `lsblk --list | grep mmcblk0 | grep part | gawk '{ print $7 }' | tr '\n' ' '` )