]> defiant.homedns.org Git - pyshared.git/blobdiff - bus_pirate.py
Added jump to bootloader
[pyshared.git] / bus_pirate.py
index a148f1a67f16b4a0251bc1ed704750d5d3929088..52a1c5c1b759fc2f8f20fd633b0fbbbc9ec4f3f9 100644 (file)
@@ -64,6 +64,29 @@ class BP:
                v = struct.unpack(">h", s)
                return v[0]/1024.0*6.6
 
+       # http://codepad.org/qtYpZmIF
+       def pwm(self, freq, duty_cycle):
+               lPrescaler = {0:1, 1:8 , 2:64, 3:256}
+               Fosc = 32e6
+               Tcy = 2.0 / Fosc
+               period = 1.0 / freq
+               prescaler = 1
+
+               # find needed prescaler
+               for i in range(4):
+                       prescaler = lPrescaler[i]
+                       PRy = period * 1.0 / (Tcy * prescaler)
+                       PRy = int(PRy - 1)
+                       OCR = int(PRy * duty_cycle)
+
+                       if PRy < (2 ** 16 - 1):
+                               break # valid value for PRy, keep values
+
+               cmd = struct.pack(">BBHH", 0b00010010, prescaler, duty_cycle, period)
+               ret = self.command(cmd, 1)
+               if ord(ret) != 0x1:
+                       raise Exception()
+
        def spi_command(self, cmd):
                ret = self.command(cmd, 1)
                if ord(ret) != 0x1:
@@ -107,12 +130,19 @@ class BP:
                state = self.update_io()
                return state & (1 << dPinToBit[pin])
 
-       def mode_i2c(self, bEnablePower=False, bEnablePullup=False):
+       def mode_i2c(self, bEnablePower=False, bEnablePullup=False, iSpeedkHz=100):
                if self.command(chr(0x2), 4) != "I2C1":
                        raise Exception()
 
-               # 100kHz
-               ret = self.command(chr(0b01100010), 1)
+               dSpeeds = {
+                       5: 0x0,
+                       50: 0x1,
+                       100: 0x2,
+                       400: 0x3,
+               }
+               if iSpeedkHz not in dSpeeds.keys():
+                       raise Exception("Invalid I2C speed")
+               ret = self.command(chr(0b01100000 | dSpeeds[iSpeedkHz]), 1)
                if ord(ret) != 0x1:
                        raise Exception()
 
@@ -128,7 +158,7 @@ class BP:
        def i2c_write(self, addr, reg, s):
                # 1. Write
                # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
-               msg = struct.pack(">BHHBB%ds" % len(s), 0x08, 2+len(s), 0, addr<<1, reg, s)
+               msg = struct.pack(">BHHBB%ds" % len(s), 0x08, 2+len(s), 0, addr, reg, s)
                ret = self.command(msg, 1)
 
                if ord(ret[0]) != 0x1:
@@ -139,7 +169,7 @@ class BP:
                self.i2c_write(addr, reg, "")
 
                # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
-               msg = struct.pack(">BHHB", 0x08, 1, 1+num_read, (addr<<1) | 0x1)
+               msg = struct.pack(">BHHB", 0x08, 1, num_read, addr | 0x1)
                ret = self.command(msg, 1 + num_read)
 
                if ord(ret[0]) != 0x1:
@@ -149,7 +179,7 @@ class BP:
 
        def i2c_search(self):
                for i in range(128):
-                       msg = struct.pack(">BHHB", 0x08, 1, 1, i<<1)
+                       msg = struct.pack(">BHHB", 0x08, 1, 1, i)
                        ret = self.command(msg, 1)
                        if ord(ret) == 0x1:
                                print "Found I2C Addr: 0x%x" % (i & ~0x1)