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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * PROM console for Cobalt Raq2
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1995, 1996, 1997 by Ralf Baechle
  9.  * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv)
  10.  *
  11.  */
  12. #include <linux/init.h>
  13. #include <linux/console.h>
  14. #include <linux/kdev_t.h>
  15. #include <linux/major.h>
  16. #include <linux/serial_reg.h>
  17. #include <asm/delay.h>
  18. #include <asm/serial.h>
  19. #include <asm/io.h>
  20. static unsigned long port = 0xc800000;
  21. static __inline__ void ns16550_cons_put_char(char ch, unsigned long ioaddr)
  22. {
  23. char lsr;
  24. do {
  25. lsr = inb(ioaddr + UART_LSR);
  26. } while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE));
  27. outb(ch, ioaddr + UART_TX);
  28. }
  29. static __inline__ char ns16550_cons_get_char(unsigned long ioaddr)
  30. {
  31. while ((inb(ioaddr + UART_LSR) & UART_LSR_DR) == 0)
  32. udelay(1);
  33. return inb(ioaddr + UART_RX);
  34. }
  35. void ns16550_console_write(struct console *co, const char *s, unsigned count)
  36. {
  37. char lsr, ier;
  38. unsigned i;
  39. ier = inb(port + UART_IER);
  40. outb(0x00, port + UART_IER);
  41. for (i=0; i < count; i++, s++) {
  42. if(*s == 'n')
  43. ns16550_cons_put_char('r', port);
  44. ns16550_cons_put_char(*s, port);
  45. }
  46. do {
  47. lsr = inb(port + UART_LSR);
  48.     } while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE));
  49. outb(ier, port + UART_IER);
  50. }
  51. char getDebugChar(void)
  52. {
  53. return ns16550_cons_get_char(port);
  54. }
  55. void putDebugChar(char kgdb_char)
  56. {
  57. ns16550_cons_put_char(kgdb_char, port);
  58. }
  59. static kdev_t
  60. ns16550_console_dev(struct console *c)
  61. {
  62. return MKDEV(TTY_MAJOR, 64 + c->index);
  63. }
  64. static struct console ns16550_console = {
  65.     name: "prom",
  66.     setup: NULL,
  67.     write: ns16550_console_write,
  68.     device: ns16550_console_dev,
  69.     flags: CON_PRINTBUFFER,
  70.     index: -1,
  71. };
  72. void __init ns16550_setup_console(void)
  73. {
  74. register_console(&ns16550_console);
  75. }