15de18cdeSSam Ravnborg /* console.c: Routines that deal with sending and receiving IO 25de18cdeSSam Ravnborg * to/from the current console device using the PROM. 35de18cdeSSam Ravnborg * 45de18cdeSSam Ravnborg * Copyright (C) 1995 David S. Miller (davem@davemloft.net) 55de18cdeSSam Ravnborg * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 65de18cdeSSam Ravnborg */ 75de18cdeSSam Ravnborg 85de18cdeSSam Ravnborg #include <linux/types.h> 95de18cdeSSam Ravnborg #include <linux/kernel.h> 105de18cdeSSam Ravnborg #include <linux/sched.h> 115de18cdeSSam Ravnborg #include <asm/openprom.h> 125de18cdeSSam Ravnborg #include <asm/oplib.h> 135de18cdeSSam Ravnborg #include <asm/system.h> 145de18cdeSSam Ravnborg #include <linux/string.h> 155de18cdeSSam Ravnborg 165de18cdeSSam Ravnborg extern int prom_stdin, prom_stdout; 175de18cdeSSam Ravnborg 185de18cdeSSam Ravnborg /* Non blocking get character from console input device, returns -1 195de18cdeSSam Ravnborg * if no input was taken. This can be used for polling. 205de18cdeSSam Ravnborg */ 215de18cdeSSam Ravnborg inline int 225de18cdeSSam Ravnborg prom_nbgetchar(void) 235de18cdeSSam Ravnborg { 245de18cdeSSam Ravnborg char inc; 255de18cdeSSam Ravnborg 265de18cdeSSam Ravnborg if (p1275_cmd("read", P1275_ARG(1,P1275_ARG_OUT_BUF)| 275de18cdeSSam Ravnborg P1275_INOUT(3,1), 285de18cdeSSam Ravnborg prom_stdin, &inc, P1275_SIZE(1)) == 1) 295de18cdeSSam Ravnborg return inc; 305de18cdeSSam Ravnborg else 315de18cdeSSam Ravnborg return -1; 325de18cdeSSam Ravnborg } 335de18cdeSSam Ravnborg 345de18cdeSSam Ravnborg /* Non blocking put character to console device, returns -1 if 355de18cdeSSam Ravnborg * unsuccessful. 365de18cdeSSam Ravnborg */ 375de18cdeSSam Ravnborg inline int 385de18cdeSSam Ravnborg prom_nbputchar(char c) 395de18cdeSSam Ravnborg { 405de18cdeSSam Ravnborg char outc; 415de18cdeSSam Ravnborg 425de18cdeSSam Ravnborg outc = c; 435de18cdeSSam Ravnborg if (p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| 445de18cdeSSam Ravnborg P1275_INOUT(3,1), 455de18cdeSSam Ravnborg prom_stdout, &outc, P1275_SIZE(1)) == 1) 465de18cdeSSam Ravnborg return 0; 475de18cdeSSam Ravnborg else 485de18cdeSSam Ravnborg return -1; 495de18cdeSSam Ravnborg } 505de18cdeSSam Ravnborg 515de18cdeSSam Ravnborg /* Blocking version of get character routine above. */ 525de18cdeSSam Ravnborg char 535de18cdeSSam Ravnborg prom_getchar(void) 545de18cdeSSam Ravnborg { 555de18cdeSSam Ravnborg int character; 565de18cdeSSam Ravnborg while((character = prom_nbgetchar()) == -1) ; 575de18cdeSSam Ravnborg return (char) character; 585de18cdeSSam Ravnborg } 595de18cdeSSam Ravnborg 605de18cdeSSam Ravnborg /* Blocking version of put character routine above. */ 615de18cdeSSam Ravnborg void 625de18cdeSSam Ravnborg prom_putchar(char c) 635de18cdeSSam Ravnborg { 645de18cdeSSam Ravnborg prom_nbputchar(c); 655de18cdeSSam Ravnborg return; 665de18cdeSSam Ravnborg } 675de18cdeSSam Ravnborg 685de18cdeSSam Ravnborg void 695de18cdeSSam Ravnborg prom_puts(const char *s, int len) 705de18cdeSSam Ravnborg { 715de18cdeSSam Ravnborg p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| 725de18cdeSSam Ravnborg P1275_INOUT(3,1), 735de18cdeSSam Ravnborg prom_stdout, s, P1275_SIZE(len)); 745de18cdeSSam Ravnborg } 75