Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 478 → Rev 479

/shark/trunk/drivers/fb/vesa.h
75,6 → 75,14
unsigned char Reserved2 [206]; /* Riservato */
} ModeInfoBlock;
 
struct gmode {
WORD xdim;
WORD ydim;
WORD bpr;
BYTE bpp;
WORD modenum;
};
 
/****************************************************************************/
/* PROTOTYPES */
/****************************************************************************/
89,6 → 97,7
int vbe_setbank(ModeInfoBlock *ModeInfo, BYTE bank);
void vbe_showmodeinfo (ModeInfoBlock *ModeInfo);
int vbe_checkmode(WORD mode);
int vbe_modenum(WORD x, WORD y, BYTE bpp);
void vbe_restore_vga(void);
 
DWORD vbe_getmem(void);
/shark/trunk/drivers/fb/vesafb.c
188,17 → 188,6
 
}
 
static struct fb_ops vesafb_ops = {
.owner = THIS_MODULE,
.fb_setcolreg = vesafb_setcolreg,
.fb_pan_display = vesafb_pan_display,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_cursor = soft_cursor,
.fb_release = vesafb_release,
};
 
int __init vesafb_setup(char *options)
{
char *this_opt;
233,6 → 222,116
extern int vbe_getifo(void);
extern void vm86_init(void);
 
static int vesafb_set_par(struct fb_info *info)
{
 
ModeInfoBlock ModeInfo;
int wx,wy,bpp,mode;
int video_cmap_len;
 
wx = info->var.xres;
wy = info->var.yres;
bpp = info->var.bits_per_pixel;
mode = vbe_modenum(wx,wy,bpp);
if (mode == -1) return -1;
screen_info.lfb_base = vbe_getmodeinfo(&ModeInfo,mode);
screen_info.orig_video_isVGA = VIDEO_TYPE_VLFB;
if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB)
return -ENXIO;
screen_info.lfb_depth = ModeInfo.BitsPerPixel;
screen_info.lfb_width = ModeInfo.XResolution;
screen_info.lfb_height = ModeInfo.YResolution;
screen_info.lfb_linelength = ModeInfo.BytesPerScanLine;
screen_info.lfb_size = VbeInfo.TotalMemory;
screen_info.pages = ModeInfo.NumberOfImagePages;
screen_info.vesapm_seg = 0;
screen_info.vesapm_off = 0;
screen_info.red_pos = ModeInfo.RedFieldPosition;
screen_info.red_size = ModeInfo.RedMaskSize;
screen_info.green_pos = ModeInfo.GreenFieldPosition;
screen_info.green_size = ModeInfo.GreenMaskSize;
screen_info.blue_pos = ModeInfo.BlueFieldPosition;
screen_info.blue_size = ModeInfo.BlueMaskSize;
screen_info.rsvd_pos = ModeInfo.RsvdFieldPosition;
screen_info.rsvd_size = ModeInfo.RsvdMaskSize;
vbe_setmode(mode);
 
info->fix.smem_start = screen_info.lfb_base;
info->var.bits_per_pixel = screen_info.lfb_depth;
if (15 == info->var.bits_per_pixel)
info->var.bits_per_pixel = 16;
info->var.xres = screen_info.lfb_width;
info->var.yres = screen_info.lfb_height;
info->fix.line_length = screen_info.lfb_linelength;
info->fix.smem_len = screen_info.lfb_size;
info->fix.visual = (info->var.bits_per_pixel == 8) ?
FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
 
/* limit framebuffer size to 16 MB. Otherwise we'll eat tons of
* kernel address space for nothing if the gfx card has alot of
* memory (>= 128 MB isn't uncommon these days ...) */
if (info->fix.smem_len > 16 * 1024 * 1024)
info->fix.smem_len = 16 * 1024 * 1024;
 
/* some dummy values for timing to make fbset happy */
info->var.pixclock = 10000000 / info->var.xres * 1000 / info->var.yres;
info->var.left_margin = (info->var.xres / 8) & 0xf8;
info->var.hsync_len = (info->var.xres / 8) & 0xf8;
if (info->var.bits_per_pixel > 8) {
info->var.red.offset = screen_info.red_pos;
info->var.red.length = screen_info.red_size;
info->var.green.offset = screen_info.green_pos;
info->var.green.length = screen_info.green_size;
info->var.blue.offset = screen_info.blue_pos;
info->var.blue.length = screen_info.blue_size;
info->var.transp.offset = screen_info.rsvd_pos;
info->var.transp.length = screen_info.rsvd_size;
video_cmap_len = 16;
} else {
info->var.red.length = 6;
info->var.green.length = 6;
info->var.blue.length = 6;
video_cmap_len = 256;
}
 
info->fix.ypanstep = ypan ? 1 : 0;
info->fix.ywrapstep = (ypan>1) ? 1 : 0;
return 0;
 
}
 
static int vesafb_check_var(struct fb_var_screeninfo *var,
struct fb_info *info)
{
 
return 0;
 
}
 
static struct fb_ops vesafb_ops = {
.owner = THIS_MODULE,
.fb_setcolreg = vesafb_setcolreg,
.fb_pan_display = vesafb_pan_display,
.fb_set_par = vesafb_set_par,
.fb_check_var = vesafb_check_var,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_cursor = soft_cursor,
.fb_release = vesafb_release,
};
 
 
int __init vesafb_init(void)
{
ModeInfoBlock ModeInfo;
/shark/trunk/drivers/fb/gdvesa.c
46,6 → 46,23
"15D - name n/a", "15E - name n/a", "15F - name n/a"
};
 
#define NMODES 13
static struct gmode allmodes[NMODES] = {
{640, 400, 640, 8, 0x4100},
{640, 480, 640, 8, 0x4101},
{800, 600, 800, 8, 0x4103},
{1024, 768, 1024, 8, 0x4105},
{640, 480, 1280, 15, 0x4110},
{800, 600, 1600, 15, 0x4113},
{1024, 768, 2048, 15, 0x4116},
{640, 480, 1280, 16, 0x4111},
{800, 600, 1600, 16, 0x4114},
{1024, 768, 2048, 16, 0x4117},
{640, 480, 1920, 24, 0x4112},
{800, 600, 2400, 24, 0x4115},
{1024, 768, 3072, 24, 0x4118}
};
 
int vbe_check_status (WORD vbe_function_result)
{
if (vbe_function_result != 0x004f) {
59,6 → 76,21
return 1;
}
 
int vbe_modenum(WORD x, WORD y, BYTE depth)
{
int mode, i;
mode = -1;
for (i = 0; i < NMODES; i++) {
if ((depth == allmodes[i].bpp) && (x == allmodes[i].xdim) && (y == allmodes[i].ydim)) {
mode = allmodes[i].modenum;
}
}
return mode;
}
 
void vbe_restore_vga(void) {
 
X_REGS16 inregs, outregs;