X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FDisplay%2FVESA%2Fmain.c;h=0af86cbd65ecc76ee5ae377f722fc28ba52ccf4f;hb=4e407e69bd660e9a32644281733192193ee6e8c8;hp=25616da22fed03a08215feae40d6a2d3b62843c8;hpb=f919351a741890adaf30624ca51fd4c7b6d3ce62;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Display/VESA/main.c b/KernelLand/Modules/Display/VESA/main.c index 25616da2..0af86cbd 100644 --- a/KernelLand/Modules/Display/VESA/main.c +++ b/KernelLand/Modules/Display/VESA/main.c @@ -2,7 +2,7 @@ * AcessOS 1 * Video BIOS Extensions (Vesa) Driver */ -#define DEBUG 1 +#define DEBUG 0 #define VERSION 0x100 #include @@ -13,11 +13,14 @@ #include #include "common.h" #include +#include // === CONSTANTS === -#define FLAG_LFB 0x1 -#define FLAG_POPULATED 0x2 -#define FLAG_VALID 0x4 +#ifdef ARCHDIR_is_x86 +# define USE_BIOS 1 +#else +# define USE_BIOS 0 +#endif #define VESA_DEFAULT_FRAMEBUFFER (KERNEL_BASE|0xA0000) #define BLINKING_CURSOR 0 #if BLINKING_CURSOR @@ -34,6 +37,7 @@ size_t Vesa_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff int Vesa_Int_ModeInfo(tVideo_IOCtl_Mode *data); void Vesa_int_HideCursor(void); void Vesa_int_ShowCursor(void); + int Vesa_int_SetCursor(tVideo_IOCtl_Bitmap *Cursor); void Vesa_FlipCursor(void *Arg); Uint16 VBE_int_GetWord(const tVT_Char *Char); void VBE_int_Text_2D_Fill(void *Ent, Uint16 X, Uint16 Y, Uint16 W, Uint16 H, Uint32 Colour); @@ -56,7 +60,7 @@ tVM8086 *gpVesa_BiosState; int giVesaCurrentMode = 0; tVesa_Mode gVesa_BootMode = {0x03, 80*8, 25*16, 80*8*2, 12, FLAG_POPULATED, 80*25*2, 0xB8000}; tVesa_Mode *gVesa_Modes; -tVesa_Mode *gpVesaCurMode; +tVesa_Mode *gpVesaCurMode = &gVesa_BootMode; int giVesaModeCount = 0; int gbVesaModesChecked; // --- Framebuffer --- @@ -83,8 +87,6 @@ bool gbVesa_DisableBIOSCalls; // Disables calls to the BIOS // === CODE === int Vesa_Install(char **Arguments) { - int rv; - for( int i = 0; Arguments && Arguments[i]; i ++ ) { if( strcmp(Arguments[i], "nobios") == 0 ) @@ -96,13 +98,15 @@ int Vesa_Install(char **Arguments) } } + #if USE_BIOS if( !gbVesa_DisableBIOSCalls ) { gpVesa_BiosState = VM8086_Init(); - if( (rv = VBE_int_GetModeList()) ) - return rv; + int rv = VBE_int_GetModeList(); + if(rv) return rv; } + #endif #if BLINKING_CURSOR // Create blink timer @@ -116,6 +120,7 @@ int Vesa_Install(char **Arguments) return MODULE_ERR_OK; } +#if USE_BIOS int VBE_int_GetModeList(void) { tVesa_CallInfo *info; @@ -124,6 +129,10 @@ int VBE_int_GetModeList(void) // Allocate Info Block info = VM8086_Allocate(gpVesa_BiosState, 512, &infoPtr.seg, &infoPtr.ofs); + if( info == NULL ) { + Log_Warning("VBE", "VM8086 allocation error"); + return MODULE_ERR_NOTNEEDED; + } // Set Requested Version memcpy(info->signature, "VBE2", 4); // Set Registers @@ -174,6 +183,7 @@ int VBE_int_GetModeInfo(Uint16 Code, tFarPtr *BufPtr) } return 0; } +#endif void VBE_int_FillMode_Int(tVesa_Mode *Mode, const tVesa_CallModeInfo *vbeinfo) @@ -220,8 +230,9 @@ void VBE_int_FillMode_Int(tVesa_Mode *Mode, const tVesa_CallModeInfo *vbeinfo) S_LOG(*vbeinfo, image_count_lfb, "%i"); LOG("}"); #endif - + Mode->flags = FLAG_POPULATED; + // Check if this mode is supported by hardware if( !(vbeinfo->attributes & 1) ) { #if DEBUG @@ -245,7 +256,7 @@ void VBE_int_FillMode_Int(tVesa_Mode *Mode, const tVesa_CallModeInfo *vbeinfo) Mode->bpp = 0; return ; case 0x90: - Mode->flags |= FLAG_LFB; + Mode->flags |= FLAG_LFB|FLAG_GRAPHICS; Mode->framebuffer = vbeinfo->physbase; Mode->fbSize = vbeinfo->Yres*vbeinfo->pitch; break; @@ -271,6 +282,7 @@ void VBE_int_SetBootMode(Uint16 ModeID, const void *ModeInfo) void Vesa_int_FillModeList(void) { + #if USE_BIOS if( !gbVesaModesChecked && !gbVesa_DisableBIOSCalls ) { tVesa_CallModeInfo *modeinfo; @@ -288,6 +300,7 @@ void Vesa_int_FillModeList(void) gbVesaModesChecked = 1; } + #endif } /** @@ -295,35 +308,43 @@ void Vesa_int_FillModeList(void) */ size_t Vesa_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags) { - // Framebuffer modes - just pass on - if( gpVesaCurMode->flags & FLAG_LFB ) - return DrvUtil_Video_WriteLFB(&gVesa_BufInfo, Offset, Length, Buffer); - - // EGA text mode translation - switch( gVesa_BufInfo.BufferFormat ) + switch( gpVesaCurMode->flags & (FLAG_LFB|FLAG_GRAPHICS) ) { - case VIDEO_BUFFMT_TEXT: { - int num = Length / sizeof(tVT_Char); - int ofs = Offset / sizeof(tVT_Char); - int i = 0; - const tVT_Char *chars = Buffer; - Uint16 word; - - for( ; num--; i ++, ofs ++) + case 0: + // EGA text mode translation + switch( gVesa_BufInfo.BufferFormat ) { - word = VBE_int_GetWord( &chars[i] ); - ((Uint16*)gVesa_BufInfo.Framebuffer)[ ofs ] = word; + case VIDEO_BUFFMT_TEXT: { + int num = Length / sizeof(tVT_Char); + int ofs = Offset / sizeof(tVT_Char); + int i = 0; + const tVT_Char *chars = Buffer; + + for( ; num--; i ++, ofs ++) + { + Uint16 word = VBE_int_GetWord( &chars[i] ); + ((Uint16*)gVesa_BufInfo.Framebuffer)[ ofs ] = word; + } + + return Length; } + case VIDEO_BUFFMT_2DSTREAM: + return DrvUtil_Video_2DStream(NULL, Buffer, Length, + &gVBE_Text2DFunctions, sizeof(gVBE_Text2DFunctions)); + default: + Log_Warning("VBE", "TODO: Alternate modes in EGA text mode"); + return 0; } - - return Length; } - case VIDEO_BUFFMT_2DSTREAM: - return DrvUtil_Video_2DStream(NULL, Buffer, Length, - &gVBE_Text2DFunctions, sizeof(gVBE_Text2DFunctions)); + return 0; + case FLAG_LFB|FLAG_GRAPHICS: + // Framebuffer modes - use DrvUtil Video + return DrvUtil_Video_WriteLFB(&gVesa_BufInfo, Offset, Length, Buffer); default: - Log_Warning("VBE", "TODO: Alternate modes in EGA text mode"); + Log_Warning("VBE", "TODO: _Write %s%s", + (gpVesaCurMode->flags & FLAG_LFB ? "FLAG_LFB" : ""), + (gpVesaCurMode->flags & FLAG_GRAPHICS ? "FLAG_GRAPHICS" : "") + ); return 0; } - } const char *csaVESA_IOCtls[] = {DRV_IOCTLNAMES, DRV_VIDEO_IOCTLNAMES, NULL}; @@ -349,13 +370,16 @@ int Vesa_IOCtl(tVFS_Node *Node, int ID, void *Data) case VIDEO_IOCTL_SETBUFFORMAT: Vesa_int_HideCursor(); ret = gVesa_BufInfo.BufferFormat; - if(Data) gVesa_BufInfo.BufferFormat = *(int*)Data; + if(Data) + gVesa_BufInfo.BufferFormat = *(int*)Data; if(gVesa_BufInfo.BufferFormat == VIDEO_BUFFMT_TEXT) - DrvUtil_Video_SetCursor( &gVesa_BufInfo, &gDrvUtil_TextModeCursor ); + Vesa_int_SetCursor(&gDrvUtil_TextModeCursor); Vesa_int_ShowCursor(); return ret; case VIDEO_IOCTL_SETCURSOR: // Set cursor position + if( !CheckMem(Data, sizeof(tVideo_IOCtl_Pos)) ) + return -EINVAL; Vesa_int_HideCursor(); giVesaCursorX = ((tVideo_IOCtl_Pos*)Data)->x; giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y; @@ -363,8 +387,7 @@ int Vesa_IOCtl(tVFS_Node *Node, int ID, void *Data) return 0; case VIDEO_IOCTL_SETCURSORBITMAP: - DrvUtil_Video_SetCursor( &gVesa_BufInfo, Data ); - return 0; + return Vesa_int_SetCursor(Data); } return 0; } @@ -393,7 +416,8 @@ int Vesa_Int_SetMode(int mode) #endif Mutex_Acquire( &glVesa_Lock ); - + + #if USE_BIOS if( gbVesa_DisableBIOSCalls ) { ASSERT(mode == -1); @@ -412,20 +436,17 @@ int Vesa_Int_SetMode(int mode) LOG("Out: AX = %04x", gpVesa_BiosState->AX); } + #else + ASSERT(mode == -1); + #endif // Map Framebuffer if( gpVesaCurMode ) { - if( gpVesaCurMode->framebuffer < 1024*1024 ) - ; - else - MM_UnmapHWPages((tVAddr)gpVesa_Framebuffer, giVesaPageCount); + MM_UnmapHWPages(gpVesa_Framebuffer, giVesaPageCount); } giVesaPageCount = (modeptr->fbSize + 0xFFF) >> 12; - if( modeptr->framebuffer < 1024*1024 ) - gpVesa_Framebuffer = (void*)(KERNEL_BASE|modeptr->framebuffer); - else - gpVesa_Framebuffer = (void*)MM_MapHWPages(modeptr->framebuffer, giVesaPageCount); + gpVesa_Framebuffer = MM_MapHWPages(modeptr->framebuffer, giVesaPageCount); Log_Log("VBE", "Setting mode to %i 0x%x (%ix%i %ibpp) %p[0x%x] maps %P", mode, modeptr->code, @@ -454,6 +475,11 @@ int Vesa_Int_SetMode(int mode) int VBE_int_MatchModes(tVideo_IOCtl_Mode *ReqMode, tVesa_Mode *ThisMode) { + if( ThisMode->bpp == 0 ) { + Log_Warning("VBE", "VESA mode %x (%ix%i) has 0bpp", + ThisMode->code, ThisMode->width, ThisMode->height); + return INT_MAX; + } LOG("Matching %ix%i %ibpp", ThisMode->width, ThisMode->height, ThisMode->bpp); if(ThisMode->width == ReqMode->width && ThisMode->height == ReqMode->height) { @@ -551,9 +577,9 @@ int Vesa_Int_ModeInfo(tVideo_IOCtl_Mode *data) void Vesa_int_HideCursor(void) { + DrvUtil_Video_RemoveCursor( &gVesa_BufInfo ); if( gpVesaCurMode->flags & FLAG_LFB ) { - DrvUtil_Video_RemoveCursor( &gVesa_BufInfo ); #if BLINKING_CURSOR if(gpVesaCursorTimer) { Time_RemoveTimer(gpVesaCursorTimer); @@ -564,7 +590,7 @@ void Vesa_int_HideCursor(void) void Vesa_int_ShowCursor(void) { - if( gpVesaCurMode->flags & FLAG_LFB ) + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) { gbVesa_CursorVisible = (giVesaCursorX >= 0); if(gVesa_BufInfo.BufferFormat == VIDEO_BUFFMT_TEXT) @@ -585,6 +611,25 @@ void Vesa_int_ShowCursor(void) giVesaCursorY ); } + else + { + DrvUtil_Video_RemoveCursor( &gVesa_BufInfo ); + } +} + +int Vesa_int_SetCursor(tVideo_IOCtl_Bitmap *Cursor) +{ + if( !CheckMem(Cursor, sizeof(tVideo_IOCtl_Bitmap)) ) + return -EINVAL; + + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) + { + DrvUtil_Video_SetCursor( &gVesa_BufInfo, Cursor ); + } + else + { + } + return 0; } /** @@ -595,7 +640,7 @@ void Vesa_FlipCursor(void *Arg) if( gVesa_BufInfo.BufferFormat != VIDEO_BUFFMT_TEXT ) return ; - if( gpVesaCurMode->flags & FLAG_LFB ) + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) { if( gbVesa_CursorVisible ) DrvUtil_Video_RemoveCursor(&gVesa_BufInfo);