[ 1] haribote ipl09.nas 引导程序阅读注释。
[ 2] haribote asmhead.nas 从实模式进入保护模式程序阅读注释。
[ 3] haribote dsctbl.c 设置GDT和IDT程序阅读注释。
[ 4] haribote memory.c 内存管理程序阅读注释。
[ 5] haribote int.c 可编程中断控制器(PIC)初始配置程序阅读注释。
[ 6] haribote timer.c 定时器管理程序阅读注释。
[ 7] haribote fifo.c 循环队列管理程序阅读注释。
[ 8] haribote keyboard.c 键盘管理程序阅读注释。

篇幅较长,可通过浏览器的搜索功能(Ctrl + f)搜索函数名了解相应函数的实现机制,如 mouse_decode。

[9] haribote mouse.c 鼠标管理程序阅读注释

mouse.c
/* mouse.c, 鼠标管理程序接口 *//* 粗略理解鼠标和CPU的连接。*         =====*         |CPU|*         =====*           ↕* =======================* |     60h    64h      |* |---------------------|* |        8042         |* |---------------------|* |状态寄存器 控制寄存器|* |输入寄存器 输出寄存器|* =======================*           ↕*          ps/2*           ↕*    ===============*    | 键盘 | 鼠标 |*    ===============*  * CPU和8042芯片通过引脚直接相连,* 键盘设备(芯片)和鼠标设备(芯片)* 通过ps/2接口和8042相连。* * 通过端口地址,CPU可直接和8042交* 互数据或命令。当CPU要与键盘或鼠* 标交互数据时需以8042作为桥梁,当* 8042接收到的CPU命令是与键盘或鼠* 标交互时,8042便充当这个中间桥梁。*/#include "bootpack.h"/* 管理鼠标缓冲队列的全局指针;* 标识鼠标缓冲队列中数据的全局变量。*/
struct FIFO32 *mousefifo;
int mousedata0;/* inthandler2c,* 鼠标中断C处理函数,读取鼠标输入到鼠标缓冲队列中。* * 当有鼠标输入而向PIC输出中断时,* CPU处理PIC申请的鼠标中断时会执行IDT[0x2c]中的处* 理函数_asm_inthandler2c(见int.c和dsctbl.c),该处* 理函数会调用此处的C处理函数inthandler2c。*/
void inthandler2c(int *esp)
{int data;/* 已差不多可正确读取鼠标数据时,* 设定PIC,向PIC发EOI命令时结束鼠标中断 */io_out8(PIC1_OCW2, 0x64);io_out8(PIC0_OCW2, 0x62);/* 读取鼠标数据并将其数据添加上鼠标标识* 后存入鼠标缓冲队列中,供其他任务读取 */data = io_in8(PORT_KEYDAT);fifo32_put(mousefifo, data + mousedata0);return;
}/* KEYCMD_SENDTO_MOUSE,* 写鼠标命令,具体的鼠标命令随后由60h端口下发;** MOUSECMD_ENABLE,开启鼠标发送数据功能的命令。*/
#define KEYCMD_SENDTO_MOUSE 0xd4
#define MOUSECMD_ENABLE     0xf4/* enable_mouse,* 初始化键盘控制器使能鼠标并设置鼠标缓冲队列和鼠标数据标识。*/
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec)
{mousefifo = fifo;mousedata0 = data0;/* 等待键盘输入缓冲器空闲, 若键盘空闲则* 通过8042下发使能鼠标的命令到鼠标设备上。*/wait_KBC_sendready();io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);wait_KBC_sendready();io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);/* 使能鼠标后,鼠标将会回复0xfa的消息;* 置phase=0标识鼠标中断传送的信息为0xfa。*/mdec->phase = 0;return;
}/* mouse_decode,* 解析鼠标数据dat,将解析结果存于mdec指向的结构体中。** 鼠标被操作时会向PIC输出中断信号, 中断C处理函数inthandler2c* 在每次鼠标中断发生时就从8042输出寄存器中读取一字节鼠标数据,* 鼠标以3字节为一组。* * 当每读满3字节并完成解析时mouse_decode返回1;若鼠标数据解析失* 败则返回-1,若还未解析满3字节则返回0。*/
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
{if (mdec->phase == 0) {/* 在phase=0时,表处于等待鼠标回复0xfa* 阶段,等到则置接收鼠标第一个字节数据阶段。*/if (dat == 0xfa) {mdec->phase = 1;}return 0;}if (mdec->phase == 1) {/* dat鼠标第1字节数据 */if ((dat & 0xc8) == 0x08) {/* 据作者观察(当然此文也观察过), 鼠标第1字* 节数据bit[3]=1,bit[7..6]=00,若鼠标第1字* 节数据不满足以上状态则表明 鼠标数据传递* 可能有误,所以在此丢弃并继续等待并解析第* 一字节数据。* * bit[2..0]置位时分别代表鼠标滑轮点击, 鼠* 标右击和鼠标左击。bit[5..4]分别跟鼠标上* 下和左右移动的方向, 值为0时表示往上或右* 移动,值为1时表示往下或左移动。* * 接收到第一个字节后置phase=2表示接下来接* 收鼠标第二字节数据。*/mdec->buf[0] = dat;mdec->phase = 2;}return 0;}if (mdec->phase == 2) {/* 接收鼠标第二字节数据(左右移动)并置* phase=3以接收鼠标第三字节数据。*/mdec->buf[1] = dat;mdec->phase = 3;return 0;}if (mdec->phase == 3) {/* 鼠标第3字节数据接收完毕,置phase=1* 表继续接收下一组鼠标数据。*/mdec->buf[2] = dat;mdec->phase = 1;/* 一组鼠标数据接收完毕,开始解析。*//* btn,点击事件;x,左右移动位移量;* y,上下移动位移量。*/mdec->btn = mdec->buf[0] & 0x07;mdec->x = mdec->buf[1];mdec->y = mdec->buf[2];/* 若鼠标第1字节bit[5..4]皆为1,则表示鼠标分别* 在往下或左方向移动, 鼠标将这两个方向分别视* 为y和x的负方向。与此对应, 此时鼠标中断传送* 上来的y和x是一个负数( 的低8位)。在32位补码* 表示数中, 将y和x的高24位扩展为1时, 就得到y* 和x的负数值, 从而获得了鼠标位移的真实值。*/if ((mdec->buf[0] & 0x10) != 0) {mdec->x |= 0xffffff00;}if ((mdec->buf[0] & 0x20) != 0) {mdec->y |= 0xffffff00;}/* 屏幕显示画面时原点在左上角,而鼠* 标移动位移量的原点在屏幕左下角。* 所以鼠标在y方向的位移值方向跟屏* 幕实际坐标方向相反,所以此处进行* 符号取反。*/mdec->y = - mdec->y;return 1;}return -1;
}
bootpack.h
/* ... *//* mouse.c */
/* struct MOUSE_DEC,* 用于存储鼠标输入数据及其解析结果的结构体类型。*/
struct MOUSE_DEC {
/* buf,用于保存鼠标的一组数据,共3字节;* phase,标识一组鼠标数据已输入多少字节;* * 后面3个成员用于存储buf中鼠标数据的解析结果。* x和y,分别存储鼠标左右和上下移动的位移量;* btn,存储鼠标点击事件。*/unsigned char buf[3], phase;int x, y, btn;
};
void inthandler2c(int *esp);
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec);
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);/* ... */

haribote mouse.c 鼠标管理程序阅读注释相关推荐

  1. linux0.11字符设备驱动及访问请求管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  2. linux0.11多任务管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  3. linux0.11缓冲区管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  4. haribote bootpack.c 主任务程序代码阅读注释

    [ 1] haribote ipl09.nas 引导程序阅读注释. [ 2] haribote asmhead.nas 从实模式进入保护模式程序阅读注释. [ 3] haribote dsctbl.c ...

  5. haribote系统调用 工程管理及应用程序阅读注释

    [ 1] haribote ipl09.nas 引导程序阅读注释. [ 2] haribote asmhead.nas 从实模式进入保护模式程序阅读注释. [ 3] haribote dsctbl.c ...

  6. linux0.11磁盘映像制作及其剩余程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  7. Magic Mouse 苹果鼠标移动速度改快的方法

    Magic Mouse 苹果鼠标移动速度改快的方法 一.通过终端可以改变鼠标的移动速度. 众所周知,Magic Mouse鼠标在Mac电脑中哪怕设置了最快的移动速度,仍然也是很慢,这时两行终端命令即可 ...

  8. UE4/UE5 虚幻引擎,设置Mouse Cursor鼠标光标样式

    UE虚幻引擎,设置Mouse Cursor鼠标光标样式的两种方法: 第一种.使用Player Controller中内部提供的鼠标样式. 第二种.在Project Settings项目设置的Softw ...

  9. Splinter入门(四) Mouse interactions 鼠标交互

    Splinter入门(四) Mouse interactions 鼠标交互 Notes:大多数鼠标交互目前只在Chrome驱动程序和Firefox 27.0.1上有效. 鼠标交互基本使用  Splin ...

最新文章

  1. L1-039. 古风排版
  2. vue 移动端头像裁剪_使用vue-cropper裁剪正方形上传头像-阿里云开发者社区
  3. java 时间转为毫秒数_疫情期间面试总结一(java基础方面)
  4. 「BZOJ2190」[SDOI2008] 仪仗队 - 欧拉函数
  5. yum 安装 Mysql 5.7,忘记密码解决方案
  6. 【转】AndroidStudio升到最新版本(3.1.2)之后
  7. ubuntu mysql5.5编码_Ubuntu下MySQL5.5编码设置
  8. docker安装informix
  9. star法则开发简历模板_软件开发的第一法则
  10. office计算机高级应用,全国高等学校计算机水平考试Ⅱ级《Office2010高级应用》考试大纲(试行)...
  11. 【Vivado那些事儿】Vivado介绍
  12. C语言学习-翁凯(第五章笔记)
  13. 2007年中国搜索引擎市场调查报告
  14. linux终端解微分方程,解微分方程+ode求解器
  15. 美团配送 二面(40min) Java后端 暑期实习面经
  16. matplotlib之pyplot模块之饼图(pie():基础参数,返回值)
  17. 设置计算机网络密码怎么设置路由器,如何在计算机上设置路由器密码?
  18. 每天只需15分钟!情感励志视频剪辑一天200多,不用真人出镜
  19. java.util工具类之Currency类
  20. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?

热门文章

  1. 阿里巴巴资深架构师推荐:基于大中台小前台模式设计高并发电商架构
  2. 微信三方开发平台开发模式下被动回复用户消息
  3. 主板诊断卡代码全解析
  4. Skinned Mesh Animation Using Matrices(使用矩阵的蒙皮网格动画)
  5. joomla 1:安装
  6. Oracle EBS 11i 表结构WIP模块
  7. 【算法】计算组合数的四种常用方法
  8. 服务器知识:阿里云ECS实例设置用户root密码、远程连接
  9. 胖虎观察日记-第三天
  10. 台达服务器电源型号,DPS-1520AB A 1440W 39Y7355 System X3850M2 台达服务器电源