]> defiant.homedns.org Git - pyshared.git/blobdiff - bus_pirate.py
Bootloader: Allow to set i2c addr
[pyshared.git] / bus_pirate.py
index 52a1c5c1b759fc2f8f20fd633b0fbbbc9ec4f3f9..02f3fb8211024a29eb0165be158aef32be520d82 100644 (file)
@@ -3,6 +3,7 @@
 
 import serial
 import struct
+import threading
 
 dPinToBit = {
                "POWER": 6,
@@ -18,14 +19,16 @@ dPinToBit = {
 # http://dangerousprototypes.com/docs/SPI_(binary)
 class BP:
        def __init__(self, sDevice):
+               self.lock = threading.Lock()
                self.pSerial = serial.Serial(sDevice, baudrate=115200, timeout=0.1)
                self.mode_bit_bang()
                self.io_state = 0
                self.io_dir = 0
 
        def command(self, cmd, num_read):
-               self.pSerial.write(cmd)
-               return self.pSerial.read(num_read)
+               with self.lock:
+                       self.pSerial.write(cmd)
+                       return self.pSerial.read(num_read)
 
        def mode_bit_bang(self):
                for i in range(20):
@@ -65,7 +68,7 @@ class BP:
                return v[0]/1024.0*6.6
 
        # http://codepad.org/qtYpZmIF
-       def pwm(self, freq, duty_cycle):
+       def pwm(self, freq, duty_cycle_percent):
                lPrescaler = {0:1, 1:8 , 2:64, 3:256}
                Fosc = 32e6
                Tcy = 2.0 / Fosc
@@ -77,12 +80,12 @@ class BP:
                        prescaler = lPrescaler[i]
                        PRy = period * 1.0 / (Tcy * prescaler)
                        PRy = int(PRy - 1)
-                       OCR = int(PRy * duty_cycle)
+                       OCR = int(PRy * duty_cycle_percent)
 
                        if PRy < (2 ** 16 - 1):
                                break # valid value for PRy, keep values
 
-               cmd = struct.pack(">BBHH", 0b00010010, prescaler, duty_cycle, period)
+               cmd = struct.pack(">BBHH", 0b00010010, i, OCR, PRy)
                ret = self.command(cmd, 1)
                if ord(ret) != 0x1:
                        raise Exception()
@@ -155,6 +158,15 @@ class BP:
                if ord(ret) != 0x1:
                        raise Exception()
 
+       def i2c_ping(self, addr):
+               # 1. Write
+               # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
+               msg = struct.pack(">BHHB", 0x08, 1, 0, addr)
+               ret = self.command(msg, 1)
+
+               if ord(ret[0]) != 0x1:
+                       raise Exception("I2C ping failed")
+
        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..)
@@ -166,7 +178,8 @@ class BP:
 
        def i2c_read(self, addr, reg, num_read):
                # set reg
-               self.i2c_write(addr, reg, "")
+               if reg != None:
+                       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, num_read, addr | 0x1)