mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 14:34:27 -05:00 
			
		
		
		
	Add U-Boot for NVIDIA Tegra based boards, with the first being CompuLab TrimSlice. This is part of initial support for this board. Signed-off-by: Tomasz Maciej Nowak <tomek_n@o2.pl>
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
REQUIRE_IMAGE_METADATA=1
 | 
						|
 | 
						|
get_magic_at() {
 | 
						|
	local pos="$2"
 | 
						|
	get_image "$1" | dd bs=1 count=2 skip="$pos" 2>/dev/null | hexdump -v -n 2 -e '1/1 "%02x"'
 | 
						|
}
 | 
						|
 | 
						|
platform_check_image() {
 | 
						|
	local diskdev partdev diff
 | 
						|
 | 
						|
	[ "$#" -gt 1 ] && return 1
 | 
						|
 | 
						|
	case "$(get_magic_at "$1" 510)" in
 | 
						|
		55aa) ;;
 | 
						|
		*)
 | 
						|
			echo "Failed to verify MBR boot signature."
 | 
						|
			return 1
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
 | 
						|
	export_bootdevice && export_partdevice diskdev 0 || {
 | 
						|
		echo "Unable to determine upgrade device"
 | 
						|
		return 1
 | 
						|
	}
 | 
						|
 | 
						|
	get_partitions "/dev/$diskdev" bootdisk
 | 
						|
 | 
						|
	#extract the boot sector from the image
 | 
						|
	get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
 | 
						|
 | 
						|
	get_partitions /tmp/image.bs image
 | 
						|
 | 
						|
	#compare tables
 | 
						|
	diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
 | 
						|
 | 
						|
	rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
 | 
						|
 | 
						|
	if [ -n "$diff" ]; then
 | 
						|
		echo "Partition layout has changed. Full image will be written."
 | 
						|
		ask_bool 0 "Abort" && exit 1
 | 
						|
		return 0
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
platform_copy_config() {
 | 
						|
	local partdev
 | 
						|
 | 
						|
	if export_partdevice partdev 1; then
 | 
						|
		mount -o rw,noatime "/dev/$partdev" /mnt
 | 
						|
		cp -af "$CONF_TAR" /mnt/
 | 
						|
		umount /mnt
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
platform_do_upgrade() {
 | 
						|
	local diskdev partdev diff
 | 
						|
 | 
						|
	export_bootdevice && export_partdevice diskdev 0 || {
 | 
						|
		echo "Unable to determine upgrade device"
 | 
						|
		return 1
 | 
						|
	}
 | 
						|
 | 
						|
	sync
 | 
						|
 | 
						|
	if [ "$SAVE_PARTITIONS" = "1" ]; then
 | 
						|
		get_partitions "/dev/$diskdev" bootdisk
 | 
						|
 | 
						|
		#extract the boot sector from the image
 | 
						|
		get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
 | 
						|
 | 
						|
		get_partitions /tmp/image.bs image
 | 
						|
 | 
						|
		#compare tables
 | 
						|
		diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
 | 
						|
	else
 | 
						|
		diff=1
 | 
						|
	fi
 | 
						|
 | 
						|
	if [ -n "$diff" ]; then
 | 
						|
		get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
 | 
						|
 | 
						|
		# Separate removal and addtion is necessary; otherwise, partition 1
 | 
						|
		# will be missing if it overlaps with the old partition 2
 | 
						|
		partx -d - "/dev/$diskdev"
 | 
						|
		partx -a - "/dev/$diskdev"
 | 
						|
 | 
						|
		return 0
 | 
						|
	fi
 | 
						|
 | 
						|
	#write uboot image
 | 
						|
	get_image "$@" | dd of="$diskdev" bs=512 skip=1 seek=1 count=4097 conv=fsync,notrunc
 | 
						|
	#iterate over each partition from the image and write it to the boot disk
 | 
						|
	while read part start size; do
 | 
						|
		if export_partdevice partdev $part; then
 | 
						|
			echo "Writing image to /dev/$partdev..."
 | 
						|
			get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
 | 
						|
		else
 | 
						|
			echo "Unable to find partition $part device, skipped."
 | 
						|
		fi
 | 
						|
	done < /tmp/partmap.image
 | 
						|
 | 
						|
	#copy partition uuid
 | 
						|
	echo "Writing new UUID to /dev/$diskdev..."
 | 
						|
	get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
 | 
						|
}
 |