k3-bootswitch: Initial version for boot selection script
[glsdk/host-tools.git] / k3-bootswitch / dfu-boot.sh
1 #!/bin/bash
2 # Utility script to select the bootmode from command line
3 # Author: Nikhil Devshatwar
5 SCRIPT=$(readlink -f $0)
6 SCRIPTPATH=`dirname $SCRIPT`
7 prefix=$SCRIPTPATH/bin
8 boot_select=$SCRIPTPATH/boot_select
9 user=`logname`
11 UMS_part1=/dev/disk/by-id/usb-Linux_UMS_disk*part1
12 UMS_part2=/dev/disk/by-id/usb-Linux_UMS_disk*part2
14 # Customize this as required
15 uart_dev=/dev/ttyUSB0
16 dev=1
18 usage()
19 {
20         echo "Usage:"
21         echo "  dfu-boot.sh - Utility script to select bootmode and mount MMC to PC"
22         echo "  sudo ./dfu-boot.sh --mount DEV"
23         echo "      DEV: 1 for MMC, 0 for eMMC"
24         echo "  sudo ./dfu-boot.sh --bootmode MODE"
25         echo "      MODE: " `ls $boot_select/ | awk -F"." 'BEGIN{ORS=" "} { print $2 }'`
26 }
28 # Bootloader takes time to initialize
29 # wait till then
30 wait_till_ready() {
31 msg=$1
32         for i in `seq 30`; do
33                 dfu-util -l | grep "Found DFU" >/dev/null 2>&1
34                 if [ $? -eq "0" ]; then
35                         >&2 echo "    >>>> dfu ready $msg after $i tries"
36                         return
37                 fi
38                 sleep 0.2
39         done
40         >&2 echo "    >>>> ERROR: Timeout waiting for dfu"
41         >&2 echo "    >>>>        Make sure to connect Type-C cable to EVM and host machine"
42         >&2 echo "    >>>>        Bootswitch settings fot DFU boot:"
43         >&2 echo "    SW8 = 1000 0000    SW9 = 0010 0000    SW3 = 0101 00 1010"
44         exit 1
45 }
47 # Use dfu to send all bootloaders till you get to the
48 # A72 u-boot prompt
49 boot_till_uboot() {
50         wait_till_ready "for tiboot3.bin"
51         2>&1 dfu-util -R -a bootloader -D $prefix/tiboot3.bin
52         wait_till_ready "for sysfw.itb"
53         2>&1 dfu-util -R -a sysfw.itb -D $prefix/sysfw.itb
54         wait_till_ready "for tispl.bin"
55         2>&1 dfu-util -R -a tispl.bin -D $prefix/tispl.bin
56         wait_till_ready "for u-boot.img"
57         2>&1 dfu-util -R -a u-boot.img -D $prefix/u-boot.img
58 }
60 # Detect and mount the partitions
61 try_mount() {
62         for i in `seq 1 100`; do
63                 echo "ums 0 mmc $1" > $uart_dev
64                 sleep 0.1
65                 if [ -b $UMS_part1 ] && [ -b $UMS_part2 ]; then
66                         mkdir -p /media/$user/UMS-boot
67                         mkdir -p /media/$user/UMS-rootfs
68                         mount $UMS_part1 /media/$user/UMS-boot
69                         mount $UMS_part2 /media/$user/UMS-rootfs
70                         echo "    >>>> Mounted partions at /media/$user/UMS-boot and /media/$user/UMS-rootfs"
71                         return
72                 fi
73         done
74         >&2 echo "    >>>> ERROR: Could not find partitions $UMS_part1"
75         exit 1
76 }
78 toggle_power()
79 {
80         echo "    >>>> Toggling phidget..."
81         (phidget-switch 0 0 && sleep 0.5 && phidget-switch 0 1 && sleep 0.1) >/dev/null 2>&1
82         if [ $? -ne 0 ]; then
83                 echo -n "ERROR: phidget not found, Reboot manually and press enter.. "
84                 read DUMMY
85         fi
86 }
88 # Main script starts from here
89 if [ `whoami` != "root" ]; then
90         echo "This script should be called with sudo!!"
91         usage
92         exit 1
93 fi
95 if [ "$1" = "--mount" ]; then
96         if [ ! -z "$2" ]; then
97                 dev=$2
98         fi
99         toggle_power
100         boot_till_uboot >/dev/null
101         try_mount $dev
102 elif [ "$1" = "--bootmode" ]; then
103         if [ ! -z "$2" ]; then
104                 bootmode=$2
105         fi
106         if [ ! -f $boot_select/spl.$bootmode ]; then
107                 echo "Invalid bootmode $bootmode"
108                 usage
109                 exit 2
110         fi
112         toggle_power
113         wait_till_ready
114         echo "    >>>> Selecting bootmode: $bootmode"
115         dfu-util -R -a bootloader -D $boot_select/spl.$bootmode >/dev/null 2>&1
116         if [ $? -eq 0 ]; then
117                 echo "    >>>> SUCCESS"
118         else
119                 echo "    >>>> FAILED"
120         fi
121 else
122         echo " Invalid usage"
123         usage
124 fi