diff options
Diffstat (limited to 'c/src/libchip/serial/ns16550.c')
-rw-r--r-- | c/src/libchip/serial/ns16550.c | 100 |
1 files changed, 88 insertions, 12 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c index 390c729a54..b0aa38ff92 100644 --- a/c/src/libchip/serial/ns16550.c +++ b/c/src/libchip/serial/ns16550.c @@ -58,6 +58,82 @@ #endif #endif +typedef struct { + uint8_t ucModemCtrl; + int transmitFifoChars; +} NS16550Context; + +/* + * Driver functions + */ + +NS16550_STATIC void ns16550_init(int minor); + +NS16550_STATIC int ns16550_open( + int major, + int minor, + void * arg +); + +NS16550_STATIC int ns16550_close( + int major, + int minor, + void * arg +); + +NS16550_STATIC void ns16550_write_polled( + int minor, + char cChar +); + +NS16550_STATIC int ns16550_assert_RTS( + int minor +); + +NS16550_STATIC int ns16550_negate_RTS( + int minor +); + +NS16550_STATIC int ns16550_assert_DTR( + int minor +); + +NS16550_STATIC int ns16550_negate_DTR( + int minor +); + +NS16550_STATIC void ns16550_initialize_interrupts(int minor); + +NS16550_STATIC void ns16550_cleanup_interrupts(int minor); + +NS16550_STATIC ssize_t ns16550_write_support_int( + int minor, + const char *buf, + size_t len +); + +NS16550_STATIC ssize_t ns16550_write_support_polled( + int minor, + const char *buf, + size_t len + ); + +int ns16550_inbyte_nonblocking_polled( + int minor +); + +NS16550_STATIC void ns16550_enable_interrupts( + console_tbl *c, + int mask +); + +NS16550_STATIC int ns16550_set_attributes( + int minor, + const struct termios *t +); + +NS16550_STATIC void ns16550_isr(void *arg); + static rtems_interrupt_lock ns16550_lock = RTEMS_INTERRUPT_LOCK_INITIALIZER("NS16550"); @@ -142,12 +218,12 @@ void ns16550_init(int minor) uintptr_t pNS16550; uint8_t ucDataByte; uint32_t ulBaudDivisor; - ns16550_context *pns16550Context; + NS16550Context *pns16550Context; setRegister_f setReg; getRegister_f getReg; console_tbl *c = Console_Port_Tbl [minor]; - pns16550Context=(ns16550_context *)malloc(sizeof(ns16550_context)); + pns16550Context=(NS16550Context *)malloc(sizeof(NS16550Context)); if (pns16550Context == NULL) { printk( "%s: Error: Not enough memory\n", __func__); @@ -328,10 +404,10 @@ NS16550_STATIC int ns16550_assert_RTS(int minor) { uint32_t pNS16550; rtems_interrupt_lock_context lock_context; - ns16550_context *pns16550Context; + NS16550Context *pns16550Context; setRegister_f setReg; - pns16550Context=(ns16550_context *) Console_Port_Data[minor].pDeviceContext; + pns16550Context=(NS16550Context *) Console_Port_Data[minor].pDeviceContext; pNS16550 = Console_Port_Tbl[minor]->ulCtrlPort1; setReg = Console_Port_Tbl[minor]->setRegister; @@ -354,10 +430,10 @@ NS16550_STATIC int ns16550_negate_RTS(int minor) { uint32_t pNS16550; rtems_interrupt_lock_context lock_context; - ns16550_context *pns16550Context; + NS16550Context *pns16550Context; setRegister_f setReg; - pns16550Context=(ns16550_context *) Console_Port_Data[minor].pDeviceContext; + pns16550Context=(NS16550Context *) Console_Port_Data[minor].pDeviceContext; pNS16550 = Console_Port_Tbl[minor]->ulCtrlPort1; setReg = Console_Port_Tbl[minor]->setRegister; @@ -385,10 +461,10 @@ NS16550_STATIC int ns16550_assert_DTR(int minor) { uint32_t pNS16550; rtems_interrupt_lock_context lock_context; - ns16550_context *pns16550Context; + NS16550Context *pns16550Context; setRegister_f setReg; - pns16550Context=(ns16550_context *) Console_Port_Data[minor].pDeviceContext; + pns16550Context=(NS16550Context *) Console_Port_Data[minor].pDeviceContext; pNS16550 = Console_Port_Tbl[minor]->ulCtrlPort1; setReg = Console_Port_Tbl[minor]->setRegister; @@ -411,10 +487,10 @@ NS16550_STATIC int ns16550_negate_DTR(int minor) { uint32_t pNS16550; rtems_interrupt_lock_context lock_context; - ns16550_context *pns16550Context; + NS16550Context *pns16550Context; setRegister_f setReg; - pns16550Context=(ns16550_context *) Console_Port_Data[minor].pDeviceContext; + pns16550Context=(NS16550Context *) Console_Port_Data[minor].pDeviceContext; pNS16550 = Console_Port_Tbl[minor]->ulCtrlPort1; setReg = Console_Port_Tbl[minor]->setRegister; @@ -533,7 +609,7 @@ NS16550_STATIC void ns16550_process( int minor) { console_tbl *c = Console_Port_Tbl [minor]; console_data *d = &Console_Port_Data [minor]; - ns16550_context *ctx = d->pDeviceContext; + NS16550Context *ctx = d->pDeviceContext; uint32_t port = c->ulCtrlPort1; getRegister_f get = c->getRegister; int i = 0; @@ -584,7 +660,7 @@ ssize_t ns16550_write_support_int( { console_tbl *c = Console_Port_Tbl [minor]; console_data *d = &Console_Port_Data [minor]; - ns16550_context *ctx = d->pDeviceContext; + NS16550Context *ctx = d->pDeviceContext; uint32_t port = c->ulCtrlPort1; setRegister_f set = c->setRegister; int i = 0; |