From: Jonathan Georgino Date: Sun, 17 Nov 2019 06:22:57 +0000 (-0800) Subject: First attempt at implementing I2C driver -- Untested. Committing to review with Francis X-Git-Tag: 3.1.0^2~17 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/ff4752dfb49954e4f1efdb89baa3167385df715f First attempt at implementing I2C driver -- Untested. Committing to review with Francis --- diff --git a/src/adafruit_blinka/microcontroller/nova/i2c.py b/src/adafruit_blinka/microcontroller/nova/i2c.py index 4e34a7d..f62e73e 100644 --- a/src/adafruit_blinka/microcontroller/nova/i2c.py +++ b/src/adafruit_blinka/microcontroller/nova/i2c.py @@ -4,34 +4,79 @@ class I2C: def __init__(self): # change GPIO controller to I2C - from pyftdi.i2c import I2cController - self._i2c = I2cController() - self._i2c.configure('ftdi:///1') - Pin.ft232h_gpio = self._i2c.get_gpio() + from binhoHostAdapter import binhoHostAdapter + from binhoHostAdapter import binhoUtilities + + utilities = binhoUtilities.binhoUtilities() + devices = utilities.listAvailableDevices() + + if len(devices) > 0: + + self._nova = binhoHostAdapter.binhoHostAdapter(devices[0]) + self._nova.setNumericalBase(10) + self._nova.setOperationMode(0, "I2C") + self._nova.setPullUpStateI2C(0, "EN") + self._nova.setClockI2C(0, 400000) + + else: + raise RuntimeError('No Binho host adapter found!') + + # Pin.ft232h_gpio = self._i2c.get_gpio() def scan(self): - return [addr for addr in range(0x79) if self._i2c.poll(addr)] + + scanResults = [] + + for i in range(8, 121): + result = self._nova.scanAddrI2C(0, i<<1) + + resp = result.split(" ") + + if resp[3] == 'OK': + scanResults.append(i) + + return scanResults def writeto(self, address, buffer, *, start=0, end=None, stop=True): + end = end if end else len(buffer) - port = self._i2c.get_port(address) - port.write(buffer[start:end], relax=stop) + + self._nova.startI2C(0, address) + + for i in range(start, end): + self._nova.writeByteI2C(0, buffer[i]) + + if stop: + self._nova.endI2C(0) + else: + self._nova.endI2C(0, True) def readfrom_into(self, address, buffer, *, start=0, end=None, stop=True): + end = end if end else len(buffer) - port = self._i2c.get_port(address) - result = port.read(len(buffer[start:end]), relax=stop) - for i, b in enumerate(result): - buffer[start+i] = b + + result = self._nova.readBytesI2C(0, address, len(buffer(start:end))) + resp = result.split(" ") + + for i in range(len(buffer(start:end))): + buffer[start+i] = resp[2+i] def writeto_then_readfrom(self, address, buffer_out, buffer_in, *, out_start=0, out_end=None, in_start=0, in_end=None, stop=False): + out_end = out_end if out_end else len(buffer_out) in_end = in_end if in_end else len(buffer_in) - port = self._i2c.get_port(address) - result = port.exchange(buffer_out[out_start:out_end], - in_end-in_start, - relax=True).tobytes() - for i, b in enumerate(result): - buffer_in[in_start+i] = b + + self._nova.startI2C(0, address) + + for i in range(out_start, out_end): + self._nova.writeByteI2C(0, buffer_out[i]) + + self._nova.endI2C(0, True) + + result = self._nova.readBytesI2C(0, address, len(buffer_in(in_start:in_end))) + resp = result.split(" ") + + for i in range(len(buffer_in(in_start:in_end))): + buffer_in[in_start+i] = resp[2+i]