diff options
Diffstat (limited to 'cpukit/libcsupport/src/termios.c')
-rw-r--r-- | cpukit/libcsupport/src/termios.c | 503 |
1 files changed, 400 insertions, 103 deletions
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index 1159bcaaae..afc466e888 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -85,6 +85,8 @@ static size_t rtems_termios_raw_output_size = 64; static struct rtems_termios_tty *rtems_termios_ttyHead; static struct rtems_termios_tty *rtems_termios_ttyTail; +static RTEMS_CHAIN_DEFINE_EMPTY(rtems_termios_devices); + static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument); static rtems_task rtems_termios_txdaemon(rtems_task_argument argument); /* @@ -103,34 +105,197 @@ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument); #define TERMIOS_RX_PROC_EVENT RTEMS_EVENT_1 #define TERMIOS_RX_TERMINATE_EVENT RTEMS_EVENT_0 -/* - * Open a termios device - */ -rtems_status_code -rtems_termios_open ( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg, - const rtems_termios_callbacks *callbacks +static rtems_termios_device_node * +rtems_termios_find_device_node( + rtems_device_major_number major, + rtems_device_minor_number minor ) { - rtems_status_code sc; - rtems_libio_open_close_args_t *args = arg; - struct rtems_termios_tty *tty; + rtems_chain_node *tail = rtems_chain_tail(&rtems_termios_devices); + rtems_chain_node *current = rtems_chain_first(&rtems_termios_devices); + + while (current != tail) { + rtems_termios_device_node *device_node = + (rtems_termios_device_node *) current; + + if (device_node->major == major && device_node->minor == minor) { + return device_node; + } + + current = rtems_chain_next(current); + } + + return NULL; +} + +rtems_status_code rtems_termios_device_install( + const char *device_file, + rtems_device_major_number major, + rtems_device_minor_number minor, + const rtems_termios_device_handler *handler, + void *context +) +{ + rtems_status_code sc; + rtems_termios_device_node *new_device_node; + rtems_termios_device_node *existing_device_node; + + new_device_node = malloc(sizeof(*new_device_node)); + if (new_device_node == NULL) { + return RTEMS_NO_MEMORY; + } + + new_device_node->major = major; + new_device_node->minor = minor; + new_device_node->handler = handler; + new_device_node->context = context; + new_device_node->tty = NULL; - /* - * See if the device has already been opened - */ sc = rtems_semaphore_obtain( rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - if (sc != RTEMS_SUCCESSFUL) - return sc; + if (sc != RTEMS_SUCCESSFUL) { + free(new_device_node); + return RTEMS_INCORRECT_STATE; + } - for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { - if ((tty->major == major) && (tty->minor == minor)) - break; + existing_device_node = rtems_termios_find_device_node (major, minor); + if (existing_device_node != NULL) { + free(new_device_node); + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_RESOURCE_IN_USE; + } + + if (device_file != NULL) { + sc = rtems_io_register_name (device_file, major, minor); + if (sc != RTEMS_SUCCESSFUL) { + free(new_device_node); + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_UNSATISFIED; + } + } + + rtems_chain_append_unprotected( + &rtems_termios_devices, &new_device_node->node); + + rtems_semaphore_release (rtems_termios_ttyMutex); + + return RTEMS_SUCCESSFUL; +} + +rtems_status_code rtems_termios_device_remove( + const char *device_file, + rtems_device_major_number major, + rtems_device_minor_number minor +) +{ + rtems_status_code sc; + rtems_termios_device_node *device_node; + + sc = rtems_semaphore_obtain( + rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) { + return RTEMS_INCORRECT_STATE; + } + + device_node = rtems_termios_find_device_node (major, minor); + if (device_node == NULL) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_INVALID_ID; } + if (device_node->tty != NULL) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_RESOURCE_IN_USE; + } + + if (device_file != NULL) { + int rv = unlink (device_file); + + if (rv != 0) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_UNSATISFIED; + } + } + + rtems_chain_extract_unprotected (&device_node->node); + free (device_node); + + rtems_semaphore_release (rtems_termios_ttyMutex); + + return RTEMS_SUCCESSFUL; +} + +static bool +rtems_termios_callback_firstOpen( + rtems_termios_tty *tty, + rtems_libio_open_close_args_t *args +) +{ + (*tty->device.firstOpen) (tty->major, tty->minor, args); + + return true; +} + +static void +rtems_termios_callback_lastClose( + rtems_termios_tty *tty, + rtems_libio_open_close_args_t *args +) +{ + (*tty->device.lastClose) (tty->major, tty->minor, args); +} + +static int +rtems_termios_callback_pollRead (struct rtems_termios_tty *tty) +{ + return (*tty->device.pollRead) (tty->minor); +} + +static void +rtems_termios_callback_write( + rtems_termios_tty *tty, + const char *buf, + size_t len +) +{ + (*tty->device.write) (tty->minor, buf, len); +} + +static bool +rtems_termios_callback_setAttributes( + rtems_termios_tty *tty, + const struct termios *term +) +{ + (*tty->device.setAttributes) (tty->minor, term); + + return true; +} + +static void +rtems_termios_callback_stopRemoteTx (rtems_termios_tty *tty) +{ + (*tty->device.stopRemoteTx) (tty->minor); +} + +static void +rtems_termios_callback_startRemoteTx (rtems_termios_tty *tty) +{ + (*tty->device.startRemoteTx) (tty->minor); +} + +static rtems_termios_tty * +rtems_termios_open_tty( + rtems_device_major_number major, + rtems_device_minor_number minor, + rtems_libio_open_close_args_t *args, + rtems_termios_tty *tty, + rtems_termios_device_node *device_node, + const rtems_termios_callbacks *callbacks +) +{ + rtems_status_code sc; + if (tty == NULL) { static char c = 'a'; @@ -139,8 +304,7 @@ rtems_termios_open ( */ tty = calloc (1, sizeof (struct rtems_termios_tty)); if (tty == NULL) { - rtems_semaphore_release (rtems_termios_ttyMutex); - return RTEMS_NO_MEMORY; + return NULL; } /* * allocate raw input buffer @@ -149,8 +313,7 @@ rtems_termios_open ( tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); if (tty->rawInBuf.theBuf == NULL) { free(tty); - rtems_semaphore_release (rtems_termios_ttyMutex); - return RTEMS_NO_MEMORY; + return NULL; } /* * allocate raw output buffer @@ -160,8 +323,7 @@ rtems_termios_open ( if (tty->rawOutBuf.theBuf == NULL) { free((void *)(tty->rawInBuf.theBuf)); free(tty); - rtems_semaphore_release (rtems_termios_ttyMutex); - return RTEMS_NO_MEMORY; + return NULL; } /* * allocate cooked buffer @@ -171,8 +333,7 @@ rtems_termios_open ( free((void *)(tty->rawOutBuf.theBuf)); free((void *)(tty->rawInBuf.theBuf)); free(tty); - rtems_semaphore_release (rtems_termios_ttyMutex); - return RTEMS_NO_MEMORY; + return NULL; } /* * Initialize wakeup callbacks @@ -183,17 +344,6 @@ rtems_termios_open ( tty->tty_rcv.sw_arg = NULL; tty->tty_rcvwakeup = 0; - /* - * link tty - */ - tty->forw = rtems_termios_ttyHead; - tty->back = NULL; - if (rtems_termios_ttyHead != NULL) - rtems_termios_ttyHead->back = tty; - rtems_termios_ttyHead = tty; - if (rtems_termios_ttyTail == NULL) - rtems_termios_ttyTail = tty; - tty->minor = minor; tty->major = major; @@ -229,14 +379,39 @@ rtems_termios_open ( /* * Set callbacks */ - tty->device = *callbacks; + if (device_node != NULL) { + device_node->tty = tty; + tty->handler = *device_node->handler; + tty->device_node = device_node; + tty->device_context = device_node->context; + memset(&tty->device, 0, sizeof(tty->device)); + } else { + tty->handler.first_open = callbacks->firstOpen != NULL ? + rtems_termios_callback_firstOpen : NULL; + tty->handler.last_close = callbacks->lastClose != NULL ? + rtems_termios_callback_lastClose : NULL; + tty->handler.poll_read = callbacks->pollRead != NULL ? + rtems_termios_callback_pollRead : NULL; + tty->handler.write = callbacks->write != NULL ? + rtems_termios_callback_write : NULL; + tty->handler.set_attributes = callbacks->setAttributes != NULL ? + rtems_termios_callback_setAttributes : NULL; + tty->handler.stop_remote_tx = callbacks->stopRemoteTx != NULL ? + rtems_termios_callback_stopRemoteTx : NULL; + tty->handler.start_remote_tx = callbacks->startRemoteTx != NULL ? + rtems_termios_callback_startRemoteTx : NULL; + tty->handler.mode = callbacks->outputUsesInterrupts; + tty->device_context = NULL; + tty->device_node = NULL; + tty->device = *callbacks; + } rtems_interrupt_lock_initialize (&tty->interrupt_lock, "Termios"); /* * Create I/O tasks */ - if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { + if (tty->handler.mode == TERMIOS_TASK_DRIVEN) { sc = rtems_task_create ( rtems_build_name ('T', 'x', 'T', c), TERMIOS_TXTASK_PRIO, @@ -259,8 +434,8 @@ rtems_termios_open ( rtems_fatal_error_occurred (sc); } - if ((tty->device.pollRead == NULL) || - (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ + if ((tty->handler.poll_read == NULL) || + (tty->handler.mode == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'r', c), 0, @@ -311,13 +486,13 @@ rtems_termios_open ( } args->iop->data1 = tty; if (!tty->refcount++) { - if (tty->device.firstOpen) - (*tty->device.firstOpen)(major, minor, arg); + if (tty->handler.first_open) + (*tty->handler.first_open)(tty, args); /* * start I/O tasks, if needed */ - if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { + if (tty->handler.mode == TERMIOS_TASK_DRIVEN) { sc = rtems_task_start( tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) @@ -329,7 +504,93 @@ rtems_termios_open ( rtems_fatal_error_occurred (sc); } } + + return tty; +} + +rtems_status_code +rtems_termios_device_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code sc; + rtems_termios_device_node *device_node; + struct rtems_termios_tty *tty; + + sc = rtems_semaphore_obtain( + rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) + return sc; + + device_node = rtems_termios_find_device_node (major, minor); + if (device_node == NULL) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_INVALID_ID; + } + + tty = rtems_termios_open_tty( + major, minor, arg, device_node->tty, device_node, NULL); + if (tty == NULL) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_NO_MEMORY; + } + + rtems_semaphore_release (rtems_termios_ttyMutex); + + return RTEMS_SUCCESSFUL; +} + +/* + * Open a termios device + */ +rtems_status_code +rtems_termios_open ( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg, + const rtems_termios_callbacks *callbacks +) +{ + rtems_status_code sc; + struct rtems_termios_tty *tty; + + /* + * See if the device has already been opened + */ + sc = rtems_semaphore_obtain( + rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) + return sc; + + for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { + if ((tty->major == major) && (tty->minor == minor)) + break; + } + + tty = rtems_termios_open_tty( + major, minor, arg, tty, NULL, callbacks); + if (tty == NULL) { + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_NO_MEMORY; + } + + if (tty->refcount == 1) { + /* + * link tty + */ + tty->forw = rtems_termios_ttyHead; + tty->back = NULL; + if (rtems_termios_ttyHead != NULL) + rtems_termios_ttyHead->back = tty; + rtems_termios_ttyHead = tty; + if (rtems_termios_ttyTail == NULL) + rtems_termios_ttyTail = tty; + } + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_SUCCESSFUL; } @@ -342,7 +603,7 @@ drainOutput (struct rtems_termios_tty *tty) rtems_interrupt_lock_context lock_context; rtems_status_code sc; - if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { + if (tty->handler.mode != TERMIOS_POLLED) { rtems_termios_interrupt_lock_acquire (tty, &lock_context); while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { tty->rawOutBufState = rob_wait; @@ -380,17 +641,11 @@ flushInput (struct rtems_termios_tty *tty) rtems_termios_interrupt_lock_release (tty, &lock_context); } -rtems_status_code -rtems_termios_close (void *arg) +static void +rtems_termios_close_tty (rtems_termios_tty *tty, void *arg) { - rtems_libio_open_close_args_t *args = arg; - struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; - sc = rtems_semaphore_obtain( - rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - if (sc != RTEMS_SUCCESSFUL) - rtems_fatal_error_occurred (sc); if (--tty->refcount == 0) { if (rtems_termios_linesw[tty->t_line].l_close != NULL) { /* @@ -409,7 +664,7 @@ rtems_termios_close (void *arg) rtems_semaphore_release (tty->osem); } - if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { + if (tty->handler.mode == TERMIOS_TASK_DRIVEN) { /* * send "terminate" to I/O tasks */ @@ -420,8 +675,39 @@ rtems_termios_close (void *arg) if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } - if (tty->device.lastClose) - (*tty->device.lastClose)(tty->major, tty->minor, arg); + if (tty->handler.last_close) + (*tty->handler.last_close)(tty, arg); + + if (tty->device_node != NULL) + tty->device_node->tty = NULL; + + rtems_semaphore_delete (tty->isem); + rtems_semaphore_delete (tty->osem); + rtems_semaphore_delete (tty->rawOutBuf.Semaphore); + if ((tty->handler.poll_read == NULL) || + (tty->handler.mode == TERMIOS_TASK_DRIVEN)) + rtems_semaphore_delete (tty->rawInBuf.Semaphore); + rtems_interrupt_lock_destroy (&tty->interrupt_lock); + free (tty->rawInBuf.theBuf); + free (tty->rawOutBuf.theBuf); + free (tty->cbuf); + free (tty); + } +} + +rtems_status_code +rtems_termios_close (void *arg) +{ + rtems_status_code sc; + rtems_libio_open_close_args_t *args = arg; + struct rtems_termios_tty *tty = args->iop->data1; + + sc = rtems_semaphore_obtain( + rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred (sc); + + if (tty->refcount == 1) { if (tty->forw == NULL) { rtems_termios_ttyTail = tty->back; if ( rtems_termios_ttyTail != NULL ) { @@ -439,20 +725,31 @@ rtems_termios_close (void *arg) } else { tty->back->forw = tty->forw; } - - rtems_semaphore_delete (tty->isem); - rtems_semaphore_delete (tty->osem); - rtems_semaphore_delete (tty->rawOutBuf.Semaphore); - if ((tty->device.pollRead == NULL) || - (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) - rtems_semaphore_delete (tty->rawInBuf.Semaphore); - rtems_interrupt_lock_destroy (&tty->interrupt_lock); - free (tty->rawInBuf.theBuf); - free (tty->rawOutBuf.theBuf); - free (tty->cbuf); - free (tty); } + + rtems_termios_close_tty (tty, arg); + rtems_semaphore_release (rtems_termios_ttyMutex); + + return RTEMS_SUCCESSFUL; +} + +rtems_status_code +rtems_termios_device_close (void *arg) +{ + rtems_status_code sc; + rtems_libio_open_close_args_t *args = arg; + struct rtems_termios_tty *tty = args->iop->data1; + + sc = rtems_semaphore_obtain( + rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred (sc); + + rtems_termios_close_tty (tty, arg); + + rtems_semaphore_release (rtems_termios_ttyMutex); + return RTEMS_SUCCESSFUL; } @@ -490,8 +787,8 @@ termios_set_flowctrl(struct rtems_termios_tty *tty) /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { /* if chars available, call write function... */ - (*tty->device.write)( - tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); + (*tty->handler.write)( + tty, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_termios_interrupt_lock_release (tty, &lock_context); @@ -511,8 +808,9 @@ termios_set_flowctrl(struct rtems_termios_tty *tty) tty->flow_ctrl &= ~(FL_MDRTS); /* restart remote Tx, if it was stopped */ - if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) { - tty->device.startRemoteTx(tty->minor); + if ((tty->flow_ctrl & FL_IRTSOFF) && + (tty->handler.start_remote_tx != NULL)) { + tty->handler.start_remote_tx(tty); } tty->flow_ctrl &= ~(FL_IRTSOFF); } @@ -591,8 +889,8 @@ rtems_termios_ioctl (void *arg) } } } - if (tty->device.setAttributes) - (*tty->device.setAttributes)(tty->minor, &tty->termios); + if (tty->handler.set_attributes) + (*tty->handler.set_attributes)(tty, &tty->termios); break; case RTEMS_IO_TCDRAIN: @@ -676,8 +974,8 @@ rtems_termios_puts ( rtems_interrupt_lock_context lock_context; rtems_status_code sc; - if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { - (*tty->device.write)(tty->minor, buf, len); + if (tty->handler.mode == TERMIOS_POLLED) { + (*tty->handler.write)(tty, buf, len); return; } newHead = tty->rawOutBuf.Head; @@ -710,8 +1008,8 @@ rtems_termios_puts ( if (tty->rawOutBufState == rob_idle) { /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { - (*tty->device.write)( - tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); + (*tty->handler.write)( + tty, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; @@ -997,7 +1295,7 @@ fillBufferPoll (struct rtems_termios_tty *tty) if (tty->termios.c_lflag & ICANON) { for (;;) { - n = (*tty->device.pollRead)(tty->minor); + n = (*tty->handler.poll_read)(tty); if (n < 0) { rtems_task_wake_after (1); } else { @@ -1010,7 +1308,7 @@ fillBufferPoll (struct rtems_termios_tty *tty) then = rtems_clock_get_ticks_since_boot(); for (;;) { - n = (*tty->device.pollRead)(tty->minor); + n = (*tty->handler.poll_read)(tty); if (n < 0) { if (tty->termios.c_cc[VMIN]) { if (tty->termios.c_cc[VTIME] && tty->ccount) { @@ -1072,13 +1370,13 @@ fillBufferQueue (struct rtems_termios_tty *tty) && ((tty->rawOutBufState == rob_idle) || (tty->flow_ctrl & FL_OSTOP))) { /* XON should be sent now... */ - (*tty->device.write)( - tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); + (*tty->handler.write)( + tty, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { tty->flow_ctrl &= ~FL_IRTSOFF; /* activate RTS line */ - if (tty->device.startRemoteTx != NULL) { - tty->device.startRemoteTx(tty->minor); + if (tty->handler.start_remote_tx != NULL) { + tty->handler.start_remote_tx(tty); } } } @@ -1131,8 +1429,7 @@ rtems_termios_read (void *arg) if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; - if (tty->device.pollRead != NULL && - tty->device.outputUsesInterrupts == TERMIOS_POLLED) + if (tty->handler.poll_read != NULL && tty->handler.mode == TERMIOS_POLLED) sc = fillBufferPoll (tty); else sc = fillBufferQueue (tty); @@ -1230,8 +1527,8 @@ rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len) /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { /* if chars available, call write function... */ - (*tty->device.write)( - tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); + (*tty->handler.write)( + tty, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_termios_interrupt_lock_release (tty, &lock_context); @@ -1252,14 +1549,14 @@ rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len) /* if tx is stopped due to XOFF or out of data */ /* call write function here */ tty->flow_ctrl |= FL_ISNTXOF; - (*tty->device.write)(tty->minor, + (*tty->handler.write)(tty, (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { tty->flow_ctrl |= FL_IRTSOFF; /* deactivate RTS line */ - if (tty->device.stopRemoteTx != NULL) { - tty->device.stopRemoteTx(tty->minor); + if (tty->handler.stop_remote_tx != NULL) { + tty->handler.stop_remote_tx(tty); } } } @@ -1308,7 +1605,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ - (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); + (*tty->handler.write)(tty, (void *)&(tty->termios.c_cc[VSTOP]), 1); tty->t_dqlen--; tty->flow_ctrl |= FL_ISNTXOF; @@ -1324,7 +1621,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) * buffer, although the corresponding data is not yet out! * Therefore the dequeue "length" should be reduced by 1 */ - (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); + (*tty->handler.write)(tty, (void *)&(tty->termios.c_cc[VSTART]), 1); tty->t_dqlen--; tty->flow_ctrl &= ~FL_ISNTXOF; @@ -1341,7 +1638,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) wakeUpWriterTask = true; } - (*tty->device.write) (tty->minor, NULL, 0); + (*tty->handler.write) (tty, NULL, 0); nToSend = 0; } else { len = tty->t_dqlen; @@ -1361,7 +1658,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) * Buffer has become empty */ tty->rawOutBufState = rob_idle; - (*tty->device.write) (tty->minor, NULL, 0); + (*tty->handler.write) (tty, NULL, 0); nToSend = 0; /* @@ -1378,7 +1675,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) /* set flag, that output has been stopped */ tty->flow_ctrl |= FL_OSTOP; tty->rawOutBufState = rob_busy; /*apm*/ - (*tty->device.write) (tty->minor, NULL, 0); + (*tty->handler.write) (tty, NULL, 0); nToSend = 0; } else { /* @@ -1395,8 +1692,8 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) nToSend = 1; } tty->rawOutBufState = rob_busy; /*apm*/ - (*tty->device.write)( - tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); + (*tty->handler.write)( + tty, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } @@ -1430,7 +1727,7 @@ rtems_termios_dequeue_characters (void *ttyp, int len) */ tty->t_dqlen += len; - if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { + if (tty->handler.mode == TERMIOS_TASK_DRIVEN) { /* * send wake up to transmitter task */ @@ -1518,10 +1815,10 @@ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) /* * do something */ - c = tty->device.pollRead(tty->minor); + c = tty->handler.poll_read(tty); if (c != EOF) { /* - * pollRead did call enqueue on its own + * poll_read did call enqueue on its own */ c_buf = c; rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); |