You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# Linux_0_11_mouse
## 鼠标驱动和简单的图形接口实现
核心:将鼠标输入放入一个缓冲队列,再由事件(消息)驱动子系统从队列中取出鼠标事件并处理:
如果是鼠标移动,则在新的位置上重新绘制光标;
如果是鼠标点击,则根据当前进程注册的鼠标点击函数来响应点击事件。
1.完整编写一个外设驱动
2.编写程序完成对图形模式显示器的驱动和管理
3.设计并实现一个事件(消息)驱动系统
4.实现一个可视化应用程序( bird)
### 鼠标的驱动
1.模仿键盘中断初始化设置语句( 鼠标也是控制台设备) , 也将鼠标中断设置语句放在函数con_init(); (console.c)
2.设置键盘控制器i8042和中断控制器8259A
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.设置屏幕分辨率
5.开始绘制屏幕
参考此处的图形模式下绘制鼠标的核心代码,为后面图的绘制作参考
## 消息驱动框架
思路:操作系统搜集来自各个地方的事件,然后将事件放入消息队列,而二用户进程查看消息队列,当发现消息给自己时,就从中取出消息,并作出相应动作
( 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发送到消息队列中。
###### 在重画时,我们可以想到,先把图像原来的位置的颜色填充为背景色,然后再画新图。当更新频率够快时,人眼无法识别,也就实现移动。