Monitor Hot Plug Detection(MSDN翻译)

Monitor Hot Plug Detection

显卡上的Video output被看作是显卡的一个子设备。而monitor或者其他连接到output上的外部显示设备不会当作一个子设备。在初始化时,KMD的DxgkDdiQueryChildRelations函数给每个子设备指定一个类型和HPD awareness值。类型是DXGK_CHILD_DEVICE_TYPE枚举中的一个值。

  • TypeVideoOutput

  • TypeOther

HPD awareness值是DXGK_CHILD_DEVICE_HPD_AWARENESS枚举中的一个值

  • HpdAwarenessAlwaysConnected

  • HpdAwarenessInterruptible

  • HpdAwarenessPolled

TypeVideoOutput类型且任何 HPD awareness 值不为HpdAwarenessAlwaysConnected 的子设备被称作video output connector。

如果KMD不能确定monitor是否被连接到了Video output上,驱动应该模拟一个可中断设备的行为,HPD awareness值被设置为HpdAwarenessInterruptible。如果KMD需要指定一个可终端monitor被连接到Video output上时,例如当用户键入切换到television视图的快捷键时,驱动应该调用DxgkCbIndicateChildStatus函数,其中ChildStatus.HotPlug.Connected 参数为TRUE

OS会请求KMD报告所有的HPD awareness值为HpdAwarenessPolled的Video output connector的状态,该请求没有固定轮询间隔,而是系统认为需要更新可用显示设备及其mode时进行请求。例如,当笔记本连接到docking时,OS需要知道是否一个monitor被连接到了docking的video output上。OS会通过为每个HPD awareness值为HpdAwarenessPolled的子设备调用KMD的DxgkDdiQueryChildStatus函数来完成此请求。

对于每个HPD awareness为HpdAwarenessInterruptible的Video output connector, KMD会在外部显示设备插入或者拔出的时候负责通知操作系统。KMD的中断处理代码调用显示端口驱动的DxgkCbIndicateChildStatus函数来上报video output连接或者断开的外部显示设备。当笔记本插入docking时,KMD的DxgkDdiNofityAcpiEvent中必须为每个docking上的HPD awareness 值为HpdAwarenessInterruptible 的Video output调用DxgkCbIndicateChildStatus。

在笔记本在docking上时,如果HPD awareness 值为HpdAwarenessPolled的output变为无效时(例如合上盖),KMD的DxgkDdiNotiryAcpiEvent函数中必须调用DxgkCbIndicateChildStatus来上报output上的连接状态。

在笔记本上Video output关联到嵌入显示panel是一个特殊的情况。OS需要知道盖子的状态是打开还是盖上。这时连接的意思代表着盖子打开,而断开代表着盖子合上。在笔记本上关联着嵌入显示显示器的Video output的HPD awareness 值为HpdAwarenessInterruptible。但是这不意味着显卡会在盖子打开或合上时会产生一个中断,而是由ACPI BIOS在盖子打开或者合上时产生一个中断。这个中断会导致系统调用KMD的DxgkDdiNotifyAcpiEvent,其中会调用DxgkCbIndicateChildStatus上报盖子的状态。KMD通过设置DXGK_CHILD_STATUS结构中HotPlug.Connected成员上报状态,True为Open,False为Close。DXGK_CHILD_STATUS为DxgkCbIndicateChildStatus 的一个参数。

下列描述了当一个monitor连接到HD15 connector上的后续操作,假设这个connector的HPD awarenesss值为HpdAwarenessPolled

  1. 当monitor连接到显卡的HD15 connector上时。显卡并不会检测到相应的hot-plug事件。

  2. 应用程序会在某时请求一个显示设备的列表。

  3. 对于显卡上的每个HPD awareness 值为HpdAwarenessPolled的Video output connector,VidPN管理器调用KMD的DxgkDdiQueryChildStatus函数来确定是否连接有外部显示设备。当DxgkDdiQueryChildStatus调用询问HD15 connector时,驱动会上报此时的确有一个外部显示设备相连。

下列描述了当一个monitor连接到DVI connector上的后续操作,假设这个connector的HPD awarenesss值为HpdAwarenessInterruptible

  1. 平面显示器连接到显卡上DVI connector。

  2. 显卡会检测到hot-plug事件,然后生成一个中断。

  3. 这个中断由KMD的DxgkDdiInterruptRoutine处理,其中调用会创建一个DPC(Deferred procedure call)。之后KMD得DPC routine会被调用。

  4. DPC回调传入DXGK_CHILD_STATUS给显示端口驱动DxgkCbIndicateChildStatus上报DVI connector的状态。DXGK_CHILD_STATUS的ChildUid成员标识了这个DVI connector,HotPlug.Connected成员为TRUE标识了该connector上有一个外接的显示设备。

假设DVI connector支持一个三个分支的转接器:DVI, HD15和S-Video。这时KMD会线枚举这这个物理DVI connector上的三个子设备: DVI-on-DVI,HD15-on-DVI,和 S-Video-on-DVI。每个子设备会拥有一个TypeVideoOutput 类型和为HpdAwarenessInterruptible的HPD awareness 值。下列描述了当一个monitor连接到HD15这个分支时的操作步骤

  1. 显卡检测到了hot-plug事件并产生一个中断。

  2. KMD的DxgkDdiInterruptRoutine处理这个中断,其中调度一个DPC,接下来KMD的DPC回调被调用。

  3. DPC回调确定了这个hot-plug事件由HD15这个分支产生(HD15-on-DVI)。

  4. DPC回调传入DXGK_CHILD_STATUS给DxgkCbIndicateChildStatus上报HD15-on-DVI Video output的状态。DXGK_CHILD_STATUS的ChildUid成员标识了这个video output 以及HotPlug.Connected 成员为TRUE表示了有外部设备连接到了这个output上。

下面描述了合上盖时笔记本的一些操作步骤

  1. 笔记本合上盖时,会产生一个ACPI事件,接下来KMD的DxgkDdiNotifyAcpiEvent会被调用。

  2. DxgkDdiNofifyAcpiEvent中将DXGK_CHILD_STATUS参数传给显示端口驱动的DxgkCbIndicateChildStatus 回调来上报内建显示显示面板的子设备状态。DxgkDdiNotifyAcpiEvent 会设置 DXGK_CHILD_STATUS的成员HotPlug.Connected 为FALSE。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值