OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [x86/] [boot/] [tty.c] - Rev 11

Go to most recent revision | Compare with Previous | Blame | View Log

/* -*- 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! */
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.