console.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* $Id: console.c,v 1.10 1996/12/18 06:46:54 tridge 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. */
  7. #include <linux/types.h>
  8. #include <linux/kernel.h>
  9. #include <linux/sched.h>
  10. #include <asm/openprom.h>
  11. #include <asm/oplib.h>
  12. #include <asm/system.h>
  13. #include <linux/string.h>
  14. /* Non blocking get character from console input device, returns -1
  15. * if no input was taken. This can be used for polling.
  16. */
  17. int
  18. prom_nbgetchar(void)
  19. {
  20. int i = -1;
  21. unsigned long flags;
  22. local_irq_save(flags);
  23. i = (*(romvec->pv_nbgetchar))();
  24. local_irq_restore(flags);
  25. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  26. }
  27. /* Non blocking put character to console device, returns -1 if
  28. * unsuccessful.
  29. */
  30. int
  31. prom_nbputchar(char c)
  32. {
  33. unsigned long flags;
  34. int i = -1;
  35. local_irq_save(flags);
  36. i = (*(romvec->pv_nbputchar))(c);
  37. local_irq_restore(flags);
  38. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  39. }
  40. /* Blocking version of get character routine above. */
  41. char
  42. prom_getchar(void)
  43. {
  44. int character;
  45. while((character = prom_nbgetchar()) == -1) ;
  46. return (char) character;
  47. }
  48. /* Blocking version of put character routine above. */
  49. void
  50. prom_putchar(char c)
  51. {
  52. while(prom_nbputchar(c) == -1) ;
  53. return;
  54. }
  55. /* Query for input device type */
  56. #if 0
  57. enum prom_input_device
  58. prom_query_input_device()
  59. {
  60. unsigned long flags;
  61. int st_p;
  62. char propb[64];
  63. char *p;
  64. switch(prom_vers) {
  65. case PROM_V0:
  66. case PROM_V2:
  67. default:
  68. switch(*romvec->pv_stdin) {
  69. case PROMDEV_KBD: return PROMDEV_IKBD;
  70. case PROMDEV_TTYA: return PROMDEV_ITTYA;
  71. case PROMDEV_TTYB: return PROMDEV_ITTYB;
  72. default:
  73. return PROMDEV_I_UNK;
  74. };
  75. case PROM_V3:
  76. case PROM_P1275:
  77. local_irq_save(flags);
  78. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin);
  79. __asm__ __volatile__("ld [%0], %%g6\n\t" : :
  80. "r" (&current_set[smp_processor_id()]) :
  81. "memory");
  82. local_irq_restore(flags);
  83. if(prom_node_has_property(st_p, "keyboard"))
  84. return PROMDEV_IKBD;
  85. prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  86. if(strncmp(propb, "serial", sizeof("serial")))
  87. return PROMDEV_I_UNK;
  88. prom_getproperty(prom_root_node, "stdin-path", propb, sizeof(propb));
  89. p = propb;
  90. while(*p) p++; p -= 2;
  91. if(p[0] == ':') {
  92. if(p[1] == 'a')
  93. return PROMDEV_ITTYA;
  94. else if(p[1] == 'b')
  95. return PROMDEV_ITTYB;
  96. }
  97. return PROMDEV_I_UNK;
  98. case PROM_AP1000:
  99. return PROMDEV_I_UNK;
  100. };
  101. }
  102. #endif
  103. /* Query for output device type */
  104. #if 0
  105. enum prom_output_device
  106. prom_query_output_device()
  107. {
  108. unsigned long flags;
  109. int st_p;
  110. char propb[64];
  111. char *p;
  112. int propl;
  113. switch(prom_vers) {
  114. case PROM_V0:
  115. switch(*romvec->pv_stdin) {
  116. case PROMDEV_SCREEN: return PROMDEV_OSCREEN;
  117. case PROMDEV_TTYA: return PROMDEV_OTTYA;
  118. case PROMDEV_TTYB: return PROMDEV_OTTYB;
  119. };
  120. break;
  121. case PROM_V2:
  122. case PROM_V3:
  123. case PROM_P1275:
  124. local_irq_save(flags);
  125. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdout);
  126. __asm__ __volatile__("ld [%0], %%g6\n\t" : :
  127. "r" (&current_set[smp_processor_id()]) :
  128. "memory");
  129. local_irq_restore(flags);
  130. propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb));
  131. if (propl >= 0 && propl == sizeof("display") &&
  132. strncmp("display", propb, sizeof("display")) == 0)
  133. {
  134. return PROMDEV_OSCREEN;
  135. }
  136. if(prom_vers == PROM_V3) {
  137. if(strncmp("serial", propb, sizeof("serial")))
  138. return PROMDEV_O_UNK;
  139. prom_getproperty(prom_root_node, "stdout-path", propb, sizeof(propb));
  140. p = propb;
  141. while(*p) p++; p -= 2;
  142. if(p[0]==':') {
  143. if(p[1] == 'a')
  144. return PROMDEV_OTTYA;
  145. else if(p[1] == 'b')
  146. return PROMDEV_OTTYB;
  147. }
  148. return PROMDEV_O_UNK;
  149. } else {
  150. /* This works on SS-2 (an early OpenFirmware) still. */
  151. switch(*romvec->pv_stdin) {
  152. case PROMDEV_TTYA: return PROMDEV_OTTYA;
  153. case PROMDEV_TTYB: return PROMDEV_OTTYB;
  154. };
  155. }
  156. break;
  157. case PROM_AP1000:
  158. return PROMDEV_I_UNK;
  159. };
  160. return PROMDEV_O_UNK;
  161. }
  162. #endif