def i2c_dump_flash(device, sda, scl, slave, alen, dumpsize, outfile): ser = bs.Connect(device) skip = 0 print("+++ Dumping I2C") with open(outfile, 'wb') as f: while dumpsize > 0: if dumpsize < BLOCKSIZE: size = dumpsize else: size = BLOCKSIZE for j in range(10): try: data = dumpI2C(ser, sda, scl, slave, size, skip, alen) if data is not None: break except Exception, e: print("+++ %s" % (str(e))) if j > 5: print("--- Trying a hard reset of the serial device.") ser.close() time.sleep(1) ser = serial.Serial(device, 500000, timeout=2) bs.FlushInput(ser) print("--- Warning. Retransmiting Attempt #%d" % (j + 1)) if data is None: print("Timeout") raise "Timeout" f.write(data) f.flush() skip = skip + BLOCKSIZE dumpsize = dumpsize - size print("+++ SUCCESS\n") return (1, 1)
def do_uart_passthrough(device, gpiorx, gpiotx, baudrate): ser = bs.Connect(device, 30) try: request_args = list(range(256)) for i in range(256): request_args[i] = 0 request_args[0] = gpiorx - 1 request_args[1] = gpiotx - 1 request_args[2] = baudrate rv = bs.requestreply(ser, 19, 9, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv print("+++ Entering passthrough mode") bs.keys_init() while True: if ser.inWaiting() > 0: ch = ser.read(1) sys.stdout.write(ch) sys.stdout.flush() inCh = bs.keys_getchar() if inCh is not None: ser.write(inCh) # not reached bs.keys_cleanup() return None except Exception, e: print("+++ %s" % (str(e))) ser.close() return None
def do_uart_tx(device, rxpin, baudrate): ser = bs.Connect(device, 30) print("+++ Sending UART discovery tx command") try: request_args = list(range(256)) for i in range(256): request_args[i] = 0 request_args[0] = rxpin request_args[1] = baudrate rv = bs.requestreply(ser, 21, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv txpin = bs_reply_args[0] if txpin != 0xffffffff: print("+++ FOUND UART TX on GPIO %d" % (txpin + 1)) else: print("+++ NOT FOUND. Note that GPIO 1 can't be used here.") ser.close() print("+++ SUCCESS") return (bs_reply_length, bs_reply_args) except Exception, e: print("+++ %s" % (str(e))) ser.close() return -1
def do_jtag_discover_pinout(device): ser = bs.Connect(device, 30) print("+++ Sending jtag pinout discovery command") request_args = list(range(256)) for i in range(256): request_args[i] = 0 rv = bs.requestreply(ser, 13, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv if bs_reply_args[0] != 0: tck = bs_reply_args[1] tms = bs_reply_args[2] tdi = bs_reply_args[3] tdo = bs_reply_args[4] ntrst = bs_reply_args[5] print("+++ %d JTAG FOUND" % (bs_reply_args[0])) print("+++ TCK %i" % (tck)) print("+++ TMS %i" % (tms)) print("+++ TDI %i" % (tdi)) print("+++ TDO %i" % (tdo)) print("+++ NTRST %i" % (ntrst)) print("+++ SUCCESS") ser.close() return (bs_reply_length, bs_reply_args)
def do_spi_read_id(device): ser = bs.Connect(device) print("+++ Sending SPI read ID command") request_args = list(range(256)) for i in range(256): request_args[i] = 0 request_args[0] = 1000000 rv = bs.requestreply(ser, 17, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv v1 = bs_reply_args[0] v2 = bs_reply_args[1] v3 = bs_reply_args[2] print("+++ SPI ID %.2x%.2x%.2x" % (v1, v2, v3)) print("+++ SUCCESS\n") ser.close() return (bs_reply_length, bs_reply_args)
def do_i2c_discover_slaves(device, sda, scl): ser = bs.Connect(device) print("+++ Sending i2c slave discovery command") request_args = list(range(256)) for i in range(256): request_args[i] = 0 request_args[0] = sda request_args[1] = scl rv = bs.requestreply(ser, 5, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv nslave_addresses = bs_reply_length print("+++ %d I2C slave addresses" % (nslave_addresses)) for i in range(nslave_addresses): print("+++ I2C slave address FOUND at %i" % bs_reply_args[i]) print("+++ SUCCESS\n") ser.close() return (bs_reply_length, bs_reply_args)
def i2c_write_flash(device, sda, scl, slave, alen, dumpsize, infile): ser = bs.Connect(device, 5) skip = 0 print("+++ Writing I2C") with open(infile, 'rb') as f: while dumpsize > 0: if dumpsize < WRITEBLOCKSIZE: size = dumpsize else: size = WRITEBLOCKSIZE f.seek(skip) rawdata = f.read(size) data = list(range(size / 4)) for i in range(size / 4): a = ord(rawdata[4 * i + 0]) b = ord(rawdata[4 * i + 1]) c = ord(rawdata[4 * i + 2]) d = ord(rawdata[4 * i + 3]) data[i] = (d << 24) + (c << 16) + (b << 8) + a for j in range(10): try: rv = writeI2C(ser, sda, scl, slave, size, skip, alen, data) if rv is not None: break except Exception, e: print("+++ %s" % (str(e))) if j > 5: print("--- Trying a hard reset of the serial device.") ser.close() time.sleep(1) ser = serial.Serial(device, 500000, timeout=2) bs.FlushInput(ser) print("--- Warning. Retransmiting Attempt #%d" % (j + 1)) if data is None: print("Timeout") raise "Timeout" skip = skip + WRITEBLOCKSIZE dumpsize = dumpsize - size print("+++ SUCCESS\n") return (1, 1)
def do_uart_rx(device): ser = bs.Connect(device, 30) print("+++ Sending UART discovery rx command") try: request_args = list(range(256)) for i in range(256): request_args[i] = 0 rv = bs.requestreply(ser, 11, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv ngpio = bs_reply_length for i in range(ngpio): changes = bs_reply_args[i] print("+++ GPIO %d has %d signal changes" % (i + 1, changes)) if changes > 0: databits = bs_reply_args[ngpio + 4 * i + 0] if databits > 0: stopbits = bs_reply_args[ngpio + 4 * i + 1] parity = bs_reply_args[ngpio + 4 * i + 2] baudrate = bs_reply_args[ngpio + 4 * i + 3] print("+++ UART FOUND") print("+++ DATABITS: %d" % (databits)) print("+++ STOPBITS: %d" % (stopbits)) if parity == 0: print("+++ PARITY: EVEN") elif parity == 1: print("+++ PARITY: ODD") else: print("+++ PARITY: NONE") print("+++ BAUDRATE: %d" % (baudrate)) ser.close() print("+++ SUCCESS") return (bs_reply_length, bs_reply_args) except Exception, e: print("+++ %s" % (str(e))) ser.close() return None
def do_i2c_discover(device): ser = bs.Connect(device, 30) print("+++ Sending i2c discover pinout command") request_args = list(range(256)) for i in range(256): request_args[i] = 0 rv = bs.requestreply(ser, 23, 0, request_args) if rv is None: ser.close() return None (bs_reply_length, bs_reply_args) = rv n = bs_reply_length print("+++ FOUND %d I2C interfaces" % (n)) for i in range(n): sda = bs_reply_args[i * 2 + 0] scl = bs_reply_args[i * 2 + 1] print("+++ I2C interface FOUND") print("+++ I2C SDA at GPIO %i" % (sda)) print("+++ I2C SCL at GPIO %i" % (scl)) print("+++ SUCCESS\n") ser.close() return (bs_reply_length, bs_reply_args)
return bs_jtag.doCommand(command[5:]) elif command == "quit": return -1 else: return None try: with open("/tmp/BUSSide.seq", "rb") as f: d = f.read(4) if len(d) == 4: seq, = struct.unpack('<I', d) bs.set_sequence_number(seq) except: pass rv = bs.Connect(device) if rv is None: print("--- Couldn't connect.") print("--- Unplug the BUSSide USB cable. Wait a few seconds.") print("--- Plug it in again. Then restart the software.") sys.exit(1) print("+++") print("+++ Welcome to the BUSSide") print("+++ By Dr Silvio Cesare of InfoSect") print("+++") printHelp() print("+++") while True: try: