예제 #1
0
 def read_data_bytes(self, size, attempt=1):
     """Read data in chunks from the chip.
        Automatically strips the two modem status bytes transfered during
        every read."""
     # Packet size sanity check
     if not self.max_packet_size:
         raise FtdiError("max_packet_size is bogus")
     packet_size = self.max_packet_size
     length = 1  # initial condition to enter the usb_read loop
     data = Array('B')
     # everything we want is still in the cache?
     if size <= len(self.readbuffer) - self.readoffset:
         data = self.readbuffer[self.readoffset:self.readoffset + size]
         self.readoffset += size
         return data
     # something still in the cache, but not enough to satisfy 'size'?
     if len(self.readbuffer) - self.readoffset != 0:
         data = self.readbuffer[self.readoffset:]
         # end of readbuffer reached
         self.readoffset = len(self.readbuffer)
     # read from USB, filling in the local cache as it is empty
     try:
         while (len(data) < size) and (length > 0):
             while True:
                 tempbuf = self._read()
                 attempt -= 1
                 length = len(tempbuf)
                 # the received buffer contains at least one useful databyte
                 # (first 2 bytes in each packet represent the current modem
                 # status)
                 if length > 2:
                     if self.latency_threshold:
                         self.latency_count = 0
                         if self.latency != self.latency_min:
                             self.set_latency_timer(self.latency_min)
                             self.latency = self.latency_min
                     # skip the status bytes
                     chunks = (length + packet_size - 1) // packet_size
                     count = packet_size - 2
                     self.readbuffer = Array('B')
                     self.readoffset = 0
                     srcoff = 2
                     for i in xrange(chunks):
                         self.readbuffer += tempbuf[srcoff:srcoff + count]
                         srcoff += packet_size
                     length = len(self.readbuffer)
                     break
                 else:
                     # received buffer only contains the modem status bytes
                     # no data received, may be late, try again
                     if attempt > 0:
                         continue
                     # no actual data
                     self.readbuffer = Array('B')
                     self.readoffset = 0
                     if self.latency_threshold:
                         self.latency_count += 1
                         if self.latency != self.latency_max:
                             if self.latency_count > self.latency_threshold:
                                 self.set_latency_timer(self.latency_max)
                                 self.latency = self.latency_max
                     # no more data to read?
                     return data
             if length > 0:
                 # data still fits in buf?
                 if (len(data) + length) <= size:
                     data += self.readbuffer[self.readoffset: \
                                             self.readoffset+length]
                     self.readoffset += length
                     # did we read exactly the right amount of bytes?
                     if len(data) == size:
                         return data
                 else:
                     # partial copy, not enough bytes in the local cache to
                     # fulfill the request
                     part_size = min(size - len(data),
                                     len(self.readbuffer) - self.readoffset)
                     if part_size < 0:
                         raise AssertionError("Internal Error")
                     data += self.readbuffer[self.readoffset:\
                                             self.readoffset+part_size]
                     self.readoffset += part_size
                     return data
     except usb.core.USBError as e:
         raise FtdiError('UsbError: %s' % str(e))
     # never reached
     raise FtdiError("Internal error")
예제 #2
0
 def soft_reset_low(self):
     pins = self.f.read_pins()
     pins &= ~(self.SOFT_RESET_PIN)
     prog_cmd = Array('B', [0x00, pins])
     self.f.write_data(prog_cmd)
예제 #3
0
 def program_low(self):
     pins = self.f.read_pins()
     pins &= ~(self.PROGRAM_PIN)
     prog_cmd = Array('B', [0x00, pins])
     self.f.write_data(prog_cmd)
예제 #4
0
from array import Array

a = Array(2)
a[0] = 1
a[1] = 'socks'

b = Array(2)
b[0] = 1
b[1] = 'socks'

print(a)
print(b)
print(b == a)
예제 #5
0
 def __init__(self):
     self._table = Array(7)
     self._count = 0
     self._maxCount = len(self._table) - len(self._table)//3
예제 #6
0
파일: bits.py 프로젝트: valeruozi/pyftdi
 def sequence(self):
     """Return the internal representation as a new mutable sequence"""
     return Array('B', self._seq)
예제 #7
0
파일: bits.py 프로젝트: valeruozi/pyftdi
 def __ilshift__(self, count):
     count %= len(self)
     seq = Array('B', [0] * count)
     seq.extend(self._seq[:-count])
     self._seq = seq
     return self
예제 #8
0
 def checksum(cls, hexastr):
     dsum = sum(Array('B', unhexlify(hexastr)))
     dsum &= 0xff
     return dsum ^ 0xff
예제 #9
0
 def checksum(cls, hexastr):
     csum = sum(Array('B', unhexlify(hexastr)))
     csum = (-csum) & 0xff
     return csum
예제 #10
0
 def _get_next_chunk(self):
     # test if the file size can be found...
     try:
         import sys
         self._bytes = stat(self._src.name)[6]
     except Exception:
         pass
     bc = 0
     try:
         for (l, line) in enumerate(self._src, start=1):
             line = line.strip()
             if self._verbose and self._bytes:
                 opc = (50 * bc) // self._bytes
                 bc += len(line)
                 pc = (50 * bc) // self._bytes
                 if pc > opc:
                     info = '\rAnalysing SREC file [%3d%%] %s' % \
                                    (2*pc, '.' * pc)
                     sys.stdout.write(info)
                     sys.stdout.flush()
             try:
                 # avoid line stripping, SREC files always use DOS format
                 if len(line) < 5:
                     continue
                 if line[0] != 'S':
                     raise SRecError("Invalid SREC header")
                 record = int(line[1])
                 if record == 1:
                     addrend = 3
                     address = int(line[4:8], 16)
                     type_ = RecordParser.DATA
                 elif record == 2:
                     addrend = 4
                     address = int(line[4:10], 16)
                     type_ = RecordParser.DATA
                 elif record == 3:
                     addrend = 5
                     address = int(line[4:12], 16)
                     type_ = RecordParser.DATA
                 elif record == 7:
                     addrend = 5
                     address = int(line[4:12], 16)
                     type_ = RecordParser.EXECUTE
                 elif record == 8:
                     addrend = 4
                     address = int(line[4:10], 16)
                     type_ = RecordParser.EXECUTE
                 elif record == 9:
                     addrend = 3
                     address = int(line[4:8], 16)
                     type_ = RecordParser.EXECUTE
                 elif record == 0:
                     addrend = 3
                     address = int(line[4:8], 16)
                     type_ = RecordParser.INFO
                 else:
                     raise SRecError("Unsupported SREC record")
                 try:
                     bytes_ = unhexlify(line[2:-2])
                 except TypeError:
                     raise SRecError("%s @ line %s" % (str(e), l))
                 size = int(line[2:4], 16)
                 effsize = len(bytes_)
                 if size != effsize:
                     raise SRecError("Expected %d bytes, got %d "
                                     "@ line %d" % (size, effsize, l))
                 if self._verify:
                     csum = sum(Array('B', bytes_))
                     csum &= 0xff
                     csum ^= 0xff
                     rsum = int(line[-2:], 16)
                     if rsum != csum:
                         raise SRecError("Invalid checksum: 0x%02x / "
                                         "0x%02x" % (rsum, csum))
                 if self._verify and record:
                     self._verify_address(address)
                 yield (type_, address, bytes_[addrend:])
             except RecordError as ex:
                 raise ex.__class__("%s @ line %d:'%s'" % (ex, l, line))
     finally:
         if self._verbose:
             print('')
예제 #11
0
 def _get_next_chunk(self):
     # test if the file size can be found...
     try:
         import sys
         self._bytes = stat(self._src.name)[6]
     except Exception:
         pass
     bc = 0
     try:
         for (lpos, line) in enumerate(self._src, start=1):
             line = line.strip()
             if self._verbose and self._bytes:
                 opc = (50 * bc) // self._bytes
                 bc += len(line)
                 pc = (50 * bc) // self._bytes
                 if pc > opc:
                     info = '\rAnalysing iHEX file [%3d%%] %s' % \
                                    (2*pc, '.' * pc)
                     sys.stdout.write(info)
                     sys.stdout.flush()
             try:
                 if len(line) < 5:
                     continue
                 if line[0] != ':':
                     raise IHexError("Invalid IHEX header")
                 size = int(line[1:3], 16)
                 address = int(line[3:7], 16)
                 record = int(line[7:9])
                 if record == 0:
                     type_ = RecordParser.DATA
                 elif record == 1:
                     type_ = RecordParser.EOF
                     if address != 0:
                         print("Unexpected non-zero address in EOF: %04x" %
                               address,
                               file=sys.stderr)
                 elif record == 2:
                     self._offset_addr &= ~((1 << 20) - 1)
                     self._offset_addr |= int(line[9:-2], 16) << 4
                     continue
                 elif record == 4:
                     self._offset_addr = int(line[9:-2], 16) << 16
                     continue
                 elif record == 3:
                     type_ = RecordParser.EXECUTE
                     cs = int(line[9:13], 16)
                     ip = int(line[13:-2], 16)
                     address = (cs << 4) + ip
                 else:
                     raise IHexError("Unsupported IHEX record: %d" % record)
                 try:
                     bytes_ = unhexlify(line[9:-2])
                 except TypeError:
                     raise IHexError("%s @ line %s" % (str(e), lpos))
                 effsize = len(bytes_)
                 if size != effsize:
                     raise IHexError("Expected %d bytes, got %d "
                                     "@ line %d" % (size, effsize, lpos))
                 if self._verify:
                     csum = sum(Array('B', unhexlify(line[1:-2])))
                     csum = (-csum) & 0xff
                     rsum = int(line[-2:], 16)
                     if rsum != csum:
                         raise IHexError("Invalid checksum: 0x%02x / "
                                         "0x%02x" % (rsum, csum))
                 if type_ == RecordParser.DATA:
                     address += self._offset_addr
                 if self._verify and record:
                     self._verify_address(address)
                 yield (type_, address, bytes_)
             except RecordError as ex:
                 raise ex.__class__("%s @ line %d:'%s'" % (ex, lpos, line))
     finally:
         if self._verbose:
             print('')
예제 #12
0
def create_empty_buf(count):
    buf = Array('B')
    for i in range(count):
        buf.append(0x00)
    return buf
예제 #13
0
def create_inc_buf(count):
    buf = Array('B')
    for i in range(count):
        buf.append(i % 256)
    return buf
예제 #14
0
 def __init__(self, trst=False, frequency=3E06):
     self._ctrl = JtagController(trst, frequency)
     self._sm = JtagStateMachine()
     self._seq = Array('B')
예제 #15
0
from userland import olympus
from userland.dionysus import dionysus
from userland.drivers import spi
from userland.drivers import gpio

#GPIOs
DATA_COMMAND_MODE = 2
RESET = 3
VBAT_ENABLE = 4
VDD_ENABLE = 5

#SS bit
SLAVE_SELECT_BIT = 0

#COMMANDS
CONTRAST = Array('B', [0x81, 0x00])
EN_CHARGE_PUMP = Array('B', [0x8D, 0x14])
DIS_CHARGE_PUMP = Array('B', [0x8D, 0x10])

PRE_CHARGE_PER = Array('B', [0xD9, 0x00])

COMM_SEQ = Array('B', [0xDA, 0x20])

RESUME_FROM_RAM = Array('B', [0xA4])
RESUME_DISPLAY = Array('B', [0xA5])
NON_INVERT_DISPLAY = Array('B', [0xA6])
INVERT_DISPLAY = Array('B', [0xA7])
DISPLAY_OFF = Array('B', [0xAE])
DISPLAY_ON = Array('B', [0xAF])
SET_LOW_ADDRESS = Array('B', [0x00])
SET_HIGH_ADDRESS = Array('B', [0x10])
예제 #16
0
 def _create_table(self):
     """Create Array filled with LinkedList"""
     table = Array(self.size)
     for i in range(self.size):
         table[i] = LinkedList()
     return table
예제 #17
0
 def put_buffer(self, column_index):
     for i in range((column_index * 128), ((column_index * 128) + 128)):
         self.send_command(Array('B', [self.bitmap[i]]))
예제 #18
0
파일: ant.py 프로젝트: myndian/Ant-Behavior
def coordinates(x, y):
    ''' Creates array containing coordinates (x, y) '''
    if (x == -2) and (y == -2):  # if (x, y) = (-2, -2)
        return Array('h')  # create an empty array in which
    return Array('h', [x, y])  # to append new coordinates
예제 #19
0
파일: bits.py 프로젝트: valeruozi/pyftdi
 def invert(self):
     """In-place invert sequence values"""
     self._seq = Array('B', [x ^ 1 for x in self._seq])
     return self
 def __init__(self, maxSize):
     self._count = 0
     self._front = 0
     self._back = maxSize - 1
     self._qArray = Array(maxSize)
예제 #21
0
파일: uart.py 프로젝트: junganghu/olympus
    def unit_test(self):
        """unit_test

    Run the unit test of the UART
    """

        print "Testing UART config"
        baudrate = self.get_baudrate()
        print "Initial baudrate = %d" % baudrate

        print "Setting baudrate to 115200"
        self.set_baudrate(115200)

        print "Testing if baudrate is correct"
        if self.get_baudrate() > (115200 -
                                  (115200 * .01)) and self.get_baudrate() < (
                                      115200 + (115200 * .01)):
            print "Baudrate is within 1% of target"
        else:
            print "Baudrate is not correct!"

        print "Changing baurdrate to initial version"
        self.set_baudrate(baudrate)

        print "\tXXXX: Cannot test hardware flow control!"

        print "Writing a string"
        self.write_string("COSPAN DESIGN ROXORS TEH BIG ONE!!1!\n")

        time.sleep(1)

        print "Read: %s: " % self.read_string(-1)

        print "disable all interrupts"
        self.disable_interrupts()
        print "Testing receive interrupt"
        self.enable_read_interrupt()

        print "Waiting 10 second for receive interrupts"
        if self.o.wait_for_interrupts(1) > 0:
            if self.o.is_interrupt_for_slave(self.dev_id):
                print "Found a read interrupt"

            print "Read: %s" % self.read_string(-1)

        self.disable_read_interrupt()

        print "Testing write interrupt"
        self.enable_write_interrupt()
        print "Waiting 1 second for write interrupts"
        if self.o.wait_for_interrupts(1) > 0:
            if self.o.is_interrupt_for_slave(self.dev_id):
                print "Found a write interrupt!"

        self.disable_write_interrupt()

        print "Testing write"

        print "Writing the maximum amount of data possible"
        write_max = self.get_write_available() - 2
        print "Max: %d" % write_max
        data_out = Array('B')
        num = 0
        try:
            for i in range(0, write_max):
                num = (i) % 255
                if (i / 256) % 2 == 1:
                    data_out.append(255 - (num))
                else:
                    data_out.append(num)

        except OverflowError as err:
            print "Overflow Error: %d >= 256" % num
            sys.exit(1)
        self.write_raw(data_out)

        print "Testing read: Type something"

        time.sleep(3)

        fail = False
        fail_count = 0
        data = self.read_all_data()

        if len(data_out) != len(data):
            print "data_in length not equal to data_out length:"
            print "\totugoing: %d incomming: %d" % (len(data_out), len(data))
            fail = True

        else:
            for i in range(0, len(data_out)):
                if data[i] != data_out[i]:
                    fail = True
                    print "Mismatch at %d: READ DATA %d != WRITE DATA %d" % (
                        i, data[i], data_out[i])
                    fail_count += 1

        if len(data) > 0:
            print "Read some data from the UART"
            print "data (raw): %s" % str(data)
            print "data (string): %s" % str(data.tostring())

        if not fail:
            print "Memory test passed!"
        elif (fail_count == 0):
            print "Data length of data_in and data_out do not match"
        else:
            print "Failed: %d mismatches" % fail_count

        self.write_raw(data_out)
        print "look for the status conditions"
        print "Status: " + hex(self.get_status())

        if self.is_read_overflow():
            print "Read overflow"
	def setUp(self):
		self.array = Array(10, 0)
		self.offarray = Array(5, 5)
예제 #23
0
    def test_device(self):
        if self.d is None:
            return
        if self.n.get_board_name() == "sim":
            self.s.Warning("Unable to run Device test with simulator")
            return

        self.d.reset_i2c_core()
        '''
        print "Check if core is enabled"
        print "enabled: " + str(self.d.is_i2c_enabled())


        print "Disable core"
        self.d.enable_i2c(False)

        print "Check if core is enabled"
        print "enabled: " + str(self.d.is_i2c_enabled())
        print "Check if core is enabled"
        print "enabled: " + str(self.d.is_i2c_enabled())

        print "Check if interrupt is enabled"
        print "enabled: " + str(self.d.is_interrupt_enabled())

        print "Enable interrupt"
        self.d.enable_interrupt(True)
        print "Check if interrupt is enabled"
        print "enabled: " + str(self.d.is_interrupt_enabled())

        clock_rate = self.d.get_clock_rate()
        print "Clock Rate: %d" % clock_rate

        print "Get clock divider"
        clock_divider = self.d.get_clock_divider()
        print "Clock Divider: %d" % clock_divider

        print "Set clock divider to generate 100kHz clock"
        self.d.set_speed_to_100khz()

        print "Get clock divider"
        clock_divider = self.d.get_clock_divider()
        print "Clock Divider: %d" % clock_divider

        print "Set clock divider to generate 400kHz clock"
        self.d.set_speed_to_400khz()

        print "Get clock divider"
        clock_divider = self.d.get_clock_divider()
        print "Clock Divider: %d" % clock_divider

        print "Set a custom clock divider to get 1MHz I2C clock"
        self.d.set_custom_speed(1000000)

        print "Get clock divider"
        clock_divider = self.d.get_clock_divider()
        print "Clock Divider: %d" % clock_divider

        print "Setting clock rate back to 100kHz"
        '''
        print "Enable core"
        self.d.enable_i2c(True)
        self.d.enable_interrupt(True)
        self.d.get_status()
        self.d.set_speed_to_100khz()

        print "Check if core is enabled"
        print "enabled: " + str(self.d.is_i2c_enabled())

        print "Check if interrupt is enabled"
        print "enabled: " + str(self.d.is_interrupt_enabled())

        #PMOD AD2 (this is used on PMODA with config file:
        #dionysus_i2c_pmod.json file
        #The following reads ADC Channel 0
        i2c_id = 0x28
        data = Array('B', [0x15])

        self.d.write_to_i2c(i2c_id, data)

        #reading from I2C device
        #print "Reading from register"
        #data  = Array('B', [0x02])
        read_data = self.d.read_from_i2c(i2c_id, None, 2)
        print "Read Data: %s" % str(read_data)
예제 #24
0
파일: jtag.py 프로젝트: pgrudzinski/pyftdi
 def sync(self):
     if not self._ftdi:
         raise JtagError("FTDI controller terminated")
     if self._write_buff:
         self._ftdi.write_data(self._write_buff)
         self._write_buff = Array('B')
예제 #25
0
 def soft_reset_high(self):
     pins = self.f.read_pins()
     pins |= self.SOFT_RESET_PIN
     prog_cmd = Array('B', [0x01, pins])
     self.f.write_data(prog_cmd)
 def __init__(self, numRows, numCols):
     self._numCols = numCols
     self._listOfRows = Array(numRows)
예제 #27
0
 def program_high(self):
     pins = self.f.read_pins()
     pins |= self.PROGRAM_PIN
     prog_cmd = Array('B', [0x01, pins])
     self.f.write_data(prog_cmd)
예제 #28
0
    def read_from_i2c(self, i2c_id, i2c_write_data, read_length):
        """read_from_i2c_register

        read from a register in the I2C device

        Args:
            i2c_id: Identification byte of the I2C (7-bit)
                this value will be shifted left by 1
            i2c_write_data: data to write to that register (Array of bytes)
                in order to read from an I2C device the user must write some
                data to set up the device to read
            read_length: Length of bytes to read from the device

        Returns:
            Array of bytes read from the I2C device

        Raises:
            NysaCommError: Error in communication
            I2CError: Errors associated with the I2C protocol
        """
        #self.debug = False
        if self.debug: print "read_from_i2c: ENTERED"
        #set up a write command
        read_command = (i2c_id << 1) | 0x01
        read_data = Array('B')
        self.reset_i2c_core()
        if self.debug:
            print "\t\tGetting status before a read"
            self.print_status(self.read_register(STATUS))
            print "\t\tGetting status before a read"
            self.print_status(self.read_register(STATUS))

        #setup the registers to read
        if i2c_write_data is not None:
            if self.debug: print "Writing to I2C"
            self.write_to_i2c(i2c_id, i2c_write_data)

        #set up interrupts
        self.enable_interrupt(True)

        #send the write command / i2c identification
        self.write_register(TRANSMIT, read_command)

        command = COMMAND_START | COMMAND_WRITE
        if self.debug:
            self.print_command(command)
        #send the command to the I2C command register to initiate a transfer
        self.write_register(COMMAND, command)

        #wait 1 second for interrupt
        if self.wait_for_interrupts(wait_time=1):
            if self.debug:
                print "got interrupt for start"
            #if self.is_interrupt_for_slave():
            status = self.get_status()
            if self.debug:
                self.print_status(status)
            if (status & STATUS_READ_ACK_N) > 0:
                raise I2CError("Did not recieve an ACK while writing I2C ID")

        else:
            if self.debug:
                self.print_status(self.get_status())
            raise I2CError(
                "Timed out while waiting for interrupt durring a start")

        #send the data
        count = 0
        if read_length > 1:
            while count < read_length - 1:
                self.get_status()
                if self.debug:
                    print "\tReading %d" % count
                self.write_register(COMMAND, COMMAND_READ)
                if self.wait_for_interrupts(wait_time=1):
                    if self.get_status() & 0x01:
                        #print "Status: 0x%08X" % self.get_status()
                        if self.debug:
                            print "got interrupt for data"
                        #if self.is_interrupt_for_slave(self.dev_id):
                        status = self.get_status()
                        #if (status & STATUS_READ_ACK_N) > 0:
                        #  raise I2CError("Did not receive an ACK while reading data")
                        value = self.read_register(RECEIVE)
                        if self.debug:
                            print "value: %s" % str(value)
                        read_data.append((value & 0xFF))

                else:
                    raise I2CError(
                        "Timed out while waiting for interrupt during read data"
                    )

                count = count + 1

        #read the last peice of data
        self.write_register(COMMAND,
                            COMMAND_READ | COMMAND_NACK | COMMAND_STOP)
        if self.wait_for_interrupts(wait_time=1):
            if self.debug:
                print "got interrupt for the last byte"
            if self.get_status() & 0x01:
                #if self.is_interrupt_for_slave(self.dev_id):
                #status = self.get_status()
                #if (status & STATUS_READ_ACK_N) > 0:
                #  raise I2CError("Did not receive an ACK while writing data")

                value = self.read_register(RECEIVE)
                if self.debug:
                    print "value: %d" % value
                read_data.append(value & 0xFF)
        else:
            raise I2CError(
                "Timed out while waiting for interrupt while reading the last byte"
            )

        #self.debug = False
        return read_data
예제 #29
0
 def pins_off(self):
     prog_cmd = Array('B', [0x01, 0x00])
     self.f.write_data(prog_cmd)
예제 #30
0
    def program_mcu(self, filepath):
        if self.is_attached():
            if self.is_prometheus_attached():
                if self.debug:
                    print "Prometheus attached, issuing reset to boot command..."
                self.reset_to_boot_mode()
                print "Was in FX3 Mode, change to boot mode..."
                time.sleep(2)
        self.connect_to_boot()
        if not self._is_boot_connected():
            d = usb.core.show_devices()
            raise PrometheusUSBError(
                "BUG: pyusb doesn't re-enumerate very well so re-run this script to program MCU"
            )
        f = open(filepath, 'r')
        buf = Array('B')
        buf.fromstring(f.read())
        f.close()

        pos = 0
        cyp_id = "%c%c" % (buf[0], buf[1])
        image_cntrl = buf[2]
        image_type = buf[3]
        length = float(len(buf[4:]))
        pos = 4
        checksum = 0
        program_entry = 0x00
        if cyp_id != "CY":
            raise PrometheusUSBError(
                "Image File does not start with Cypress ID: 'CY': %s" %
                str(buf[0:1]))
        if image_cntrl & 0x01 != 0:
            raise PrometheusUSBError(
                "Image Control Byte bit 0 != 1, this file is not an executable"
            )
        if image_type != 0xB0:
            raise PrometheusUSBError("Not a normal FW Binary with Checksum")

        while True:
            size = (buf[pos + 3] << 24) + (buf[pos + 2] << 16) + (
                buf[pos + 1] << 8) + buf[pos]
            pos += 4
            address = (buf[pos + 3] << 24) + (buf[pos + 2] << 16) + (
                buf[pos + 1] << 8) + buf[pos]
            pos += 4

            if size > 0:
                data = buf[pos:(pos + size * 4)]
                self._write_program_data(address, data)
                for i in range(0, (size * 4), 4):
                    checksum += ((data[i + 3] << 24) + (data[i + 2] << 16) +
                                 (data[i + 1] << 8) + (data[i]))
                    checksum = checksum & 0xFFFFFFFF
                pos += (size * 4)
            else:
                program_entry = address
                break

            if self.debug:
                sys.stdout.write("\r%%% 3.1f" % (100 * pos / length))
            if self.debug: sys.stdout.flush()

        if self.debug: print ""
        read_checksum = (buf[pos + 3] << 24) + (buf[pos + 2] << 16) + (
            buf[pos + 1] << 8) + buf[pos]
        if read_checksum != checksum:
            raise PrometheusUSBError(
                "Checksum from file != Checksum from Data: 0x%X != 0x%X" %
                (read_checksum, checksum))
        time.sleep(1)
        if self.debug: print "Sending Reset"
        try:
            write_len = self.dev.ctrl_transfer(
                bmRequestType=0x40,  #VRequest, To the devce, Endpoint
                bRequest=0xA0,  #Vendor Specific
                wValue=program_entry & 0x0000FFFF,  #Entry point of the program
                wIndex=program_entry >> 16,
                #data_or_wLength = 0,                  #No Data
                timeout=1000)  #Timeout = 1 second
        except usb.core.USBError, err:
            pass