summaryrefslogtreecommitdiffstats
path: root/debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h
diff options
context:
space:
mode:
Diffstat (limited to 'debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h')
-rw-r--r--debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h b/debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h
new file mode 100644
index 0000000..4bd2f53
--- /dev/null
+++ b/debug/risc-v-gsp-rm-vm/firmware/uproc_demo/ge_uart.h
@@ -0,0 +1,38 @@
+/* Minimal NS16550A UART helpers for the QEMU virt machine. */
+#ifndef GE_UART_H
+#define GE_UART_H
+
+typedef unsigned char u8;
+typedef unsigned int u32;
+typedef unsigned long u64;
+typedef long i64;
+
+#define UART0_BASE 0x10000000UL
+#define UART_THR (UART0_BASE + 0x00)
+#define UART_LSR (UART0_BASE + 0x05)
+
+static inline void uart_putc(char c)
+{
+ volatile u8 *lsr = (volatile u8 *)UART_LSR;
+ while ((*lsr & 0x20) == 0) {
+ /* wait for THR empty */
+ }
+ *(volatile u8 *)UART_THR = (u8)c;
+}
+
+static inline void uart_puts(const char *s)
+{
+ while (*s) {
+ uart_putc(*s++);
+ }
+}
+
+static inline void uart_hex(u64 value, int digits)
+{
+ static const char hex[] = "0123456789abcdef";
+ for (int i = (digits - 1) * 4; i >= 0; i -= 4) {
+ uart_putc(hex[(value >> i) & 0xf]);
+ }
+}
+
+#endif /* GE_UART_H */