lcd_console_rotation.c 5.2 KB

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