天天看點

UEFI開發探索30 –滑鼠初探

(請保留-> 作者: 羅冰   https://blog.csdn.net/luobing4365)

我的UEFI開發探索的系列部落格,一直都有一根主線的存在,那就是在測試闆上把UEFI的Option ROM開發出來。

回想到目前為止,總線及裝置通路:PCI、Smbus、序列槽,都已經實作過了(序列槽實作不大完美,但在測試闆上不需要使用);界面相關:螢幕畫圖、文字顯示、圖像(BMP、PCX、JPEG)顯示,也已經完成;使用者互動:鍵盤已經完成,滑鼠還沒有寫。

也就是說,滑鼠探索完成後,隻剩下建構Option ROM架構,這條主線就完成了。

UEFI開發探索系列已經進入中期了。

在完成主線之後,我會深入UEFI的各個議題研究,比如多線程、視訊、對Package的整理等等。這得益于前幾章搭建的調試環境,很多以前沒有辦法研究的題目,終于有了解剖分析的可能了。

回到滑鼠的程式設計。

1 UEFI對滑鼠的支援

BIOS對滑鼠的支援一直處于一種比較尴尬的境地。因為BIOS設定一直比較難以了解,非技術人員很難搞清楚那些術語。作為一種功能性的配置,使用者互動的易用性一直擺在一個比較低的境地。

之前寫的部落格中,我談過在Legacy BIOS下寫滑鼠驅動的過程。實際上,很多主機闆最終都不支援滑鼠中斷,也就意味着我寫的驅動無法運作。

随着UEFI的發展,這種情況逐漸改變。BIOS設定界面也變得越來越漂亮,很多時候和在作業系統下操作軟體差不多了。 UEFI Spec中,支援滑鼠的Protocol為Simple Pointer Protocol。如下圖:

UEFI開發探索30 –滑鼠初探

圖1 支援滑鼠的Protocol (UEFI Spec 2.8 page 454~455)

滑鼠的資訊通過Mode可以得到,不過在實際操作中,我發現沒什麼太大作用。目前還是有不少UEFI BIOS對這個Protocol支援的并不好,Mode中顯示支援,擷取滑鼠消息卻失敗。

滑鼠的操作方法與鍵盤類似,可以通過Event來擷取是否有滑鼠消息産生。這裡就不展開讨論了,具體看下本篇提供的代碼,一看即懂。

函數也不一一講解了,文檔寫得比較清楚。

2 迷思

有段時間我用單片機模拟滑鼠,最終用開發闆實作了一個USB滑鼠。通過開發闆上的按鍵來模拟滑鼠的移動以及左右按鍵的操作,還是比較有意思的。

程式中必須提供滑鼠的報告描述符。其中,對于滑鼠的邏輯位移量,一般有最大和最小值,分别為127和-127。如圖,截取自USB HID規範:

UEFI開發探索30 –滑鼠初探

圖2 HID spec-滑鼠的報告描述符示例

是以,在我的印象中,對滑鼠的邏輯位移量記得最大就是127了。

可是,在測試中發現,在有的平台上(我的小米15.6, 顯示卡Geforce MX110)使用上述Protocol提供的函數GetState,所獲得的相對位移量RelativeMovementX和RelativeMovmentY,遠遠大于上述的數值(參考圖3)。

這造成了我認知上的盲點,難道GetState獲得的相對位移量與HID協定中描述的邏輯位移不是同一個概念?它們之間是什麼關系?

今天沒有精力去探究這件事情,留個坑在這,有空再來填吧。

3 編譯運作

在TianoCore模拟環境中或者使用qemu啟動Ovmf,都不能正常使用滑鼠。是以,隻能将程式編譯為64位,用U盤啟動UEFI Shell,在實際的平台上測試。

我測試了三個平台:SenyPC的HM86平台,intel NUC6CAY和我工作用的小米15.6(Mx110顯示卡)。

第一個平台是2014年左右的,對滑鼠的Protocol支援不好,能找到Protocol,但是程式無法抓到滑鼠資訊。 第二個平台和第三個都正常工作,截圖如下:

UEFI開發探索30 –滑鼠初探

圖3 在NUC6CAY上測試程式

按下滑鼠左鍵,會發現LeftButton變為真。其他包括滑鼠右擊、移動等功能都很正常。不過,在小米的平台上,出現了上一節所描述的,相對位移量非常大的情況。

UEFI開發探索30 –滑鼠初探

圖4 小米筆記本上測試程式

除了位移量的問題外,滑鼠消息都能很好的擷取。也就是說,在GUI界面上支援滑鼠的障礙,已經不存在了。下一篇我就來試試在圖形界面上把滑鼠顯示出來。

Gitee位址:https://gitee.com/luobing4365/uefi-explorer

項目代碼位于:/20 Mouse-GetState 下

繼續閱讀