mirror of
https://github.com/lingble/meta-tegra.git
synced 2025-10-29 19:42:41 +00:00
* 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>
161 lines
4.6 KiB
Bash
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 "$@"
|