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;
}