(請保留-> 作者: 羅冰 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。如下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49zdaVnQuxEeBRUT0FkeNZkSxQVTCZ0VGx2aSZkVxw0MBpHT1UERNlHO5N2aGJjYzJEWkZXUuJGbS5mY250VMdHZzwkb5ckYplTaipWNTpFbshVYwx2MMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖1 支援滑鼠的Protocol (UEFI Spec 2.8 page 454~455)
滑鼠的資訊通過Mode可以得到,不過在實際操作中,我發現沒什麼太大作用。目前還是有不少UEFI BIOS對這個Protocol支援的并不好,Mode中顯示支援,擷取滑鼠消息卻失敗。
滑鼠的操作方法與鍵盤類似,可以通過Event來擷取是否有滑鼠消息産生。這裡就不展開讨論了,具體看下本篇提供的代碼,一看即懂。
函數也不一一講解了,文檔寫得比較清楚。
2 迷思
有段時間我用單片機模拟滑鼠,最終用開發闆實作了一個USB滑鼠。通過開發闆上的按鍵來模拟滑鼠的移動以及左右按鍵的操作,還是比較有意思的。
程式中必須提供滑鼠的報告描述符。其中,對于滑鼠的邏輯位移量,一般有最大和最小值,分别為127和-127。如圖,截取自USB HID規範:
圖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,但是程式無法抓到滑鼠資訊。 第二個平台和第三個都正常工作,截圖如下:
圖3 在NUC6CAY上測試程式
按下滑鼠左鍵,會發現LeftButton變為真。其他包括滑鼠右擊、移動等功能都很正常。不過,在小米的平台上,出現了上一節所描述的,相對位移量非常大的情況。
圖4 小米筆記本上測試程式
除了位移量的問題外,滑鼠消息都能很好的擷取。也就是說,在GUI界面上支援滑鼠的障礙,已經不存在了。下一篇我就來試試在圖形界面上把滑鼠顯示出來。
Gitee位址:https://gitee.com/luobing4365/uefi-explorer
項目代碼位于:/20 Mouse-GetState 下