From: John Hodge Date: Thu, 28 Jul 2011 13:10:40 +0000 (+0800) Subject: Kernel - Implemented fallback to VGA when VESA is unavaliable X-Git-Tag: rel0.10~27 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=75a4b9b73ca624eae571477741ac853e39871c90;p=tpg%2Facess2.git Kernel - Implemented fallback to VGA when VESA is unavaliable - Reworked parts of VTerm for it. - Also fixed bugs in drvutil --- diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index d2bdd81d..8a3bd26f 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -19,6 +19,7 @@ #define MAX_INPUT_CHARS8 (MAX_INPUT_CHARS32*4) //#define DEFAULT_OUTPUT "BochsGA" #define DEFAULT_OUTPUT "Vesa" +#define FALLBACK_OUTPUT "x86_VGAText" #define DEFAULT_INPUT "PS2Keyboard" #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 @@ -108,7 +109,7 @@ const Uint16 caVT100Colours[] = { }; // === GLOBALS === -MODULE_DEFINE(0, VERSION, VTerm, VT_Install, NULL, DEFAULT_OUTPUT, DEFAULT_INPUT, NULL); +MODULE_DEFINE(0, VERSION, VTerm, VT_Install, NULL, FALLBACK_OUTPUT, DEFAULT_INPUT, NULL); tDevFS_Driver gVT_DrvInfo = { NULL, "VTerm", { @@ -168,11 +169,11 @@ int VT_Install(char **Arguments) Log_Debug("VTerm", "Argument '%s'", arg); if( strcmp(opt, "Video") == 0 ) { - if( !gsVT_OutputDevice && Modules_InitialiseBuiltin( val ) == 0 ) + if( !gsVT_OutputDevice ) gsVT_OutputDevice = strdup(val); } else if( strcmp(opt, "Input") == 0 ) { - if( !gsVT_InputDevice && Modules_InitialiseBuiltin( val ) == 0 ) + if( !gsVT_InputDevice ) gsVT_InputDevice = strdup(val); } else if( strcmp(opt, "Width") == 0 ) { @@ -188,16 +189,21 @@ int VT_Install(char **Arguments) } // Apply Defaults - if(!gsVT_OutputDevice) gsVT_OutputDevice = strdup(DEFAULT_OUTPUT); - if(!gsVT_InputDevice) gsVT_InputDevice = strdup(DEFAULT_INPUT); + if(!gsVT_OutputDevice) gsVT_OutputDevice = (char*)DEFAULT_OUTPUT; + else if( Module_EnsureLoaded( gsVT_OutputDevice ) ) gsVT_OutputDevice = (char*)DEFAULT_OUTPUT; + if( Module_EnsureLoaded( gsVT_OutputDevice ) ) gsVT_OutputDevice = (char*)FALLBACK_OUTPUT; - // Create paths + if(!gsVT_InputDevice) gsVT_InputDevice = (char*)DEFAULT_INPUT; + else if( Module_EnsureLoaded( gsVT_InputDevice ) ) gsVT_InputDevice = (char*)DEFAULT_INPUT; + + // Create device paths { char *tmp; tmp = malloc( 9 + strlen(gsVT_OutputDevice) + 1 ); strcpy(tmp, "/Devices/"); strcpy(&tmp[9], gsVT_OutputDevice); gsVT_OutputDevice = tmp; + tmp = malloc( 9 + strlen(gsVT_InputDevice) + 1 ); strcpy(tmp, "/Devices/"); strcpy(&tmp[9], gsVT_InputDevice); @@ -244,7 +250,6 @@ int VT_Install(char **Arguments) // Set kernel output to VT0 Debug_SetKTerminal("/Devices/VTerm/0"); - Log_Log("VTerm", "Returning %i", MODULE_ERR_OK); return MODULE_ERR_OK; } @@ -318,12 +323,15 @@ void VT_SetResolution(int Width, int Height) // Resize the text terminals giVT_RealWidth = mode.width; giVT_RealHeight = mode.height; + Log_Debug("VTerm", "Resizing terminals to %ix%i", + giVT_RealWidth/giVT_CharWidth, giVT_RealHeight/giVT_CharHeight); for( i = 0; i < NUM_VTS; i ++ ) { if( gVT_Terminals[i].Mode != TERM_MODE_TEXT ) continue; gVT_Terminals[i].TextWidth = giVT_RealWidth/giVT_CharWidth; gVT_Terminals[i].TextHeight = giVT_RealHeight/giVT_CharHeight; + gVT_Terminals[i].ScrollHeight = gVT_Terminals[i].TextHeight; gVT_Terminals[i].Text = realloc( gVT_Terminals[i].Text, @@ -1465,6 +1473,7 @@ void VT_int_ScrollFramebuffer( tVTerm *Term, int Count ) // BLIT to 0,0 from 0,giVT_CharHeight buf.Op = VIDEO_2DOP_BLIT; buf.SrcX = 0; buf.DstX = 0; + // TODO: Don't assume character dimensions buf.W = Term->TextWidth * giVT_CharWidth; if( Count > 0 ) { diff --git a/Kernel/drvutil.c b/Kernel/drvutil.c index a96e2227..1bc6b785 100644 --- a/Kernel/drvutil.c +++ b/Kernel/drvutil.c @@ -26,7 +26,7 @@ Uint64 DrvUtil_Video_2DStream(void *Ent, void *Buffer, int Length, " operation %i", op); } - if(op*4 > SizeofHandlers) { + if(op*sizeof(void*) > SizeofHandlers) { Log_Warning("DrvUtil", "DrvUtil_Video_2DStream: Driver does" " not support op %i", op); return Length-rem; @@ -49,7 +49,7 @@ Uint64 DrvUtil_Video_2DStream(void *Ent, void *Buffer, int Length, Ent, ((Uint16*)stream)[0], ((Uint16*)stream)[1], ((Uint16*)stream)[2], ((Uint16*)stream)[3], - ((Uint32*)stream)[4] + ((Uint32*)stream)[2] ); rem -= 12; @@ -72,7 +72,7 @@ Uint64 DrvUtil_Video_2DStream(void *Ent, void *Buffer, int Length, ((Uint16*)stream)[4], ((Uint16*)stream)[5] ); - rem -= 16; + rem -= 12; stream = (void*)((tVAddr)stream + 12); break; diff --git a/Kernel/modules.c b/Kernel/modules.c index 1dc11499..786d409d 100644 --- a/Kernel/modules.c +++ b/Kernel/modules.c @@ -13,12 +13,14 @@ int Module_int_Initialise(tModule *Module, const char *ArgString); void Modules_int_GetBuiltinArray(void); void Modules_LoadBuiltins(void); -void Modules_SetBuiltinParams(char *Name, char *ArgString); +void Modules_SetBuiltinParams(const char *Name, char *ArgString); + int Modules_InitialiseBuiltin(const char *Name); // int Module_RegisterLoader(tModuleLoader *Loader); // int Module_LoadMem(void *Buffer, Uint Length, char *ArgString); // int Module_LoadFile(char *Path, char *ArgString); int Module_int_ResolveDeps(tModule *Info); int Module_IsLoaded(const char *Name); +// int Module_EnsureLoaded(const char *Name); // === EXPORTS === EXPORT(Module_RegisterLoader); @@ -283,7 +285,7 @@ int Modules_InitialiseBuiltin(const char *Name) /** * \brief Sets the parameters for a builtin module */ -void Modules_SetBuiltinParams(char *Name, char *ArgString) +void Modules_SetBuiltinParams(const char *Name, char *ArgString) { int i; @@ -429,3 +431,19 @@ int Module_IsLoaded(const char *Name) // not found - return false return 0; } + +/** + * \brief Load a module if needed + */ +int Module_EnsureLoaded(const char *Name) +{ + if( Module_IsLoaded(Name) ) + return 0; + + if( Modules_InitialiseBuiltin(Name) == 0 ) + return 0; + + // TODO: Load from a file? + + return -1; +}