console.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. save_flags(flags); cli();
  23. i = (*(romvec->pv_nbgetchar))();
  24. restore_flags(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. save_flags(flags); cli();
  36. i = (*(romvec->pv_nbputchar))(c);
  37. restore_flags(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. save_flags(flags); cli();
  78. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin);
  79. __asm__ __volatile__("ld [%0], %%g6nt" : :
  80.      "r" (&current_set[smp_processor_id()]) :
  81.      "memory");
  82. restore_flags(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. save_flags(flags); cli();
  125. st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdout);
  126. __asm__ __volatile__("ld [%0], %%g6nt" : :
  127.      "r" (&current_set[smp_processor_id()]) :
  128.      "memory");
  129. restore_flags(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