Skip to content

Commit

Permalink
added SafeMode for dongles with borked firmware to get into bootloade…
Browse files Browse the repository at this point in the history
…r mode easier

bugfixes for Py3 and bytes slices ([3] versus [3:4] to get int versus byte/str)
  • Loading branch information
atlas0fd00m committed Dec 31, 2020
1 parent d1443d0 commit b698b67
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 27 deletions.
12 changes: 6 additions & 6 deletions firmware/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ installRfCatChronosDongle: RfCatChronos.hex
goodfet.cc info

installRfCatChronosDongleCCBootloader: RfCatChronosCCBootloader.hex
if [ ! -c /dev/RFCAT_BL_C ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_C ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_C erase_all
rfcat_bootloader /dev/RFCAT_BL_C download bins/RfCatChronosCCBootloader.hex
rfcat_bootloader /dev/RFCAT_BL_C verify bins/RfCatChronosCCBootloader.hex && rfcat_bootloader /dev/RFCAT_BL_C run
Expand All @@ -351,7 +351,7 @@ installRfCat24DonsDongle: RfCatDons24.hex
goodfet.cc info

installRfCat24DonsDongleCCBootloader: RfCatDons24CCBootloader.hex
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_D erase_all
rfcat_bootloader /dev/RFCAT_BL_D download bins/RfCatDons24CCBootloader.hex
rfcat_bootloader /dev/RFCAT_BL_D verify bins/RfCatDons24CCBootloader.hex && rfcat_bootloader /dev/RFCAT_BL_D run
Expand All @@ -363,7 +363,7 @@ installRfCatDonsDongle: RfCatDons.hex
goodfet.cc info

installRfCatDonsDongleCCBootloader: RfCatDonsCCBootloader.hex
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_D erase_all
rfcat_bootloader /dev/RFCAT_BL_D download bins/RfCatDonsCCBootloader.hex
rfcat_bootloader /dev/RFCAT_BL_D verify bins/RfCatDonsCCBootloader.hex && rfcat_bootloader /dev/RFCAT_BL_D run
Expand All @@ -375,7 +375,7 @@ installRfCatYS1: RfCatYS1.hex
goodfet.cc info

installRfCatYS1CCBootloader: RfCatYS1CCBootloader.hex
if [ ! -c /dev/RFCAT_BL_YS1 ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_YS1 ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_YS1 erase_all
rfcat_bootloader /dev/RFCAT_BL_YS1 download bins/RfCatYS1CCBootloader.hex
rfcat_bootloader /dev/RFCAT_BL_YS1 verify bins/RfCatYS1CCBootloader.hex && rfcat_bootloader /dev/RFCAT_BL_YS1 run
Expand Down Expand Up @@ -472,7 +472,7 @@ installchronostestrecvusbfw: chronostestrecvusb.hex
goodfet.cc info

installchronostestrecvusbfwCC: chronostestrecvusbCC.hex
if [ ! -c /dev/RFCAT_BL_C ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_C ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_C erase_all
rfcat_bootloader /dev/RFCAT_BL_C download bins/testrecv.hex
rfcat_bootloader /dev/RFCAT_BL_C verify bins/testrecv.hex && rfcat_bootloader /dev/RFCAT_BL_C run
Expand All @@ -484,7 +484,7 @@ installdonstestrecvusbfw: donstestrecvusb.hex
goodfet.cc info

installdonstestrecvusbfwCC: donstestrecvusbCC.hex
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force && sleep 1 ; fi ;
if [ ! -c /dev/RFCAT_BL_D ] ; then ../rfcat --bootloader --force -S && sleep 1 ; fi ;
rfcat_bootloader /dev/RFCAT_BL_D erase_all
rfcat_bootloader /dev/RFCAT_BL_D download bins/testrecv.hex
rfcat_bootloader /dev/RFCAT_BL_D verify bins/testrecv.hex && rfcat_bootloader /dev/RFCAT_BL_D run
Expand Down
5 changes: 3 additions & 2 deletions rfcat
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ if __name__ == "__main__":
parser.add_argument('-n', '--specchans', default=104, type=int)
parser.add_argument('--bootloader', default=False, action="store_true", help='trigger the bootloader (use in order to flash the dongle)')
parser.add_argument('--force', default=False, action="store_true", help='use this to make sure you want to set bootloader mode (you *must* flash after setting --bootloader)')
parser.add_argument('-S', '--safemode', default=False, action="store_true", help='TROUBLESHOOTING ONLY, used with -r')

ifo = parser.parse_args()

Expand All @@ -51,14 +52,14 @@ if __name__ == "__main__":
exit(-1)

print("Entering RfCat Bootloader mode, ready for new image...")
RfCat(ifo.index).bootloader()
RfCat(ifo.index, safemode=ifo.safemode).bootloader()
exit(0)

elif ifo.specan:
RfCat(ifo.index).specan(ifo.centfreq,ifo.inc,ifo.specchans)

elif ifo.research:
interactive(ifo.index, DongleClass=RfCat, intro=intro)
interactive(ifo.index, DongleClass=RfCat, intro=intro, safemode=ifo.safemode)

else:
# do the full-rfcat thing
Expand Down
8 changes: 5 additions & 3 deletions rflib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,15 @@ def cleanupInteractiveAtExit():
except:
pass

def interactive(idx=0, DongleClass=RfCat, intro=''):
def interactive(idx=0, DongleClass=RfCat, intro='', safemode=False):
global d
import rflib.chipcon_nic as rfnic
import atexit

d = DongleClass(idx=idx)
d.setModeRX() # this puts the dongle into receive mode
d = DongleClass(idx=idx, debug=safemode, safemode=safemode)
if not safemode:
d.setModeRX() # this puts the dongle into receive mode

atexit.register(cleanupInteractiveAtExit)

print(intro)
Expand Down
16 changes: 8 additions & 8 deletions rflib/chipcon_nic.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ class NICxx11(USBDongle):
the same radio concepts (frequency, channels, etc) and functionality
(AES, Manchester Encoding, etc).
'''
def __init__(self, idx=0, debug=False, copyDongle=None, RfMode=RFST_SRX):
USBDongle.__init__(self, idx, debug, copyDongle, RfMode)
def __init__(self, idx=0, debug=False, copyDongle=None, RfMode=RFST_SRX, safemode=False):
USBDongle.__init__(self, idx, debug, copyDongle, RfMode, safemode=safemode)
self.max_packet_size = RF_MAX_RX_BLOCK
self.endec = None
if hasattr(self, "chipnum"):
Expand Down Expand Up @@ -1096,7 +1096,7 @@ def getAmpMode(self):
'''
retval = self.send(APP_NIC, NIC_GET_AMP_MODE, b"")
if len(retval) == 2:
retval = ord(retval[0])
retval = ord(retval[0:1])
return retval

def setPktAddr(self, addr):
Expand Down Expand Up @@ -1151,7 +1151,7 @@ def RFxmitLong(self, data, doencoding=True):
preload = old_div(RF_MAX_TX_BLOCK, RF_MAX_TX_CHUNK)
retval, ts = self.send(APP_NIC, NIC_LONG_XMIT, b"%s" % struct.pack("<HB",datalen,preload)+data[:RF_MAX_TX_CHUNK * preload], wait=wait*preload)
#sys.stderr.write('=' + repr(retval))
error = struct.unpack("<B", retval[0])[0]
error = struct.unpack(b"<B", retval[0:1])[0]
if error:
return error

Expand All @@ -1161,15 +1161,15 @@ def RFxmitLong(self, data, doencoding=True):
error = RC_TEMP_ERR_BUFFER_NOT_AVAILABLE
while error == RC_TEMP_ERR_BUFFER_NOT_AVAILABLE:
retval,ts = self.send(APP_NIC, NIC_LONG_XMIT_MORE, b"%s" % struct.pack("B", len(chunk))+chunk, wait=wait)
error = struct.unpack("<B", retval[0])[0]
error = struct.unpack(b"<B", retval[0:1])[0]
if error:
return error
#if error == RC_TEMP_ERR_BUFFER_NOT_AVAILABLE:
# sys.stderr.write('.')
#sys.stderr.write('+')
# tell dongle we've finished
retval,ts = self.send(APP_NIC, NIC_LONG_XMIT_MORE, b"%s" % struct.pack("B", 0), wait=wait)
return struct.unpack("<b", retval[0])[0]
return struct.unpack("<b", retval[0:1])[0]

def RFtestLong(self, data=b"BLAHabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZblahaBcDeFgHiJkLmNoPqRsTuVwXyZBLahAbCdEfGhIjKlMnOpQrStUvWxYz"):
datalen = len(data)
Expand Down Expand Up @@ -1850,13 +1850,13 @@ def _setMACmode(self, _mode):
self.setMACdata(macdata)

def setMACdata(self, data):
datastr = struct.pack("<BHHHHHHHHBBH", *data)
datastr = struct.pack(b"<BHHHHHHHHBBH", *data)
return self.send(APP_NIC, FHSS_SET_MAC_DATA, datastr)

def getMACdata(self):
datastr, timestamp = self.send(APP_NIC, FHSS_GET_MAC_DATA, b'')
#print (repr(datastr))
data = struct.unpack("<BHHHHHHHHBBH", datastr)
data = struct.unpack(b"<BHHHHHHHHBBH", datastr)
return data

def reprMACdata(self):
Expand Down
28 changes: 20 additions & 8 deletions rflib/chipcon_usb.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,14 @@ def __str__(self):

class USBDongle(object):
######## INITIALIZATION ########
def __init__(self, idx=0, debug=False, copyDongle=None, RfMode=RFST_SRX):
def __init__(self, idx=0, debug=False, copyDongle=None, RfMode=RFST_SRX, safemode=False):
self._safemode = safemode
self.chipnum = None
self.chipstr = "uninitialized"
self.rsema = None
self.xsema = None
self._bootloader = False
self._init_on_reconnect = True
self._init_on_reconnect = not safemode
self._do = None
self.idx = idx
self.cleanup()
Expand All @@ -88,8 +89,8 @@ def __init__(self, idx=0, debug=False, copyDongle=None, RfMode=RFST_SRX):
self.send_thread.setDaemon(True)
self.send_thread.start()

self.resetup(copyDongle=copyDongle)
self.max_packet_size = USB_MAX_BLOCK_SIZE
self.resetup(copyDongle=copyDongle)

def cleanup(self):
self._usberrorcnt = 0;
Expand Down Expand Up @@ -190,6 +191,9 @@ def finish_setup(self):
self._usbmaxi, self._usbmaxo = (EP5IN_MAX_PACKET_SIZE, EP5OUT_MAX_PACKET_SIZE)
self._threadGo.set()

if self._safemode:
return

self.getRadioConfig()
chip = self.getPartNum()
chipstr = CHIPS.get(chip)
Expand All @@ -215,13 +219,16 @@ def resetup(self, console=True, copyDongle=None):
if self._bootloader:
return
if self._debug: print(("waiting (resetup) %x" % self.idx), file=sys.stderr)

while (self._do==None):
try:
self.setup(console, copyDongle)
if copyDongle is None:
self._clear_buffers(False)
self.ping(3, wait=10, silent=True)
self.setRfMode(self._rfmode)

if not self._safemode:
self.ping(3, wait=10, silent=True)
self.setRfMode(self._rfmode)

except Exception as e:
#if console: sys.stderr.write('.')
Expand Down Expand Up @@ -409,12 +416,10 @@ def runEP5_recv(self):
pass
elif ('No such device' in errstr):
self._threadGo.clear()
#self.resetup(False) ## THIS IS A PROBLEM.
self.reset_event.set()
print("===== RESETUP set from recv thread")
elif ('Input/output error' in errstr): # USBerror 5
self._threadGo.clear()
#self.resetup(False) ## THIS IS A PROBLEM.
self.reset_event.set()
print("===== RESETUP set from recv thread")

Expand All @@ -427,7 +432,6 @@ def runEP5_recv(self):
if "'NoneType' object has no attribute 'bInterfaceNumber'" in str(e):
print("Error: dongle went away. USB bus problems?")
self._threadGo.clear()
#self.resetup(False)
self.reset_event.set()

except:
Expand Down Expand Up @@ -755,6 +759,14 @@ def poke(self, addr, data):
r, t = self.send(APP_SYSTEM, SYS_CMD_POKE, struct.pack("<H", addr) + data)
return r

def poke8(self, addr, data):
data = b'%c' % (data)
return self.poke(addr, data)

def poke16(self, addr, data):
data = struct.pack('<H', data)
return self.poke(addr, data)

def pokeReg(self, addr, data):
r, t = self.send(APP_SYSTEM, SYS_CMD_POKE_REG, struct.pack("<H", addr) + data)
return r
Expand Down

0 comments on commit b698b67

Please sign in to comment.