Rev 1766 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1766 | Rev 1780 | ||
|---|---|---|---|
| Line 47... | Line 47... | ||
| 47 | 47 | ||
| 48 | #include "helenos.xbm" |
48 | #include "helenos.xbm" |
| 49 | 49 | ||
| 50 | SPINLOCK_INITIALIZE(fb_lock); |
50 | SPINLOCK_INITIALIZE(fb_lock); |
| 51 | 51 | ||
| 52 | static __u8 *fbaddress = NULL; |
52 | static uint8_t *fbaddress = NULL; |
| 53 | 53 | ||
| 54 | static __u8 *blankline = NULL; |
54 | static uint8_t *blankline = NULL; |
| 55 | static __u8 *dbbuffer = NULL; /* Buffer for fast scrolling console */ |
55 | static uint8_t *dbbuffer = NULL; /* Buffer for fast scrolling console */ |
| 56 | static int dboffset; |
56 | static int dboffset; |
| 57 | 57 | ||
| 58 | static unsigned int xres = 0; |
58 | static unsigned int xres = 0; |
| 59 | static unsigned int yres = 0; |
59 | static unsigned int yres = 0; |
| 60 | static unsigned int scanline = 0; |
60 | static unsigned int scanline = 0; |
| Line 96... | Line 96... | ||
| 96 | return (*(int *)src) & 0xffffff; |
96 | return (*(int *)src) & 0xffffff; |
| 97 | } |
97 | } |
| 98 | 98 | ||
| 99 | static void rgb_3byte(void *dst, int rgb) |
99 | static void rgb_3byte(void *dst, int rgb) |
| 100 | { |
100 | { |
| 101 | __u8 *scr = dst; |
101 | uint8_t *scr = dst; |
| 102 | #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
102 | #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
| 103 | scr[0] = RED(rgb, 8); |
103 | scr[0] = RED(rgb, 8); |
| 104 | scr[1] = GREEN(rgb, 8); |
104 | scr[1] = GREEN(rgb, 8); |
| 105 | scr[2] = BLUE(rgb, 8); |
105 | scr[2] = BLUE(rgb, 8); |
| 106 | #else |
106 | #else |
| Line 110... | Line 110... | ||
| 110 | #endif |
110 | #endif |
| 111 | } |
111 | } |
| 112 | 112 | ||
| 113 | static int byte3_rgb(void *src) |
113 | static int byte3_rgb(void *src) |
| 114 | { |
114 | { |
| 115 | __u8 *scr = src; |
115 | uint8_t *scr = src; |
| 116 | #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
116 | #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
| 117 | return scr[0] << 16 | scr[1] << 8 | scr[2]; |
117 | return scr[0] << 16 | scr[1] << 8 | scr[2]; |
| 118 | #else |
118 | #else |
| 119 | return scr[2] << 16 | scr[1] << 8 | scr[0]; |
119 | return scr[2] << 16 | scr[1] << 8 | scr[0]; |
| 120 | #endif |
120 | #endif |
| Line 122... | Line 122... | ||
| 122 | 122 | ||
| 123 | /** 16-bit depth (5:6:5) */ |
123 | /** 16-bit depth (5:6:5) */ |
| 124 | static void rgb_2byte(void *dst, int rgb) |
124 | static void rgb_2byte(void *dst, int rgb) |
| 125 | { |
125 | { |
| 126 | /* 5-bit, 6-bits, 5-bits */ |
126 | /* 5-bit, 6-bits, 5-bits */ |
| 127 | *((__u16 *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | BLUE(rgb, 5); |
127 | *((uint16_t *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | BLUE(rgb, 5); |
| 128 | } |
128 | } |
| 129 | 129 | ||
| 130 | /** 16-bit depth (5:6:5) */ |
130 | /** 16-bit depth (5:6:5) */ |
| 131 | static int byte2_rgb(void *src) |
131 | static int byte2_rgb(void *src) |
| 132 | { |
132 | { |
| 133 | int color = *(__u16 *)(src); |
133 | int color = *(uint16_t *)(src); |
| 134 | return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); |
134 | return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); |
| 135 | } |
135 | } |
| 136 | 136 | ||
| 137 | /** Put pixel - 8-bit depth (3:2:3) */ |
137 | /** Put pixel - 8-bit depth (3:2:3) */ |
| 138 | static void rgb_1byte(void *dst, int rgb) |
138 | static void rgb_1byte(void *dst, int rgb) |
| 139 | { |
139 | { |
| 140 | *(__u8 *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3); |
140 | *(uint8_t *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3); |
| 141 | } |
141 | } |
| 142 | 142 | ||
| 143 | /** Return pixel color - 8-bit depth (3:2:3) */ |
143 | /** Return pixel color - 8-bit depth (3:2:3) */ |
| 144 | static int byte1_rgb(void *src) |
144 | static int byte1_rgb(void *src) |
| 145 | { |
145 | { |
| 146 | int color = *(__u8 *)src; |
146 | int color = *(uint8_t *)src; |
| 147 | return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); |
147 | return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); |
| 148 | } |
148 | } |
| 149 | 149 | ||
| 150 | static void putpixel(unsigned int x, unsigned int y, int color) |
150 | static void putpixel(unsigned int x, unsigned int y, int color) |
| 151 | { |
151 | { |
| Line 182... | Line 182... | ||
| 182 | 182 | ||
| 183 | 183 | ||
| 184 | /** Scroll screen one row up */ |
184 | /** Scroll screen one row up */ |
| 185 | static void scroll_screen(void) |
185 | static void scroll_screen(void) |
| 186 | { |
186 | { |
| 187 | __u8 *lastline = &fbaddress[(rows - 1) * ROW_BYTES]; |
187 | uint8_t *lastline = &fbaddress[(rows - 1) * ROW_BYTES]; |
| 188 | int firstsz; |
188 | int firstsz; |
| 189 | 189 | ||
| 190 | if (dbbuffer) { |
190 | if (dbbuffer) { |
| 191 | memcpy(&dbbuffer[dboffset*scanline], blankline, FONT_SCANLINES*scanline); |
191 | memcpy(&dbbuffer[dboffset*scanline], blankline, FONT_SCANLINES*scanline); |
| 192 | 192 | ||
| Line 223... | Line 223... | ||
| 223 | 223 | ||
| 224 | /***************************************************************/ |
224 | /***************************************************************/ |
| 225 | /* Character-console functions */ |
225 | /* Character-console functions */ |
| 226 | 226 | ||
| 227 | /** Draw character at given position */ |
227 | /** Draw character at given position */ |
| 228 | static void draw_glyph(__u8 glyph, unsigned int col, unsigned int row) |
228 | static void draw_glyph(uint8_t glyph, unsigned int col, unsigned int row) |
| 229 | { |
229 | { |
| 230 | unsigned int y; |
230 | unsigned int y; |
| 231 | 231 | ||
| 232 | for (y = 0; y < FONT_SCANLINES; y++) |
232 | for (y = 0; y < FONT_SCANLINES; y++) |
| 233 | draw_glyph_line(fb_font[glyph * FONT_SCANLINES + y], col * COL_WIDTH, row * FONT_SCANLINES + y); |
233 | draw_glyph_line(fb_font[glyph * FONT_SCANLINES + y], col * COL_WIDTH, row * FONT_SCANLINES + y); |
| Line 334... | Line 334... | ||
| 334 | * @param y Screen height in pixels |
334 | * @param y Screen height in pixels |
| 335 | * @param bpp Bits per pixel (8, 16, 24, 32) |
335 | * @param bpp Bits per pixel (8, 16, 24, 32) |
| 336 | * @param scan Bytes per one scanline |
336 | * @param scan Bytes per one scanline |
| 337 | * |
337 | * |
| 338 | */ |
338 | */ |
| 339 | void fb_init(__address addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan) |
339 | void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan) |
| 340 | { |
340 | { |
| 341 | switch (bpp) { |
341 | switch (bpp) { |
| 342 | case 8: |
342 | case 8: |
| 343 | rgb2scr = rgb_1byte; |
343 | rgb2scr = rgb_1byte; |
| 344 | scr2rgb = byte1_rgb; |
344 | scr2rgb = byte1_rgb; |
| Line 364... | Line 364... | ||
| 364 | } |
364 | } |
| 365 | 365 | ||
| 366 | unsigned int fbsize = scan * y; |
366 | unsigned int fbsize = scan * y; |
| 367 | 367 | ||
| 368 | /* Map the framebuffer */ |
368 | /* Map the framebuffer */ |
| 369 | fbaddress = (__u8 *) hw_map((__address) addr, fbsize); |
369 | fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize); |
| 370 | 370 | ||
| 371 | xres = x; |
371 | xres = x; |
| 372 | yres = y; |
372 | yres = y; |
| 373 | bitspp = bpp; |
373 | bitspp = bpp; |
| 374 | scanline = scan; |
374 | scanline = scan; |
| Line 397... | Line 397... | ||
| 397 | if (!dbbuffer) |
397 | if (!dbbuffer) |
| 398 | printf("Failed to allocate scroll buffer.\n"); |
398 | printf("Failed to allocate scroll buffer.\n"); |
| 399 | dboffset = 0; |
399 | dboffset = 0; |
| 400 | 400 | ||
| 401 | /* Initialized blank line */ |
401 | /* Initialized blank line */ |
| 402 | blankline = (__u8 *) malloc(ROW_BYTES, FRAME_ATOMIC); |
402 | blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
| 403 | if (!blankline) |
403 | if (!blankline) |
| 404 | panic("Failed to allocate blank line for framebuffer."); |
404 | panic("Failed to allocate blank line for framebuffer."); |
| 405 | for (y=0; y < FONT_SCANLINES; y++) |
405 | for (y=0; y < FONT_SCANLINES; y++) |
| 406 | for (x=0; x < xres; x++) |
406 | for (x=0; x < xres; x++) |
| 407 | (*rgb2scr)(&blankline[POINTPOS(x,y)],BGCOLOR); |
407 | (*rgb2scr)(&blankline[POINTPOS(x,y)],BGCOLOR); |