X-Git-Url: https://defiant.homedns.org/gitweb/?a=blobdiff_plain;f=i2c.py;h=bffa9fe0c61e3b556ae534e43412dc7f07b83b16;hb=5e8ea81e656170f78ed9c126ad857955d81cc414;hp=2bb9f94026849106394d92e9f3210d7feff14de6;hpb=44c7f3645d8839dbc49a54bf1481dd2f75199a7a;p=pyshared.git diff --git a/i2c.py b/i2c.py index 2bb9f94..bffa9fe 100755 --- a/i2c.py +++ b/i2c.py @@ -7,7 +7,6 @@ import os import logging import struct import fcntl -from ctypes import * from time import sleep DEBUG=0 @@ -15,7 +14,6 @@ I2C_FILENAME = "/dev/i2c-2" logger = logging.getLogger(__name__) class i2c: - libc = CDLL("libc.so.6") I2C_SLAVE = 0x0703 # Use this slave address __single = None __lock = threading.Lock() @@ -34,40 +32,33 @@ class i2c: logger.warning("Error: (%s) I2C blocked %fs by %s!", parent, count*0.001, parent_owner) i2c.__parent_owner = inspect.stack()[1] i2c.__single = True - self.dev = i2c.libc.open(I2C_FILENAME, os.O_RDWR) + self.dev = os.open(I2C_FILENAME, os.O_RDWR) if self.dev < 0: raise IOError("open") fcntl.flock(self.dev, fcntl.LOCK_EX) - err = i2c.libc.ioctl(self.dev, i2c.I2C_SLAVE, addr>>1) - if err < 0: - raise IOError("ioctl") + fcntl.ioctl(self.dev, i2c.I2C_SLAVE, addr>>1) def write(self, s): - num_write = i2c.libc.write(self.dev, s, len(s)) + num_write = os.write(self.dev, s) if num_write != len(s): self.close() raise IOError("write: %d" % (num_write)) def read(self, num): - buf = create_string_buffer(num) - num_read = i2c.libc.read(self.dev, buf, num) - if num_read != num: + buf = os.read(self.dev, num) + if len(buf) != num: self.close() - raise IOError("read: %d" % (num_read)) - return buf.raw + raise IOError("read: %d" % (len(buf))) + return buf def close(self): if self.dev: - i2c.libc.close(self.dev) + os.close(self.dev) self.dev = None - #i2c.__parent_owner = None i2c.__single = None - def __del__(self): - self.close() - -def i2c_write_reg(addr, reg, buf): +def i2c_write_reg(addr, reg, buf=""): dev = i2c(addr) s = struct.pack(">B", reg) + buf dev.write(s) @@ -75,16 +66,15 @@ def i2c_write_reg(addr, reg, buf): def i2c_read_reg(addr, reg, num=1): + i2c_write_reg(addr, reg) + dev = i2c(addr) - s = struct.pack(">B", reg) - dev.write(s) s = dev.read(num) dev.close() return s if __name__ == "__main__": - import struct import sys dev = i2c(0x50)