console.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/sched.h>
  11. #include <asm/openprom.h>
  12. #include <asm/oplib.h>
  13. #include <asm/system.h>
  14. #include <linux/string.h>
  15. extern int prom_stdin, prom_stdout;
  16. /* Non blocking get character from console input device, returns -1
  17.  * if no input was taken.  This can be used for polling.
  18.  */
  19. __inline__ int
  20. prom_nbgetchar(void)
  21. {
  22. char inc;
  23. if (p1275_cmd("read", P1275_ARG(1,P1275_ARG_OUT_BUF)|
  24.       P1275_INOUT(3,1),
  25.       prom_stdin, &inc, P1275_SIZE(1)) == 1)
  26. return inc;
  27. else
  28. return -1;
  29. }
  30. /* Non blocking put character to console device, returns -1 if
  31.  * unsuccessful.
  32.  */
  33. __inline__ int
  34. prom_nbputchar(char c)
  35. {
  36. char outc;
  37. outc = c;
  38. if (p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)|
  39.        P1275_INOUT(3,1),
  40.        prom_stdout, &outc, P1275_SIZE(1)) == 1)
  41. return 0;
  42. else
  43. return -1;
  44. }
  45. /* Blocking version of get character routine above. */
  46. char
  47. prom_getchar(void)
  48. {
  49. int character;
  50. while((character = prom_nbgetchar()) == -1) ;
  51. return (char) character;
  52. }
  53. /* Blocking version of put character routine above. */
  54. void
  55. prom_putchar(char c)
  56. {
  57. prom_nbputchar(c);
  58. return;
  59. }
  60. void
  61. prom_puts(char *s, int len)
  62. {
  63. p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)|
  64.    P1275_INOUT(3,1),
  65.    prom_stdout, s, P1275_SIZE(len));
  66. }
  67. /* Query for input device type */
  68. enum prom_input_device
  69. prom_query_input_device()
  70. {
  71. int st_p;
  72. char propb[64];
  73. st_p = prom_inst2pkg(prom_stdin);
  74. if(prom_node_has_property(st_p, "keyboard"))
  75. return PROMDEV_IKBD;
  76. prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  77. if(strncmp(propb, "serial", 6))
  78. return PROMDEV_I_UNK;
  79. /* FIXME: Is there any better way how to find out? */
  80. memset(propb, 0, sizeof(propb));
  81. st_p = prom_finddevice ("/options");
  82. prom_getproperty(st_p, "input-device", propb, sizeof(propb));
  83. /*
  84.  * If we get here with propb == 'keyboard', we are on ttya, as
  85.  * the PROM defaulted to this due to 'no input device'.
  86.  */
  87. if (!strncmp(propb, "keyboard", 8))
  88. return PROMDEV_ITTYA;
  89. if (strncmp (propb, "tty", 3) || !propb[3])
  90. return PROMDEV_I_UNK;
  91. switch (propb[3]) {
  92. case 'a': return PROMDEV_ITTYA;
  93. case 'b': return PROMDEV_ITTYB;
  94. default: return PROMDEV_I_UNK;
  95. }
  96. }
  97. /* Query for output device type */
  98. enum prom_output_device
  99. prom_query_output_device()
  100. {
  101. int st_p;
  102. char propb[64];
  103. int propl;
  104. st_p = prom_inst2pkg(prom_stdout);
  105. propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  106. if (propl >= 0 && propl == sizeof("display") &&
  107.     strncmp("display", propb, sizeof("display")) == 0)
  108. return PROMDEV_OSCREEN;
  109. if(strncmp("serial", propb, 6))
  110. return PROMDEV_O_UNK;
  111. /* FIXME: Is there any better way how to find out? */
  112. memset(propb, 0, sizeof(propb));
  113. st_p = prom_finddevice ("/options");
  114. prom_getproperty(st_p, "output-device", propb, sizeof(propb));
  115. /*
  116.  * If we get here with propb == 'screen', we are on ttya, as
  117.  * the PROM defaulted to this due to 'no input device'.
  118.  */
  119. if (!strncmp(propb, "screen", 6))
  120. return PROMDEV_OTTYA;
  121. if (strncmp (propb, "tty", 3) || !propb[3])
  122. return PROMDEV_O_UNK;
  123. switch (propb[3]) {
  124. case 'a': return PROMDEV_OTTYA;
  125. case 'b': return PROMDEV_OTTYB;
  126. default: return PROMDEV_O_UNK;
  127. }
  128. }