加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(142)

发布时间:2020-12-15 04:59:27 所属栏目:百科 来源:网络整理
导读:VidInitialize 函数主要进行 VGA 简单视频显示模式初始化。具体实现代码如下: #001 BOOLEAN #002 NTAPI #003 VidInitialize(IN BOOLEAN SetMode) #004 { #005 ULONG Context = 0; #006 PHYSICAL_ADDRESS TranslatedAddress; #007 PHYSICAL_ADDRESS NullAddr

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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读