Files
meta-tegra/recipes-core/initrdscripts/tegra-flash-init/program-boot-device.sh
Matt Madison 106d558853 initrdscripts: updates for L4T R36.3
* More drivers are now kernel modules
* Switch from ECID to module serial number for
  forming USB device ID when flashing

Signed-off-by: Matt Madison <matt@madison.systems>
2024-05-30 12:13:39 -07:00

161 lines
4.6 KiB
Bash

#!/bin/sh
BOOTPART_SIZE=
BOOTDEV_TYPE=unset
program_spi_partition() {
local partname="$1"
local part_offset="$2"
local part_size="$3"
local part_file="$4"
local file_size=0
if [ -n "$part_file" ]; then
file_size=$(stat -c "%s" "$part_file")
if [ -z "$file_size" ]; then
echo "ERR: could not retrieve file size of $part_file" >&2
return 1
fi
fi
if [ $file_size -ne 0 ]; then
echo "Writing $part_file (size=$file_size) to $partname (offset=$part_offset)"
if ! mtd_debug write /dev/mtd0 $part_offset $file_size "$part_file"; then
return 1
fi
fi
# Multiple copies of the BCT get installed at erase-block boundaries
# within the defined BCT partition
if [ "$partname" = "BCT" ]; then
local slotsize=16384
local rounded_slot_size=$(expr \( \( $slotsize \+ 511 \) / 512 \) \* 512)
local curr_offset=$(expr $part_offset \+ $rounded_slot_size)
local copycount=$(expr $part_size / $rounded_slot_size)
local i=1
while [ $i -lt $copycount ]; do
echo "Writing $part_file to BCT+$i (offset=$curr_offset)"
if ! mtd_debug write /dev/mtd0 $curr_offset $file_size "$part_file"; then
return 1
fi
i=$(expr $i \+ 1)
curr_offset=$(expr $curr_offset \+ $rounded_slot_size)
done
fi
return 0
}
program_mmcboot_partition() {
local partname="$1"
local part_offset="$2"
local part_size="$3"
local part_file="$4"
local file_size=0
local bootpart="/dev/mmcblk0boot0"
if [ -z "$BOOTPART_SIZE" ]; then
echo "ERR: boot partition size not set" >&2
return 1
fi
if [ $part_offset -ge $BOOTPART_SIZE ]; then
part_offset=$(expr $part_offset - $BOOTPART_SIZE)
bootpart="/dev/mmcblk0boot1"
fi
if [ -n "$part_file" ]; then
file_size=$(stat -c "%s" "$part_file")
if [ -z "$file_size" ]; then
echo "ERR: could not retrieve file size of $part_file" >&2
return 1
fi
fi
if [ $file_size -ne 0 ]; then
echo "Writing $part_file (size=$file_size) to $partname on $bootpart (offset=$part_offset)"
if ! dd if="$part_file" of="$bootpart" bs=1 seek=$part_offset count=$file_size > /dev/null; then
return 1
fi
# Multiple copies of the BCT get installed at 16KiB boundaries
# within the defined BCT partition
if [ "$partname" = "BCT" ]; then
local slotsize=16384
local curr_offset=$(expr $part_offset \+ $slotsize)
local copycount=$(expr $part_size / $slotsize)
local i=1
while [ $i -lt $copycount ]; do
echo "Writing $part_file (size=$file_size) to BCT+$i (offset=$curr_offset)"
if ! dd if="$part_file" of="$bootpart" bs=1 seek=$curr_offset count=$file_size > /dev/null; then
return 1
fi
i=$(expr $i \+ 1)
curr_offset=$(expr $curr_offset \+ $slotsize)
done
fi
fi
return 0
}
program_boot_partitions() {
local blpkgdir="$1"
local partname part_offset part_size part_file
local rc=0
if [ -z "$blpkgdir" -o ! -d "$blpkgdir" ]; then
echo "ERR: missing or non-directory: $blpkgdir" >&2
return 1
fi
if [ -f "$blpkgdir/boot_device_type" ]; then
BOOTDEV_TYPE=$(cat "$blpkgdir/boot_device_type")
else
echo "ERR: missing boot_device_type file in $blpkgdir" >&2
return 1
fi
if [ ! -f "$blpkgdir/partitions.conf" ]; then
echo "ERR: partition config missing in $blpkgdir" >&2
return 1
fi
if [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
if [ ! -b /dev/mmcblk0boot0 -o ! -b /dev/mmcblk0boot1 ]; then
echo "ERR: eMMC boot device, but mmcblk0bootX devices do not exist" >&2
return 1
fi
BOOTPART_SIZE=$(expr $(cat /sys/block/mmcblk0boot0/size) \* 512)
echo "0" > /sys/block/mmcblk0boot0/force_ro
echo "0" > /sys/block/mmcblk0boot1/force_ro
blkdiscard -f /dev/mmcblk0boot0
blkdiscard -f /dev/mmcblk0boot1
elif [ "$BOOTDEV_TYPE" = "spi" ]; then
if [ ! -e /dev/mtd0 ]; then
echo "ERR: SPI boot device, but mtd0 device does not exist" >&2
return 1
fi
echo "Erasing /dev/mtd0"
flash_erase /dev/mtd0 0 0
else
echo "ERR: unknown boot device type: $BOOTDEV_TYPE" >&2
return 1
fi
oldwd="$PWD"
cd "$blpkgdir"
while IFS=":" read partname part_offset part_size part_file; do
if [ "$BOOTDEV_TYPE" = "spi" ]; then
if ! program_spi_partition "$partname" "$part_offset" "$part_size" "$part_file"; then
rc=1
break
fi
elif [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
if ! program_mmcboot_partition "$partname" "$part_offset" "$part_size" "$part_file"; then
rc=1
break
fi
fi
done < partitions.conf
if [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
echo "1" > /sys/block/mmcblk0boot0/force_ro
echo "1" > /sys/block/mmcblk0boot1/force_ro
fi
cd "$oldwd"
return $rc
}
program_boot_partitions "$@"