Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
0
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)
Example #5
0
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)
Example #6
0
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)
Example #7
0
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)
Example #8
0
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
Example #9
0
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)
Example #10
0
        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: