reactos操作系统实现(142)
VidInitialize函数主要进行VGA简单视频显示模式初始化。具体实现代码如下: #001 BOOLEAN #002 NTAPI #003 VidInitialize(IN BOOLEAN SetMode) #004 { #005 ULONG Context = 0; #006 PHYSICAL_ADDRESS TranslatedAddress; #007 PHYSICAL_ADDRESS NullAddress = {{0,0}}; #008 ULONG AddressSpace = 1; #009 BOOLEAN Result; #010 ULONG_PTR Base; #011 #012 /* Make sure that we have a bus translation function */
确保已经初始化地址总线转换回调函数。 #013 if (!HalFindBusAddressTranslation) return FALSE; #014 #015 /* Get the VGA Register address */
获取VGA的寄存器地址。 #016 Result = HalFindBusAddressTranslation(NullAddress, #017 &AddressSpace, #018 &TranslatedAddress, #019 &Context, #020 TRUE); #021 if (!Result) return FALSE; #022
检查是否需要映射I/O地址空间。 #023 /* See if this is I/O Space,which we need to map */ #024 TryAgain: #025 if (!AddressSpace) #026 { #027 /* Map it */ #028 Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress,0x400,MmNonCached); #029 } #030 else #031 { #032 /* The base is the translated address,no need to map I/O space */ #033 Base = TranslatedAddress.LowPart; #034 } #035 #036 /* Set the VGA Register base and now check if we have a VGA device */
保存VGA的寄存器地址。 #037 VgaRegisterBase = Base;
调用函数VgaIsPresent来判断VGA显示卡是否安装。 #038 if (VgaIsPresent()) #039 {
转换VGA显示内存地址。 #040 /* Translate the VGA Memory Address */ #041 NullAddress.LowPart = 0xA0000; #042 AddressSpace = 0; #043 Result = HalFindBusAddressTranslation(NullAddress, #044 &AddressSpace, #045 &TranslatedAddress, #046 &Context, #047 FALSE); #048 if (Result) #049 { #050 /* Success! See if this is I/O Space,which we need to map */
如果是I/O地址空间,就进行映射转换。 #051 if (!AddressSpace) #052 { #053 /* Map it */ #054 Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, #055 0x20000, #056 MmNonCached); #057 } #058 else #059 { #060 /* The base is the translated address,no need to map I/O space */ #061 Base = TranslatedAddress.LowPart; #062 } #063
设置VGA的内存基地址。 #064 /* Set the VGA Memory Base */ #065 VgaBase = Base; #066
是否需要显示图片模式。 #067 /* Now check if we have to set the mode */ #068 if (SetMode) #069 {
复位显示。 #070 /* Reset the display */ #071 HalResetDisplay(); #072 curr_x = 0; #073 curr_y = 0; #074 #075 /* Initialize it */
初始化VGA显示。 #076 VgaInterpretCmdStream(AT_Initialization); #077 return TRUE; #078 } #079 } #080 } #081 else #082 { #083 /* It's not,so unmap the I/O space if we mapped it */ #084 if (!AddressSpace) MmUnmapIoSpace((PVOID)VgaRegisterBase,0x400); #085 } #086
如果初始化失败,重新开始初始化。 #087 /* If we got here,then we failed...let's try again */ #088 Result = HalFindBusAddressTranslation(NullAddress, #089 &AddressSpace, #090 &TranslatedAddress, #091 &Context, #092 TRUE); #093 if (Result) goto TryAgain; #094
运行到这里就表示初始化VGA显示卡失败。 #095 /* If we got here,then we failed even past our re-try... */ #096 return FALSE; #097} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |