一种动态识别和配置外接显示器的方法

文档序号:6427811阅读:303来源:国知局
专利名称:一种动态识别和配置外接显示器的方法
技术领域
本发明涉及显示器热插拔技术领域,尤其是一种通过定时获取显示器的EDID数据来动态识别和配置外接显示器的方法。
背景技术
显示器热插拔检测HPD (Hot Plugging Detect),是从显示器输出送往计算机主机的一个检测信号。热插拔检测的作用是当数字显示器通过HDMI/DVI (High Definition Multimedia Interface/Digital Visual hterface,高清晰度多媒体接口 / 数字视频接口)接口与计算机主机相连或断开连接时,计算机主机能够通过HDMI/DVI的HPD引脚检测出这一事件,并做出响应。但是,早期的显示接口 VGA (Video Graphics Array,视频图形阵列)由于硬件结构中没有设计热插拔引脚,无法主动发送HPD信号到主机,导致主机无法获知一个VGA显示器的连接与断开,从而不能调整相应的显卡工作模式符合当前显示器的最佳规格,导致新的显示器连接后,显示器显示的分辨率仍旧是先前显示器的输出格式,或者超出当前显示器的输出范围,显示器黑屏不工作。因此,目前的操作系统Windows、Linux等,至多只能在系统启动时,检测当前是否已经连接显示器,在进入系统之后,都无法对VGA显示器进行动态热插拔检测。

发明内容
为了解决上述问题,实现VGA显示器的热插拔技术,本发明提出了一种通过定时获取显示器的EDID数据来动态识别和配置外接显示器的方法,该方法通过定时获取显示器的EDID (Extended Display Identification Data,扩展显示标识数据)数据,实现主动探测显示器的功能,在发现显示器被更换后,能够获取新插入的显示器的EDID数据,并根据此数据进行显卡工作模式的重新设定,从而解决无法对VGA显示器进行动态热插拔检测的问题。为了实现上述目的,本发明所采用的技术方案是一种动态识别和配置外接显示器的方法,包括以下步骤
步骤一打开一个I2Canter — Integrated Circuit)设备,根据该I2C设备的对象句柄,通过 SMBUS (SYSTEM MANAGEMENT BUS)总线获取该 I2C 设备的 EDID(Extended Display Identification Data,扩展显示标识数据)数据,如果获取EDID数据成功,则转步骤二 ;如果获取EDID数据失败,则关闭该I2C设备,转步骤一打开下一个I2C设备;
步骤二 对获取的该EDID数据进行有效性检测,如果该EDID数据有效,则缓存一组该 I2C设备有效的EDID数据和该I2C设备的对象句柄,转步骤三;如果该EDID数据无效,则转步骤一打开下一个I2C设备;
步骤三间隔一定时间,使用之前保存的I2C设备的对象句柄再次通过SMBUS总线获取该I2C设备的EDID数据,并对获取的该EDID数据进行有效性检测,如果通过有效性检测,转步骤四;如果未通过有效性检测,则转步骤三;
步骤四对两组该I2C设备有效的EDID数据进行比较,如果两组数据不同,则后一组该 I2C设备有效的EDID数据为新的显示器所提供,根据EDID数据的结构定义,从该后一组数据中解析出新的显示器的最佳分辨率和刷新率数据,并依据该最佳分辨率和刷新率数据重新设定显卡工作模式,然后缓存新的一组EDID数据用以替换旧的EDID数据,转步骤三;如果两组EDID数据相同,则转步骤三。优选的,所述有效性检测包括
检测所获取的EDID数据的数据头,一个有效的EDID数据的数据头为7 Byte,内容为{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},如果是,进行下一步检测;如果否,该 EDID数据无效;
检测所获取的EDID数据的校验和,一个有效的EDID数据长度为128Byte,每一个Byte 数据进行累加,累加的和值必须为0,如果是,该EDID数据有效;如果否,该EDID数据无效。优选的,所述间隔一定时间为5秒到15秒。优选的,所述新的显示器的最佳分辨率和刷新率数据来源于后一组该I2C设备有效的EDID数据的数据结构中起始偏移地址为0x36h的18个Byte。优选的,所述步骤一之前还包括以下步骤动态分配内存,用于存储EDID数据。本发明通过这些步骤,定时的对I2C设备进行访问,获取当前时刻的EDID数据,并通过检测和比较,判断当前有无新的显示器插入,当发现新显示器插入时,即可根据获取到的数据重新设定显卡工作模式,从而自动根据新显示器的最佳分辨率显示出Linux操作系统桌面,避免了显示器黑屏现象或者需要手动设定分辨率的的操作,从而实现了 VGA显示器用户模式下的热插拔检测和动态配置。


图1为本发明动态识别和配置外接显示器的方法一具体实施例的流程图。
具体实施例方式为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。本发明的总体方案是通过主动定时探测外置VGA显示器,获取并根据当前显示器最佳分辨率和刷新率重新设置显卡的工作模式。具体来说,本发明通过定时检测当前显示器中保存的EDID (扩展显示标识数据)数据信息,通过正确性检测以及差异比较,判断当前显示器是否已经被更换,如果发现当前显示器与先前不同,立即解析出当前显示器EDID中保存的最佳分辨率和刷新率,然后根据新的分辨率和刷新率重新设置显卡的工作模式,防止用户因为热插拔更换VGA显示器导致的显示器分辨率无法自动调整为最佳模式或者显卡输出超出分辨率取值范围导致显示器黑屏不正常输出。为使本发明的特征及细节得到更清楚的了解,特结合附图1详细解说本发明所述方法在主机是Linux操作系统下具体实施例的所有步骤
1)步骤Sl 内存分配。
4
程序首次安装时会做如下设置在系统启动后系统会加载i2C_dev. ko模块,在/ dev/目录下生成所有的I2C设备文件,设置I2C设备文件的访问权限,使得普通用户在登入桌面后可以在当前权限下访问这些设备文件。这些设置是程序能够正常工作的前提条件。 程序启动后,首先使用malloc动态分配内存用于暂存新的EDID数据和缓存旧的EDID数据。2)步骤S2 打开I2C设备。当程序运行后,首先访问/dev/目录下的I2C设备文件,如果文件不存在,则退出程序,否则即按照顺序先打开其中的一个I2C设备。3 )步骤S3 SMBUS数据传输验证。当访问I2C设备成功后,通过IO CONTROL (系统IO端口调用)的方式设置其DDC (DISPLAY DATA CHANNEL)协议从地址为 0x50,然后通过系统调用 i2c_smbus_read_byte_ data方法通过SMBUS (SYSTEM MANAGEMENT BUS)总线获取EDID数据,如果获取失败,说明此设备不支持SMBUS传输,关闭此设备,继续访问下一个I2C设备。如果遍历完所有设备,找不到一个有效的支持SMBUS传输的设备,退出程序。4)步骤S4 有效性检测,即数据头、校验和检测。对获取得到的EDID数据,进行数据头的检测,校验和的检测。一个有效的EDID 数据前 7 Byte 必须为{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},当数据头符合时, 还需要进行数据完整性检查,即校验和检测,一个有效的EDID数据长度为128Byte,每一个 Byte数据进行累加,累加的和值必须为0。如果检测结果为,获取得到的EDID数据是无效的,则返回重新获取一个新的EDID设备,寻求一个有效的EDID数据。5)步骤S5 缓存当前EDID。如果通过有效性检测,即认为找到了一个有效的、可以获取正确EDID的I2C设备, 此时保存当前设备的对象句柄和缓存获取到的EDID数据。6)步骤 S6 SMBUS 获取 EDID。由于SMBUS获取EDID是一个类似于死循环的程序,CPU占用比较高,选取的时间间隔太短了,程序跑的太频繁会影响CPU的使用;选取的时间间隔太长了,用户一旦作出插拔操作会响应产生延迟,因此,时间间隔范围最好在5-1 之间,一般选择为10s。每隔5-15s,再次使用保存的设备对象句柄,使用SMBUS调用主动获取新的EDID数据。7)步骤S7 数据头、校验和检测。重新对新获取的EDID数据进行数据头检测,校验和检测,获取到新的有效EDID数据。8)步骤S8 与缓存EDID进行比较。使用新的数据与之前缓存的EDID数据进行二进制比较,用于判断是否有一个新的VGA显示器已经连接。当两组数据不相同时,表示一个新的显示器已经被插上。9)步骤S9 解析当前EDID。当发现有新的显示器已经连接时,解析新EDID数据结构中起始偏移地址为0x36h 的18个Byte用以获取到此数据中保存的新显示器最佳分辨率和最佳刷新率。其中新EDID 数据结构中起始偏移地址为0x36h的18个Byte为显示器细节时钟描述的第一部分,此
5ISByte完整保存了当前显示的序列好号,显示器名称,最佳分辨率,最佳刷新率,以及一些被支持的其他数据。10)步骤SlO 设置最佳分辨率刷新率。通过系统调用的方式将新显示器最佳分辨率和最佳刷新率发送到显卡,重新设定显卡的工作模式,使之符合新显示器的最佳工作模式。当工作模式设定完成后,保存新EDID 数据到缓存中用以替换旧的数据,然后开始新一轮的显示器探测流程。需要说明的是,本发明涉及流程和程序在本实施例中是基于Linux操作系统实现的,能够在Linux桌面环境下定时主动探测外置VGA显示器的热插拔,并根据显示器的EDID 信息,动态配置显卡输出符合新插入显示器的最佳分辨率和刷新率的方法。本发明所述方法和流程亦可适用于Windows操作系统。其中,获取EDID和设置分辨率的方法会因系统平台的不同略有差异,在此不一一列举赘述。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种动态识别和配置外接显示器的方法,其特征在于,包括以下步骤步骤一打开一个I2C设备,根据该I2C设备的对象句柄,通过SMBUS总线获取该I2C 设备的EDID数据,如果获取EDID数据成功,则转步骤二 ;如果获取EDID数据失败,则关闭该I2C设备,转步骤一打开下一个I2C设备;步骤二 对获取的该EDID数据进行有效性检测,如果该EDID数据有效,则缓存一组该 I2C设备有效的EDID数据和该I2C设备的对象句柄,转步骤三;如果该EDID数据无效,则转步骤一打开下一个I2C设备;步骤三间隔一定时间,使用之前保存的I2C设备的对象句柄再次通过SMBUS总线获取该I2C设备的EDID数据,并对获取的该EDID数据进行有效性检测,如果通过有效性检测, 转步骤四;如果未通过有效性检测,则转步骤三;步骤四对两组该I2C设备有效的EDID数据进行比较,如果两组数据不同,则后一组该 I2C设备有效的EDID数据为新的显示器所提供,根据EDID数据的结构定义,从该后一组数据中解析出新的显示器的最佳分辨率和刷新率数据,并依据该最佳分辨率和刷新率数据重新设定显卡工作模式,然后缓存新的一组EDID数据用以替换旧的EDID数据,转步骤三;如果两组EDID数据相同,则转步骤三。
2.如权利要求1所述的方法,其特征在于,所述有效性检测包括检测所获取的EDID数据的数据头,一个有效的EDID数据的数据头为7 Byte,内容为{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},如果是,进行下一步检测;如果否,该 EDID数据无效;检测所获取的EDID数据的校验和,一个有效的EDID数据长度为128Byte,每一个Byte 数据进行累加,累加的和值必须为0,如果是,该EDID数据有效;如果否,该EDID数据无效。
3.如权利要求1所述的方法,其特征在于,所述间隔一定时间为5秒到15秒。
4.如权利要求1所述的方法,其特征在于,所述新的显示器的最佳分辨率和刷新率数据来源于后一组该I2C设备有效的EDID数据的数据结构中起始偏移地址为0x36h的18个 Byte0
5.如权利要求1、2、3或4所述的方法,其特征在于,所述步骤一之前还包括以下步骤 动态分配内存,用于存储EDID数据。
全文摘要
本发明涉及一种动态识别和配置外接显示器的方法,该方法主动定时探测外置VGA显示器,能够获取并根据当前显示器最佳分辨率和刷新率重新设置显卡的工作模式。本发明通过定时检测当前显示器中保存的EDID(扩展显示标识数据)数据信息,通过正确性检测以及差异比较,判断当前显示器是否已经被更换,如果发现当前显示器与先前不同,立即解析出当前显示器EDID中保存的最佳分辨率和刷新率,然后根据新的分辨率和刷新率重新设置显卡的工作模式,防止用户因为热插拔更换VGA显示器导致的显示器分辨率无法自动调整为最佳模式或者显卡输出超出分辨率取值范围导致显示器黑屏不正常输出。
文档编号G06F3/14GK102455886SQ20111018522
公开日2012年5月16日 申请日期2011年7月5日 优先权日2011年7月5日
发明者张伟 申请人:中标软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1