cores/gpio: add support for Record on GPIOOut, GPIOIn and GPIOInOut.
This commit is contained in:
parent
5e53e5d73a
commit
2ec4604c41
|
@ -1,4 +1,5 @@
|
||||||
# This file is Copyright (c) 2013-2015 Sebastien Bourdeauducq <sb@m-labs.hk>
|
# This file is Copyright (c) 2013-2015 Sebastien Bourdeauducq <sb@m-labs.hk>
|
||||||
|
# This file is Copyright (c) 2019-2020 Florent Kermarrec <florent@enjoy-digital.fr>
|
||||||
# License: BSD
|
# License: BSD
|
||||||
|
|
||||||
from migen import *
|
from migen import *
|
||||||
|
@ -6,26 +7,33 @@ from migen.genlib.cdc import MultiReg
|
||||||
|
|
||||||
from litex.soc.interconnect.csr import *
|
from litex.soc.interconnect.csr import *
|
||||||
|
|
||||||
# GPIO Input ----------------------------------------------------------------------------------------
|
# Helpers ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _to_signal(obj):
|
||||||
|
return obj.raw_bits() if isinstance(obj, Record) else obj
|
||||||
|
|
||||||
|
# GPIO Input ---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class GPIOIn(Module, AutoCSR):
|
class GPIOIn(Module, AutoCSR):
|
||||||
def __init__(self, signal):
|
def __init__(self, pads):
|
||||||
self._in = CSRStatus(len(signal), description="GPIO Input(s) Status.")
|
pads = _to_signal(pads)
|
||||||
self.specials += MultiReg(signal, self._in.status)
|
self._in = CSRStatus(len(pads), description="GPIO Input(s) Status.")
|
||||||
|
self.specials += MultiReg(pads, self._in.status)
|
||||||
|
|
||||||
# GPIO Output --------------------------------------------------------------------------------------
|
# GPIO Output --------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class GPIOOut(Module, AutoCSR):
|
class GPIOOut(Module, AutoCSR):
|
||||||
def __init__(self, signal):
|
def __init__(self, pads):
|
||||||
self._out = CSRStorage(len(signal), description="GPIO Output(s) Control.")
|
pads = _to_signal(pads)
|
||||||
self.comb += signal.eq(self._out.storage)
|
self.out = CSRStorage(len(pads), description="GPIO Output(s) Control.")
|
||||||
|
self.comb += pads.eq(self.out.storage)
|
||||||
|
|
||||||
# GPIO Input/Output --------------------------------------------------------------------------------
|
# GPIO Input/Output --------------------------------------------------------------------------------
|
||||||
|
|
||||||
class GPIOInOut(Module):
|
class GPIOInOut(Module):
|
||||||
def __init__(self, in_signal, out_signal):
|
def __init__(self, in_pads, out_pads):
|
||||||
self.submodules.gpio_in = GPIOIn(in_signal)
|
self.submodules.gpio_in = GPIOIn(in_pads)
|
||||||
self.submodules.gpio_out = GPIOOut(out_signal)
|
self.submodules.gpio_out = GPIOOut(out_pads)
|
||||||
|
|
||||||
def get_csrs(self):
|
def get_csrs(self):
|
||||||
return self.gpio_in.get_csrs() + self.gpio_out.get_csrs()
|
return self.gpio_in.get_csrs() + self.gpio_out.get_csrs()
|
||||||
|
|
Loading…
Reference in New Issue