static int sun3fbcon_switch(int con, struct fb_info *info) { int x_margin, y_margin; struct fb_info_sbusfb *fb = sbusfbinfo(info); int lastconsole; /* Do we have to save the colormap? */ if (fb_display[info->currcon].cmap.len) fb_get_cmap(&fb_display[info->currcon].cmap, 1, sun3fb_getcolreg, info); if (info->display_fg) { lastconsole = info->display_fg->vc_num; if (lastconsole != con && (fontwidth(&fb_display[lastconsole]) != fontwidth(&fb_display[con]) || fontheight(&fb_display[lastconsole]) != fontheight(&fb_display[con]))) fb->cursor.mode |= CURSOR_SHAPE; } x_margin = (fb_display[con].var.xres_virtual - fb_display[con].var.xres) / 2; y_margin = (fb_display[con].var.yres_virtual - fb_display[con].var.yres) / 2; if (fb->margins) fb->margins(fb, &fb_display[con], x_margin, y_margin); if (fb->graphmode || fb->x_margin != x_margin || fb->y_margin != y_margin) { fb->x_margin = x_margin; fb->y_margin = y_margin; sun3fb_clear_margin(&fb_display[con], 0); } info->currcon = con; /* Install new colormap */ do_install_cmap(con, info); return 0; }
static int sun3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) { if (con == info->currcon) /* current console? */ return fb_get_cmap(cmap, kspc, sun3fb_getcolreg, info); else if (fb_display[con].cmap.len) /* non default colormap? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel), cmap, kspc ? 0 : 2); return 0; }
static int igafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *fb_info) { struct fb_info_iga *info = (struct fb_info_iga*) fb_info; if (con == info->currcon) /* current console? */ return fb_get_cmap(cmap, kspc, iga_getcolreg, &info->fb_info); else if (fb_display[con].cmap.len) /* non default colormap? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else fb_copy_cmap(fb_default_cmap(info->video_cmap_len), cmap, kspc ? 0 : 2); return 0; }
int fbgen_switch(int con, struct fb_info *info) { struct fb_info_gen *info2 = (struct fb_info_gen *)info; struct fbgen_hwswitch *fbhw = info2->fbhw; /* Do we have to save the colormap ? */ if (fb_display[currcon].cmap.len) fb_get_cmap(&fb_display[currcon].cmap, 1, fbhw->getcolreg, &info2->info); fbgen_do_set_var(&fb_display[con].var, 1, info2); currcon = con; /* Install new colormap */ fbgen_install_cmap(con, info2); return 0; }
void fb_init(void) { Debug("fb_init()\n"); fb_open(); fb_get_var(); memcpy(&saved_var, &fb_var, sizeof(struct fb_var_screeninfo)); //saved_var = fb_var; if (fb_var.xoffset || fb_var.yoffset || fb_var.accel_flags) { fb_var.xoffset = 0; fb_var.yoffset = 0; fb_var.accel_flags = 0; fb_set_var(); } fb_get_fix(); var_fix_validate(); memcpy(&saved_fix, &fb_fix, sizeof(struct fb_var_screeninfo)); //saved_fix = fb_fix; switch (fb_fix.visual) { case FB_VISUAL_MONO01: case FB_VISUAL_MONO10: case FB_VISUAL_TRUECOLOR: /* no colormap */ break; case FB_VISUAL_PSEUDOCOLOR: case FB_VISUAL_STATIC_PSEUDOCOLOR: cmap_init(1<<fb_var.bits_per_pixel); break; case FB_VISUAL_DIRECTCOLOR: cmap_init(1<<(max(max(fb_var.red.length, fb_var.green.length), max(fb_var.blue.length, fb_var.transp.length)))); break; } if (fb_cmap.len) { fb_get_cmap(); saved_cmap = fb_cmap; ALLOC_AND_SAVE_COMPONENT(red); ALLOC_AND_SAVE_COMPONENT(green); ALLOC_AND_SAVE_COMPONENT(blue); if (fb_cmap.transp) ALLOC_AND_SAVE_COMPONENT(transp); } fb_map(); fb_save(); fb_clear(); }
int fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) { struct fb_info_gen *info2 = (struct fb_info_gen *)info; struct fbgen_hwswitch *fbhw = info2->fbhw; if (con == currcon) /* current console ? */ return fb_get_cmap(cmap, kspc, fbhw->getcolreg, info); else if (fb_display[con].cmap.len) /* non default colormap ? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else { int size = fb_display[con].var.bits_per_pixel == 16 ? 64 : 256; fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2); } return 0; }