from nmigen.build import * __all__ = ["I2CResource", "GPIOResources", "DiffResources"] def I2CResource(*args, sda, scl, conn=None, attrs=None, role="host"): assert role in ("host", "device") io = [] # sda line: I/O port for the data line io.append(Subsignal("sda", Pins(sda, dir="io", conn=conn, assert_width=1))) # sck line: I2C clock signal outputs from master to slave if role == "host": io.append(Subsignal("scl", Pins(scl, dir="o", conn=conn, assert_width=1))) else: #device io.append(Subsignal("scl", Pins(scl, dir="i", conn=conn, assert_width=1))) if attrs is not None: io.append(attrs) return Resource.family(*args, default_name="i2c", ios=io) # Auto create a resource list given a set of iCE40 pins and STM32 pin names (pins_dict) def GPIOResources(*args, pins_dict, dir = "o", invert=False, conn=None, attrs=None): # Check data integrity: pins_dict must be a dict AND port must be from a to k assert isinstance(pins_dict, dict) # Debug: dir == "o" assert dir == "o" # List of resources to be returned resources = [] for STM32_pin, iCE40_pin in pins_dict.items(): # Set all gpio pins to be output only for the time being # TODO: Allow dir argument. ios = [Pins(iCE40_pin, dir=dir, invert=invert, conn=conn)] if attrs is not None: ios.append(attrs) # Extract GPIO port and port number from STM32_pin # Strip "P" from P if STM32_pin.startswith('P'): STM32_pin = STM32_pin[1:] # Acquire port from port = STM32_pin[0].lower() port_num = int(STM32_pin[1:]) # Insert gpio. into resources list resources.append(Resource.family(*args, port_num, default_name=("gpio"+port), ios=ios)) return resources # Auto create a resource list for differential I/O def DiffResources(*args, eem_pins, invert=False, conn=None, attrs=None, dir): # TODO: Everything # assert dimensionality assert isinstance(eem_pins, list) assert isinstance(eem_pins[0], list) assert isinstance(eem_pins[0][0], list) assert isinstance(eem_pins[0][0][0], str) # assert direction to be either input or output # reject tristate or bidirectional pin assert dir in ("i", "o") if __name__ == "__main__": from pin_mapper import * eem = diffMapping() DiffResources(eem_pins = eem, dir = "o", attrs=Attrs(IO_STANDARD="SB_LVCMOS") )