console.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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(void);
  26. void rt_hw_console_putc(char c);
  27. void rt_hw_console_clear(void);
  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. rt_uint8_t* font_ptr;
  55. register rt_uint32_t cursor;
  56. register rt_uint32_t i, j;
  57. if (console.current_col == RT_CONSOLE_COL)
  58. {
  59. rt_hw_console_newline();
  60. console.current_col = 0;
  61. rt_hw_console_putc(c);
  62. return;
  63. }
  64. font_ptr = console.font_ptr + c * RT_CONSOLE_FONT_HEIGHT;
  65. cursor = (console.current_row * RT_CONSOLE_FONT_HEIGHT) * console.pitch
  66. + console.current_col * RT_CONSOLE_FONT_WIDTH * console.bpp;
  67. for (i = 0; i < RT_CONSOLE_FONT_HEIGHT; i ++ )
  68. {
  69. for (j = 0; j < RT_CONSOLE_FONT_WIDTH; j ++)
  70. {
  71. if ( ((font_ptr[i] >> (7-j)) & 0x01) != 0 )
  72. {
  73. /* draw a pixel */
  74. rt_uint8_t *ptr = &(console.video_ptr[cursor + i * console.pitch + j * console.bpp]);
  75. switch(console.bpp)
  76. {
  77. case 1:
  78. *ptr = RT_CONSOLE_FOREPIXEL;
  79. break;
  80. case 2:
  81. *(rt_uint16_t*)ptr = RT_CONSOLE_FOREPIXEL;
  82. break;
  83. case 3:
  84. ptr[0] = RT_CONSOLE_FOREPIXEL & 0xff;
  85. ptr[1] = (RT_CONSOLE_FOREPIXEL >> 8) & 0xff;
  86. ptr[2] = (RT_CONSOLE_FOREPIXEL >> 16) & 0xff;
  87. break;
  88. case 4:
  89. *(rt_uint32_t*)ptr = RT_CONSOLE_FOREPIXEL;
  90. break;
  91. }
  92. }
  93. }
  94. }
  95. console.current_col ++;
  96. }
  97. break;
  98. }
  99. }
  100. void rt_hw_console_newline()
  101. {
  102. console.current_row ++;
  103. if (console.current_row >= RT_CONSOLE_ROW)
  104. {
  105. rt_uint32_t i;
  106. /* scroll to next line */
  107. for (i = 0; i < RT_CONSOLE_ROW - 1; i ++)
  108. {
  109. rt_memcpy(console.video_ptr + i * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  110. console.video_ptr + (i + 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  111. RT_CONSOLE_FONT_HEIGHT * console.pitch);
  112. }
  113. /* clear last line */
  114. rt_memset(console.video_ptr + (RT_CONSOLE_ROW - 1) * RT_CONSOLE_FONT_HEIGHT * console.pitch,
  115. 0,
  116. RT_CONSOLE_FONT_HEIGHT * console.pitch);
  117. console.current_row = RT_CONSOLE_ROW - 1;
  118. }
  119. }
  120. void rt_hw_console_clear()
  121. {
  122. console.current_col = 0;
  123. console.current_row = 0;
  124. rt_memset(console.video_ptr, 0, RT_CONSOLE_HEIGHT * console.pitch);
  125. }
  126. /* write one character to serial, must not trigger interrupt */
  127. void rt_hw_serial_putc(const char c)
  128. {
  129. /*
  130. to be polite with serial console add a line feed
  131. to the carriage return character
  132. */
  133. if (c=='\n')rt_hw_serial_putc('\r');
  134. while (!(uart0.uart_device->ustat & USTAT_TXB_EMPTY));
  135. uart0.uart_device->utxh = (c & 0x1FF);
  136. }
  137. /**
  138. * This function is used by rt_kprintf to display a string on console.
  139. *
  140. * @param str the displayed string
  141. */
  142. void rt_hw_console_output(const char* str)
  143. {
  144. while (*str)
  145. {
  146. rt_hw_serial_putc(*str++);
  147. }
  148. }