《操作系统中鼠标操作原理.ppt》由会员分享,可在线阅读,更多相关《操作系统中鼠标操作原理.ppt(49页珍藏版)》请在三一办公上搜索。
1、操作系统下鼠标操作原理,软件组整理,目 录1、鼠标的类型及与主板的连接关系2、鼠标工作原理3、鼠标硬件原理图4、HID协议与操作系统HID驱动简介5、操作系统HID接口6、图形显示基本原理与操作系统焦点模型7、应用程序鼠标捕获与程序处理,鼠标的类型,按照与电脑的连接方式来分的话有串口鼠标、PS/2鼠标和USB鼠标。如下图所示:,鼠标与主板的连接关系,鼠标分别连接到主板的串口、PS2、USB口。,串口,PS2口,USB口,鼠标工作原理,光电鼠标工作原理示意图,激光鼠标原理与之类似。,鼠标光学跟踪引擎部分横截面示意图,光学鼠标主要由四部分的核心组件构成,分别是发光二极管、透镜组件、光学引擎(Opt
2、ical Engine)以及控制芯片组成。光学鼠标通过底部的LED灯,灯光以30度角射向桌面,照射出粗糙的表面所产生的阴影,然后再通过平面的折射透过另外一块透镜反馈到传感器上。,当鼠标移动的时候,成像传感器录得连续的图案,然后通过“数字信号处理器”(DSP)对每张图片的前后对比分析处理,以判断鼠标移动的方向以及位移,从而得出鼠标x,y方向的移动数值。再通过SPI传给鼠标的微型控制单元(Micro Controller Unit)。鼠标的处理器对这些数值处理之后,传给电脑主机。传统的光电鼠标采样频率约为3000 Frames/sec(帧/秒),也就是说它在一秒钟内只能采集和处理3000张图像。,
3、鼠标硬件原理图1,鼠标硬件原理图2,HID协议简介,一、应用场合USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。,HID协议简介,二、USB HID类可采用的通信管道所有的HID设备通过USB的控制管道(默认管道,即端点
4、0)和中断管道与主机通信。USB HID规范定义的HID设备可用端点包含三种管道:1、控制(端点0)(必选)传输USB描述符、类请求代码以及供查询的消息数据等2、中断输入(必选)传输从设备到主机的输入数据3、中断输出(可选)传输从主机到设备的输出数据,HID协议简介,控制管道主要用于以下3个方面:1、接收/响应USB主机的控制请示及相关的类数据。2、在USB主机查询时传输数据(如响应Get_Report请求等)。3、接收USB主机的数据。中断管道主要用于以下两个方面:1、USB主机接收USB设备的异步传输数据。2、USB主机发送有实时性要求的数据给USB设备;从USB主机到USB设备的中断输出
5、数据传输是可选的,当不支持中断输出数据传输时,USB主机通过控制管道将数据传输给USB设备。,HID协议简介,三、USB HID设备的描述符HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,还包括3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。,HID协议简介,除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为零。接口描述符中bInterfaceClass的值
6、必须为0 x03,bInterfaceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。如果为0则只有在操作系统启动后才能识别并使用您的HID设备),bInterfaceProtocol的取值含义如下表所示:表2、HID接口描述符中bInterfaceProtocol的含义bInterfaceProtocol的取值(十进制)含义0 NONE1 键盘2 鼠标3255 保留,HID协议简介,下面仅对这3个HID设备类特定描述符中
7、的HID描述符进行说明。HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。HID设备描述符主要描述HID规范的版本号、HID通信所使用的额外描述符、报表描述符的长度等。其他信息请自行百度。,操作系统HID驱动简介,HID 设备驱动简介为简化USB设备的开发过程,USB提出了设备类的概念。HID设备类,即人机接口设备。典型的HID设备如键盘、鼠标。所有设备类都必须支持标准USB描述符和标准USB设备请求。如果有必要,设备类还可以自行定义其专用的描述符和设 备请求,这分别被称为设备类定义描述符和设备类定义请求。另外,一个完整
8、的设备类还将指明其接口和端点的使用方法,如如接口所包含端点的个数、端点的最大 数据包长度等。,操作系统HID驱动简介,HID设备既可以是低速设备也可以是全速设备,其典型的数据传输类型为中断IN传输,即它适用于主机接收USB设备 发来的小量到中等量的数据。HID具有以下的功能特点:1)适用于传输少量或中量的数据;2)传输的数据具有突发性;3)传输的最大速率有限制;4)无固 定的传输率。HID设备类除支持标准USB描述符外(设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符),还自行 定义了3种类描述符,分别为HID描述符(主要用于识别HID设备所包含的其他类描述符)、报告描述符(提供H
9、ID设备和主机间交换数据的格式)和物理描 述符。一个HID设备只能支持一个HID描述符;可以支持一个或多个报告描述符;物理描述符是可选的,大多数HID设备不需要使用它。,操作系统HID驱动简介,USB HID设备驱动原理设备的USB 人机交互设备必须遵循以下的USB开始程序,如右图所示:1)插入设备 USB设备第一次连接到总线时,虽然接上了电源,但是总线仍然没有任何功能,一定要到重置总线为止才可以开始运作。注意,一旦USB在D端使用了 1.5k的提升电阻,就会立即通知总线的集线器,有一个低速设备(1.5Mb/s)刚被连接上。而程序以设备地址0开始运行。设备插上时,电源打开重置的过程:重置执行初
10、始设置并出发总线重置中断-位于中止模式下知道总线被重置为止等待设备列举执行程序循环,操作系统HID驱动简介,2)总线重置 接着主机将会辨认新的USB设备并重置它。在总线重置过程中,除了设定堆栈指针外,也出发所有被使用到的中断。(总线重置的中断服务程序ISR功能)3)设备列举。主机会负责检测与设定所有连接至根集线器的设备,辨别与设定一个USB设备的程序,称为设备列举。主机首先会送出SETUP封包以读取默认地址0的设备描 述符。当收到描述符后,主机将会指定新的USB地址给设备。从设备所返回的信息中,主机就会知道设备所支持的数据端点的数量。完成设备列举。,操作系统HID驱动简介,4)数据捕捉与转换
11、这里以键盘为例,在固件中将以周期性的方式,把扫描的形式写入到扫描矩阵的列I/O端口伤(接口2),并且在行I/O接口伤读取结果值以决定哪个键被按下 了。通过键盘扫描后所得到的数据码,可以使用中断传输以端点1来传送给主机。设备就将键盘的8B数据放置在IN令牌包随后跟随的资料封包的数据域位内,再 返回给主机。当含有LED的按键(如NumLock,Caps lock 与 Scroll lock)被按下或放开时,主机就会送出含有设定报告(Set_Report)要求的SETUP封包,通过控制传输传至设备的端口0上。,操作系统HID驱动简介,USB HID设备驱动程序设计的流程说明USB总线与设备间的交互都
12、是通过USBD即USB总线驱动程序完成。USBD起着中间桥梁作用,解释USB设备类驱动程序发来的命令并将其划分为一系列的USB事务,然后发送给USB主控制器驱动程序。具体流程是插入一个USB设备后,主机检测到有设备接入,USBD就从链表中查找匹配HID设备类。为每一个接入的 HID设备驱动建立一个对应的USB_HID_SIO_CHAN结构来对该HID设备驱动进行管理。这里的USB_HID_SIO_CHAN结构是 USBD为每一个HID设备所分配的一个关键的内部数据结构。此后由USB主控制器驱动程序来负责硬件底层的驱动。而HID设备移除时,会调用函数usbHIDDeviceAttachCallb
13、ack(),这时先判断是否有与该HID设备绑定的结构,有则清除该结构。而HID设备移除时,会调用函数usbHIDDeviceAttachCallback(),这时先判断是否有与该HID设备绑定的结构,有则清除该结构。,操作系统HID驱动简介,从框图中,可以看出除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。接口描述符中bInterfaceClass的值必须为0 x03,bInterf
14、aceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。如果为0则只有在操作系统启动后才能识别并使用您的HID设备)。,操作系统HID驱动简介,成功注册一个没有被初始化的HID设备的程序流程如右图所示。USB HID设备驱动程序的简单介绍见下页。,操作系统HID接口,设备文件一般注册为“/dev/input/mouse0”,对应的驱动程序及接口如下:/输入子系统层的操作-drivers/input/input.copen/d
15、ev/input/mouse0mousedev_open()/drivers/input/mousedev.c/*打开鼠标类输入设备*/input_open_device()input_handle-dev-open/驱动层物理设备的操作-drivers/usb/input/usbmouse.cusb_mouse_open()注册Input Handler 驱动层只是把输入设备注册到输入子系统中,在驱动层的代码中本身并不创建设备结点。应用程序用来与设备打交道的设备结点的创建由Event Handler层调用Input core中的函数来实现。,操作系统HID接口,而在创建具体的设备节点之前,E
16、vent Handler层需要先注册一类设备的输入事件处理函数及相关接口static int _init mousedev_init(void)/注册输入事件处理、连接、断开、设备(文件)操作函数 input_register_handler(,操作系统HID接口,下面集中分析mousedev_event事件处理:分析数据事件结构体linux/input.h中有定义,这个文件还定义了标准按键的编码等struct input_event struct timeval time;/按键时间 _u16 type;/类型,在下面有定义 _u16 code;/要模拟成什么按键 _s32 value;/是
17、按下还是释放;code:事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0127为键盘上的按键代码,0 x1100 x116 为鼠标上按键代码,其中0 x110(BTN_ LEFT)为鼠标左键,0 x111(BTN_RIGHT)为鼠标右键,0 x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件.如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0 x00),指示鼠标的Y轴方向REL_Y(代码为0 x01),指示鼠标中轮子方向REL_WHEEL(代码为0
18、x08).,操作系统HID接口,对HID接口的测试结果如右图所示。,图形显示基本原理,随着计算机科学技术的迅猛发展,借助于计算机的图形显示技术、图像处理技术和模式识别技术均取得了重大进展。仅在电视节目制作系统中,就有电视字幕机、三维动画工作站和非线性编辑系统等几大应用领域。而在这几大应用领域中,都离不开计算机图形显示技术。,图形显示基本原理,谈到计算机图形显示技术,可分为硬件和软件两大部分,且这两大部分密切相关。就广义的图形来说,可以分为由计算机生成的字幕与图形、由扫描仪输入的图 形、由图像卡输入的活动图像及由该卡捕捉到的单帧图像(可以用某一规定的图形格式来存储)等。当这些图形图像以文件形式存
19、储下来时,可以有静态或动态、低 分辨率或高分辨率等数十种格式。,图形显示基本原理,1图形适配器及其显示模式从1981年问世的ibmpc机到当今的第4代Core系列微机,其图形显示方式都是通过图形适配器送到光栅扫描帧缓冲式显示器进行显示的,而图形适配器则是一块插在计算机主板上总线扩充槽内的插卡,它沟通了主机与显示器的联系,一般简称作显示卡。,图形显示基本原理,2光栅图形显示器的工作原理在图形显示卡上都有一个由视频存储器vram组成的显示缓冲区,它接受并暂存计算机送来的图形图像数字信息,经da转换为模拟信号后,再送到显示器 去显示。早期的mda卡上仅有4kb容量的显示缓冲存储器,到标准vga卡时容
20、量增至512kb。增强vga卡一般为1mb容量,而目前扩展功能的显示卡 上,显示缓冲区(显存)的容量已达到2Gb甚至更大。显示缓冲区可以看成是一个与屏幕上像素分布一一对应的二维矩阵,其中的每一个存储单元对应着屏幕上的一个像素,其位置可以由二维坐标(x,y)来表示。显示缓冲区的存储单元与显示器屏幕坐标的对应关系可以由下页图片所示。,图形显示基本原理,图形显示基本原理,3图形显示过程图形的显示过程应该从硬件和软件两个方面来说。就硬件方面来说,当电子束扫描到屏幕上某一像素的位置(坐标)时,显示器中的显示处理器 dpu(display processing unit)会同时从对应的显示缓冲单元中取出像
21、素值,并以此查找彩色表的地址,从该地址处得到该像素的红、绿、蓝三基色分量,经da转换后分别控制三基 色电子枪或LCD显示电路,使屏幕上该像素显示出三基色的混合色。在图2示例中,彩色表的红、绿分量分别为15,而蓝分量为0,因此,屏幕上该像素的颜色会是黄色。,图形显示基本原理,就软件方面来说,要完成图形显示的初始化及图形的加工。这里,初始化的意思是要将计算机的显示方式设置为显示器所能够显示的某一种模式,并将所有的显示缓冲单元清零,另外,对彩色表的每一个单元要分别填上预定的颜色值,使彩色索引与具体的颜色联系起来。图形加工则是图形软件的主要任务,其主要内容是:根据需要显示的图形内容,随时改写显示缓冲单
22、元的内容。这是因为屏幕上显示的图形是由显示卡上显示缓冲区中的内容唯一决定的。一旦在显示缓冲单元中写入要求的彩色索引值,图形就自然在屏幕上显示出来了。,操作系统焦点模型,无论是 Windows 应用程序还是 Linux 应用程序的开发人员,焦点(focus)都是一个非常常见的一个概念。那么焦点究竟是什么呢?简单的说,焦点决定了由哪个窗口或者控件接收键盘或鼠标输入信息,因此,它又被称作输入焦点。对于用户来说,最直观的感觉是,有光标闪动的窗口或者被高亮的控件就有焦点。,操作系统焦点模型,很多初级应用程序员或者 Windows 用户有这样一个误解,认为凡是鼠标点击的窗口就是焦点窗口。当出现有的窗口或者
23、控件点击后没有反应的现象时,就认为是焦点出现了问题。事实上,焦点仅仅控制着键盘的输入,而鼠标输入与焦点没有直接关系。用户之所以有这样的误解是由于另一个概念,系统的焦点模式(focus mode)。焦点模式决定了鼠标如何使一个窗口获得焦点。,操作系统焦点模型,一般来说,焦点模式被分为三种:click-to focus:这种模式就是指鼠标点击的窗口就可获得焦点。这是Windows用户最常见的一种模式。鼠标点击的窗口会被激活,被置于所有窗口的最前面,并接收键盘输入。focus-follow-mouse:有的地方也称这种模式为 pointer focus。它是指鼠标下的窗口可以获取焦点。当鼠标移到一个
24、可以获得焦点的窗口的范围内,用户不需要点击窗口的某个地方就可以激活这个窗口,接收键盘输入。但是,这个窗口不一定会被置于所有窗口的最前面。当鼠标移出这个窗口的范围时,这个窗口也会随之失去焦点。sloppy focus:这种模式与 focus-follow-mouse 一样,当鼠标移至某窗口的范围内的时候,该窗口会获得焦点。与 focus-follow-mouse 不同的是,当鼠标移出这个窗口范围时,焦点也不会随之改变。只有当鼠标移动到别的可以接收焦点的窗口时,系统焦点才改变。不同的系统对焦点模式的支持不同,所使用的焦点模型也有很大的区别。,操作系统焦点模型,Linux X 系统中的焦点系统Lin
25、ux 上的界面系统使用的是 X 窗口系统。X 是一个面向网络的窗口系统,它采用了 Client-Server 的模型。Client 可以看做是X系统下运行的应用程序。X Server 为各个 Client 提供了界面方面的服务。Client 和 Server 可以不在同一台机器上运行,它们通过网络发送请求和消息。,操作系统焦点模型,Windows 上的焦点是一个局部的概念,每个线程都拥有自己的焦点窗口。但是在 X 系统中,焦点是一个全局的概念。整个系统中只有一个 X 窗口拥有 X 焦点。应用程序可以通过 XSetInputFocus 来设置焦点窗口。与 Windows 不同的是,在 Linux
26、 上不可见的窗口是不能被设置为焦点窗口的。在 X 系统中,X Server 会在窗口获得或者失去焦点时发送 FocusIn 和 FocusOut 事件通知Client。但是和 Windows 不同的是,并不是所有窗口都能在焦点切换时收到通知,只有创建时选择了 FocusChangeMask 的窗口才能接收到焦点变化事件。,操作系统焦点模型,Linux上鼠标与键盘输入模型,操作系统焦点模型,X 系统有着非常特殊的键盘输入模型。在一般情况下(没有应用调用了 XGrabKey 或者XGrabKeyboard 的情况下),X 系统下键盘输入不仅与焦点有关,还与鼠标位置相关。如果当前鼠标位于焦点窗口之外
27、,那么,和 Windows 一样,X Server 会将键盘或鼠标事件发送给焦点窗口。但是,如果鼠标位于焦点窗口的子窗口上,那么,键盘事件会直接发送给这个子窗口。,应用程序鼠标捕获与程序处理,前面我们已经讲过键盘与鼠标事件的处理,这次聊聊鼠标事件处理。我们从队列里获取到事件以后,可以检测事件的类型,鼠标事件有两个:鼠标键(按下、松开)和鼠标移动。一般的检测代码如下:,应用程序鼠标捕获与程序处理,SDL_Event myEvent;/事件 int quit=0;while(!quit)while(SDL_PollEvent(,应用程序鼠标捕获与程序处理,在SDL_MOUSEBUTTONDOWN、
28、SDL_MOUSEBUTTONUP事件中,我们可以检测鼠标按键信息,然后加以处理。鼠标按键事件的结构:复制代码typedef struct SDL_MouseButtonEvent Uint8 type;/*SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP*/Uint8 which;/*The mouse device index*/Uint8 button;/*鼠标按键,左、右、中三个键*/Uint8 state;/*SDL_PRESSED按下 or SDL_RELEASED松开*/Uint16 x,y;/*鼠标按下时的坐标*/SDL_MouseButtonE
29、vent;,应用程序鼠标捕获与程序处理,鼠标移动事件的结构为:typedef struct SDL_MouseMotionEvent Uint8 type;/*SDL_MOUSEMOTION*/Uint8 which;/*The mouse device index*/Uint8 state;/*鼠标状态*/Uint16 x,y;/*鼠标当前坐标*/Sint16 xrel;/*鼠标在x方向的位移*/Sint16 yrel;/*鼠标在y方向的位移*/SDL_MouseMotionEvent;,应用程序鼠标捕获与程序处理,鼠标按下的程序处理段:case SDL_MOUSEBUTTONDOWN:/鼠标按下 switch(myEvent.button.button)case SDL_BUTTON_LEFT:x=myEvent.button.x;/得到当前鼠标的坐标 y=myEvent.button.y;/判断鼠标是否落在登录按钮里 if(isOnButton(x,y,0)=1)selected=LOGIN;changeButton(LEFT,2,应用程序鼠标捕获与程序处理,程序界面如下:,以上就是操作系统使用过程中,鼠标移动“登录”按钮并按下的操作原理。谢谢!,