console.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /* $Id: console.c,v 1.25 2001/10/30 04:54:22 davem 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) 1998 Pete Zaitcev <zaitcev@yahoo.com>
  7. */
  8. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/sched.h>
  11. #include <asm/openprom.h>
  12. #include <asm/sun4prom.h>
  13. #include <asm/oplib.h>
  14. #include <asm/system.h>
  15. #include <linux/string.h>
  16. extern void restore_current(void);
  17. static char con_name_jmc[] = "/obio/su@"; /* "/obio/su@0,3002f8"; */
  18. #define CON_SIZE_JMC (sizeof(con_name_jmc))
  19. /* Non blocking get character from console input device, returns -1
  20. * if no input was taken. This can be used for polling.
  21. */
  22. int
  23. prom_nbgetchar(void)
  24. {
  25. static char inc;
  26. int i = -1;
  27. unsigned long flags;
  28. spin_lock_irqsave(&prom_lock, flags);
  29. switch(prom_vers) {
  30. case PROM_V0:
  31. case PROM_SUN4:
  32. i = (*(romvec->pv_nbgetchar))();
  33. break;
  34. case PROM_V2:
  35. case PROM_V3:
  36. if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
  37. i = inc;
  38. } else {
  39. i = -1;
  40. }
  41. break;
  42. default:
  43. i = -1;
  44. break;
  45. };
  46. restore_current();
  47. spin_unlock_irqrestore(&prom_lock, flags);
  48. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  49. }
  50. /* Non blocking put character to console device, returns -1 if
  51. * unsuccessful.
  52. */
  53. int
  54. prom_nbputchar(char c)
  55. {
  56. static char outc;
  57. unsigned long flags;
  58. int i = -1;
  59. spin_lock_irqsave(&prom_lock, flags);
  60. switch(prom_vers) {
  61. case PROM_V0:
  62. case PROM_SUN4:
  63. i = (*(romvec->pv_nbputchar))(c);
  64. break;
  65. case PROM_V2:
  66. case PROM_V3:
  67. outc = c;
  68. if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
  69. i = 0;
  70. else
  71. i = -1;
  72. break;
  73. default:
  74. i = -1;
  75. break;
  76. };
  77. restore_current();
  78. spin_unlock_irqrestore(&prom_lock, flags);
  79. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  80. }
  81. /* Blocking version of get character routine above. */
  82. char
  83. prom_getchar(void)
  84. {
  85. int character;
  86. while((character = prom_nbgetchar()) == -1) ;
  87. return (char) character;
  88. }
  89. /* Blocking version of put character routine above. */
  90. void
  91. prom_putchar(char c)
  92. {
  93. while(prom_nbputchar(c) == -1) ;
  94. return;
  95. }