diff options
Diffstat (limited to 'c/src/libchip/serial/ns16550.h')
-rw-r--r-- | c/src/libchip/serial/ns16550.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/c/src/libchip/serial/ns16550.h b/c/src/libchip/serial/ns16550.h index 28905665bb..ef1f9f9d95 100644 --- a/c/src/libchip/serial/ns16550.h +++ b/c/src/libchip/serial/ns16550.h @@ -27,6 +27,7 @@ #ifndef _NS16550_H_ #define _NS16550_H_ +#include <rtems/termiostypes.h> #include <libchip/serial.h> #ifdef __cplusplus @@ -53,6 +54,37 @@ extern const console_flow ns16550_flow_DTRCTS; void ns16550_outch_polled(console_tbl *c, char out); int ns16550_inch_polled(console_tbl *c); +/* Alternative NS16550 driver using the Termios device context */ + +typedef uint8_t (*ns16550_get_reg)(uintptr_t port, uint8_t reg); + +typedef void (*ns16550_set_reg)(uintptr_t port, uint8_t reg, uint8_t value); + +typedef struct { + rtems_termios_device_context base; + ns16550_get_reg get_reg; + ns16550_set_reg set_reg; + uintptr_t port; + rtems_vector_number irq; + uint32_t clock; + uint32_t initial_baud; + bool has_fractional_divider_register; + uint8_t modem_control; + size_t transmit_fifo_chars; +} ns16550_context; + +extern const rtems_termios_device_handler ns16550_handler_interrupt; +extern const rtems_termios_device_handler ns16550_handler_polled; + +extern const rtems_termios_device_flow ns16550_flow_rtscts; +extern const rtems_termios_device_flow ns16550_flow_dtrcts; + +void ns16550_polled_putchar(rtems_termios_device_context *base, char out); + +int ns16550_polled_getchar(rtems_termios_device_context *base); + +bool ns16550_probe(rtems_termios_device_context *base); + #ifdef __cplusplus } #endif |