litex-uart.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2021 Gabriel Somlo
  5. *
  6. * Authors:
  7. * Gabriel Somlo <gsomlo@gmail.com>
  8. */
  9. #include <sbi/riscv_io.h>
  10. #include <sbi/sbi_console.h>
  11. #include <sbi_utils/serial/litex-uart.h>
  12. /* clang-format off */
  13. #define UART_REG_RXTX 0
  14. #define UART_REG_TXFULL 1
  15. #define UART_REG_RXEMPTY 2
  16. #define UART_REG_EV_STATUS 3
  17. #define UART_REG_EV_PENDING 4
  18. #define UART_REG_EV_ENABLE 5
  19. /* clang-format on */
  20. static volatile u32 *uart_base;
  21. static u8 get_reg(u8 reg)
  22. {
  23. return readb(uart_base + reg);
  24. }
  25. static void set_reg(u8 reg, u8 val)
  26. {
  27. writeb(val, uart_base + reg);
  28. }
  29. static void litex_uart_putc(char ch)
  30. {
  31. while (get_reg(UART_REG_TXFULL));
  32. set_reg(UART_REG_RXTX, ch);
  33. }
  34. static int litex_uart_getc(void)
  35. {
  36. if (get_reg(UART_REG_RXEMPTY))
  37. return -1;
  38. else
  39. return get_reg(UART_REG_RXTX);
  40. }
  41. static struct sbi_console_device litex_console = {
  42. .name = "litex_uart",
  43. .console_putc = litex_uart_putc,
  44. .console_getc = litex_uart_getc
  45. };
  46. int litex_uart_init(unsigned long base)
  47. {
  48. uart_base = (volatile u32 *)base;
  49. set_reg(UART_REG_EV_ENABLE, 0); /* UART in polling mode: disable IRQ */
  50. sbi_console_set_device(&litex_console);
  51. return 0;
  52. }