UEFI开发探索76- YIE001PCIe开发板(09 界面和键盘控制)

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

YIE001PCIe开发板之界面和键盘控制


在开发板YIE001上进行开发,实际上和之前博客中开发UEFI应用,并没有本质的区别。所要注意的,是在Option ROM被BIOS加载之时,所用的UEFI机制以及Protocol是否能正常使用。

一般来说, GraphicsOutput Protocol和ConOut Protocol是可以正常使用的。但是,其他的Protocol,比如创建Event,就很难说了。笔者目前测试的机器上,在加载Option ROM时,创建的Event完全无法按照预期运作。而同样的代码,在同一机器的UEFI Shell下测试却是正常的。

本篇代码的编程过程如下。

1 图形支持和汉字支持

UEFI开发探索中的代码,特别是图形和汉字部分,是从我的开源项目Foxdisk中移植过来的。针对UEFI的机制,进行了改动。所以,在博客中的代码,同文件名的,其内容都差不多。

当然,随着各个课题的展开,代码也在不断地修改。甚至对我而言,也很难分清楚目前所用的文件是什么时候修改的。比如近期又在处理键盘的源文件中,添加了检查键盘按键的非阻塞处理函数CheckKey()。

我尽力维持一个松散而逻辑一致的结构,保证源文件可以直接使用。处理同一硬件的或者同一逻辑层的代码,基本上会在相同的源文件中。

以下列出了源文件的功能:
表1 源文件的功能

源文件引脚名称
Graphic.c, Graphic.h图像处理
Keyboard.c, Keyboard.h键盘处理
Window.c, Window.h界面相关的代码,比如背景设置等
Font.c, Font.h文字的显示,包括汉字、英文的显示
Common.c, Common.h提供各种Protocol实例,以及共用的一些函数

将以上的文件,拷贝到之前构建好的Option ROM框架代码的文件夹下,修改相应的INF文件,就可以直接使用了。

对于汉字的显示机制,之前的博客中已经讨论得比较多了,可以查看下之前的博客及代码。

不过,博客中讨论的议题还是比较分散的。《UEFI编程实践》的书中,为了编译阅读,将这些议题整理成章了。考虑到版权问题,各种汉字库的提取工具也重新编写了。新书发布的时候,我将会把代码和工具在Gitee和GitHub上共享,有兴趣的技术同好到时可以直接去下载使用。

2 界面及键盘控制编程

Option ROM的代码,只有在BIOS加载到内存中才能运行。在这点上,开发板YIE001和YIE002有很大不同,YIE001毕竟不是独立的MCU,无法独立运行。

本篇的代码,将键盘的控制与YIE001的硬件控制联系起来了。具体实现代码如下:

VOID HelloUEFI(VOID)
{
  UINT64 flag;
  EFI_INPUT_KEY key={0,0};  
  UINT8 *s_text = "Alasse' aure,";  //《魔戒》精灵语的 “你好,日安”
  UINT8 *s_text1 = "欢迎进入UEFI的世界!";
  UINT8 *s_text2 = "按'ESC'键退出此界面";
  flag = InintGloabalProtocols(GRAPHICS_OUTPUT);
  Print(L"flag=%x\n",flag);
  
  //图形显示测试
  SwitchGraphicsMode(TRUE);
  SetBKG(&(gColorTable[DEEPBLUE]));
  
  draw_string(s_text, 110, 60, &MyFontArray, &(gColorTable[WHITE]));
  draw_string(s_text1, 80, 100, &MyFontArray, &(gColorTable[WHITE]));
  draw_string(s_text2, 135, 140, &MyFontArray1, &(gColorTable[YELLOW]));
  while(key.ScanCode!=0x17) //ESC
  {
    GetKey(&key);
    if(key.ScanCode ==1 ) //UP 
      draw_string(s_text1, 80, 100, &MyFontArray, &(gColorTable[DEEPBLUE]));
    else if(key.ScanCode ==2 ) //DOWN
      draw_string(s_text1, 80, 100, &MyFontArray, &(gColorTable[WHITE]));  
    if(key.UnicodeChar == 0x31)   
      SetLed(MyIoBaseAddr,LED1,LEDON);
    if(key.UnicodeChar == 0x32)   
      SetLed(MyIoBaseAddr,LED2,LEDON);
    if(key.UnicodeChar == 0x33)   
      SetLed(MyIoBaseAddr,LED1,LEDOFF);
    if(key.UnicodeChar == 0x34)   
      SetLed(MyIoBaseAddr,LED2,LEDOFF);
  }
  SetMyMode(OldGraphicsMode);
  SwitchGraphicsMode(FALSE);
}

代码的逻辑并不复杂,在设置了图形模式,显示相应的提示字符后,直接进入按键获取的循环。只有接受到用户的ESC按键后,才会退出循环。

方向键的上下键用来控制屏幕上字符串s_text1的显示和消除;数字键1、2、3和4,分别用来控制LED1、LED2的亮和灭。

3 测试

编译命令如下:

C:\UEFIWorkspace>build -t VS2015x86 -p RobinPkg\RobinPkg.dsc -m RobinPkg\Drivers\YIE1CG\YIE1CG.inf -a X64

按照UEFI开发探索75介绍的方法,将YIE1CG.rom刷入YIE001的Flash中,并插在实际的机器上进行测试(也可以不刷入,使用UEFI开发探索71中介绍的方法,使用load命令测试)。

Option ROM的界面显示如图1所示。
YIE1CG的界面图
图1 YIE1CG的界面

通过键盘控制LED灯的演示,只能通过视频拍下转换为GIF。不过,GIF文件太大,就不贴出了。有条件的技术同好,可以按照本篇的方法,修改代码进行实验。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目所用ROM文件位于:/ 76 YIE1CG下


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随着国家十四五新战略规划的推出,众多国内企业都参与到国产芯片替代浪潮中来,可以预测未来越多的国产芯片会被设计、生产和使用在我们日常所使用的电子产品中,国产芯片拥有巨大的市场前景。 目前国产芯片采用的体系架构主要有X86、ARM、MIPS、RISC V、PowerPC、Alpha等。我们知道电子产品正常工作必须要有操作系统和各种应用软件,没有操作系统和应用软件的芯片就是一堆废铁,而大多数人并不知道的是没有系统固件来加载操作系统的电脑亦是一堆废铁, UEFI就是由UEFI行业协会提出和维护一种行业标准的系统固件,它支持目前市面上的大多数芯片体系结构和操作系统,随着标准的不断演进相信越来越多的体系结构的芯片和操作系统会被支持。 笔者从事BIOS开发已有十余年的时间,见证了Legacy BIOS辉煌与隐退,也有幸了参与了新世纪初系统固件从Legacy BIOS往UEFI BIOS的迁移的全过程。科技行业风起云涌新技术新架构日新月异,每每回望不禁感慨我辈可谓是“眼见着他起高楼,眼见着他宴宾客”的那一波BIOS人。曾经系统固件江湖还是Legacy BIOS的天下,BIOS人使用汇编语言编码、通过中断来与操作系统沟通。自UEFI框架被广泛使以来开我们的发环境从纯汇编变成了99%的C语言加1%的汇编语言的模式,开发效率大大的加强了。 虽然UEFI框架大大加快了开发效率,但是由于系统固件开发属于比较偏门和专业的领域,学习和入门门槛比较高,现有的BIOS工程师又分布在大大小小的各个公司内部缺乏有效沟通和交流,同时BIOS源码又属于敏感和机密数据受到各种NDA限制,市面上对UEFI框架介绍的资料少之又少,因此笔者从2000左右开始就陆续以Cstyle_0x007为ID在https://blog.csdn.net/CStyle_0x007发布一系列博文,现已有数十篇原创文章。刚开始的想法是把博文当作工作笔记方便自己随时查阅,后来慢慢发展成了与业内外感兴趣的朋友的沟通交流的平台。 随手写的博文难免有错误与纰漏为了避免误导大众,准备把博文重新整理在纠正谬误同时也会补充一些新的内容,尽量做到所写的每句话都是无误的,也欢迎有兴趣的朋友踊跃提出意见和建议。组建了微信公众号,目的在于方便有兴趣的朋友一起交流,名字初步定为“固件C字营”,其中“固件”泛指一切固化的软件,这里主要指UEFI BIOS系统固件,“C”泛指“China“,我们可以把这里当作大家沟通交流的营地,我们会不定时发布一些行业资讯、工作、学习心得,感兴趣扫描下面二维码就可以加入,也可以发邮件到[email protected]投稿分享你的想法。 本文取名《UEFI内核的导读》这里的UEFI专指“UEFI BIOS”,全文专注于对UEFI内核的梳理与分享,同时兼顾对X86系统固件生态中常用的工程技术的介绍,主要包含以下内容:UEFI启动流程以及各个阶段主要完成的任务及参考的实现方式导读UEFI及PI规范中的常见Protocol的实现与使用技巧UEFI固件生态中常见外设、总线、行业标准的协议内容及使用方法 雄关漫道真如铁,而今迈步从头越,系统固件雄起之路道阻且长,相信我们的BIOS人一定可以为国产芯片的起飞助力、为系统固件团队的壮大贡献自己的一份微薄之力,为每一个不畏艰难、不惧寂寞坚守在工作岗位的BIOS人加油,好样的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值