dfu-boot: Support using RPS instead of phidget
[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 # No need to change anything below this line
6 UMS_part1=/dev/disk/by-id/usb-Linux_UMS_disk*part1
7 UMS_part2=/dev/disk/by-id/usb-Linux_UMS_disk*part2
8 SCRIPT=$(readlink -f $0)
9 SCRIPTPATH=`dirname $SCRIPT`
10 user=`logname`
12 usage()
13 {
14         echo
15         echo "dfu-boot.sh => Utility script to select bootmode and mount MMC to PC"
16         echo "Usage:"
17         echo "  sudo ./dfu-boot.sh --PLATFORM [--mount DEV | --bootmode MODE | --tftp ADDRESS]"
18         echo "    PLATFORM: j721e-evm, j7200-evm, am65xx-evm"
19         echo "    DEV: specify the device to mount => 1 for MMC, 0 for eMMC"
20         echo "    MODE: specify the bootmode to use"
21         echo "    ADDRESS: specify the IP address for tftp/NFS boot"
22 }
24 read_config() {
25 configfile=$HOME/.config/k3bootswitch.conf
26 section=$1
27 param=$2
29         python3 -c "
30 import configparser;
31 import sys;
32 config = configparser.ConfigParser();
33 config.read('$configfile');
34 print (config['$section'].get('$param',''));
35 "
36 }
38 init() {
39 board=$1
41         prebuilt=$SCRIPTPATH/bin/$board
42         boot_select=$SCRIPTPATH/boot_select/$board
44         uart_dev=`read_config $board uart_dev`
45         nfspath=`read_config $board nfspath`
46         switch=`read_config $board switch`
48         ipaddr=`read_config core ipaddr`
49         switch_type=`read_config core switch_type`
51         # Select toggle utility (phidget or rps)
52         case $switch_type in
53                 rps)
54                         rps_dev=`read_config core rps_dev`
55                         if [ -z "$rps_dev" ]; then
56                                 >&2 echo "    >>>> ERROR: RPS uart device is missing in the config"
57                                 >&2 echo "    >>>>        Refer to the readme and set rps_dev = /dev/ttyUSB*"
58                                 exit 1
59                         fi
60                         toggle_util="$SCRIPTPATH/rps/rps.sh $rps_dev"
61                         ;;
62                 phidget | *)
63                         toggle_util=phidget-switch
64                         ;;
65         esac
66 }
68 toggle_power()
69 {
70 switch=$1
71         echo "    >>>> Toggling power..."
72         ($toggle_util $switch 0 && sleep 1 && $toggle_util $switch 1 && sleep 0.1) >/dev/null 2>&1
73         if [ $? -ne 0 ]; then
74                 echo -n "ERROR: toggle utility '$toggle_util' not found, Reboot manually and press enter.. "
75                 read DUMMY
76         fi
77 }
79 # Bootloader takes time to initialize
80 # wait till PC detects a dfu device
81 wait_till_ready() {
82 msg=$1
83         for i in `seq 30`; do
84                 dfu-util -l | grep "Found DFU" >/dev/null 2>&1
85                 if [ $? -eq "0" ]; then
86                         >&2 echo "    >>>> dfu ready $msg after $i tries"
87                         return
88                 fi
89                 sleep 0.2
90         done
91         >&2 echo "    >>>> ERROR: Timeout waiting for dfu"
92         >&2 echo "    >>>>        Make sure to connect USB cable from EVM to host machine"
93         >&2 echo "    >>>>        Refer to readme for correct switch settings for DFU bootmode:"
94         exit 1
95 }
97 # Use dfu to send prebuilt binaries till you get to the
98 # Cortex-A u-boot prompt
99 boot_till_uboot() {
100         wait_till_ready "for tiboot3.bin"
101         2>&1 dfu-util -R -a bootloader -D $prebuilt/tiboot3.bin
102         # Skip the sysfe.itb where combined boot flow is used
103         if [ $board != "am64xx-evm" ]; then
104                 wait_till_ready "for sysfw.itb"
105                 2>&1 dfu-util -R -a sysfw.itb -D $prebuilt/sysfw.itb
106         fi
107         wait_till_ready "for tispl.bin"
108         2>&1 dfu-util -R -a tispl.bin -D $prebuilt/tispl.bin
109         wait_till_ready "for u-boot.img"
110         2>&1 dfu-util -R -a u-boot.img -D $prebuilt/u-boot.img
113 # Detect and mount the partitions
114 try_mount() {
115 uart_dev=$1
116 mdev=$2
117         for i in `seq 1 100`; do
118                 echo "ums 0 mmc $mdev" > $uart_dev
119                 sleep 0.1
120                 if [ -b $UMS_part1 ] && [ -b $UMS_part2 ]; then
121                         mkdir -p /media/$user/UMS-boot
122                         mkdir -p /media/$user/UMS-rootfs
123                         mount $UMS_part1 /media/$user/UMS-boot -o uid=`id | cut -d'(' -f1  | cut -d'=' -f2`,gid=`id | cut -d'(' -f2  | cut -d'=' -f2`
124                         mount $UMS_part2 /media/$user/UMS-rootfs
125                         echo "    >>>> Mounted partions at /media/$user/UMS-boot and /media/$user/UMS-rootfs"
126                         return
127                 fi
128         done
129         >&2 echo "    >>>> ERROR: Could not find partitions $UMS_part1"
130         exit 1
133 change_bootmode_slow() {
134 uart_dev=$1
135         sleep 5
136         for i in `seq 1 100`; do
137                 echo "mw.w 0x43000030 0x0d3b" > $uart_dev
138                 sleep 0.1
139                 echo "reset" > $uart_dev
140                 sleep 0.1
141         done
145 # Send a boot_select binary
146 change_bootmode() {
147 bootmode=$1
148         if [ ! -f $boot_select/spl.$bootmode ]; then
149                 echo "Invalid bootmode $bootmode"
150                 options=`ls $boot_select/spl* | awk -F"." 'BEGIN{ORS=" "} { print $2 }'`
151                 echo "Supported bootmodes for $board are: $options"
152                 exit 1
153         fi
155         wait_till_ready
156         echo "    >>>> Selecting bootmode: $bootmode"
157         dfu-util -R -a bootloader -D $boot_select/spl.$bootmode >/dev/null 2>&1
158         if [ $? -eq 0 ]; then
159                 echo "    >>>> SUCCESS"
160         else
161                 echo "    >>>> FAILED"
162         fi
165 # Send commands to do a tftp boot
166 tftp_boot() {
167 ipaddr=$1
168 nfspath=$2
170         for i in `seq 1 30`; do
171                 echo "" > $uart_dev
172                 sleep 0.3
173         done
175         cat >>$uart_dev << EOF
176 run findfdt
177 setenv bootargs console=\$console \$optargs root=/dev/nfs rw  nfsroot=$ipaddr:$nfspath,nolock,v3,tcp,rsize=4096,wsize=4096 ip=dhcp sysrq_always_enabled loglevel=8 earlycon=ns16550a,mmio32,0x02800000
178 setenv bootcmd 'run args_all; setenv autoload no; dhcp; setenv serverip $ipaddr; run findfdt; tftp \${loadaddr} Image; tftp \${fdtaddr} \${name_fdt}; fdt address \${fdtaddr}; fdt resize 0x100000; booti \${loadaddr} - \${fdtaddr}'
179 boot
180 EOF
183 # Main script starts from here
184 if [ `whoami` != "root" ]; then
185         echo "This script should be called with sudo!!"
186         usage
187         exit 1
188 fi
190 while [[ $# -gt 0 ]]
191 do
192 case $1 in
193         --j7|--j7es|--j721e|--j721e-evm)
194                 init "j721e-evm"
195                 shift
196                 ;;
197         --vcl|--j7vcl|--j7200|--j7200-evm)
198                 init "j7200-evm"
199                 shift
200                 ;;
201         --am65|--am65x-evm|--am654-idk|--am65xx-evm)
202                 init "am65xx-evm"
203                 shift
204                 ;;
205         --am64|--am64xx-evm)
206                 init "am64xx-evm"
207                 shift
208                 ;;
209         -t|--tftp)
210                 ipaddr=$2
211                 shift
212                 shift
213                 ;;
214         -m|--mount)
215                 mdev=$2
216                 shift
217                 shift
218                 ;;
219         -b|--bootmode)
220                 bootmode=$2
221                 shift
222                 shift
223                 ;;
224         -h|--help)
225                 usage
226                 exit 0
227                 ;;
228         *)
229                 echo "Invalid argument $1"
230                 usage
231                 exit 1
232                 ;;
233 esac
234 done
236 init $board
238 if [ ! -z $bootmode ]; then
239         # Reboot the board in specified bootmode
240         toggle_power $switch
241         if [ $board == "am64x-evm" ] && [ $bootmode == "uart" ]; then
242                 boot_till_uboot >/dev/null
243                 change_bootmode_slow $uart_dev
244         else
245                 change_bootmode $bootmode
246         fi
247 elif [ ! -z $mdev ]; then
248         # Reboot the board and mount the specified device
249         toggle_power $switch
250         boot_till_uboot >/dev/null
251         try_mount $uart_dev $mdev
252 elif [ ! -z $ipaddr ]; then
253         # Reboot the board and mount the specified device
254         toggle_power $switch
255         boot_till_uboot >/dev/null
256         tftp_boot $ipaddr $nfspath
257 else
258         echo "Invalid usage!!"
259         usage
260 fi