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_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 uart_rx(): print("+++ Sending UART discovery rx command") request_args = [] bs.NewTimeout(120) rv = bs.requestreply(11, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv ngpio = 9 for i in range(ngpio): changes = bs_reply_args[5*i + 0] print("+++ GPIO %d has %d signal changes" % (i+1, changes)) if changes > 0: databits = bs_reply_args[5*i + 1] if databits > 0: stopbits = bs_reply_args[5*i + 2] parity = bs_reply_args[5*i + 3] baudrate = bs_reply_args[5*i + 4] 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)) print("+++ SUCCESS") return (bs_reply_length, bs_reply_args)
def spi_fuzz(cs, clk, mosi, miso): print("+++ Sending spi fuzz command") request_args = [1000000, cs, clk, mosi, miso] bs.NewTimeout(60) rv = bs.requestreply(35, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv n = bs_reply_length / (4 * 6) print("+++ FOUND %d SPI commands" % (n)) for i in range(n): cmd = bs_reply_args[i * 6 + 0] v1 = bs_reply_args[i * 6 + 1] v2 = bs_reply_args[i * 6 + 2] v3 = bs_reply_args[i * 6 + 3] v4 = bs_reply_args[i * 6 + 4] v5 = bs_reply_args[i * 6 + 5] print("+++ SPI command FOUND") print("+++ SPI command %.2x" % (cmd)) print("+++ SPI v1 %.2x" % (v1)) print("+++ SPI v2 %.2x" % (v2)) print("+++ SPI v3 %.2x" % (v3)) print("+++ SPI v4 %.2x" % (v4)) print("+++ SPI v5 %.2x" % (v5)) print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
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 spi_erase_sector(skipsize, cs, clk, mosi, miso): print("+++ Sending SPI erase sector command") request_args = [1000000, skipsize, cs, clk, mosi, miso] rv = bs.requestreply(27, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
def writeSPI(size, skipsize, data): request_args = list(range(3 + size / 4)) request_args[0] = size request_args[1] = skipsize request_args[2] = 1000000 for i in range(size / 4): request_args[3 + i] = data[i] rv = bs.requestreply(37, request_args) return rv
def spi_wp_disable(cs, clk, mosi, miso): print("+++ Sending SPI write protect commands") request_args = [1000000, cs, clk, mosi, miso] rv = bs.requestreply(39, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
def dumpSPI(size, skip): request_args = [size, skip, 1000000] rv = bs.requestreply(1, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv data = "" for i in range(bs_reply_length / 4): data = data + struct.pack('<I', bs_reply_args[i]) return data
def dumpI2C(sda, scl, slave, size, skip, alen): data = "" request_args = [slave, size, skip, sda, scl, alen] rv = bs.requestreply(9, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv data = "" for i in range(bs_reply_length / 4): data = data + struct.pack('<I', bs_reply_args[i]) return data
def spi_streg2(cs, clk, mosi, miso): print("+++ Sending SPI command") request_args = [1000000, cs, clk, mosi, miso, 2, 0x35, 0x00] rv = bs.requestreply(3, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv for i in range(1, 2): print("+++ STATUS REGISTER 2: %.2x" % (bs_reply_args[i])) print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
def writeI2C(sda, scl, slave, size, skip, alen, data): request_args = list(range(6 + size / 4)) request_args[0] = slave request_args[1] = size request_args[2] = skip request_args[3] = sda request_args[4] = scl request_args[5] = alen for i in range(size / 4): request_args[6 + i] = data[i] rv = bs.requestreply(25, request_args) return rv
def spi_bb_read_id(cs, clk, mosi, miso): print("+++ Sending SPI read ID command") request_args = [1000000, cs, clk, mosi, miso] rv = bs.requestreply(31, request_args) if rv is None: 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") return bs_reply_length, bs_reply_args
def spi_read_id(): print("+++ Sending SPI read ID command") request_args = [1000000] rv = bs.requestreply(17, request_args) if rv is None: 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") return (bs_reply_length, bs_reply_args)
def i2c_discover_slaves(sda, scl): print("+++ Sending i2c slave discovery command") request_args = [sda, scl] rv = bs.requestreply(5, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv nslave_addresses = bs_reply_length / 4 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") return (bs_reply_length, bs_reply_args)
def uart_data_discover(): print("+++ Sending UART data discovery command") request_args = [] bs.NewTimeout(60) rv = bs.requestreply(15, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv ngpio = 9 for i in range(ngpio): print("+++ SIGNAL CHANGES: D%d --> %d" % ((i+1), bs_reply_args[i])) print("+++ SUCCESS") return rv
def spi_readuid(cs, clk, mosi, miso): print("+++ Sending SPI command") request_args = [ 1000000, cs, clk, mosi, miso, 13, 0x4b, 0x00, 0x00, 0x00, 0x00, 0, 0, 0, 0, 0, 0, 0, 0 ] rv = bs.requestreply(3, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv for i in range(5, 13): print("+++ UID: %.2x" % (bs_reply_args[i])) print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
def uart_tx(rxpin, baudrate): print("+++ Sending UART discovery tx command") request_args = [rxpin, baudrate] bs.NewTimeout(3) rv = bs.requestreply(21, request_args) if rv is None: 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.") print("+++ SUCCESS") return rv
def i2c_discover(): print("+++ Sending i2c discover pinout command") request_args = [] bs.NewTimeout(30) rv = bs.requestreply(23, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv n = bs_reply_length / 8 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") 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 doSendCommand(cs, clk, mosi, miso, args): print("+++ Sending SPI command") n = len(args) request_args = list(range(6 + n)) request_args[0] = 1000000 request_args[1] = cs request_args[2] = clk request_args[3] = mosi request_args[4] = miso request_args[5] = n for i in range(n): request_args[6 + i] = int(args[i], 16) rv = bs.requestreply(3, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv for i in range(n): print("+++ SPI Response: %.2x" % (bs_reply_args[i])) print("+++ SUCCESS\n") 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 uart_passthrough(gpiorx, gpiotx, baudrate): request_args = [gpiorx-1, gpiotx-1, baudrate] bs.NewTimeout(30) rv = bs.requestreply(19, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv print("+++ Entering passthrough mode") bs.keys_init() ser = bs.getSerial() 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
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)
def spi_discover_pinout(): print("+++ Sending spi discover pinout command") request_args = [1000000] bs.NewTimeout(60) rv = bs.requestreply(29, request_args) if rv is None: return None (bs_reply_length, bs_reply_args) = rv n = bs_reply_length / (4 * 4) print("+++ FOUND %d SPI interfaces" % (n)) for i in range(n): cs = bs_reply_args[i * 4 + 0] clk = bs_reply_args[i * 4 + 1] mosi = bs_reply_args[i * 4 + 2] miso = bs_reply_args[i * 4 + 3] print("+++ SPI interface FOUND") print("+++ SPI CS at GPIO %i" % (cs)) print("+++ SPI CLK at GPIO %i" % (clk)) print("+++ SPI MOSI at GPIO %i" % (mosi)) print("+++ SPI MISO at GPIO %i" % (miso)) print("+++ SUCCESS\n") return (bs_reply_length, bs_reply_args)
def jtag_discover_pinout(): print("+++ Sending jtag pinout discovery command") request_args = [] bs.NewTimeout(30) rv = bs.requestreply(13, request_args) if rv is None: 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") return (bs_reply_length, bs_reply_args)