(请保留->发布地址: http://yiiyee.cn/blog/author/luobing/ )
我的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。如下图:
鼠标的信息通过Mode可以得到,不过在实际操作中,我发现没什么太大作用。目前还是有不少UEFI BIOS对这个Protocol支持的并不好,Mode中显示支持,获取鼠标消息却失败。
鼠标的操作方法与键盘类似,可以通过Event来获取是否有鼠标消息产生。这里就不展开讨论了,具体看下我在百度云上提供的代码,一看即懂。
函数也不一一讲解了,文档写得比较清楚。
2 迷思
有段时间我用单片机模拟鼠标,最终用开发板实现了一个USB鼠标。通过开发板上的按键来模拟鼠标的移动以及左右按键的操作,还是比较有意思的。
程序中必须提供鼠标的报告描述符。其中,对于鼠标的逻辑位移量,一般有最大和最小值,分别为127和-127。如图,截取自USB HID规范:
所以,在我的印象中,对鼠标的逻辑位移量记得最大就是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,但是程序无法抓到鼠标信息。 第二个平台和第三个都正常工作,截图如下:
按下鼠标左键,会发现LeftButton变为真。其他包括鼠标右击、移动等功能都很正常。不过,在小米的平台上,出现了上一节所描述的,相对位移量非常大的情况。
除了位移量的问题外,鼠标消息都能很好的获取。也就是说,在GUI界面上支持鼠标的障碍,已经不存在了。下一篇我就来试试在图形界面上把鼠标显示出来。
百度云链接:https://pan.baidu.com/s/1gccSosw8_UAGTI5gZPnLCA
提取码:dx23
文件在 20 Mouse-GetState 下
2,188 total views, 1 views today