On 4/11/25 15:45, Jan Kiszka wrote:
From: Jan Kiszka <[email protected]>
As an eMMC block device image may consist of more than just the user
data partition, provide a helper script that can compose the image from
boot partitions, an RPMB partition and the user data image. The script
also does the required size validation and/or rounding.
Signed-off-by: Jan Kiszka <[email protected]>
---
Changes in v6.1:
- address BSD shell portability issue of stat -c
scripts/mkemmc.sh | 219 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 219 insertions(+)
create mode 100755 scripts/mkemmc.sh
+echo "Creating eMMC image"
+
+truncate -s 0 "$outimg"
+pos=0
+
+if [ "$bootsz" -gt 0 ]; then
+ echo " Boot partition 1 and 2: $((bootsz / 1024))K each"
+ blocks=$(( bootsz / (128 * 1024) ))
+ check_truncation "$bootimg1" "$bootsz"
+ dd if="$bootimg1" of="$outimg" conv=sparse bs=128K count=$blocks \
+ status=none
+ check_truncation "$bootimg2" "$bootsz"
+ dd if="$bootimg2" of="$outimg" conv=sparse bs=128K count=$blocks \
+ seek=$blocks status=none
+ pos=$((2 * bootsz))
+fi
+
+if [ "$rpmbsz" -gt 0 ]; then
+ echo " RPMB partition: $((rpmbsz / 1024))K"
+ blocks=$(( rpmbsz / (128 * 1024) ))
+ check_truncation "$rpmbimg" "$rpmbsz"
+ dd if="$rpmbimg" of="$outimg" conv=sparse bs=128K count=$blocks \
+ seek=$(( pos / (128 * 1024) )) status=none
+ pos=$((pos + rpmbsz))
+fi
Still:
$ dash scripts/mkemmc.sh -b firmware.img -r /dev/zero:2MB os.img emmc.img
Invalid value '2MB' specified for /dev/zero image size.
scripts/mkemmc.sh: 170: [: Illegal number:
Creating eMMC image
Boot partition 1 and 2: 128K each
scripts/mkemmc.sh: 192: [: Illegal number:
User data: 4 bytes
$ bash scripts/mkemmc.sh -b firmware.img -r /dev/zero:2MB os.img emmc.img
Invalid value '2MB' specified for /dev/zero image size.
scripts/mkemmc.sh: line 170: [: : integer expression expected
Creating eMMC image
Boot partition 1 and 2: 128K each
scripts/mkemmc.sh: line 192: [: : integer expression expected
User data: 4 bytes
But now the file is generated :)
We'll fix on top.
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Tested-by: Philippe Mathieu-Daudé <[email protected]>
+
+if [ "$usersz" -lt 1024 ]; then
+ echo " User data: $usersz bytes"
+elif [ "$usersz" -lt $((1024 * 1024)) ]; then
+ echo " User data: $(( (usersz + 1023) / 1024 ))K ($usersz)"
+elif [ "$usersz" -lt $((1024 * 1024 * 1024)) ]; then
+ echo " User data: $(( (usersz + 1048575) / 1048576))M
($usersz)"
+else
+ echo " User data: $(( (usersz + 1073741823) / 1073741824))G
($usersz)"
+fi
+check_truncation "$userimg" "$usersz"
+dd if="$userimg" of="$outimg" conv=sparse bs=128K seek=$(( pos / (128 * 1024)
)) \
+ count=$(( (usersz + 128 * 1024 - 1) / (128 * 1024) )) status=none
+pos=$((pos + usersz))
+truncate -s $pos "$outimg"
+
+echo ""
+echo "Instantiate by appending to the qemu command line:"
+echo " -drive file=$outimg,if=none,format=raw,id=emmc-img"
+echo " -device
emmc,boot-partition-size=$bootsz,rpmb-partition-size=$rpmbsz,drive=emmc-img"