LJ Archive

Listing 1. A Simple Implementation of the set_termios Call

#define RELEVANT_IFLAG(iflag)
    (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))

static void
tiny_set_termios (struct tty_struct *tty,
                  struct termios *old_termios)
{
   unsigned int cflag;

   cflag = tty->termios->c_cflag;

   /* check that they really want us to change
    * something */
   if (old_termios) {
       if ((cflag == old_termios->c_cflag) &&
          (RELEVANT_IFLAG(tty->termios->c_iflag) ==
           RELEVANT_IFLAG(old_termios->c_iflag))) {
               printk (KERN_DEBUG
               " - nothing to change...\n");
               return;
       }
   }

   /* get the byte size */
   switch (cflag & CSIZE) {
       case CS5:
           printk (KERN_DEBUG " - data bits = 5\n");
           break;
       case CS6:
           printk (KERN_DEBUG " - data bits = 6\n");
           break;
       case CS7:
           printk (KERN_DEBUG " - data bits = 7\n");
           break;
       default:
       case CS8:
           printk (KERN_DEBUG " - data bits = 8\n");
           break;
   }

   /* determine the parity */
   if (cflag & PARENB)
       if (cflag & PARODD)
           printk (KERN_DEBUG " - parity = odd\n");
       else
           printk (KERN_DEBUG " - parity = even\n");
   else
       printk (KERN_DEBUG " - parity = none\n");

   /* figure out the stop bits requested */
   if (cflag & CSTOPB)
       printk (KERN_DEBUG " - stop bits = 2\n");
   else
       printk (KERN_DEBUG " - stop bits = 1\n");

   /* figure out the flow control settings */
   if (cflag & CRTSCTS)
       printk (KERN_DEBUG
               " - RTS/CTS is enabled\n");
   else
       printk (KERN_DEBUG
               " - RTS/CTS is disabled\n");

   /* determine software flow control */
   /* if we are implementing XON/XOFF,
    * set the start and stop character in the
    * device */
   if (I_IXOFF(tty) || I_IXON(tty)) {
       unsigned char stop_char  = STOP_CHAR(tty);
       unsigned char start_char = START_CHAR(tty);

       /* if we are implementing
        * INBOUND XON/XOFF */
       if (I_IXOFF(tty))
           printk (KERN_DEBUG
                   " - INBOUND XON/XOFF "
                   "is enabled, "
                   "XON = %2x, XOFF = %2x",
                   start_char, stop_char);
       else
           printk (KERN_DEBUG
                   " - INBOUND XON/XOFF "
                   "is disabled");

       /* if we are implementing
        * OUTBOUND XON/XOFF */
       if (I_IXON(tty))
           printk (KERN_DEBUG
                   " - OUTBOUND XON/XOFF "
                   " is enabled, "
                   "XON = %2x, XOFF = %2x",
                   start_char, stop_char);
       else
           printk (KERN_DEBUG
                   " - OUTBOUND XON/XOFF "
                   " is disabled");
   }

   /* get the baud rate wanted */
   printk (KERN_DEBUG
           " - baud rate = %d",
           tty_get_baud_rate(tty));

   return;
}
LJ Archive