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 { 2425edd694SDavid S. Miller unsigned long args[7]; 255de18cdeSSam Ravnborg char inc; 265de18cdeSSam Ravnborg 2725edd694SDavid S. Miller args[0] = (unsigned long) "read"; 2825edd694SDavid S. Miller args[1] = 3; 2925edd694SDavid S. Miller args[2] = 1; 3025edd694SDavid S. Miller args[3] = (unsigned int) prom_stdin; 3125edd694SDavid S. Miller args[4] = (unsigned long) &inc; 3225edd694SDavid S. Miller args[5] = 1; 3325edd694SDavid S. Miller args[6] = (unsigned long) -1; 3425edd694SDavid S. Miller 3525edd694SDavid S. Miller p1275_cmd_direct(args); 3625edd694SDavid S. Miller 3725edd694SDavid S. Miller if (args[6] == 1) 385de18cdeSSam Ravnborg return inc; 395de18cdeSSam Ravnborg return -1; 405de18cdeSSam Ravnborg } 415de18cdeSSam Ravnborg 425de18cdeSSam Ravnborg /* Non blocking put character to console device, returns -1 if 435de18cdeSSam Ravnborg * unsuccessful. 445de18cdeSSam Ravnborg */ 455de18cdeSSam Ravnborg inline int 465de18cdeSSam Ravnborg prom_nbputchar(char c) 475de18cdeSSam Ravnborg { 4825edd694SDavid S. Miller unsigned long args[7]; 495de18cdeSSam Ravnborg char outc; 505de18cdeSSam Ravnborg 515de18cdeSSam Ravnborg outc = c; 5225edd694SDavid S. Miller 5325edd694SDavid S. Miller args[0] = (unsigned long) "write"; 5425edd694SDavid S. Miller args[1] = 3; 5525edd694SDavid S. Miller args[2] = 1; 5625edd694SDavid S. Miller args[3] = (unsigned int) prom_stdout; 5725edd694SDavid S. Miller args[4] = (unsigned long) &outc; 5825edd694SDavid S. Miller args[5] = 1; 5925edd694SDavid S. Miller args[6] = (unsigned long) -1; 6025edd694SDavid S. Miller 6125edd694SDavid S. Miller p1275_cmd_direct(args); 6225edd694SDavid S. Miller 6325edd694SDavid S. Miller if (args[6] == 1) 645de18cdeSSam Ravnborg return 0; 655de18cdeSSam Ravnborg else 665de18cdeSSam Ravnborg return -1; 675de18cdeSSam Ravnborg } 685de18cdeSSam Ravnborg 695de18cdeSSam Ravnborg /* Blocking version of get character routine above. */ 705de18cdeSSam Ravnborg char 715de18cdeSSam Ravnborg prom_getchar(void) 725de18cdeSSam Ravnborg { 735de18cdeSSam Ravnborg int character; 745de18cdeSSam Ravnborg while((character = prom_nbgetchar()) == -1) ; 755de18cdeSSam Ravnborg return (char) character; 765de18cdeSSam Ravnborg } 775de18cdeSSam Ravnborg 785de18cdeSSam Ravnborg /* Blocking version of put character routine above. */ 795de18cdeSSam Ravnborg void 805de18cdeSSam Ravnborg prom_putchar(char c) 815de18cdeSSam Ravnborg { 825de18cdeSSam Ravnborg prom_nbputchar(c); 835de18cdeSSam Ravnborg } 845de18cdeSSam Ravnborg 855de18cdeSSam Ravnborg void 865de18cdeSSam Ravnborg prom_puts(const char *s, int len) 875de18cdeSSam Ravnborg { 8825edd694SDavid S. Miller unsigned long args[7]; 8925edd694SDavid S. Miller 9025edd694SDavid S. Miller args[0] = (unsigned long) "write"; 9125edd694SDavid S. Miller args[1] = 3; 9225edd694SDavid S. Miller args[2] = 1; 9325edd694SDavid S. Miller args[3] = (unsigned int) prom_stdout; 9425edd694SDavid S. Miller args[4] = (unsigned long) s; 9525edd694SDavid S. Miller args[5] = len; 9625edd694SDavid S. Miller args[6] = (unsigned long) -1; 9725edd694SDavid S. Miller 9825edd694SDavid S. Miller p1275_cmd_direct(args); 995de18cdeSSam Ravnborg } 100