2007-07-11 12:18:45 -07:00
/* -*- linux-c -*- ------------------------------------------------------- *
*
* Copyright ( C ) 1991 , 1992 Linus Torvalds
* Copyright 2007 rPath , Inc . - All Rights Reserved
2009-04-01 18:13:46 -07:00
* Copyright 2009 Intel Corporation ; author H . Peter Anvin
2007-07-11 12:18:45 -07:00
*
* This file is part of the Linux kernel , and is made available under
* the terms of the GNU General Public License version 2.
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*
* 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 )
{
2009-04-01 18:13:46 -07:00
struct biosregs ireg ;
2007-07-11 12:18:45 -07:00
2009-04-01 18:13:46 -07:00
if ( ch = = ' \n ' )
2007-07-11 12:18:45 -07:00
putchar ( ' \r ' ) ; /* \n -> \r\n */
2009-04-01 18:13:46 -07:00
initregs ( & ireg ) ;
ireg . bx = 0x0007 ;
ireg . cx = 0x0001 ;
ireg . ah = 0x0e ;
ireg . al = ch ;
intcall ( 0x10 , & ireg , NULL ) ;
2007-07-11 12:18:45 -07:00
}
void __attribute__ ( ( section ( " .inittext " ) ) ) puts ( const char * str )
{
2009-04-01 18:13:46 -07:00
while ( * str )
2007-07-11 12:18:45 -07:00
putchar ( * str + + ) ;
}
/*
* Read the CMOS clock through the BIOS , and return the
* seconds in BCD .
*/
static u8 gettime ( void )
{
2009-04-01 18:13:46 -07:00
struct biosregs ireg , oreg ;
2007-07-11 12:18:45 -07:00
2009-04-01 18:13:46 -07:00
initregs ( & ireg ) ;
ireg . ah = 0x02 ;
intcall ( 0x1a , & ireg , & oreg ) ;
2007-07-11 12:18:45 -07:00
2009-04-01 18:13:46 -07:00
return oreg . dh ;
2007-07-11 12:18:45 -07:00
}
/*
* Read from the keyboard
*/
int getchar ( void )
{
2009-04-01 18:13:46 -07:00
struct biosregs ireg , oreg ;
initregs ( & ireg ) ;
/* ireg.ah = 0x00; */
intcall ( 0x16 , & ireg , & oreg ) ;
2007-07-11 12:18:45 -07:00
2009-04-01 18:13:46 -07:00
return oreg . al ;
2007-07-11 12:18:45 -07:00
}
static int kbd_pending ( void )
{
2009-04-01 18:13:46 -07:00
struct biosregs ireg , oreg ;
initregs ( & ireg ) ;
ireg . ah = 0x01 ;
intcall ( 0x16 , & ireg , & oreg ) ;
return ! ( oreg . eflags & X86_EFLAGS_ZF ) ;
2007-07-11 12:18:45 -07:00
}
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! */
}