專利名稱:一種動態(tài)識別和配置外接顯示器的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及顯示器熱插拔技術(shù)領(lǐng)域,尤其是一種通過定時獲取顯示器的EDID數(shù)據(jù)來動態(tài)識別和配置外接顯示器的方法。
背景技術(shù):
顯示器熱插拔檢測HPD (Hot Plugging Detect),是從顯示器輸出送往計算機主機的一個檢測信號。熱插拔檢測的作用是當數(shù)字顯示器通過HDMI/DVI (High Definition Multimedia Interface/Digital Visual hterface,高清晰度多媒體接口 / 數(shù)字視頻接口)接口與計算機主機相連或斷開連接時,計算機主機能夠通過HDMI/DVI的HPD引腳檢測出這一事件,并做出響應(yīng)。但是,早期的顯示接口 VGA (Video Graphics Array,視頻圖形陣列)由于硬件結(jié)構(gòu)中沒有設(shè)計熱插拔引腳,無法主動發(fā)送HPD信號到主機,導致主機無法獲知一個VGA顯示器的連接與斷開,從而不能調(diào)整相應(yīng)的顯卡工作模式符合當前顯示器的最佳規(guī)格,導致新的顯示器連接后,顯示器顯示的分辨率仍舊是先前顯示器的輸出格式,或者超出當前顯示器的輸出范圍,顯示器黑屏不工作。因此,目前的操作系統(tǒng)Windows、Linux等,至多只能在系統(tǒng)啟動時,檢測當前是否已經(jīng)連接顯示器,在進入系統(tǒng)之后,都無法對VGA顯示器進行動態(tài)熱插拔檢測。
發(fā)明內(nèi)容
為了解決上述問題,實現(xiàn)VGA顯示器的熱插拔技術(shù),本發(fā)明提出了一種通過定時獲取顯示器的EDID數(shù)據(jù)來動態(tài)識別和配置外接顯示器的方法,該方法通過定時獲取顯示器的EDID (Extended Display Identification Data,擴展顯示標識數(shù)據(jù))數(shù)據(jù),實現(xiàn)主動探測顯示器的功能,在發(fā)現(xiàn)顯示器被更換后,能夠獲取新插入的顯示器的EDID數(shù)據(jù),并根據(jù)此數(shù)據(jù)進行顯卡工作模式的重新設(shè)定,從而解決無法對VGA顯示器進行動態(tài)熱插拔檢測的問題。為了實現(xiàn)上述目的,本發(fā)明所采用的技術(shù)方案是一種動態(tài)識別和配置外接顯示器的方法,包括以下步驟
步驟一打開一個I2Canter — Integrated Circuit)設(shè)備,根據(jù)該I2C設(shè)備的對象句柄,通過 SMBUS (SYSTEM MANAGEMENT BUS)總線獲取該 I2C 設(shè)備的 EDID(Extended Display Identification Data,擴展顯示標識數(shù)據(jù))數(shù)據(jù),如果獲取EDID數(shù)據(jù)成功,則轉(zhuǎn)步驟二 ;如果獲取EDID數(shù)據(jù)失敗,則關(guān)閉該I2C設(shè)備,轉(zhuǎn)步驟一打開下一個I2C設(shè)備;
步驟二 對獲取的該EDID數(shù)據(jù)進行有效性檢測,如果該EDID數(shù)據(jù)有效,則緩存一組該 I2C設(shè)備有效的EDID數(shù)據(jù)和該I2C設(shè)備的對象句柄,轉(zhuǎn)步驟三;如果該EDID數(shù)據(jù)無效,則轉(zhuǎn)步驟一打開下一個I2C設(shè)備;
步驟三間隔一定時間,使用之前保存的I2C設(shè)備的對象句柄再次通過SMBUS總線獲取該I2C設(shè)備的EDID數(shù)據(jù),并對獲取的該EDID數(shù)據(jù)進行有效性檢測,如果通過有效性檢測,轉(zhuǎn)步驟四;如果未通過有效性檢測,則轉(zhuǎn)步驟三;
步驟四對兩組該I2C設(shè)備有效的EDID數(shù)據(jù)進行比較,如果兩組數(shù)據(jù)不同,則后一組該 I2C設(shè)備有效的EDID數(shù)據(jù)為新的顯示器所提供,根據(jù)EDID數(shù)據(jù)的結(jié)構(gòu)定義,從該后一組數(shù)據(jù)中解析出新的顯示器的最佳分辨率和刷新率數(shù)據(jù),并依據(jù)該最佳分辨率和刷新率數(shù)據(jù)重新設(shè)定顯卡工作模式,然后緩存新的一組EDID數(shù)據(jù)用以替換舊的EDID數(shù)據(jù),轉(zhuǎn)步驟三;如果兩組EDID數(shù)據(jù)相同,則轉(zhuǎn)步驟三。優(yōu)選的,所述有效性檢測包括
檢測所獲取的EDID數(shù)據(jù)的數(shù)據(jù)頭,一個有效的EDID數(shù)據(jù)的數(shù)據(jù)頭為7 Byte,內(nèi)容為{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},如果是,進行下一步檢測;如果否,該 EDID數(shù)據(jù)無效;
檢測所獲取的EDID數(shù)據(jù)的校驗和,一個有效的EDID數(shù)據(jù)長度為128Byte,每一個Byte 數(shù)據(jù)進行累加,累加的和值必須為0,如果是,該EDID數(shù)據(jù)有效;如果否,該EDID數(shù)據(jù)無效。優(yōu)選的,所述間隔一定時間為5秒到15秒。優(yōu)選的,所述新的顯示器的最佳分辨率和刷新率數(shù)據(jù)來源于后一組該I2C設(shè)備有效的EDID數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)中起始偏移地址為0x36h的18個Byte。優(yōu)選的,所述步驟一之前還包括以下步驟動態(tài)分配內(nèi)存,用于存儲EDID數(shù)據(jù)。本發(fā)明通過這些步驟,定時的對I2C設(shè)備進行訪問,獲取當前時刻的EDID數(shù)據(jù),并通過檢測和比較,判斷當前有無新的顯示器插入,當發(fā)現(xiàn)新顯示器插入時,即可根據(jù)獲取到的數(shù)據(jù)重新設(shè)定顯卡工作模式,從而自動根據(jù)新顯示器的最佳分辨率顯示出Linux操作系統(tǒng)桌面,避免了顯示器黑屏現(xiàn)象或者需要手動設(shè)定分辨率的的操作,從而實現(xiàn)了 VGA顯示器用戶模式下的熱插拔檢測和動態(tài)配置。
圖1為本發(fā)明動態(tài)識別和配置外接顯示器的方法一具體實施例的流程圖。
具體實施例方式為了使本發(fā)明的目的、技術(shù)方案及有益效果更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。本發(fā)明的總體方案是通過主動定時探測外置VGA顯示器,獲取并根據(jù)當前顯示器最佳分辨率和刷新率重新設(shè)置顯卡的工作模式。具體來說,本發(fā)明通過定時檢測當前顯示器中保存的EDID (擴展顯示標識數(shù)據(jù))數(shù)據(jù)信息,通過正確性檢測以及差異比較,判斷當前顯示器是否已經(jīng)被更換,如果發(fā)現(xiàn)當前顯示器與先前不同,立即解析出當前顯示器EDID中保存的最佳分辨率和刷新率,然后根據(jù)新的分辨率和刷新率重新設(shè)置顯卡的工作模式,防止用戶因為熱插拔更換VGA顯示器導致的顯示器分辨率無法自動調(diào)整為最佳模式或者顯卡輸出超出分辨率取值范圍導致顯示器黑屏不正常輸出。為使本發(fā)明的特征及細節(jié)得到更清楚的了解,特結(jié)合附圖1詳細解說本發(fā)明所述方法在主機是Linux操作系統(tǒng)下具體實施例的所有步驟
1)步驟Sl 內(nèi)存分配。
4
程序首次安裝時會做如下設(shè)置在系統(tǒng)啟動后系統(tǒng)會加載i2C_dev. ko模塊,在/ dev/目錄下生成所有的I2C設(shè)備文件,設(shè)置I2C設(shè)備文件的訪問權(quán)限,使得普通用戶在登入桌面后可以在當前權(quán)限下訪問這些設(shè)備文件。這些設(shè)置是程序能夠正常工作的前提條件。 程序啟動后,首先使用malloc動態(tài)分配內(nèi)存用于暫存新的EDID數(shù)據(jù)和緩存舊的EDID數(shù)據(jù)。2)步驟S2 打開I2C設(shè)備。當程序運行后,首先訪問/dev/目錄下的I2C設(shè)備文件,如果文件不存在,則退出程序,否則即按照順序先打開其中的一個I2C設(shè)備。3 )步驟S3 SMBUS數(shù)據(jù)傳輸驗證。當訪問I2C設(shè)備成功后,通過IO CONTROL (系統(tǒng)IO端口調(diào)用)的方式設(shè)置其DDC (DISPLAY DATA CHANNEL)協(xié)議從地址為 0x50,然后通過系統(tǒng)調(diào)用 i2c_smbus_read_byte_ data方法通過SMBUS (SYSTEM MANAGEMENT BUS)總線獲取EDID數(shù)據(jù),如果獲取失敗,說明此設(shè)備不支持SMBUS傳輸,關(guān)閉此設(shè)備,繼續(xù)訪問下一個I2C設(shè)備。如果遍歷完所有設(shè)備,找不到一個有效的支持SMBUS傳輸?shù)脑O(shè)備,退出程序。4)步驟S4 有效性檢測,即數(shù)據(jù)頭、校驗和檢測。對獲取得到的EDID數(shù)據(jù),進行數(shù)據(jù)頭的檢測,校驗和的檢測。一個有效的EDID 數(shù)據(jù)前 7 Byte 必須為{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},當數(shù)據(jù)頭符合時, 還需要進行數(shù)據(jù)完整性檢查,即校驗和檢測,一個有效的EDID數(shù)據(jù)長度為128Byte,每一個 Byte數(shù)據(jù)進行累加,累加的和值必須為0。如果檢測結(jié)果為,獲取得到的EDID數(shù)據(jù)是無效的,則返回重新獲取一個新的EDID設(shè)備,尋求一個有效的EDID數(shù)據(jù)。5)步驟S5 緩存當前EDID。如果通過有效性檢測,即認為找到了一個有效的、可以獲取正確EDID的I2C設(shè)備, 此時保存當前設(shè)備的對象句柄和緩存獲取到的EDID數(shù)據(jù)。6)步驟 S6 SMBUS 獲取 EDID。由于SMBUS獲取EDID是一個類似于死循環(huán)的程序,CPU占用比較高,選取的時間間隔太短了,程序跑的太頻繁會影響CPU的使用;選取的時間間隔太長了,用戶一旦作出插拔操作會響應(yīng)產(chǎn)生延遲,因此,時間間隔范圍最好在5-1 之間,一般選擇為10s。每隔5-15s,再次使用保存的設(shè)備對象句柄,使用SMBUS調(diào)用主動獲取新的EDID數(shù)據(jù)。7)步驟S7 數(shù)據(jù)頭、校驗和檢測。重新對新獲取的EDID數(shù)據(jù)進行數(shù)據(jù)頭檢測,校驗和檢測,獲取到新的有效EDID數(shù)據(jù)。8)步驟S8 與緩存EDID進行比較。使用新的數(shù)據(jù)與之前緩存的EDID數(shù)據(jù)進行二進制比較,用于判斷是否有一個新的VGA顯示器已經(jīng)連接。當兩組數(shù)據(jù)不相同時,表示一個新的顯示器已經(jīng)被插上。9)步驟S9 解析當前EDID。當發(fā)現(xiàn)有新的顯示器已經(jīng)連接時,解析新EDID數(shù)據(jù)結(jié)構(gòu)中起始偏移地址為0x36h 的18個Byte用以獲取到此數(shù)據(jù)中保存的新顯示器最佳分辨率和最佳刷新率。其中新EDID 數(shù)據(jù)結(jié)構(gòu)中起始偏移地址為0x36h的18個Byte為顯示器細節(jié)時鐘描述的第一部分,此
5ISByte完整保存了當前顯示的序列好號,顯示器名稱,最佳分辨率,最佳刷新率,以及一些被支持的其他數(shù)據(jù)。10)步驟SlO 設(shè)置最佳分辨率刷新率。通過系統(tǒng)調(diào)用的方式將新顯示器最佳分辨率和最佳刷新率發(fā)送到顯卡,重新設(shè)定顯卡的工作模式,使之符合新顯示器的最佳工作模式。當工作模式設(shè)定完成后,保存新EDID 數(shù)據(jù)到緩存中用以替換舊的數(shù)據(jù),然后開始新一輪的顯示器探測流程。需要說明的是,本發(fā)明涉及流程和程序在本實施例中是基于Linux操作系統(tǒng)實現(xiàn)的,能夠在Linux桌面環(huán)境下定時主動探測外置VGA顯示器的熱插拔,并根據(jù)顯示器的EDID 信息,動態(tài)配置顯卡輸出符合新插入顯示器的最佳分辨率和刷新率的方法。本發(fā)明所述方法和流程亦可適用于Windows操作系統(tǒng)。其中,獲取EDID和設(shè)置分辨率的方法會因系統(tǒng)平臺的不同略有差異,在此不一一列舉贅述。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所做的任何修改、等同替換和改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種動態(tài)識別和配置外接顯示器的方法,其特征在于,包括以下步驟步驟一打開一個I2C設(shè)備,根據(jù)該I2C設(shè)備的對象句柄,通過SMBUS總線獲取該I2C 設(shè)備的EDID數(shù)據(jù),如果獲取EDID數(shù)據(jù)成功,則轉(zhuǎn)步驟二 ;如果獲取EDID數(shù)據(jù)失敗,則關(guān)閉該I2C設(shè)備,轉(zhuǎn)步驟一打開下一個I2C設(shè)備;步驟二 對獲取的該EDID數(shù)據(jù)進行有效性檢測,如果該EDID數(shù)據(jù)有效,則緩存一組該 I2C設(shè)備有效的EDID數(shù)據(jù)和該I2C設(shè)備的對象句柄,轉(zhuǎn)步驟三;如果該EDID數(shù)據(jù)無效,則轉(zhuǎn)步驟一打開下一個I2C設(shè)備;步驟三間隔一定時間,使用之前保存的I2C設(shè)備的對象句柄再次通過SMBUS總線獲取該I2C設(shè)備的EDID數(shù)據(jù),并對獲取的該EDID數(shù)據(jù)進行有效性檢測,如果通過有效性檢測, 轉(zhuǎn)步驟四;如果未通過有效性檢測,則轉(zhuǎn)步驟三;步驟四對兩組該I2C設(shè)備有效的EDID數(shù)據(jù)進行比較,如果兩組數(shù)據(jù)不同,則后一組該 I2C設(shè)備有效的EDID數(shù)據(jù)為新的顯示器所提供,根據(jù)EDID數(shù)據(jù)的結(jié)構(gòu)定義,從該后一組數(shù)據(jù)中解析出新的顯示器的最佳分辨率和刷新率數(shù)據(jù),并依據(jù)該最佳分辨率和刷新率數(shù)據(jù)重新設(shè)定顯卡工作模式,然后緩存新的一組EDID數(shù)據(jù)用以替換舊的EDID數(shù)據(jù),轉(zhuǎn)步驟三;如果兩組EDID數(shù)據(jù)相同,則轉(zhuǎn)步驟三。
2.如權(quán)利要求1所述的方法,其特征在于,所述有效性檢測包括檢測所獲取的EDID數(shù)據(jù)的數(shù)據(jù)頭,一個有效的EDID數(shù)據(jù)的數(shù)據(jù)頭為7 Byte,內(nèi)容為{0x00,Oxff, Oxff, Oxff, Oxff, Oxff, Oxff, 0x00},如果是,進行下一步檢測;如果否,該 EDID數(shù)據(jù)無效;檢測所獲取的EDID數(shù)據(jù)的校驗和,一個有效的EDID數(shù)據(jù)長度為128Byte,每一個Byte 數(shù)據(jù)進行累加,累加的和值必須為0,如果是,該EDID數(shù)據(jù)有效;如果否,該EDID數(shù)據(jù)無效。
3.如權(quán)利要求1所述的方法,其特征在于,所述間隔一定時間為5秒到15秒。
4.如權(quán)利要求1所述的方法,其特征在于,所述新的顯示器的最佳分辨率和刷新率數(shù)據(jù)來源于后一組該I2C設(shè)備有效的EDID數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)中起始偏移地址為0x36h的18個 Byte0
5.如權(quán)利要求1、2、3或4所述的方法,其特征在于,所述步驟一之前還包括以下步驟 動態(tài)分配內(nèi)存,用于存儲EDID數(shù)據(jù)。
全文摘要
本發(fā)明涉及一種動態(tài)識別和配置外接顯示器的方法,該方法主動定時探測外置VGA顯示器,能夠獲取并根據(jù)當前顯示器最佳分辨率和刷新率重新設(shè)置顯卡的工作模式。本發(fā)明通過定時檢測當前顯示器中保存的EDID(擴展顯示標識數(shù)據(jù))數(shù)據(jù)信息,通過正確性檢測以及差異比較,判斷當前顯示器是否已經(jīng)被更換,如果發(fā)現(xiàn)當前顯示器與先前不同,立即解析出當前顯示器EDID中保存的最佳分辨率和刷新率,然后根據(jù)新的分辨率和刷新率重新設(shè)置顯卡的工作模式,防止用戶因為熱插拔更換VGA顯示器導致的顯示器分辨率無法自動調(diào)整為最佳模式或者顯卡輸出超出分辨率取值范圍導致顯示器黑屏不正常輸出。
文檔編號G06F3/14GK102455886SQ20111018522
公開日2012年5月16日 申請日期2011年7月5日 優(yōu)先權(quán)日2011年7月5日
發(fā)明者張偉 申請人:中標軟件有限公司