Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.21 160 lines 3.8 kB view raw
1/* $Id: console.c,v 1.9 1997/10/29 07:41:43 ecd Exp $ 2 * console.c: Routines that deal with sending and receiving IO 3 * to/from the current console device using the PROM. 4 * 5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 6 * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 7 */ 8 9#include <linux/types.h> 10#include <linux/kernel.h> 11#include <linux/sched.h> 12#include <asm/openprom.h> 13#include <asm/oplib.h> 14#include <asm/system.h> 15#include <linux/string.h> 16 17extern int prom_stdin, prom_stdout; 18 19/* Non blocking get character from console input device, returns -1 20 * if no input was taken. This can be used for polling. 21 */ 22__inline__ int 23prom_nbgetchar(void) 24{ 25 char inc; 26 27 if (p1275_cmd("read", P1275_ARG(1,P1275_ARG_OUT_BUF)| 28 P1275_INOUT(3,1), 29 prom_stdin, &inc, P1275_SIZE(1)) == 1) 30 return inc; 31 else 32 return -1; 33} 34 35/* Non blocking put character to console device, returns -1 if 36 * unsuccessful. 37 */ 38__inline__ int 39prom_nbputchar(char c) 40{ 41 char outc; 42 43 outc = c; 44 if (p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| 45 P1275_INOUT(3,1), 46 prom_stdout, &outc, P1275_SIZE(1)) == 1) 47 return 0; 48 else 49 return -1; 50} 51 52/* Blocking version of get character routine above. */ 53char 54prom_getchar(void) 55{ 56 int character; 57 while((character = prom_nbgetchar()) == -1) ; 58 return (char) character; 59} 60 61/* Blocking version of put character routine above. */ 62void 63prom_putchar(char c) 64{ 65 prom_nbputchar(c); 66 return; 67} 68 69void 70prom_puts(const char *s, int len) 71{ 72 p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| 73 P1275_INOUT(3,1), 74 prom_stdout, s, P1275_SIZE(len)); 75} 76 77/* Query for input device type */ 78enum prom_input_device 79prom_query_input_device(void) 80{ 81 int st_p; 82 char propb[64]; 83 84 st_p = prom_inst2pkg(prom_stdin); 85 if(prom_node_has_property(st_p, "keyboard")) 86 return PROMDEV_IKBD; 87 prom_getproperty(st_p, "device_type", propb, sizeof(propb)); 88 if(strncmp(propb, "serial", 6)) 89 return PROMDEV_I_UNK; 90 /* FIXME: Is there any better way how to find out? */ 91 memset(propb, 0, sizeof(propb)); 92 st_p = prom_finddevice ("/options"); 93 prom_getproperty(st_p, "input-device", propb, sizeof(propb)); 94 95 /* 96 * If we get here with propb == 'keyboard', we are on ttya, as 97 * the PROM defaulted to this due to 'no input device'. 98 */ 99 if (!strncmp(propb, "keyboard", 8)) 100 return PROMDEV_ITTYA; 101 102 if (!strncmp (propb, "rsc", 3)) 103 return PROMDEV_IRSC; 104 105 if (!strncmp (propb, "virtual-console", 3)) 106 return PROMDEV_IVCONS; 107 108 if (strncmp (propb, "tty", 3) || !propb[3]) 109 return PROMDEV_I_UNK; 110 111 switch (propb[3]) { 112 case 'a': return PROMDEV_ITTYA; 113 case 'b': return PROMDEV_ITTYB; 114 default: return PROMDEV_I_UNK; 115 } 116} 117 118/* Query for output device type */ 119 120enum prom_output_device 121prom_query_output_device(void) 122{ 123 int st_p; 124 char propb[64]; 125 int propl; 126 127 st_p = prom_inst2pkg(prom_stdout); 128 propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb)); 129 if (propl >= 0 && propl == sizeof("display") && 130 strncmp("display", propb, sizeof("display")) == 0) 131 return PROMDEV_OSCREEN; 132 if(strncmp("serial", propb, 6)) 133 return PROMDEV_O_UNK; 134 /* FIXME: Is there any better way how to find out? */ 135 memset(propb, 0, sizeof(propb)); 136 st_p = prom_finddevice ("/options"); 137 prom_getproperty(st_p, "output-device", propb, sizeof(propb)); 138 139 /* 140 * If we get here with propb == 'screen', we are on ttya, as 141 * the PROM defaulted to this due to 'no input device'. 142 */ 143 if (!strncmp(propb, "screen", 6)) 144 return PROMDEV_OTTYA; 145 146 if (!strncmp (propb, "rsc", 3)) 147 return PROMDEV_ORSC; 148 149 if (!strncmp (propb, "virtual-console", 3)) 150 return PROMDEV_OVCONS; 151 152 if (strncmp (propb, "tty", 3) || !propb[3]) 153 return PROMDEV_O_UNK; 154 155 switch (propb[3]) { 156 case 'a': return PROMDEV_OTTYA; 157 case 'b': return PROMDEV_OTTYB; 158 default: return PROMDEV_O_UNK; 159 } 160}