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