Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1019 → Rev 1022

/shark/trunk/drivers/fb/vesafb.c
224,7 → 224,6
 
static int vesafb_set_par(struct fb_info *info)
{
 
ModeInfoBlock ModeInfo;
int wx,wy,bpp,mode;
int video_cmap_len;
237,33 → 236,33
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);
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)
505,7 → 504,7
/* Find the largest power-of-two */
while (temp_size & (temp_size - 1))
temp_size &= (temp_size - 1);
 
/* Try and find a power of two to add */
while (temp_size && mtrr_add(vesafb_fix.smem_start, temp_size, MTRR_TYPE_WRCOMB, 1)==-EINVAL) {
temp_size >>= 1;
/shark/trunk/drivers/fb/gdvesa.c
48,164 → 48,164
 
#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}
{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) {
switch (vbe_function_result) {
case 0x014f : return -1; /* VBE Generic error */
case 0x024f : return -2; /* Hardware incompatibility error */
case 0x034f : return -3; /* Unvalid function requested */
default : return -4; /* Unknown error */
if (vbe_function_result != 0x004f) {
switch (vbe_function_result) {
case 0x014f : return -1; /* VBE Generic error */
case 0x024f : return -2; /* Hardware incompatibility error */
case 0x034f : return -3; /* Unvalid function requested */
default : return -4; /* Unknown error */
}
}
}
return 1;
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;
}
int mode, i;
 
void vbe_restore_vga(void) {
mode = -1;
 
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
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;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1,p2;
BYTE p1,p2;
#endif
inregs.x.ax = 0x03;
 
inregs.x.ax = 0x03;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
 
}
 
int vbe_getinfo(void)
{
X_REGS16 inregs, outregs; /* registri normali */
X_SREGS16 sregs; /* registri estesi */
LIN_ADDR DOSaddr;
DWORD linearaddr;
X_REGS16 inregs, outregs; /* registri normali */
X_SREGS16 sregs; /* registri estesi */
LIN_ADDR DOSaddr;
DWORD linearaddr;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
/* Allochiamo mem per il nostro blocco */
if ((DOSaddr = DOS_alloc(sizeof(VbeInfoBlock))) == 0) {
/* set_text_mode ();*/
return -1;
} else {
/* linearaddr = appl2linear(DOSaddr);*/
linearaddr = (DWORD) DOSaddr;
/* Allochiamo mem per il nostro blocco */
if ((DOSaddr = DOS_alloc(sizeof(VbeInfoBlock))) == 0) {
/* set_text_mode ();*/
return -1;
} else {
/*linearaddr = appl2linear(DOSaddr);*/
linearaddr = (DWORD) DOSaddr;
 
/* 0x00 = Get Vbe2.0 Info */
inregs.x.ax = 0x4f00;
/* Indirizzo reale del nostro blocco */
inregs.x.di = linearaddr & 0x000F;
sregs.es = ((linearaddr & 0xFFFF0) >> 4);
sregs.ds = ((linearaddr & 0xFFFF0) >> 4);
/* 0x00 = Get Vbe2.0 Info */
inregs.x.ax = 0x4f00;
/* Indirizzo reale del nostro blocco */
inregs.x.di = linearaddr & 0x000F;
sregs.es = ((linearaddr & 0xFFFF0) >> 4);
sregs.ds = ((linearaddr & 0xFFFF0) >> 4);
 
/* Settiamo il VbeSignature correttamente */
VbeInfo.VbeSignature[0] = 'V';
VbeInfo.VbeSignature[1] = 'B';
VbeInfo.VbeSignature[2] = 'E';
VbeInfo.VbeSignature[3] = '2';
/* Settiamo il VbeSignature correttamente */
VbeInfo.VbeSignature[0] = 'V';
VbeInfo.VbeSignature[1] = 'B';
VbeInfo.VbeSignature[2] = 'E';
VbeInfo.VbeSignature[3] = '2';
 
memcpy((void *)linearaddr, &VbeInfo, sizeof(VbeInfo));
memcpy((void *)linearaddr, &VbeInfo, sizeof(VbeInfo));
 
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
if (vbe_check_status(outregs.x.ax) < 0)
return -1;
memcpy(&VbeInfo, (void *)linearaddr, sizeof(VbeInfo));
return 0;
}
if (vbe_check_status(outregs.x.ax) < 0)
return -1;
memcpy(&VbeInfo, (void *)linearaddr, sizeof(VbeInfo));
 
return 0;
}
}
 
void vbe_showmodes(void)
{
short int modec;
WORD list;
LIN_ADDR VideoModeaddr;
short int modec;
WORD list;
LIN_ADDR VideoModeaddr;
 
list=0;
VideoModeaddr = (LIN_ADDR)((VbeInfo.SupportedModesSegment<<4) + VbeInfo.SupportedModesOffset);
list=0;
VideoModeaddr = (LIN_ADDR)((VbeInfo.SupportedModesSegment<<4) + VbeInfo.SupportedModesOffset);
 
cprintf ("\nList of modes supported:\n");
do {
memcpy(&modec, VideoModeaddr, 2);
VideoModeaddr += 2;
if (modec != -1) cprintf (" %s ", VideoModeNames[modec - 0x100]);
list++;
if (list % 2 == 0) cprintf ("\n");
} while ((modec != -1) && (list < 40));
cprintf ("\nList of modes supported:\n");
do {
memcpy(&modec, VideoModeaddr, 2);
VideoModeaddr += 2;
if (modec != -1) cprintf (" %s ", VideoModeNames[modec - 0x100]);
list++;
if (list % 2 == 0) cprintf ("\n");
} while ((modec != -1) && (list < 40));
 
cprintf ("\nToal modes supported: %d", list);
cprintf ("\nToal modes supported: %d", list);
}
 
DWORD vbe_getmodeinfo(ModeInfoBlock *ModeInfo, WORD Vbe_Mode)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
LIN_ADDR dosaddr;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
LIN_ADDR dosaddr;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
if ((dosaddr = DOS_alloc(sizeof(ModeInfoBlock))) == 0) {
return(-1);
}
if ((dosaddr = DOS_alloc(sizeof(ModeInfoBlock))) == 0) {
return(-1);
}
 
/* 0x01 = Get Vbe Mode Info */
inregs.x.ax = 0x4f01;
inregs.x.cx = Vbe_Mode;
/* 0x01 = Get Vbe Mode Info */
inregs.x.ax = 0x4f01;
inregs.x.cx = Vbe_Mode;
 
inregs.x.di = (DWORD)dosaddr & 0x000F;
sregs.es = (((DWORD)dosaddr & 0xFFFF0) >> 4);
sregs.ds = (((DWORD)dosaddr & 0xFFFF0) >> 4);
inregs.x.di = (DWORD)dosaddr & 0x000F;
sregs.es = (((DWORD)dosaddr & 0xFFFF0) >> 4);
sregs.ds = (((DWORD)dosaddr & 0xFFFF0) >> 4);
 
#ifndef VM86
p1 = inp(0x21);
218,36 → 218,36
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
if (vbe_check_status (outregs.x.ax) < 0) {
return -1;
}
if (vbe_check_status (outregs.x.ax) < 0) {
return -1;
}
 
memcpy(ModeInfo, dosaddr, sizeof(ModeInfoBlock));
memcpy(ModeInfo, dosaddr, sizeof(ModeInfoBlock));
 
vbe_screen = ModeInfo->PhysBasePtr;
if(vbe_screen == -1) {
return -1;
}
return vbe_screen;
vbe_screen = ModeInfo->PhysBasePtr;
if(vbe_screen == -1) {
return -1;
}
return vbe_screen;
}
 
DWORD vbe_getflb(void)
{
return vbe_screen;
return vbe_screen;
}
 
int vbe_setmode (WORD Vbe_Mode)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
memset (&inregs, 0, sizeof(inregs));
/* Set Vesa Vbe mode */
inregs.x.ax = 0x4f02;
inregs.x.bx = Vbe_Mode;
memset (&inregs, 0, sizeof(inregs));
/* Set Vesa Vbe mode */
inregs.x.ax = 0x4f02;
inregs.x.bx = Vbe_Mode;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
259,31 → 259,29
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
 
return 1; //vbe_check_status (outregs.x.ax);
 
return 1; //vbe_check_status (outregs.x.ax);
}
 
WORD vbe_getbpr(ModeInfoBlock *ModeInfo)
{
return ModeInfo->BytesPerScanLine;
return ModeInfo->BytesPerScanLine;
}
 
int vbe_setbank(ModeInfoBlock *ModeInfo, BYTE bank)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
memset (&inregs, 0, sizeof(inregs));
memset (&sregs, 0, sizeof(sregs));
/* Set Window */
inregs.x.ax = 0x4f05;
inregs.h.bh = 0x00;
inregs.h.bl = 0x00;
inregs.x.dx = (64 / ModeInfo->WinGranularity) * bank;
memset (&inregs, 0, sizeof(inregs));
memset (&sregs, 0, sizeof(sregs));
/* Set Window */
inregs.x.ax = 0x4f05;
inregs.h.bh = 0x00;
inregs.h.bl = 0x00;
inregs.x.dx = (64 / ModeInfo->WinGranularity) * bank;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
295,10 → 293,10
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
return vbe_check_status (outregs.x.ax);
return vbe_check_status (outregs.x.ax);
}
 
DWORD vbe_getmem(void)
{
return (VbeInfo.TotalMemory<<6) * 1024;
return (VbeInfo.TotalMemory<<6) * 1024;
}
/shark/trunk/drivers/fb/fbmem.c
1342,80 → 1342,77
extern int linuxcomp_setfd(struct inode *i, int i_rdev);
 
/* Shark Inode emulation */
int fb_open_inode(int num) {
struct inode *i;
i = (struct inode *)kmalloc(sizeof(struct inode),GFP_KERNEL);
linuxcomp_setfd(i,num);
if (fb_open(i,NULL)) {
kfree(i);
return -1;
}
int fb_open_inode(int num)
{
struct inode *i;
 
kfree(i);
return 0;
i = (struct inode *)kmalloc(sizeof(struct inode),GFP_KERNEL);
 
linuxcomp_setfd(i,num);
 
if (fb_open(i,NULL)) {
kfree(i);
return -1;
}
 
kfree(i);
return 0;
}
 
/* Shark Inode emulation */
int fb_close_inode(int num) {
int fb_close_inode(int num)
{
struct inode *i;
 
struct inode *i;
i = (struct inode *)kmalloc(sizeof(struct inode),GFP_KERNEL);
 
i = (struct inode *)kmalloc(sizeof(struct inode),GFP_KERNEL);
linuxcomp_setfd(i,num);
 
linuxcomp_setfd(i,num);
if(fb_release(i,NULL)) {
kfree(i);
return -1;
}
 
if(fb_release(i,NULL)) {
kfree(i);
return -1;
}
kfree(i);
 
kfree(i);
return 0;
}
 
return 0;
int fb_set_mode_inode(int num, unsigned char *modeopt)
{
struct fb_var_screeninfo var;
struct fb_info *info = registered_fb[num];
struct fb_fillrect rect;
 
}
fb_find_mode(&var,info,modeopt,NULL,0,NULL,0);
 
int fb_set_mode_inode(int num, unsigned char *modeopt) {
var.xoffset = 0;
var.yoffset = 0;
var.xres_virtual = var.xres;
var.yres_virtual = var.yres;
 
struct fb_var_screeninfo var;
struct fb_info *info = registered_fb[num];
struct fb_fillrect rect;
if (info->fbops->fb_check_var)
info->fbops->fb_check_var(&var, info);
 
fb_find_mode(&var,info,modeopt,NULL,0,NULL,0);
memcpy(&(info->var),&var,sizeof(struct fb_var_screeninfo));
 
var.xoffset = 0;
var.yoffset = 0;
var.xres_virtual = var.xres;
var.yres_virtual = var.yres;
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
fb_pan_display(info, &info->var);
 
if (info->fbops->fb_check_var)
info->fbops->fb_check_var(&var, info);
memcpy(&(info->var),&var,sizeof(struct fb_var_screeninfo));
if (info->var.bits_per_pixel > 8)
info->fix.visual = FB_VISUAL_TRUECOLOR;
 
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
fb_pan_display(info, &info->var);
rect.dx = 0;
rect.dy = 0;
rect.width = info->var.xres;
rect.height = info->var.yres;
rect.color = 0;
rect.rop = ROP_COPY;
 
if (info->var.bits_per_pixel > 8)
info->fix.visual = FB_VISUAL_TRUECOLOR;
cfb_fillrect(info,&rect);
 
rect.dx = 0;
rect.dy = 0;
rect.width = info->var.xres;
rect.height = info->var.yres;
rect.color = 0;
rect.rop = ROP_COPY;
cfb_fillrect(info,&rect);
return 0;
return 0;
}
 
/**