Ignore:
Timestamp:
May 4, 1998, 12:41:07 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
47d1f5d
Parents:
55951bc
Message:

Patch from Eric Norum to switch to termios callback structure, add
support for device driver support on tcsetattr(), and hardware
flow control callbacks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libcsupport/src/termios.c

    r55951bc r161e1b3f  
    100100         * Raw output character buffer
    101101         */
    102         char                    outputUsesInterrupts;
    103102        volatile char           rawOutBuf[RAW_OUTPUT_BUFFER_SIZE];
    104103        volatile unsigned int   rawOutBufHead;
     
    110109         * Callbacks to device-specific routines
    111110         */
    112         int             (*lastClose)(int major, int minor, void *arg);
    113         int             (*read)(int minor);
    114         int             (*write)(int minor, const char *buf, int len);
     111        rtems_termios_callbacks device;
    115112};
    116113
     
    168165rtems_status_code
    169166rtems_termios_open (
    170   rtems_device_major_number  major,
    171   rtems_device_minor_number  minor,
    172   void                      *arg,
    173   int                      (*deviceFirstOpen)(int major, int minor, void *arg),
    174   int                      (*deviceLastClose)(int major, int minor, void *arg),
    175   int                      (*deviceRead)(int minor),
    176   int                      (*deviceWrite)(int minor, const char *buf, int len),
    177   int                        deviceOutputUsesInterrupts
     167  rtems_device_major_number      major,
     168  rtems_device_minor_number      minor,
     169  void                          *arg,
     170  const rtems_termios_callbacks *callbacks
    178171  )
    179172{
     
    245238                 * Set callbacks
    246239                 */
    247                 tty->write = deviceWrite;
    248                 tty->lastClose = deviceLastClose;
    249                 if ((tty->read = deviceRead) == NULL) {
     240                tty->device = *callbacks;
     241                if (!tty->device.pollRead) {
    250242                        sc = rtems_semaphore_create (
    251243                                rtems_build_name ('T', 'R', 'r', c),
     
    265257                tty->column = 0;
    266258                tty->cindex = tty->ccount = 0;
    267                 tty->outputUsesInterrupts = deviceOutputUsesInterrupts;
    268259
    269260                /*
     
    292283                 * Device-specific open
    293284                 */
    294                 if (deviceFirstOpen)
    295                         (*deviceFirstOpen) (major, minor, arg);
     285                if (tty->device.firstOpen)
     286                        (*tty->device.firstOpen)(major, minor, arg);
    296287
    297288                /*
     
    318309                rtems_fatal_error_occurred (sc);
    319310        if (--tty->refcount == 0) {
    320                 if (tty->lastClose)
    321                          (*tty->lastClose) (tty->major, tty->minor, arg);
     311                if (tty->device.lastClose)
     312                         (*tty->device.lastClose)(tty->major, tty->minor, arg);
    322313                if (tty->forw == NULL)
    323314                        ttyTail = tty->back;
     
    331322                rtems_semaphore_delete (tty->osem);
    332323                rtems_semaphore_delete (tty->rawOutBufSemaphore);
    333                 if (tty->read == NULL)
     324                if (!tty->device.pollRead)
    334325                        rtems_semaphore_delete (tty->rawInBufSemaphore);
    335326                free (tty);
     
    391382                        }
    392383                }
     384                if (tty->device.setAttributes)
     385                        (*tty->device.setAttributes)(tty->minor, &tty->termios);
    393386                break;
    394387        }
     
    408401        rtems_status_code sc;
    409402
    410         if (!tty->outputUsesInterrupts) {
    411                 (*tty->write)(tty->minor, buf, len);
     403        if (!tty->device.outputUsesInterrupts) {
     404                (*tty->device.write)(tty->minor, buf, len);
    412405                return;
    413406        }
     
    443436                        rtems_interrupt_enable (level);
    444437                        tty->rawOutBufState = rob_busy;
    445                         (*tty->write)(tty->minor, (char *)&tty->rawOutBuf[tty->rawOutBufTail], 1);
     438                        (*tty->device.write)(tty->minor, (char *)&tty->rawOutBuf[tty->rawOutBufTail], 1);
    446439                }
    447440                else {
     
    719712        if (tty->termios.c_lflag & ICANON) {
    720713                for (;;) {
    721                         n = (*tty->read)(tty->minor);
     714                        n = (*tty->device.pollRead)(tty->minor);
    722715                        if (n < 0) {
    723716                                rtems_task_wake_after (1);
     
    734727                        rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then);
    735728                for (;;) {
    736                         n = (*tty->read)(tty->minor);
     729                        n = (*tty->device.pollRead)(tty->minor);
    737730                        if (n < 0) {
    738731                                if (tty->termios.c_cc[VMIN]) {
     
    825818                tty->cindex = tty->ccount = 0;
    826819                tty->read_start_column = tty->column;
    827                 if (tty->read)
     820                if (tty->device.pollRead)
    828821                        sc = fillBufferPoll (tty);
    829822                else
     
    898891                else
    899892                        nToSend = tty->rawOutBufHead - newTail;
    900                 (*tty->write)(tty->minor, (char *)&tty->rawOutBuf[newTail], nToSend);
     893                (*tty->device.write)(tty->minor, (char *)&tty->rawOutBuf[newTail], nToSend);
    901894        }
    902895        tty->rawOutBufTail = newTail;
Note: See TracChangeset for help on using the changeset viewer.