|
|
|
|
# Linux_0_11_mouse
|
|
|
|
|
## 鼠标驱动和简单的图形接口实现
|
|
|
|
|
核心:将鼠标输入放入一个缓冲队列,再由事件(消息)驱动子系统从队列中取出鼠标事件并处理:
|
|
|
|
|
如果是鼠标移动,则在新的位置上重新绘制光标;
|
|
|
|
|
如果是鼠标点击,则根据当前进程注册的鼠标点击函数来响应点击事件。
|
|
|
|
|
1.驱动鼠标
|
|
|
|
|
2.让显示器在图形模式下工作
|
|
|
|
|
3.设计并实现一个事件(消息)驱动系统
|
|
|
|
|
4.实现一个可视化应用程序(bird)
|
|
|
|
|
|
|
|
|
|
### 编写鼠标中断处理函数
|
|
|
|
|
1.模仿键盘中断初始化设置语句(鼠标也是控制台设备),也将鼠标中断设置语句放在函数con_init(); (console.c)
|
|
|
|
|
2.编写mouse.s(实际上应该是mouse.S),在其中实现mouse_interrupt
|
|
|
|
|
【由于给操作系统源码增加了一个新文件,所以还要修改Makefile文件】--模仿键盘修改
|
|
|
|
|
3.因为是调用readmouse进行细致处理,所以还要编写readmouse(tty_io.c)--对信号处理--需要下面知识
|
|
|
|
|
|
|
|
|
|
在获取鼠标操作码时使用了端口地址0x60,这个端口对应的数据寄存器在键盘控制器上,因此需了解键盘控制器原理。
|
|
|
|
|
详细看 李治军pdf 12.2.2
|
|
|
|
|
|
|
|
|
|
### 显示屏的图形工作模式
|
|
|
|
|
1.启动图形模式
|
|
|
|
|
|
|
|
|
|
2.了解VGA的基本组成结构和工作原理
|
|
|
|
|
1)图形控制器 -- 控制数据在显存中的存放
|
|
|
|
|
2)拼接器 -- 负责从四个显存片上取出数据并经过合适的拼接成要显示的像素信息
|
|
|
|
|
3)CRT控制器 -- 控制屏幕分辨率
|
|
|
|
|
|
|
|
|
|
3.建立像素点阵与显存之间的映射
|
|
|
|
|
此处选择VGA标准里的256色模式。每个像素点用一个字节来表示。
|
|
|
|
|
显示模式的分辨率选为320*200,所以一个屏幕共有64000个像素点,所以存一个屏幕的显存大小就是64000B,略小于64K.
|
|
|
|
|
所以,端口地址0x3CE的0x06寄存器中,Memory Map Select位应被设定为01.0x05寄存器其Shift256应为1.
|
|
|
|
|
根据拼接器的工作模式,表明Shift256位和Chain4置为1后,显卡显示模式时256色的,还是线性寻址的。
|
|
|
|
|
|
|
|
|
|
4.设置屏幕分辨率
|
|
|
|
|
|
|
|
|
|
### 开始绘制屏幕
|
|
|
|
|
参考此处的图形模式下绘制鼠标的核心代码,为后面图的绘制作参考
|
|
|
|
|
|
|
|
|
|
## 消息驱动框架
|
|
|
|
|
思路:操作系统搜集来自各个地方的事件,然后将事件放入消息队列,而二用户进程查看消息队列,当发现消息给自己时,就从中取出消息,并作出相应动作
|
|
|
|
|
(1)定义消息队列数据结构(tty.h)
|
|
|
|
|
(2)实现函数post_message,将消息放到消息队列里(tty_io.c)
|
|
|
|
|
(3)实现系统调用get_message对应的内核函数sys_get_message,实现从消息队列中取出消息(sys.c)
|
|
|
|
|
(4)事件发生时,创建新消息放到消息队列里,调用post_message
|
|
|
|
|
(函数post_message和get_message的内核实现,这两个函数的核心工作就是链表的插入和删除)
|
|
|
|
|
|
|
|
|
|
## 可视化应用程序的设计与实现
|
|
|
|
|
定义:所有对象是长方体,小鸟的形状和x方向上位置不变,背景在移动,按下左键小鸟就飞一下,否则下落
|
|
|
|
|
(1)对所有对象初始化
|
|
|
|
|
(2)创建定时器,给应用程序发一个定时消息,重画整个画面---(导致rand不好用了--因为与时间有关)
|
|
|
|
|
(3)针对信息做出反应
|
|
|
|
|
###### 因为硬件每一个滴答(10ms)会向cpu发送一次时钟中断,而操作系统会在时钟中断处理程序do_timer中扫描usr_timer_list中的所有定时器,
|
|
|
|
|
###### 将每个时钟的jiffies减一。如果某个定时器的jiffies变为0,就发送一个定时器到时消息,用post_message发送到消息队列中。
|
|
|
|
|
###### 在重画时,我们可以想到,先把图像原来的位置的颜色填充为背景色,然后再画新图。当更新频率够快时,人眼无法识别,也就实现移动。
|
|
|
|
|
|