代码拉取完成,页面将自动刷新
/* ""表示该头文件与源文件位于同一个文件夹里,< >则表示该头文件位于编译器的文件夹里。*/
#include "bootpack.h"
struct FIFO32 *mousefifo;
int mousedata0;
/* PS/2鼠标中断
IRQ-12是从PIC的第4号(从PIC相当于IRQ-08~IRQ-15),首先要通知IRQ-12受理已完成,然后再通知主PIC。
这是因为主/从PIC的协调不能够自动完成,如果程序不教给主PIC该怎么做,它就会忽视从PIC的下一个中断请求。
*/
void inthandler2c(int *esp)
{
int data;
io_out8(PIC1_OCW2, 0x64);// 通知PIC1 IRQ-12受理完成
io_out8(PIC0_OCW2, 0x62);// 通知PIC0 IRQ-2受理完成
data = io_in8(PORT_KEYDAT);
fifo8_put(&mousefifo, data+mousedata0);
return;
}
#define KEYCMD_SENDTO_MOUSE 0xd4
#define MOUSECMD_ENABLE 0xf4
void enable_mouse(struct FIFO32 *fifo,int data0, struct MOUSE_DEC *mdec){
mousefifo=fifo;
mousedata0=data0;
// 激活鼠标
wait_KBC_sendready();
io_out8(PORT_KEYCMD,KEYCMD_SENDTO_MOUSE);
wait_KBC_sendready();
io_out8(PORT_KEYDAT,MOUSECMD_ENABLE);
// 顺利的话,键盘控制器会返回ACK 0xfa
mdec->phase=0; // 等待0xfa的阶段
return;
}
int mouse_decode(struct MOUSE_DEC *mdec,unsigned char dat){
if (mdec->phase == 0) {
// 等待0xfa阶段
if (dat == 0xfa) {
mdec->phase = 1;
}
return 0;
}
if (mdec->phase == 1) {
/* 鼠标第一字节,检验是否正确
判断第一字节对移动有反应的部分是否在0~3的范围内;同时还要判断第一字节对点击有反应的部分是否在8~F的范围内。
如果这个字节的数据不在以上范围内,它就会被舍去。
*/
if ((dat & 0xc8) == 0x08) {
mdec->buf[0] = dat;
mdec->phase = 2;
}
return 0;
}
if (mdec->phase == 2) {
/* 鼠标第二字节 */
mdec->buf[1] = dat;
mdec->phase = 3;
return 0;
}
if (mdec->phase == 3) {
mdec->buf[2] = dat;
mdec->phase = 1;
// 鼠标键的状态,放在buf[0]的低3位。0x07相当于00000111,通过&取出低3位的值。
mdec->btn = mdec->buf[0] & 0x07;
mdec->x = mdec->buf[1];
mdec->y = mdec->buf[2];
// 将x和y的第8位及第8位以后全部都设成1,或全部都保留为0。这样就能正确地解读x和y。
if ((mdec->buf[0] & 0x10) != 0) {
mdec->x |= 0xffffff00;
}
if ((mdec->buf[0] & 0x20) != 0) {
mdec->y |= 0xffffff00;
}
mdec->y=-mdec->y; // 鼠标y方向与画面符号相反
return 1;
}
// -1 一般不会执行
return -1;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。