(本文已参与“新人创作礼”活动,一起开启掘金创作之路。)
(转载请保留-《UEFI编程实践》并行博客,作者:罗冰)
坐在旅馆的书桌旁,突然想起一句诗:戍客望边色,思归多苦颜。
也许是天气原因,也许是因为出差,心情总是不好。
上海的天空,灰蒙蒙的。一眼望去,都是淡墨色的乌云,不沉重,也透不过阳光。窗外的风很柔,茂盛的树叶一动不动。要不是偶尔传来的汽车声音,几乎要怀疑时间都停止了。
没有阳光的天气,让人心情比较压抑。
需要点爱好来扫去沉闷的心情:人生苦短,最乐编程!
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运行起来,重新编个函数封装一下。运行情况就不截图了,就是在上次的代码上改的,输出信息差不多。
Gitee地址: gitee.com/luobing4365…
项目代码位于:/04 ReadKey下。