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

这篇博客不是要写鼠标的历史,而是记录在很久以前,在Legacy BIOS下,我写鼠标驱动(BIOS/DOS下运行)的过程。

我对底层编写程序,从参加工作的时候就非常着迷。当时接手隔离卡5.0的开发维护,主体产品已经完成,我一直思考:怎么才能让产品和别家的不同呢?

介绍下背景知识:隔离卡V5.0是公司第一款采用PCI Oprom开发的产品,插上就可以出界面。省去了用户安装软件的过程,一推出就大受欢迎。我们采用的是沁恒电子的WCH365,代码也参考他们的DEMO开发的。很快,对手使用同样的芯片,有了同样的方案。

就是在这种情况下,我希望找到新的竞争点。突然想到,市场上所有的PCI Option ROM上的界面,都是支持键盘的,没有支持鼠标的。这不就是一个切入点吗?如图,这是当时的隔离卡。我工作的笔记本没带回来,图是从网上找到的,这么多年,没想到还能找到。

图1 易思克隔离卡v5.0

有了想法,执行起来也不容易。

问题1: 鼠标肯定是在图形模式下运行的,怎么无缝的将鼠标显示在目前的界面?
问题2: 针对鼠标的驱动代码量不能大,ROM只有32K,现在出货的产品已经有21.5K,留给鼠标驱动的就没有多少空间,必须控制代码量;
问题3: 我知道DOS下有int33h可以控制鼠标,也有大量的例子可以参考。可惜我们是在BIOS上运行的,无法调用;

第3个问题,实际可以通过BIOS提供的int 15h C2h的00~07功能来实现。这是支持PS/2鼠标的软中断(实际测试,USB有时候也支持),phoneix/award的BIOS手册上有相关描述。

图2 鼠标的bios中断

手册上只列出了中断的说明,如何运行却没有解释。

注意看AL=07的功能号,其中指明了ES:BX指向mouse driver。鼠标驱动是由用户自己编写,由BIOS来调用的。其原理如下:

1)      用户准备mouser driver,必须是FAR调用(跨段);
2)      当鼠标有任何动作时,比如移动、单击等,BIOS将会调用mouse driver,将鼠标的位置和状态传递给用户;
3)      每次的鼠标动作,都会触发BIOS调用三次mouse driver,每次只传送一个数据。传递的三个数据分别为鼠标状态、鼠标X坐标、鼠标Y坐标;
4)      BIOS每次的传递方法为:将数据压入堆栈,再调用mouse driver。

也即在鼠标有动作时,BIOS依次的动作为(发生三次):

Push mouse_status(2字节)
Call far ptr mouse_driver(4字节)

数据就存在sp+4处。

这些过程有点像windows驱动,都是由系统来调用程序,只不过这个比windows简单很多。

有了这些背景知识,就可以编程了。

Mouse driver的主要功能如下:

1)      根据传过来的数据,在新的位置绘制鼠标图案,并消除原位置的鼠标图案,同时将原位置鼠标图案下掩盖的图形还原;
2)      准备全局变量,将鼠标的状态传递出去,让使用mouser driver的程序可以根据鼠标动作进行事件处理。

更细节的处理可以看源码,仍旧放在百度云上,有兴趣可以看看。不过估计没有什么人还会对看汇编程序感兴趣,为了减少代码量,全部都是汇编写的。

我也只是因为,再不把这篇博文写完,以后估计连源代码都找不到了。以前没有养成如现在一样规范写日志的习惯,日志记录非常分散,有些已经找不到了。

程序使用borland 3.1中的tasm编译,如果用微软的masm(16位)编译,有些宏名需要修改。

在实际运用过程中,发现AMI的bios支持得不是很好;USB的鼠标也不是很理想。代码中加了判断,如果不支持的话,就不会启用鼠标驱动。虽然不完美,也帮助公司确立了产品技术领先的形象,是一段让我颇为自豪的经历。

虚拟机下是没法运行的,所以不截图了。就把编译过程截下来吧:

图3 编译mouse driver

回到UEFI 的鼠标支持吧,估计要再过几个博客才会写到。UEFI中似乎没有中断的概念了,取而代之的是事件方式。怎么构建出一个让主程序不需要管理、只需要处理关心的鼠标事件的代码,类似windows的事件处理,简洁而高效,是一个需要深入思考的问题。

研究技术真的是没有止境。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/X2 Mouse driver下。

UEFI开发探索11 – 鼠标前传相关推荐

  1. UEFI开发探索97 – EDK2模拟器搭建网络环境

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...

  2. UEFI开发探索99 – UEFI Shell下截屏工具

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...

  3. UEFI开发探索85- YIE002USB开发板(08 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-编程 1 YIE002-STM32的USB编程 2 调 ...

  4. UEFI开发探索QA – 问题辑录(持续更新)

    最近正在尝试在Unbutu16上搭建开发和调试环境,其中过程一言难尽,到现在也没完成到符合我要求的程度. 正是因为遇到障碍,我今天早上回到Win10+UDK2018的环境下,想重新编译下AppPkg, ...

  5. UEFI开发探索95 – 弹跳小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的弹跳小游戏 1 Bounce游戏 1.1 游戏架构 1.2 移植和编写代码 1)编写 ...

  6. UEFI开发探索81- YIE002USB开发板(04 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-USB系统概述 1 USB规范简介 2 软件工程师眼中 ...

  7. UEFI开发探索100 – 《UEFI编程实践》发布啦

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...

  8. UEFI开发探索02 – 环境搭建1

    (请保留->作者:罗冰 ) 开发初期的目的就是做出可以在pci rom上跑的Oprom,当然是在uefi bios下.我的计划大致如下: 1 搭建完整的编译环境,了解使用哪些库进行编译: 2 我 ...

  9. UEFI开发探索94 – 迷宫小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的迷宫小游戏 1 Maze程序结构分析 1)定义全局变量 2)设置迷宫 3) 游戏控制 ...

最新文章

  1. linux将bridge当做hub来用
  2. leetcode340. 至多包含 K 个不同字符的最长子串
  3. Blazeface 人脸检测器
  4. mongodb运算操作符
  5. java date只保留年月日_java.util.Date、java.sql.Date、java.sql.Timestamp区别和总结
  6. java求最小生成树的权重_给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。...
  7. java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)
  8. Map的传统输出和使用增强for循环的输出
  9. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
  10. 指纹机和计算机无法连接,指纹考勤系统常见问题及解决办法
  11. elasticsearch 分组求和
  12. 周立功DTU+温度传感器,ZWS物联网平台尝试
  13. 运行“travel[org.apache.tomcat.maven:tomcat7 maven plugin:2.1:run]时出错:未指定项目JDK
  14. [正则表达式] 校验经度和纬度
  15. android 生成条码,Android -条形码的生成
  16. 咸鱼ESP32实例—RTC
  17. 阿里云学生成长计划领取资格考试答案
  18. POJO 与javaBean(普通bean和EJB)
  19. Content Provider启动浅析
  20. 【计算机网络】因特网概述

热门文章

  1. 2013上半年 系统集成项目管理工程师 下午试卷
  2. 转:衡量数据的离散程度
  3. C++实现积分函数(第一章)
  4. iPhone信号太差?学会这三招,信号差也能瞬间满格!
  5. OPC DA与OPC UA的区别
  6. Ros yocs_velocity_smoother 保姆级部署教程
  7. 计算机C语言好学吗?要是想自学应该怎么办?大学挂科赶紧恶补!
  8. 吉里吉里1/吉里吉里2中KAG脚本的解释执行(1)
  9. 从最近一次的计算机攻击中,我们学到的经验教训
  10. android 更改主题,如何更改android app的颜色主题?