| // Copyright 2017 The Fuchsia Authors | |
| // | |
| // Use of this source code is governed by a MIT-style | |
| // license that can be found in the LICENSE file or at | |
| // https://opensource.org/licenses/MIT | |
| #include <err.h> | |
| #include <lib/arch/intrin.h> | |
| #include <pdev/uart.h> | |
| static int default_getc(bool wait) { return ZX_ERR_NOT_SUPPORTED; } | |
| static void default_pputc(char c) {} | |
| static int default_pgetc() { return ZX_ERR_NOT_SUPPORTED; } | |
| static void default_start_panic() {} | |
| static void default_dputs(const char* str, size_t len, bool block, bool map_NL) {} | |
| static const struct pdev_uart_ops default_ops = { | |
| .getc = default_getc, | |
| .pputc = default_pputc, | |
| .pgetc = default_pgetc, | |
| .start_panic = default_start_panic, | |
| .dputs = default_dputs, | |
| }; | |
| static const struct pdev_uart_ops* uart_ops = &default_ops; | |
| void uart_init() {} | |
| void uart_init_early() {} | |
| bool uart_present() { return uart_ops != &default_ops; } | |
| void uart_putc(char c) { uart_ops->dputs(&c, 1, true, true); } | |
| int uart_getc(bool wait) { return uart_ops->getc(wait); } | |
| /* | |
| * block : Blocking vs Non-Blocking | |
| * map_NL : If true, map a '\n' to '\r'+'\n' | |
| */ | |
| void uart_puts(const char* str, size_t len, bool block, bool map_NL) { | |
| uart_ops->dputs(str, len, block, map_NL); | |
| } | |
| void uart_pputc(char c) { uart_ops->pputc(c); } | |
| int uart_pgetc() { return uart_ops->pgetc(); } | |
| void pdev_register_uart(const struct pdev_uart_ops* ops) { | |
| uart_ops = ops; | |
| arch::ThreadMemoryBarrier(); | |
| } |