📄 viafbdev.c
字号:
DEBUG_MSG(KERN_INFO "via_getcolreg!\n" );
if (regno >= m)
return 1;
*red = palette[regno].red;
*green = palette[regno].green;
*blue = palette[regno].blue;
*transp = palette[regno].transp;
return 0;
}
/* Set one color register */
static int via_setcolreg(unsigned regno, unsigned red, unsigned green,
unsigned blue, unsigned transp,
struct fb_info *info)
{
struct viafb_info * i = (struct viafb_info *)info;
int bpp = i->currentmode.bpp;
int m = bpp==8?256:16;
DEBUG_MSG(KERN_INFO "via_setcolreg!\n" );
if (regno >= m)
return 1;
palette[regno].red = red;
palette[regno].green = green;
palette[regno].blue = blue;
palette[regno].transp = transp;
if (bpp==8) {
t_outb(0xFF,0x3C6);
t_outb(regno,0x3C8);
t_outb(red>>10,0x3C9);
t_outb(green>>10,0x3C9);
t_outb(blue>>10,0x3C9);
} else
if (bpp == 16) /* RGB 565 */
((u16*)info->pseudo_palette)[regno] = (red & 0xF800) |
((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11);
else
if (bpp == 32) /* ARGB 8888 */
((u32*)info->pseudo_palette)[regno] =
((transp & 0xFF00) <<16) |
((red & 0xFF00) << 8) |
((green & 0xFF00)) |
((blue & 0xFF00)>>8);
return 0;
}
/* blank screen */
static int via_blank(int blank_mode, struct fb_info_gen *info)
{
DEBUG_MSG(KERN_INFO "via_blank!\n" );
/* clear DPMS setting */
switch (blank_mode) {
case VESA_NO_BLANKING:
/* Screen: On, HSync: On, VSync: On */
write_reg_mask(CR36, VIACR, 0x00, BIT4+BIT5); // control CRT monitor power management
break;
case VESA_HSYNC_SUSPEND:
/* Screen: Off, HSync: Off, VSync: On */
write_reg_mask(CR36, VIACR, 0x10, BIT4+BIT5); // control CRT monitor power management
break;
case VESA_VSYNC_SUSPEND:
/* Screen: Off, HSync: On, VSync: Off */
write_reg_mask(CR36, VIACR, 0x20, BIT4+BIT5); // control CRT monitor power management
break;
case VESA_POWERDOWN:
/* Screen: Off, HSync: Off, VSync: Off */
write_reg_mask(CR36, VIACR, 0x30, BIT4+BIT5); // control CRT monitor power management
break;
}
return 0;
}
/* Set display switch used by console */
static void via_set_disp(const void *par, struct display *disp,
struct fb_info_gen *info)
{
struct viafb_info * i = (struct viafb_info *)info;
struct fb_info * ii = (struct fb_info *)info;
struct viafb_par * p = (struct viafb_par *)par;
//int isaccel = p->var.accel_flags & FB_ACCELF_TEXT;
int isaccel = 0;
DEBUG_MSG(KERN_INFO "via_set_disp!\n" );
disp->screen_base = (char *)i->fbmem_virt;
#ifdef FBCON_HAS_CFB8
if (p->bpp == 8 ) {
if (isaccel)
disp->dispsw = &via_8bpp;
else
disp->dispsw = &fbcon_cfb8;
} else
#endif
#ifdef FBCON_HAS_CFB16
if (p->bpp == 16) {
if (isaccel){
disp->dispsw = &via_16bpp;
}else
disp->dispsw = &fbcon_cfb16;
disp->dispsw_data =ii->pseudo_palette; /* console palette */
} else
#endif
#ifdef FBCON_HAS_CFB32
if (p->bpp == 32) {
if (isaccel)
disp->dispsw = &via_32bpp;
else
disp->dispsw = &fbcon_cfb32;
disp->dispsw_data =ii->pseudo_palette; /* console palette */
} else
#endif
disp->dispsw = &fbcon_dummy;
}
static struct fbgen_hwswitch via_hwswitch = {
NULL, /* detect not needed */
via_encode_fix,
via_decode_var,
via_encode_var,
via_get_par,
via_set_par,
via_getcolreg,
via_setcolreg,
via_pan_display,
via_blank,
via_set_disp
};
static int get_mode_index(int hres, int vres)
{
DEBUG_MSG(KERN_INFO "get_mode_index!\n" );
if (hres==640 && vres==480) {
resMode = VIA_RES_640X480;
mode = "640x480";
} else if (hres==800 && vres==600) {
resMode = VIA_RES_800X600;
mode = "800x600";
} else if (hres==1024 && vres==768) {
resMode = VIA_RES_1024X768;
mode = "1024x768";
} else if (hres==1152 && vres==864) {
resMode = VIA_RES_1152X864;
mode = "1152x864";
} else if (hres==1280 && vres==1024) {
resMode = VIA_RES_1280X1024;
mode = "1280x1024";
} else if (hres==1600 && vres==1200) {
resMode = VIA_RES_1600X1200;
mode = "1600x1200";
} else if (hres==1440 && vres==1050) {
resMode = VIA_RES_1440X1050;
mode = "1440x1050";
} else if (hres==1280 && vres==768) {
resMode = VIA_RES_1280X768;
mode = "1280x768";
} else if (hres==1280 && vres==960) {
resMode = VIA_RES_1280X960;
mode = "1280x960";
} else if (hres==1920 && vres==1440) {
resMode = VIA_RES_1920X1440;
mode = "1920x1440";
} else if (hres==848 && vres==480) {
resMode = VIA_RES_848X480;
mode = "848x480";
} else if (hres==1400 && vres==1050) {
resMode = VIA_RES_1400X1050;
mode = "1400x1050";
} else if (hres==720 && vres==480) {
resMode = VIA_RES_720X480;
mode = "720x480";
} else if (hres==720 && vres==576) {
resMode = VIA_RES_720X576;
mode = "720x576";
} else if (hres==1024 && vres==512) {
resMode = VIA_RES_1024X512;
mode = "1024x512";
} else if (hres==856 && vres==480) {
resMode = VIA_RES_856X480;
mode = "856x480";
} else if (hres==1024 && vres==576) {
resMode = VIA_RES_1024X576;
mode = "1024x576";
} else {
resMode = VIA_RES_640X480;
mode = "640x480";
}
return(resMode);
}
//static int via_iosize;
//static int __devinit via_pci_probe(struct pci_dev * dev, const struct pci_device_id * id)
static int __devinit via_pci_probe(void)
{
//unsigned char revision;
unsigned int default_xres,default_yres;
char *tmpc,*tmpm;
int vmode_index;
DEBUG_MSG(KERN_INFO "VIAFB PCI Probe!!\n");
init_chip_info();
noaccel = 1;
defaultaccel = !noaccel;
if (chip_info.gfx_chip_name == UNICHROME_K800)
fb_info.fbmem = 0x0c000000;
else
fb_info.fbmem = read_reg(VIASR, SR30) << 24;
fb_info.memsize = get_memsize();
fb_info.fbmem_virt = (unsigned int)ioremap_nocache(fb_info.fbmem, fb_info.memsize);
if (!fb_info.fbmem_virt) {
// release_mem_region(fb_info.fbmem, fb_info.memsize);
printk("ioremap failed\n");
return -1;
}
fb_info.gen.parsize = sizeof (struct viafb_par);
fb_info.gen.fbhw = &via_hwswitch;
strcpy(fb_info.gen.info.modename, viafb_name);
fb_info.gen.info.changevar = NULL;
fb_info.gen.info.node = NODEV;
fb_info.gen.info.fbops = &viafb_ops;
fb_info.gen.info.disp = &disp;
fb_info.gen.info.switch_con = &fbgen_switch;
fb_info.gen.info.updatevar = &fbgen_update_var;
fb_info.gen.info.blank = &fbgen_blank;
fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
fb_info.gen.info.fontname[0] = '\0';
fb_info.gen.info.pseudo_palette = pseudo_pal;
tmpm = mode;
tmpc = strsep(&tmpm,"x");
default_xres = simple_strtoul(tmpc,NULL,0);
default_yres = simple_strtoul(tmpm,NULL,0);
vmode_index = get_mode_index(default_xres, default_yres);
switch (bpp) {
case 0 ... 8:
bpp = 8;
break;
case 9 ... 16:
bpp = 16;
break;
case 17 ... 32:
bpp = 32;
break;
default :
bpp = 8;
}
default_var.xres=default_xres;
default_var.yres=default_yres;
default_var.xres_virtual=default_xres;
default_var.yres_virtual=default_yres;
default_var.bits_per_pixel=bpp;
if (default_var.bits_per_pixel==15)
default_var.bits_per_pixel=16;
default_var.pixclock=get_pixclock(default_xres, default_yres, refresh);
default_var.left_margin=(default_xres>>3)&0xf8;
default_var.right_margin=32;
default_var.upper_margin=16;
default_var.lower_margin=4;
default_var.hsync_len=default_var.left_margin;
default_var.vsync_len=4;
//if (defaultaccel && acc)
// default_var.accel_flags |= FB_ACCELF_TEXT;
//else
// default_var.accel_flags &= ~FB_ACCELF_TEXT;
default_var.accel_flags = 0;
//default_var.accel_flags |= FB_ACCELF_TEXT;
via_decode_var(&default_var, &fb_info.currentmode, &fb_info.gen);
fbgen_get_var(&disp.var, -1, &fb_info.gen.info);
default_var.activate = FB_ACTIVATE_NOW;
fbgen_set_disp(-1, &fb_info.gen);
if (register_framebuffer(&fb_info.gen.info) < 0) {
printk("Could not register Via framebuffer\n");
return -EINVAL;
}
DEBUG_MSG(KERN_INFO "fb%d: %s frame buffer device %dx%d-%dbpp\n",
GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename,default_var.xres,
default_var.yres,default_var.bits_per_pixel);
init_dac(IGA2);
return 0;
}
//static void __devexit via_pci_remove(struct pci_dev * dev)
static void __devexit via_pci_remove(void)
{
DEBUG_MSG(KERN_INFO "via_pci_remove!\n" );
unregister_framebuffer(&fb_info.gen.info);
// iounmap((void *)fb_info.io_virt);
iounmap((void *)fb_info.fbmem_virt);
// release_mem_region(fb_info.fbmem, fb_info.memsize);
// release_region(fb_info.io, via_iosize);
}
/* List of boards that we are trying to support */
/*static struct pci_device_id via_devices[] __devinitdata = {
{PCI_VENDOR_ID_VIA, 0x3122, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
{0,}
};*/
//MODULE_DEVICE_TABLE(pci,via_devices);
//static struct pci_driver viafb_pci_driver = {
// name:"viafb",
// id_table:via_devices,
// probe:via_pci_probe,
// remove:__devexit_p(via_pci_remove),
//};
int __init viafb_init(void)
{
DEBUG_MSG(KERN_INFO "viafb_init!\n" );
DEBUG_MSG(KERN_INFO "VIA Graphics Intergration Chipset framebuffer %s initializing\n", VERSION);
via_pci_probe();
//return pci_module_init(&viafb_pci_driver);
return 0;
}
void __exit viafb_exit(void)
{
DEBUG_MSG(KERN_INFO "viafb_exit!\n" );
via_pci_remove();
//pci_unregister_driver(&viafb_pci_driver);
}
/*
* Parse user specified options (`video=via:')
* example:
* video=via:800x600,bpp=16,noaccel
*/
int __init viafb_setup(char *options)
{
DEBUG_MSG(KERN_INFO "viafb_setup!\n" );
return 0;
}
static struct fb_ops viafb_ops = {
fb_get_fix:fbgen_get_fix,
fb_get_var:fbgen_get_var,
fb_set_var:fbgen_set_var,
fb_get_cmap:fbgen_get_cmap,
fb_set_cmap:fbgen_set_cmap,
fb_pan_display:fbgen_pan_display,
};
#ifdef MODULE
int __init init_module(void)
{
DEBUG_MSG(KERN_INFO "init_module!\n" );
viafb_init();
return 0;
}
#endif
module_exit(viafb_exit);
MODULE_PARM(noaccel,"i");
MODULE_PARM(memsize,"i");
MODULE_PARM(mode,"s");
MODULE_PARM_DESC(mode, "Set resolution (default=640x480)");
MODULE_PARM(bpp,"i");
MODULE_PARM_DESC(disp_mode, "Set color depth (default=32bpp)");
MODULE_PARM(refresh,"i");
MODULE_PARM_DESC(refresh, "Set CRT refresh rate (default = 60)");
MODULE_PARM(CRT_ON, "i");
MODULE_PARM_DESC(CRT, "Turn on/off flag of CRT device (default = ON)");
MODULE_PARM(DVI_ON, "i");
MODULE_PARM_DESC(DVI, "Turn on/off flag of DVI device (default = OFF)");
MODULE_PARM(LCD_ON, "i");
MODULE_PARM_DESC(LCD, "Turn on/off flag of LCD device (default = OFF)");
MODULE_PARM(TV_ON, "i");
MODULE_PARM_DESC(TV, "Turn on/off flag of TV device (default = OFF)");
MODULE_PARM(tv_system, "i");
MODULE_PARM_DESC(tv_system, "TV Signal Standard (NTSC, PAL,...,etc)");
MODULE_PARM(tv_level, "i");
MODULE_PARM_DESC(tv_level, "TV Horizontal/Vertical Contraction Control");
MODULE_PARM(tv_out_signal, "i");
MODULE_PARM_DESC(tv_out_signal, "Set TV output signal.(Default=Composite+SVideo)");
MODULE_PARM(tv_dedotcrawl, "i");
MODULE_PARM_DESC(tv_dedotcrawl, "Control TV DeDotCrawl function.(Default=disable)");
MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -