From 26fe45fce19bb670ac22c6d38d555be33d8ffed8 Mon Sep 17 00:00:00 2001 From: Florent Kermarrec Date: Sun, 12 Jan 2020 21:11:44 +0100 Subject: [PATCH] cores/uart: rename BridgedUART to UARTEmulator and rework/simplify it. Also integrated it in SoCCore with uart_name="emulator" --- litex/soc/cores/uart.py | 44 +++++++++++++++---------------- litex/soc/integration/soc_core.py | 4 ++- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/litex/soc/cores/uart.py b/litex/soc/cores/uart.py index 0a21838c..70e36c31 100644 --- a/litex/soc/cores/uart.py +++ b/litex/soc/cores/uart.py @@ -13,13 +13,15 @@ from litex.soc.interconnect.csr_eventmanager import * from litex.soc.interconnect import stream from litex.soc.interconnect.wishbonebridge import WishboneStreamingBridge -# RS232 PHY ---------------------------------------------------------------------------------------- - -class RS232PHYInterface: +class UARTInterface: def __init__(self): - self.sink = stream.Endpoint([("data", 8)]) + self.sink = stream.Endpoint([("data", 8)]) self.source = stream.Endpoint([("data", 8)]) +# RS232 PHY ---------------------------------------------------------------------------------------- + +class RS232PHYInterface(UARTInterface): + pass class RS232PHYRX(Module): def __init__(self, pads, tuning_word): @@ -268,25 +270,21 @@ class UARTMultiplexer(Module): ] self.comb += Case(self.sel, cases) -class BridgedUart(UART): +# UART Emulator ------------------------------------------------------------------------------------ + +class UARTEmulator(UART): """ - Creates a UART that's fully compatible with the existing - UART class, except it adds a second UART that can be read - over the Wishbone bridge. + UART emulation over Wishbone bridge. - This allows a program on the other end of the Wishbone - bridge to act as a terminal emulator on a board where - the UART is otherwise used as a Wishbone bridge. + Creates a fully compatible UART that can be used by the CPU as a regular UART and adds a second + UART, cross-connected to the main one to allow terminal emulation over a Wishbone bridge. """ - def __init__(self, **kw): - class BridgedUartPhy: - def __init__(self): - self.sink = stream.Endpoint([("data", 8)]) - self.source = stream.Endpoint([("data", 8)]) - class CrossoverPhy: - def __init__(self, phy): - self.source = phy.sink - self.sink = phy.source - phy = BridgedUartPhy() - UART.__init__(self, phy, **kw) - self.submodules.xover = UART(CrossoverPhy(phy)) + def __init__(self, **kwargs): + uart_phy = UARTInterface() + emul_phy = UARTInterface() + UART.__init__(self, uart_phy, **kwargs) + self.submodules.emul = UART(emul_phy) + self.comb += [ + uart_phy.source.connect(emul_phy.sink), + emul_phy.source.connect(uart_phy.sink) + ] diff --git a/litex/soc/integration/soc_core.py b/litex/soc/integration/soc_core.py index 6c564e22..8ce16d56 100644 --- a/litex/soc/integration/soc_core.py +++ b/litex/soc/integration/soc_core.py @@ -240,7 +240,9 @@ class SoCCore(Module): # Add UART if with_uart: if uart_stub: - self.submodules.uart = uart.UARTStub() + self.submodules.uart = uart.UARTStub() + elif uart_name == "emulator": + self.submodules.uart = uart.UARTEmulator() else: if uart_name == "jtag_atlantic": from litex.soc.cores.jtag import JTAGAtlantic -- 2.30.2