forked from ExpressLRS/ExpressLRS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbinary_flash.py
More file actions
202 lines (180 loc) · 8.5 KB
/
binary_flash.py
File metadata and controls
202 lines (180 loc) · 8.5 KB
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#!/usr/bin/python
from enum import Enum
import shutil
import os
from elrs_helpers import ElrsUploadResult
import BFinitPassthrough
import ETXinitPassthrough
import serials_find
import UARTupload
import upload_via_esp8266_backpack
from firmware import DeviceType, FirmwareOptions, MCUType
import sys
from os.path import dirname
sys.path.append(dirname(__file__) + '/external/esptool')
from external.esptool import esptool
sys.path.append(dirname(__file__) + "/external")
import external.pystlink
class UploadMethod(Enum):
wifi = 'wifi'
uart = 'uart'
betaflight = 'bf'
edgetx = 'etx'
stlink = 'stlink'
stock = 'stock'
dir = 'dir'
def __str__(self):
return self.value
def upload_wifi(args, options, upload_addr, isstm: bool):
wifi_mode = 'upload'
if args.force == True:
wifi_mode = 'uploadforce'
elif args.confirm == True:
wifi_mode = 'uploadconfirm'
if args.port:
upload_addr = [args.port]
if options.mcuType == MCUType.ESP8266:
return upload_via_esp8266_backpack.do_upload('firmware.bin.gz', wifi_mode, upload_addr, isstm, {})
else:
return upload_via_esp8266_backpack.do_upload(args.file.name, wifi_mode, upload_addr, isstm, {})
def upload_stm32_uart(args, options):
if args.port == None:
args.port = serials_find.get_serial_port()
return UARTupload.uart_upload(args.port, args.file.name, args.baud, target=options.firmware.upper(), accept=args.accept, ignore_incorrect_target=args.force)
def upload_stm32_stlink(args, options: FirmwareOptions):
stlink = external.pystlink.PyStlink(verbosity=1)
flash_start = app_start = 0x08000000
if "0x" in options.offset:
offset = int(options.offset, 16)
else:
offset = int(options.offset, 10)
app_start = flash_start + offset
if options.bootloader is not None:
bootloader_dir = '' if args.fdir is None else args.fdir + '/'
stlink.program_flash(bootloader_dir + 'bootloader/' + options.bootloader, flash_start, erase=True, verify=True, initialize_comms=True)
stlink.program_flash(args.file.name, app_start, erase=True, verify=True, initialize_comms=True)
return ElrsUploadResult.Success
def upload_esp8266_uart(args):
if args.port == None:
args.port = serials_find.get_serial_port()
try:
cmd = ['--chip', 'esp8266', '--port', args.port, '--baud', str(args.baud), '--after', 'soft_reset', 'write_flash']
if args.erase: cmd.append('--erase-all')
cmd.extend(['0x0000', args.file.name])
esptool.main(cmd)
except:
return ElrsUploadResult.ErrorGeneral
return ElrsUploadResult.Success
def upload_esp8266_bf(args, options):
if args.port == None:
args.port = serials_find.get_serial_port()
mode = 'upload'
if args.force == True:
mode = 'uploadforce'
retval = BFinitPassthrough.main(['-p', args.port, '-b', str(args.baud), '-r', options.firmware, '-a', mode, '--accept', args.accept])
if retval != ElrsUploadResult.Success:
return retval
try:
cmd = ['--passthrough', '--chip', 'esp8266', '--port', args.port, '--baud', str(args.baud), '--before', 'no_reset', '--after', 'soft_reset', '--no-stub', 'write_flash']
if args.erase: cmd.append('--erase-all')
cmd.extend(['0x0000', args.file.name])
esptool.main(cmd)
except:
return ElrsUploadResult.ErrorGeneral
return ElrsUploadResult.Success
def upload_esp32_uart(args):
if args.port == None:
args.port = serials_find.get_serial_port()
try:
dir = os.path.dirname(args.file.name)
cmd = ['--chip', 'esp32', '--port', args.port, '--baud', str(args.baud), '--after', 'hard_reset', 'write_flash']
if args.erase: cmd.append('--erase-all')
cmd.extend(['-z', '--flash_mode', 'dio', '--flash_freq', '40m', '--flash_size', 'detect', '0x1000', os.path.join(dir, 'bootloader.bin'), '0x8000', os.path.join(dir, 'partitions.bin'), '0xe000', os.path.join(dir, 'boot_app0.bin'), '0x10000', args.file.name])
esptool.main(cmd)
except:
return ElrsUploadResult.ErrorGeneral
return ElrsUploadResult.Success
def upload_esp32_etx(args):
if args.port == None:
args.port = serials_find.get_serial_port()
ETXinitPassthrough.etx_passthrough_init(args.port, args.baud)
try:
dir = os.path.dirname(args.file.name)
cmd = ['--chip', 'esp32', '--port', args.port, '--baud', str(args.baud), '--before', 'no_reset', '--after', 'hard_reset', 'write_flash']
if args.erase: cmd.append('--erase-all')
cmd.extend(['-z', '--flash_mode', 'dio', '--flash_freq', '40m', '--flash_size', 'detect', '0x1000', os.path.join(dir, 'bootloader.bin'), '0x8000', os.path.join(dir, 'partitions.bin'), '0xe000', os.path.join(dir, 'boot_app0.bin'), '0x10000', args.file.name])
esptool.main(cmd)
except:
return ElrsUploadResult.ErrorGeneral
return ElrsUploadResult.Success
def upload_esp32_bf(args, options):
if args.port == None:
args.port = serials_find.get_serial_port()
mode = 'upload'
if args.force == True:
mode = 'uploadforce'
retval = BFinitPassthrough.main(['-p', args.port, '-b', str(args.baud), '-r', options.firmware, '-a', mode])
if retval != ElrsUploadResult.Success:
return retval
try:
esptool.main(['--passthrough', '--chip', 'esp32', '--port', args.port, '--baud', str(args.baud), '--before', 'no_reset', '--after', 'hard_reset', 'write_flash', '-z', '--flash_mode', 'dio', '--flash_freq', '40m', '--flash_size', 'detect', '0x10000', args.file.name])
except:
return ElrsUploadResult.ErrorGeneral
return ElrsUploadResult.Success
def upload_dir(mcuType, args):
if mcuType == MCUType.STM32:
if args.flash == UploadMethod.stock:
shutil.copy2(args.file.name, os.path.join(args.out, 'firmware.elrs'))
else:
shutil.copy2(args.file.name, args.out)
if mcuType == MCUType.ESP8266:
shutil.copy2('firmware.bin.gz', os.path.join(args.out, 'firmware.bin.gz'))
elif mcuType == MCUType.ESP32:
shutil.copy2(args.file.name, args.out)
def upload(options: FirmwareOptions, args):
if args.baud == 0:
args.baud = 460800
if args.flash == UploadMethod.betaflight:
args.baud = 420000
if args.flash == UploadMethod.dir or args.flash == UploadMethod.stock:
return upload_dir(options.mcuType, args)
elif options.deviceType == DeviceType.RX:
if options.mcuType == MCUType.ESP8266:
if args.flash == UploadMethod.betaflight:
return upload_esp8266_bf(args, options)
elif args.flash == UploadMethod.uart:
return upload_esp8266_uart(args)
elif args.flash == UploadMethod.wifi:
return upload_wifi(args, options, ['elrs_rx', 'elrs_rx.local'], False)
elif options.mcuType == MCUType.ESP32:
if args.flash == UploadMethod.betaflight:
return upload_esp32_bf(args, options)
elif args.flash == UploadMethod.uart:
return upload_esp32_uart(args)
elif args.flash == UploadMethod.wifi:
return upload_wifi(args, options, ['elrs_rx', 'elrs_rx.local'], False)
elif options.mcuType == MCUType.STM32:
if args.flash == UploadMethod.betaflight or args.flash == UploadMethod.uart:
return upload_stm32_uart(args, options)
elif args.flash == UploadMethod.stlink: # untested
return upload_stm32_stlink(args, options)
else:
if options.mcuType == MCUType.ESP8266:
if args.flash == UploadMethod.uart:
return upload_esp8266_uart(args)
elif args.flash == UploadMethod.wifi:
return upload_wifi(args, options, ['elrs_tx', 'elrs_tx.local'], False)
elif options.mcuType == MCUType.ESP32:
if args.flash == UploadMethod.edgetx:
return upload_esp32_etx(args)
elif args.flash == UploadMethod.uart:
return upload_esp32_uart(args)
elif args.flash == UploadMethod.wifi:
return upload_wifi(args, options, ['elrs_tx', 'elrs_tx.local'], False)
elif options.mcuType == MCUType.STM32:
if args.flash == UploadMethod.stlink: # test
return upload_stm32_stlink(args, options)
elif args.flash == UploadMethod.wifi:
return upload_wifi(args, options, ['elrs_txbp', 'elrs_txbp.local'], True)
print("Invalid upload method for firmware")
return ElrsUploadResult.ErrorGeneral