2 * Copyright (c) 1999, 2000, 2002 Greg Haerr <greg@censoft.com>
4 * Microwindows Screen Driver for Linux kernel framebuffers
6 * Portions used from Ben Pfaff's BOGL <pfaffben@debian.org>
9 * Gary Thomas <gthomas@redhat.com>
10 * Richard Panton <richard.panton@3glab.org>
12 * Note: modify select_fb_driver() to add new framebuffer subdrivers
16 #include <pkgconf/system.h>
22 #include <cyg/hal/drv_api.h>
23 #include <cyg/infra/diag.h>
24 #include <cyg/io/io.h>
30 #include <sys/types.h>
36 #include <cyg/hal/lcd_support.h>
38 static PSD fb_open(PSD psd);
39 static void fb_close(PSD psd);
40 static void fb_setpalette(PSD psd,int first, int count, MWPALENTRY *palette);
41 static void gen_getscreeninfo(PSD psd,PMWSCREENINFO psi);
42 static void set_portrait_mode(PSD psd, int portraitmode);
44 SCREENDEVICE scrdev = {
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL,
50 NULL, /* DrawPixel subdriver*/
51 NULL, /* ReadPixel subdriver*/
52 NULL, /* DrawHorzLine subdriver*/
53 NULL, /* DrawVertLine subdriver*/
54 NULL, /* FillRect subdriver*/
56 NULL, /* Blit subdriver*/
58 NULL, /* DrawArea subdriver*/
59 NULL, /* SetIOPermissions*/
63 NULL, /* StretchBlit subdriver*/
64 set_portrait_mode /* SetPortrait*/
68 static int status; /* 0=never inited, 1=once inited, 2=inited. */
70 static short saved_red[256]; /* original hw palette*/
71 static short saved_green[256];
72 static short saved_blue[256];
74 extern SUBDRIVER fbportrait_left, fbportrait_right, fbportrait_down;
77 static void set_directcolor_palette(PSD psd);
88 // Initialize LCD screen
92 psd->xres = psd->xvirtres = li.width;
93 psd->yres = psd->yvirtres = li.height;
94 psd->portrait = MWPORTRAIT_NONE;
96 /* set planes from fb type*/
97 if (1 /*type == FB_TYPE_PACKED_PIXELS*/)
98 psd->planes = 1; /* FIXME */
99 else psd->planes = 0; /* force error later*/
102 psd->ncolors = (psd->bpp >= 24)? (1 << 24): (1 << psd->bpp);
104 /* set linelen to byte length, possibly converted later*/
105 psd->linelen = li.rlen;
106 psd->size = 0; /* force subdriver init of size*/
108 psd->flags = PSF_SCREEN | PSF_HAVEBLIT;
110 psd->flags |= PSF_HAVEOP_COPY;
112 /* set pixel format*/
114 #ifdef FB_TRUE_RGB555
116 psd->pixtype = MWPF_TRUECOLOR555;
119 #ifdef FB_TRUE_RGB565
121 psd->pixtype = MWPF_TRUECOLOR565;
125 EPRINTF("Unsupported display type: %d\n", li.type);
129 if(1 /*visual == FB_VISUAL_TRUECOLOR || visual == FB_VISUAL_DIRECTCOLOR*/) {
132 psd->pixtype = MWPF_TRUECOLOR332;
135 psd->pixtype = MWPF_TRUECOLOR565;
138 psd->pixtype = MWPF_TRUECOLOR888;
141 psd->pixtype = MWPF_TRUECOLOR0888;
145 "Unsupported %d color (%d bpp) truecolor framebuffer\n",
146 psd->ncolors, psd->bpp);
149 } else psd->pixtype = MWPF_PALETTE;
152 diag_printf("%dx%dx%d linelen %d type %d bpp %d\n", psd->xres,
153 psd->yres, psd->ncolors, psd->linelen, li.type, psd->bpp);
155 /* select a framebuffer subdriver based on planes and bpp*/
156 subdriver = select_fb_subdriver(psd);
158 EPRINTF("No driver for screen\n", psd->bpp);
163 * set and initialize subdriver into screen driver
164 * psd->size is calculated by subdriver init
166 if(!set_subdriver(psd, subdriver, TRUE)) {
167 EPRINTF("Driver initialize failed\n", psd->bpp);
170 /* Remember this as the original (HW) subdriver */
171 psd->orgsubdriver = subdriver;
173 /* mmap framebuffer into this address space*/
175 if(psd->addr == NULL || psd->addr == (unsigned char *)-1) {
176 // EPRINTF("Error mmaping %s: %m\n", env);
181 /* save original palette*/
182 ioctl_getpalette(0, 16, saved_red, saved_green, saved_blue);
184 /* setup direct color palette if required (ATI cards)*/
185 if(visual == FB_VISUAL_DIRECTCOLOR)
186 set_directcolor_palette(psd);
190 return psd; /* success*/
196 /* close framebuffer*/
200 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__);
204 /* if not opened, return*/
209 /* reset hw palette*/
210 ioctl_setpalette(0, 256, saved_red, saved_green, saved_blue);
212 /* unmap framebuffer*/
213 // munmap(psd->addr, psd->size);
215 /* close framebuffer*/
220 /* setup directcolor palette - required for ATI cards*/
222 set_directcolor_palette(PSD psd)
224 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__); while (1) ;
227 short r[256], g[256], b[256];
229 /* 16bpp uses 32 palette entries*/
231 /* FIXME: this still doesn't work*/
232 for(i=0; i<32; ++i) {
233 //r[i] = g[i] = b[i] = ((i<<11)|(i<<6)|i)<<8;
234 //r[i] = g[i] = b[i] = ((i<<5)|i)<<10;
235 //r[i] = g[i] = b[i] = i<<11;
236 //r[i] = g[i] = b[i] = (i<<11) | (i<<3);
237 r[i] = g[i] = b[i] = (i<<11);
242 ioctl_setpalette(0, 32, r, g, b);
244 /* 32bpp uses 256 entries*/
247 ioctl_setpalette(0, 256, r, r, r);
252 static int fade = 100;
254 /* convert Microwindows palette to framebuffer format and set it*/
256 fb_setpalette(PSD psd,int first, int count, MWPALENTRY *palette)
258 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__); while (1) ;
261 unsigned short red[count];
262 unsigned short green[count];
263 unsigned short blue[count];
265 /* convert palette to framebuffer format*/
266 for(i=0; i < count; i++) {
267 MWPALENTRY *p = &palette[i];
269 /* grayscale computation:
270 * red[i] = green[i] = blue[i] =
271 * (p->r * 77 + p->g * 151 + p->b * 28);
273 red[i] = (p->r * fade / 100) << 8;
274 green[i] = (p->g * fade / 100) << 8;
275 blue[i] = (p->b * fade / 100) << 8;
277 ioctl_setpalette(first, count, red, green, blue);
281 /* get framebuffer palette*/
283 ioctl_getpalette(int start, int len, short *red, short *green, short *blue)
285 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__); while (1) ;
288 cyg_uint32 sz = sizeof(cmap);
297 cyg_io_get_config( fb_handle, CYG_IO_GET_CONFIG_FB_PALETTE, &cmap, &sz );
298 // ioctl(fb, FBIOGETCMAP, &cmap);
302 /* set framebuffer palette*/
304 ioctl_setpalette(int start, int len, short *red, short *green, short *blue)
306 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__); while (1) ;
309 cyg_uint32 sz = sizeof(cmap);
318 cyg_io_set_config( fb_handle, CYG_IO_SET_CONFIG_FB_PALETTE, &cmap, &sz );
319 // ioctl(fb, FBIOPUTCMAP, &cmap);
323 /* experimental palette animation*/
325 setfadelevel(PSD psd, int f)
327 printf("%s - NOT IMPLEMENTED\n", __FUNCTION__); while (1) ;
330 unsigned short r[256], g[256], b[256];
331 extern MWPALENTRY gr_palette[256];
333 if(psd->pixtype != MWPF_PALETTE)
339 for(i=0; i<256; ++i) {
340 r[i] = (gr_palette[i].r * fade / 100) << 8;
341 g[i] = (gr_palette[i].g * fade / 100) << 8;
342 b[i] = (gr_palette[i].b * fade / 100) << 8;
344 ioctl_setpalette(0, 256, r, g, b);
349 gen_getscreeninfo(PSD psd,PMWSCREENINFO psi)
351 psi->rows = psd->yvirtres;
352 psi->cols = psd->xvirtres;
353 psi->planes = psd->planes;
355 psi->ncolors = psd->ncolors;
356 psi->pixtype = psd->pixtype;
357 psi->fonts = NUMBER_FONTS;
358 psi->portrait = psd->portrait;
360 switch (psd->portrait) {
361 case MWPORTRAIT_NONE:
362 psi->fbdriver = psd->orgsubdriver;
364 case MWPORTRAIT_RIGHT:
365 psi->fbdriver = &fbportrait_right;
367 case MWPORTRAIT_LEFT:
368 psi->fbdriver = &fbportrait_left;
370 case MWPORTRAIT_DOWN:
371 psi->fbdriver = &fbportrait_down;
375 switch (psd->pixtype) {
376 case MWPF_TRUECOLOR555:
381 case MWPF_TRUECOLOR565:
387 printf("%s - unsupported pixtype\n", __FUNCTION__);
396 if(psd->yvirtres > 480) {
398 psi->xdpcm = 33; /* assumes screen width of 24 cm*/
399 psi->ydpcm = 33; /* assumes screen height of 18 cm*/
400 } else if(psd->yvirtres > 350) {
402 psi->xdpcm = 27; /* assumes screen width of 24 cm*/
403 psi->ydpcm = 27; /* assumes screen height of 18 cm*/
406 psi->xdpcm = 27; /* assumes screen width of 24 cm*/
407 psi->ydpcm = 19; /* assumes screen height of 18 cm*/
411 psi->ydpcm = 42; // 320 / (3 * 2.54)
412 psi->xdpcm = 38; //240 / (2.5 * 2.54)
417 set_portrait_mode(PSD psd, int portraitmode)
419 psd->portrait = portraitmode;
420 switch (portraitmode) {
421 case MWPORTRAIT_NONE:
422 psd->xvirtres = psd->xres;
423 psd->yvirtres = psd->yres;
424 set_subdriver(psd, psd->orgsubdriver, FALSE);
426 case MWPORTRAIT_RIGHT:
427 psd->xvirtres = psd->yres;
428 psd->yvirtres = psd->xres;
429 set_subdriver(psd, &fbportrait_right, FALSE);
431 case MWPORTRAIT_LEFT:
432 psd->xvirtres = psd->yres;
433 psd->yvirtres = psd->xres;
434 set_subdriver(psd, &fbportrait_left, FALSE);
436 case MWPORTRAIT_DOWN:
437 psd->xvirtres = psd->xres;
438 psd->yvirtres = psd->yres;
439 set_subdriver(psd, &fbportrait_down, FALSE);