07day FIFO与接受鼠标控制信息
2016-01-11 14:40
330 查看
我们完善一下键盘中断处理,按下一个键,就把所按键的编码在画面显示出来,这样就可以切实完成中断处理程序了。
但是这样的话,我们的显示图形等响应程序就位于中断处理程序中了,这样浪费了宝贵的cpu中断时间,所以我们考虑制作一个缓冲区来接受键盘中断处理的按键编码。
接受中断 ,放入我们的FIFO缓冲区中。
主函数中 不断循环处理缓冲区 并显示
说说鼠标
为了让鼠标起作用,就让让下面两个装置有效,一个是鼠标控制电路,另一个是鼠标本身。
激活之后我们就可以接受处理鼠标信息了
修改一下处理部分
{ struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; unsigned char data, s[4]; io_out8(PIC0_OCW2, 0x61); /* 通知PIC*IRQ-01已经处理完毕 */ data = io_in8(PORT_KEYDAT); sprintf(s, "%02X", data); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); return; }
但是这样的话,我们的显示图形等响应程序就位于中断处理程序中了,这样浪费了宝贵的cpu中断时间,所以我们考虑制作一个缓冲区来接受键盘中断处理的按键编码。
void inthandler21(int *esp) { unsigned char data; io_out8(PIC0_OCW2, 0x61); /* */ data = io_in8(PORT_KEYDAT); if (keybuf.len < 32) { keybuf.data[keybuf.next_w] = data; keybuf.len++; keybuf.next_w++; if (keybuf.next_w == 32) { keybuf.next_w = 0; } } return; }
接受中断 ,放入我们的FIFO缓冲区中。
主函数中 不断循环处理缓冲区 并显示
for (;;) { io_cli(); if (keybuf.len == 0) { io_stihlt(); } else { i = keybuf.data[keybuf.next_r]; keybuf.len--; keybuf.next_r++; if (keybuf.next_r == 32) { keybuf.next_r = 0; } io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } }
说说鼠标
为了让鼠标起作用,就让让下面两个装置有效,一个是鼠标控制电路,另一个是鼠标本身。
#define PORT_KEYDAT 0x0060 #define PORT_KEYSTA 0x0064 #define PORT_KEYCMD 0x0064 #define KEYSTA_SEND_NOTREADY 0x02 #define KEYCMD_WRITE_MODE 0x60 #define KBC_MODE 0x47 void wait_KBC_sendready(void) { /* 等待键盘控制电路准备完毕 */ for (;;) { if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) { break; } } return; } void init_keyboard(void) { /* 初始化键盘控制电路 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);// 0x60 wait_KBC_sendready(); io_out8(PORT_KEYDAT, KBC_MODE);//0x47 return; } #define KEYCMD_SENDTO_MOUSE 0xd4 #define MOUSECMD_ENABLE 0xf4 void enable_mouse(void) { /* 激活鼠标 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); return; /* 顺利的话 键盘控制其返回ACK(0xfa) */ }
激活之后我们就可以接受处理鼠标信息了
修改一下处理部分
for (;;) { io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) != 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } else if (fifo8_status(&mousefifo) != 0) { i = fifo8_get(&mousefifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 47, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); } } }
相关文章推荐
- akka访问远程Actor
- MSSQL2008数据同步浅析二(安装篇)
- 计算标点符号
- Autodesk FBX SDK Program 中文 (二)
- iOS工程通用模块介绍
- JavaScript编码规范[百度]
- gulp安装简介
- linux常用指令
- [HSR算法-Occlusion Culling]
- TCP长连接、短连接
- 不是很爱你
- ImageView设置不可点击无效
- VirtualBox 安装CentOs7后无法联网问题
- 华硕BIOS密码表2002-2011
- Android中visibility属性
- Oracle SQL语句执行步骤
- 从头认识java-17.4 详解同步(1)-由竞争条件引发的问题
- ubuntu14.04LTS编译MUDOS v22.2b14
- 5.5. Dictionaries(字典)
- 明天不是明天