From 09a7a9e108c0747b878037f9c0333b85de394166 Mon Sep 17 00:00:00 2001 From: Dan White Date: Sun, 8 Apr 2012 18:19:59 -0500 Subject: [PATCH] usbio.py: add AD5242 class --- python-lib/usbio.py | 159 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/python-lib/usbio.py b/python-lib/usbio.py index 758e51b..f5971f2 100644 --- a/python-lib/usbio.py +++ b/python-lib/usbio.py @@ -348,6 +348,165 @@ class Mux(object): return tuple(b) +class AD524x(object): + ADDR_BASE = intbv(0b0101100, max=2**7) + SEL_POS = 7 + RS_POS = 6 + SD_POS = 5 + O1_POS = 4 + O2_POS = 3 + # instruction bits 2..0 are unused + READ = 1 + WRITE = 0 + lastA = None + lastB = None + lastSel = None + + def __init__(self, i2cbus, addr=0): + self.bus = i2cbus + self.addr = intbv(ADDR_BASE + intbv(addr, max=2**2), max=2**7) + self._sel = intbv(0, max=1) + self._rs = intbv(0, max=1) + self._sd = intbv(0, max=1) + self._posA = intbv(0x80, max=2**8) + self._posB = intbv(0x80, max=2**8) + self._gpo1 = intbv(0, max=1) + self._gpo2 = intbv(0, max=1) + self.gpo = (self._gpo1, self.gpo2) + + @property + def sel(self): return self._sel + + @sel.setter + def sel(self, value): + if value: + v = 1 + else: + v = 0 + self._sel = intbv(v, max=1) + + @property + def reset(self): return self._rs + + @reset.setter + def reset(self, value): + if value: + v = 1 + else: + v = 0 + self._rs = intbv(v, max=1) + + @property + def shutdown(self): return self._sd + + @shutdown.setter + def shutdown(self, value): + if value: + v = 1 + else: + v = 0 + self._sd = intbv(v, max=1) + + @property + def posA(self): return self._posA + + @posA.setter + def posA(self, value): + self._posA = intbv(value, max=2**8) + + @property + def posB(self): return self._posB + + @posB.setter + def posB(self, value): + self._posB = intbv(value, max=2**8) + + @property + def pos(self): + if self.pos: + return self.posB + else: + return self.posA + + @property + def gpo1(self): return self.gpo1 + + @gpo1.setter + def gpo1(self, value): + if value: + v = intbv(1)[0] + else: + v = intbv(0)[0] + self._gpo1 = v + + @property + def gpo2(self): return self.gpo2 + + @gpo2.setter + def gpo2(self, value): + if value: + v = intbv(1)[0] + else: + v = intbv(0)[0] + self._gpo2 = v + + @property + def instruction(self): + inst = intbv(0)[8:] + inst += self.sel << self.SEL_POS + inst += self.reset << self.RS_POS + inst += self.shutdown << self.SD_POS + inst += self.gpo1 << self.O1_POS + inst += self.gpo2 << self.O2_POS + return inst + + def setpos(self, sel, pos, force=False): + self.sel = sel + if sel: + self.posB = pos + else: + self.posA = pos + self.update(force=force) + + def update(self, force=False): + if force or (self.posA != self.lastA): + self.send(0) + + if force or (self.posB != self.lastB): + self.send(1) + + def send(self, sel): + self.sel = sel + cmd = ((self.addr << 1) + self.WRITE, + self.instruction, + self.pos) + + self.lastSel = self.sel + if sel: + self.lastB = self.pos + else: + self.lastA = self.pos + + self.bus.write(cmd) + + def read(self, sel): + if sel != self.lastSel: + self.send(sel) + + cmd = ((self.addr << 1) + self.READ, ) + val = self.bus.read(cmd, 1) + return val[0] + + + +class I2C(object): + def write(self, data): + """Send i2c command data to slave.""" + raise NotImplementedError + + def read(self, cmd, n): + """Send i2c command cmd and read n additional bytes from slave.""" + raise NotImplementedError o = OTA() -- 2.25.1