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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * arch/mips/lib/console.c
  3.  *
  4.  * Copyright (C) 1994 by Waldorf Electronic,
  5.  * written by Ralf Baechle and Andreas Busse
  6.  *
  7.  * This file is subject to the terms and conditions of the GNU General Public
  8.  * License.  See the file COPYING in the main directory of this archive for
  9.  * more details.
  10.  *
  11.  * FIXME: This file is hacked to be hardwired for the Deskstation
  12.  *        Only thought as a debugging console output.  It's as inefficient
  13.  *        as a piece of code can be but probably a good piece of code to
  14.  *        implement a preliminary console for a new target.
  15.  */
  16. #include <linux/tty.h>
  17. #include <asm/bootinfo.h>
  18. static unsigned int size_x;
  19. static unsigned int size_y;
  20. static unsigned short cursor_x;
  21. static unsigned short cursor_y;
  22. static volatile unsigned short *vram_addr;
  23. static int console_needs_init = 1;
  24. extern struct screen_info screen_info;
  25. /* ----------------------------------------------------------------------
  26.  * init_console()
  27.  * ---------------------------------------------------------------------- */
  28. void init_console(void)
  29. {
  30.   size_x = 80;
  31.   size_y = 25;
  32.   cursor_x = 0;
  33.   cursor_y = 0;
  34.   vram_addr = (unsigned short *)0xb00b8000;
  35.   console_needs_init = 0;
  36. }
  37. void
  38. set_size_x(unsigned int x)
  39. {
  40.   size_x = x;
  41. }
  42. void
  43. set_size_y(unsigned int y)
  44. {
  45.   size_y = y;
  46. }
  47. void
  48. set_vram(unsigned short *vram)
  49. {
  50.   vram_addr = vram;
  51. }
  52. void
  53. set_crsr(unsigned int x, unsigned int y)
  54. {
  55.   cursor_x = x;
  56.   cursor_y = y;
  57. }
  58. void
  59. print_char(unsigned int x, unsigned int y, unsigned char c)
  60. {
  61.   volatile unsigned short *caddr;
  62.   caddr = vram_addr + (y * size_x) + x;
  63.   *caddr = (*caddr & 0xff00) | 0x0f00 | (unsigned short) c;
  64. }
  65. static void
  66. scroll(void)
  67. {
  68.   volatile unsigned short *caddr;
  69.   register int i;
  70.   caddr = vram_addr;
  71.   for(i=0; i<size_x * (size_y-1); i++)
  72.     *(caddr++) = *(caddr + size_x);
  73.   /* blank last line */
  74.   caddr = vram_addr + (size_x * (size_y-1));
  75.   for(i=0; i<size_x; i++)
  76.     *(caddr++) = (*caddr & 0xff00) | (unsigned short) ' ';
  77. }
  78. void print_string(const unsigned char *str)
  79. {
  80.   unsigned char c;
  81.   if (console_needs_init)
  82.     init_console();
  83.   while((c = *str++))
  84.     switch(c)
  85.       {
  86.       case 'n':
  87. cursor_x = 0;
  88. cursor_y++;
  89. if(cursor_y == size_y)
  90.   {
  91.     scroll();
  92.     cursor_y = size_y - 1;
  93.   }
  94. break;
  95.       default:
  96. print_char(cursor_x, cursor_y, c);
  97. cursor_x++;
  98. if(cursor_x == size_x)
  99.   {
  100.     cursor_x = 0;
  101.     cursor_y++;
  102.     if(cursor_y == size_y)
  103.       {
  104. scroll();
  105. cursor_y = size_y - 1;
  106.       }
  107.   }
  108. break;
  109.       }
  110. }
  111. /* end of file */