UEFI开发探索10 – 再论键盘

突然想起一句诗:戍客望边色,思归多苦颜。也许是天气原因,也许是出差,心情总是不好。

上海的天空,灰蒙蒙的。一眼望去,都是淡墨色的乌云,不沉重,也透不过阳光。窗外的风很小,茂盛的树叶一动不动。除了传来的汽车声音,几乎要怀疑时间停止了一样。

没有阳光的天气,让人心情比较压抑。

UEFI下编写Option ROM,除了图形显示外(这是用户最直接能感受到的),最常用的就是键盘了。

我把上一篇博客中关于键盘的代码,以x64的方式再编译,拿到实际的环境中去测试。上次使用的ReadKeyStrokeEx来获取键盘输入,我测试的是一款AMI BIOS的环境,与联想开发的一款计算机。

很奇怪,程序不工作。

加上调试代码,提示SimpleTextInputEx的Protocol找不到。嗯,确实奇怪。

Spec中没有对这方面的说明。Console I/O protocol中提供了两种获取键盘的方式,除了SimpleTextInputEx外,还有SimpleTextInput可以使用。

我最关心的是键盘的处理,因此关注点放在了ReadKeyStrokeEx和ReadKeyStroke上。它们的区别,从函数说明上很容易看出来:

图1 两个API函数比较

ReadKeyStroke所用的数据结构EFI_INPUT_Key是ReadKeyStrokeEx所用EFK_KET_DATA的子集。EFI_KEY_DATA中多了EFI_KEY_STATE的字段,这是用来标志Shift、Ctrl等键状态的。

不知道为什么实际环境中不支持ReadKeyStrokeEx,偷懒吗?

这次的代码比较简单,直接把ReadKeyStroke运行起来,重新编个函数封装一下。运行情况就不截图了,就是在上次的代码上改的,输出信息差不多。

百度云链接:https://pan.baidu.com/s/1gccSosw8_UAGTI5gZPnLCA
提取码:dx23
代码在 04 ReadKey下。

78 total views, 1 views today

发表评论

电子邮件地址不会被公开。 必填项已用*标注