summaryrefslogtreecommitdiff
blob: 3c802b440facaa647e80df0625c0c531f028232f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/sh

DFU_MODE=0
CPLD=0

get_dfu() {
  if [ -r "/usr/share/hackrf/hackrf_one_usb.dfu" ]; then
    ram_firmware="/usr/share/hackrf/hackrf_one_usb.dfu"
  else
    printf "Unable to find hackrf_one_usb.dfu in the search path\n"
    exit 1
  fi
  export ram_firmware
}

get_cpld() {
  if [ -r "/usr/share/hackrf/hackrf_cpld_default.xsvf" ]; then
    cpld="/usr/share/hackrf/hackrf_cpld_default.xsvf"
  else
    printf "Unable to find default.xsvf in the search path\n"
    exit 1
  fi
  export cpld
}

usage() {
  printf "hackrf_easy_flash list\n"
  printf "hackrf_easy_flash upgrade\n"
}

if [ -z "${1}" ]; then
  usage
  exit 0
fi

list_firmware() {
  if [ ${DFU_MODE} = 1 ]; then
    if [ -z "${ram_firmware}" ]; then
      get_dfu
    fi
    printf "Best DFU found: ${ram_firmware}\n"
  fi
  printf "Available firmware options:\n"
  if [ -r "/usr/share/hackrf/hackrf_one_usb.bin" ]; then
    printf "hackrf (default)\n"
  fi
  if [ -r "/usr/share/hackrf/portapack-h1-firmware.bin" ]; then
    printf "portapack (--portapack)\n"
  fi
  if [ -r "/usr/share/hackrf/portapack-h1-havoc.bin" ]; then
    printf "portapack-havoc (--havoc)\n"
  fi
}

#parse args
while [ -n "${1}" ]; do
  case $1 in
    -h|--help)
      usage
      exit 0
      ;;
    list|--list)
      list_firmware
      exit 0
      ;;
    update|--update|upgrade|--upgrade|hackrf|--hackrf)
      firmware="/usr/share/hackrf/hackrf_one_usb.bin"
      TARGET=hackrf
      shift
      ;;
    portapack|--portapack)
      firmware="/usr/share/hackrf/portapack-h1-firmware.bin"
      TARGET=portapack
      shift
      ;;
    havoc|--havoc)
      firmware="/usr/share/hackrf/portapack-h1-havoc.bin"
      TARGET=havoc
      shift
      ;;
    cpld|--cpld)
      CPLD=1
      get_cpld
      shift
      ;;
    dfu|--dfu)
      DFU_MODE=1
      get_dfu
      shift
      ;;
    --)
      shift
      break
      ;;
    *)
      break
      ;;
  esac
done

if [ -z "${firmware}" ]; then
    firmware="/usr/share/hackrf/hackrf_one_usb.bin"
    TARGET="hackrf"
fi

if [ ! -r "${firmware}" ]; then
  printf "Unable to find or read ${firmware}\n"
  printf "Please ensure the requested firmware is installed and readable\n"
  exit 1
fi

if [ "${CPLD}" = 1 ] && [ "${TARGET}" != "hackrf" ]; then
  printf "To update the CPLD you must use the stock hackrf firmware or do this update manually\n"
  printf "Try \"$(basename $0) --cpld && $(basename $0) ${TARGET}\"\n"
  exit 1
fi

if [ ${DFU_MODE} = 1 ]; then
  printf "Preparing to reset hackrf with DFU ${ram_firmware}\n"
  printf "Then flashing with ${firmware}\n\n"
  printf "Hold down the HackRF's DFU button (the button closest to the antenna jack)\n"
  printf "then plug the HackRF into a USB port on your computer.\n"
  printf "After the HackRF is plugged in, you may release the DFU button.\n"
  printf "Press any key to continue or ^c to abort\n"
  read
  if ! dfu-util --device 1fc9:000c --download "${ram_firmware}" --reset; then
    printf "dfu-util reported failure, quitting\n"
    exit 1
  fi
  sleep 2s
else
  if hackrf_info | grep -q 'No HackRF boards found.'; then
    printf "No hackrf found, please ensure you are in hackrf mode or try --dfu\n"
    exit 1
  fi
fi
if hackrf_spiflash -w "${firmware}"; then
  sleep 3s
  hackrf_spiflash -R
  sleep 3s
else
  printf "hackrf_spiflash reported failure, quitting\n"
  exit 1
fi
if [ "${CPLD}" = 1 ]; then
  #printf "To update the cpld, please reset your hackrf into it's new firmware before updating the cpld\n"
  #printf "Please reset your hackrf by pressing the button furthest from the antenna or power cycling it.\n"
  #printf "Press any key to continue or ^c to abort\n"
  #read
  if hackrf_cpldjtag -x "${cpld}"; then
    sleep 3s
    hackrf_spiflash -R
  else
    printf "hackrf_cpldjtag reported failure\n"
    exit 1
  fi
fi
if [ "${TARGET}" = "hackrf" ]; then
  hackrf_info
fi
printf "If you saw no errors, you are up to date with the requested firmware\n"