lcd_console_rotation.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2015
  4. * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
  5. */
  6. #include <common.h>
  7. #include <lcd.h>
  8. #include <video_font.h> /* Get font data, width and height */
  9. static void lcd_putc_xy90(struct console_t *pcons, ushort x, ushort y, char c)
  10. {
  11. int fg_color = lcd_getfgcolor();
  12. int bg_color = lcd_getbgcolor();
  13. int col, i;
  14. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  15. (x+1) * pcons->lcdsizex -
  16. y;
  17. uchar msk = 0x80;
  18. uchar *pfont = video_fontdata + c * VIDEO_FONT_HEIGHT;
  19. for (col = 0; col < VIDEO_FONT_WIDTH; ++col) {
  20. for (i = 0; i < VIDEO_FONT_HEIGHT; ++i)
  21. *dst-- = (*(pfont + i) & msk) ? fg_color : bg_color;
  22. msk >>= 1;
  23. dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
  24. }
  25. }
  26. static inline void console_setrow90(struct console_t *pcons, u32 row, int clr)
  27. {
  28. int i, j;
  29. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  30. pcons->lcdsizex -
  31. row*VIDEO_FONT_HEIGHT+1;
  32. for (j = 0; j < pcons->lcdsizey; j++) {
  33. for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
  34. *dst-- = clr;
  35. dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
  36. }
  37. }
  38. static inline void console_moverow90(struct console_t *pcons,
  39. u32 rowdst, u32 rowsrc)
  40. {
  41. int i, j;
  42. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  43. pcons->lcdsizex -
  44. (rowdst*VIDEO_FONT_HEIGHT+1);
  45. fbptr_t *src = (fbptr_t *)pcons->fbbase +
  46. pcons->lcdsizex -
  47. (rowsrc*VIDEO_FONT_HEIGHT+1);
  48. for (j = 0; j < pcons->lcdsizey; j++) {
  49. for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
  50. *dst-- = *src--;
  51. src += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
  52. dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
  53. }
  54. }
  55. static void lcd_putc_xy180(struct console_t *pcons, ushort x, ushort y, char c)
  56. {
  57. int fg_color = lcd_getfgcolor();
  58. int bg_color = lcd_getbgcolor();
  59. int i, row;
  60. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  61. pcons->lcdsizex +
  62. pcons->lcdsizey * pcons->lcdsizex -
  63. y * pcons->lcdsizex -
  64. (x+1);
  65. for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
  66. uchar bits = video_fontdata[c * VIDEO_FONT_HEIGHT + row];
  67. for (i = 0; i < VIDEO_FONT_WIDTH; ++i) {
  68. *dst-- = (bits & 0x80) ? fg_color : bg_color;
  69. bits <<= 1;
  70. }
  71. dst -= (pcons->lcdsizex - VIDEO_FONT_WIDTH);
  72. }
  73. }
  74. static inline void console_setrow180(struct console_t *pcons, u32 row, int clr)
  75. {
  76. int i;
  77. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  78. (pcons->rows-row-1) * VIDEO_FONT_HEIGHT *
  79. pcons->lcdsizex;
  80. for (i = 0; i < (VIDEO_FONT_HEIGHT * pcons->lcdsizex); i++)
  81. *dst++ = clr;
  82. }
  83. static inline void console_moverow180(struct console_t *pcons,
  84. u32 rowdst, u32 rowsrc)
  85. {
  86. int i;
  87. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  88. (pcons->rows-rowdst-1) * VIDEO_FONT_HEIGHT *
  89. pcons->lcdsizex;
  90. fbptr_t *src = (fbptr_t *)pcons->fbbase +
  91. (pcons->rows-rowsrc-1) * VIDEO_FONT_HEIGHT *
  92. pcons->lcdsizex;
  93. for (i = 0; i < (VIDEO_FONT_HEIGHT * pcons->lcdsizex); i++)
  94. *dst++ = *src++;
  95. }
  96. static void lcd_putc_xy270(struct console_t *pcons, ushort x, ushort y, char c)
  97. {
  98. int fg_color = lcd_getfgcolor();
  99. int bg_color = lcd_getbgcolor();
  100. int i, col;
  101. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  102. pcons->lcdsizey * pcons->lcdsizex -
  103. (x+1) * pcons->lcdsizex +
  104. y;
  105. uchar msk = 0x80;
  106. uchar *pfont = video_fontdata + c * VIDEO_FONT_HEIGHT;
  107. for (col = 0; col < VIDEO_FONT_WIDTH; ++col) {
  108. for (i = 0; i < VIDEO_FONT_HEIGHT; ++i)
  109. *dst++ = (*(pfont + i) & msk) ? fg_color : bg_color;
  110. msk >>= 1;
  111. dst -= (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
  112. }
  113. }
  114. static inline void console_setrow270(struct console_t *pcons, u32 row, int clr)
  115. {
  116. int i, j;
  117. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  118. row*VIDEO_FONT_HEIGHT;
  119. for (j = 0; j < pcons->lcdsizey; j++) {
  120. for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
  121. *dst++ = clr;
  122. dst += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
  123. }
  124. }
  125. static inline void console_moverow270(struct console_t *pcons,
  126. u32 rowdst, u32 rowsrc)
  127. {
  128. int i, j;
  129. fbptr_t *dst = (fbptr_t *)pcons->fbbase +
  130. rowdst*VIDEO_FONT_HEIGHT;
  131. fbptr_t *src = (fbptr_t *)pcons->fbbase +
  132. rowsrc*VIDEO_FONT_HEIGHT;
  133. for (j = 0; j < pcons->lcdsizey; j++) {
  134. for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
  135. *dst++ = *src++;
  136. src += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
  137. dst += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
  138. }
  139. }
  140. static void console_calc_rowcol_rot(struct console_t *pcons)
  141. {
  142. if (pcons->lcdrot == 1 || pcons->lcdrot == 3)
  143. console_calc_rowcol(pcons, pcons->lcdsizey, pcons->lcdsizex);
  144. else
  145. console_calc_rowcol(pcons, pcons->lcdsizex, pcons->lcdsizey);
  146. }
  147. void lcd_init_console_rot(struct console_t *pcons)
  148. {
  149. if (pcons->lcdrot == 0) {
  150. return;
  151. } else if (pcons->lcdrot == 1) {
  152. pcons->fp_putc_xy = &lcd_putc_xy90;
  153. pcons->fp_console_moverow = &console_moverow90;
  154. pcons->fp_console_setrow = &console_setrow90;
  155. } else if (pcons->lcdrot == 2) {
  156. pcons->fp_putc_xy = &lcd_putc_xy180;
  157. pcons->fp_console_moverow = &console_moverow180;
  158. pcons->fp_console_setrow = &console_setrow180;
  159. } else if (pcons->lcdrot == 3) {
  160. pcons->fp_putc_xy = &lcd_putc_xy270;
  161. pcons->fp_console_moverow = &console_moverow270;
  162. pcons->fp_console_setrow = &console_setrow270;
  163. } else {
  164. printf("%s: invalid framebuffer rotation (%d)!\n",
  165. __func__, pcons->lcdrot);
  166. return;
  167. }
  168. console_calc_rowcol_rot(pcons);
  169. }