console.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include <rtthread.h>
  2. #include <serial.h>
  3. #define RT_CONSOLE_WIDTH 240
  4. #define RT_CONSOLE_HEIGHT 320
  5. #define RT_CONSOLE_FONT_WIDTH 8
  6. #define RT_CONSOLE_FONT_HEIGHT 16
  7. #define RT_CONSOLE_COL (RT_CONSOLE_WIDTH/RT_CONSOLE_FONT_WIDTH)
  8. #define RT_CONSOLE_ROW (RT_CONSOLE_HEIGHT/RT_CONSOLE_FONT_HEIGHT)
  9. #define RT_CONSOLE_TAB 4
  10. #define RT_CONSOLE_FOREPIXEL (0x001f)
  11. extern struct serial_device uart0;
  12. struct rt_console
  13. {
  14. rt_uint8_t* video_ptr;
  15. rt_uint8_t* font_ptr;
  16. /* bpp and pixel of width */
  17. rt_uint8_t bpp;
  18. rt_uint32_t pitch;
  19. /* current cursor */
  20. rt_uint8_t current_col;
  21. rt_uint8_t current_row;
  22. };
  23. struct rt_console console;
  24. void rt_hw_console_init(rt_uint8_t* video_ptr, rt_uint8_t* font_ptr, rt_uint8_t bpp);
  25. void rt_hw_console_newline();
  26. void rt_hw_console_putc(char c);
  27. void rt_hw_console_clear();
  28. void rt_hw_console_init(rt_uint8_t* video_ptr, rt_uint8_t* font_ptr, rt_uint8_t bpp)
  29. {
  30. rt_memset(&console, 0, sizeof(struct rt_console));
  31. console.video_ptr = video_ptr;
  32. console.font_ptr = font_ptr;
  33. console.bpp = bpp;
  34. console.pitch = console.bpp * RT_CONSOLE_WIDTH;
  35. rt_hw_console_clear();
  36. }
  37. void rt_hw_console_putc(char c)
  38. {
  39. switch (c)
  40. {
  41. case 10:
  42. case 11:
  43. case 12:
  44. case 13:
  45. /* to next line */
  46. rt_hw_console_newline();
  47. console.current_col = 0;
  48. break;
  49. case 9:
  50. console.current_col += RT_CONSOLE_TAB;
  51. break;
  52. default:
  53. {
  54. if (console.current_col == RT_CONSOLE_COL)
  55. {
  56. rt_hw_console_newline();
  57. console.current_col = 0;
  58. rt_hw_console_putc(c);
  59. return;
  60. }
  61. rt_uint8_t* font_ptr = console.font_ptr + c * RT_CONSOLE_FONT_HEIGHT;
  62. register rt_uint32_t cursor = (console.current_row * RT_CONSOLE_FONT_HEIGHT) * console.pitch
  63. + console.current_col * RT_CONSOLE_FONT_WIDTH * console.bpp;
  64. register rt_uint32_t i, j;
  65. for (i = 0; i < RT_CONSOLE_FONT_HEIGHT; i ++ )
  66. {
  67. for (j = 0; j < RT_CONSOLE_FONT_WIDTH; j ++)
  68. {
  69. if ( ((font_ptr[i] >> (7-j)) & 0x01) != 0 )
  70. {
  71. /* draw a pixel */
  72. rt_uint8_t *ptr = &(console.video_ptr[cursor + i * console.pitch + j * console.bpp]);
  73. switch(console.bpp)
  74. {
  75. case 1:
  76. *ptr = RT_CONSOLE_FOREPIXEL;
  77. break;
  78. case 2:
  79. *(rt_uint16_t*)ptr = RT_CONSOLE_FOREPIXEL;
  80. break;
  81. case 3:
  82. ptr[0] = RT_CONSOLE_FOREPIXEL & 0xff;
  83. ptr[1] = (RT_CONSOLE_FOREPIXEL >> 8) & 0xff;
  84. ptr[2] = (RT_CONSOLE_FOREPIXEL >> 16) & 0xff;
  85. break;
  86. case 4:
  87. *(rt_uint32_t*)ptr = RT_CONSOLE_FOREPIXEL;
  88. break;
  89. }
  90. }
  91. }
  92. }
  93. console.current_col ++;
  94. }
  95. break;
  96. }
  97. }
  98. void rt_hw_console_newline()
  99. {
  100. console.current_row ++;
  101. if (console.current_row >= RT_CONSOLE_ROW)
  102. {
  103. rt_uint32_t i;
  104. /* scroll to next line */
  105. for (i = 0; i < RT_CONSOLE_ROW - 1; i ++)
  106. {
  107. rt_memcpy(console.video_ptr + i * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  108. console.video_ptr + (i + 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  109. RT_CONSOLE_FONT_HEIGHT * console.pitch);
  110. }
  111. /* clear last line */
  112. rt_memset(console.video_ptr + (RT_CONSOLE_ROW - 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  113. 0,
  114. RT_CONSOLE_FONT_HEIGHT * console.pitch);
  115. console.current_row = RT_CONSOLE_ROW - 1;
  116. }
  117. }
  118. void rt_hw_console_clear()
  119. {
  120. console.current_col = 0;
  121. console.current_row = 0;
  122. rt_memset(console.video_ptr, 0, RT_CONSOLE_HEIGHT * console.pitch);
  123. }
  124. /* write one character to serial, must not trigger interrupt */
  125. void rt_hw_serial_putc(const char c)
  126. {
  127. /*
  128. to be polite with serial console add a line feed
  129. to the carriage return character
  130. */
  131. if (c=='\n')rt_hw_serial_putc('\r');
  132. while (!(uart0.uart_device->ustat & USTAT_TXB_EMPTY));
  133. uart0.uart_device->utxh = (c & 0x1FF);
  134. }
  135. /**
  136. * This function is used by rt_kprintf to display a string on console.
  137. *
  138. * @param str the displayed string
  139. */
  140. void rt_hw_console_output(const char* str)
  141. {
  142. while (*str)
  143. {
  144. rt_hw_serial_putc(*str++);
  145. //rt_hw_console_putc(*str++);
  146. }
  147. }