uart: add BridgedUart
authorSean Cross <sean@xobs.io>
Sun, 12 Jan 2020 09:52:42 +0000 (19:52 +1000)
committerSean Cross <sean@xobs.io>
Sun, 12 Jan 2020 09:52:42 +0000 (19:52 +1000)
This version of the UART adds a second, compatible UART after
the first.  This maintians software compatibility, and allows a
program running on the other side of the litex bridge to act as
a terminal emulator by manually reading and writing the second
UART.

Signed-off-by: Sean Cross <sean@xobs.io>
litex/soc/cores/uart.py

index 2bdc8e30e62b4948249cd5a571697bfd0bfc28cc..0a21838cf560849171cc44c3383f51c1fc297a02 100644 (file)
@@ -267,3 +267,26 @@ class UARTMultiplexer(Module):
                 uarts[n].rx.eq(uart.rx)
             ]
         self.comb += Case(self.sel, cases)
+
+class BridgedUart(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.
+
+    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.
+    """
+    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))