Logo Search packages:      
Sourcecode: linux version File versions  Download package

tty.c

/* -*- linux-c -*- ------------------------------------------------------- *
 *
 *   Copyright (C) 1991, 1992 Linus Torvalds
 *   Copyright 2007 rPath, Inc. - All Rights Reserved
 *
 *   This file is part of the Linux kernel, and is made available under
 *   the terms of the GNU General Public License version 2.
 *
 * ----------------------------------------------------------------------- */

/*
 * arch/i386/boot/tty.c
 *
 * Very simple screen I/O
 * XXX: Probably should add very simple serial I/O?
 */

#include "boot.h"

/*
 * These functions are in .inittext so they can be used to signal
 * error during initialization.
 */

void __attribute__((section(".inittext"))) putchar(int ch)
{
      unsigned char c = ch;

      if (c == '\n')
            putchar('\r');    /* \n -> \r\n */

      /* int $0x10 is known to have bugs involving touching registers
         it shouldn't.  Be extra conservative... */
      asm volatile("pushal; pushw %%ds; int $0x10; popw %%ds; popal"
                 : : "b" (0x0007), "c" (0x0001), "a" (0x0e00|ch));
}

void __attribute__((section(".inittext"))) puts(const char *str)
{
      int n = 0;
      while (*str) {
            putchar(*str++);
            n++;
      }
}

/*
 * Read the CMOS clock through the BIOS, and return the
 * seconds in BCD.
 */

static u8 gettime(void)
{
      u16 ax = 0x0200;
      u16 cx, dx;

      asm volatile("int $0x1a"
                 : "+a" (ax), "=c" (cx), "=d" (dx)
                 : : "ebx", "esi", "edi");

      return dx >> 8;
}

/*
 * Read from the keyboard
 */
int getchar(void)
{
      u16 ax = 0;
      asm volatile("int $0x16" : "+a" (ax));

      return ax & 0xff;
}

static int kbd_pending(void)
{
      u8 pending;
      asm volatile("int $0x16; setnz %0"
                 : "=rm" (pending)
                 : "a" (0x0100));
      return pending;
}

void kbd_flush(void)
{
      for (;;) {
            if (!kbd_pending())
                  break;
            getchar();
      }
}

int getchar_timeout(void)
{
      int cnt = 30;
      int t0, t1;

      t0 = gettime();

      while (cnt) {
            if (kbd_pending())
                  return getchar();

            t1 = gettime();
            if (t0 != t1) {
                  cnt--;
                  t0 = t1;
            }
      }

      return 0;         /* Timeout! */
}

Generated by  Doxygen 1.6.0   Back to index