PS2鼠标接口程序设计总结.doc_第1页
PS2鼠标接口程序设计总结.doc_第2页
PS2鼠标接口程序设计总结.doc_第3页
PS2鼠标接口程序设计总结.doc_第4页
PS2鼠标接口程序设计总结.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章PS2鼠标接口程序设计总结1.1 PS/2鼠标接口简介标准的PS/2鼠标,支持下面的输入X(左右)位移、Y(上下)位移、左键、中键和右键鼠标以一个固定的频率读取这些输入,并更新不同的计数器,然后标记出反映的移动和按键状态。标准的鼠标有两个计数器,保持位移的跟踪,X位移计数器和Y位移计数器。可存放9位的2进制补码,并且每个计数器都有相关的溢出标志,它们的内容连同三个鼠标按钮的状态一起以三字节移动数据包的形式发送给主机。位移计数器表示从最后一次位移数据包被送往主机后,有位移量发生。当鼠标读取它的输入的时候,它记录按键的当前状态,然后检查位移,如果位移发生它就增加(对正位移)或减少(对负位移)X和/或Y位移计数器的值。如果有一个计数器溢出了就设置相应的溢出标志。1.1.1 输入分辨率和缩入比例决定位移计数器增减数量的参数叫分辨率,缺省的分辨率为4个计数单位/毫米,主机可以用设置分辨率0xE8命令改变这个值。有一个参数不影响位移计数器的值,但是影响这些计数器报告的值。这个参数就是缩放比例,缺省情况下鼠标使用1:1比例。因此对报告的鼠标位移没有影响,但是主机可以用设置比例2:1(0xE7)命令选择2:1比例。如果启用了2:1比例,鼠标在发数据给主机前采用如表1.1的算法运算计数器内容。表1.1 缩放比例算法运算表位移增量值报告值001121334659N52*N1.1.2 位移数据包标准的PS/2鼠标,发送位移和按键信息给主机采用如表1.2的3字节数据包格式。表1.2 3字节数据包格式D7D6D5D4D3D2D1D0Byte1YoverflowXoverflowYsign bitXsign bitAlways1MiddleBtnRight BtnLeft BtnByte2X MovementByte3Y Movement位移计数器是一个9位2进制的补码整数。它的最高位作为符号位出现,在位移数据包的第一个字节里,这些计数器在鼠标读取输入发现有位移时被更新。这些值是自从最后一次发送位移数据包给主机后位移的累计量(即最后一次数据包发给主机后位移计数器被复位)。位移计数器可表示的值的范围是-255 到+255。如果超过了范围,相应的溢出位就被设置,并且在复位前计数器不会增减。一旦位移数据包成功地发送给主机,位移计数器就会复位,同样鼠标在收到主机不是“Resend” 0xFE命令外的其他命令计数器也会复位。1.1.3 Intelimouse的扩展对标准的PS/2 鼠标的一个流行的扩展是微软的Intellimouse。它包括支持五个鼠标按键和三个位移轴(左右上下和滚轮)。这些附加特征要求使用4字节的位移数据包,而不是标准3 字节包,因为标准PS/2 鼠标驱动不认识这个数据包的格式,因此微软的Intellimouse要求严格按照标准PS/2 鼠标来操作。除非它知道驱动程序支持扩展数据包格式,如果微软的Intellimouse用于一台只支持标准PS/2 鼠标的计算机它依然是有功能的,只是滚轮和第4 5 个按键不起作用。微软的Intellimouse工作起来象标准的PS/2 鼠标,(也就是使用3 字节位移数据包,和标准PS/2 鼠标一样回应所有命令报告设备ID 0x00)。要进入滚轮模式,主机应该发送如下的命令序列:设置采样速率 200设置采样速率 100设置采样速率 80要进入滚轮+5键模式,主机应该发送如下的命令序列:设置采样速率 200设置采样速率 200设置采样速率 80主机然后应该发布“获得设备ID” 命令0xF2并等待回应,如果安装的是是标准PS/2 鼠标非Intellimouse,它回应设备ID0x00。在这种情况下主机会辨认出实际这个鼠标没有滚轮并继续把它当作是标准PS/2 鼠标。但是如果安装的是微软的Intellimouse它返回的ID是0x03。这就告诉主机挂接的定点设备有滚轮,并且主机认为鼠标使用4 字节的位移数据包,如表1.3所示:表1.3 4字节数据包格式D7D6D5D4D3D2D1D0Byte1Y overflowX overflowY sign bitX sign bitAlways1Middle BtnRight BtnLeft BtnByte2X MovementByte3Y MovementByte4Z MovementZ 位移是2的补码,表示滚轮自上次数据报告以来的位移,有效值的范围在-8 到+7 这意味着数值实际只有低四位高四位仅用作符号扩展位。主机接着发布“获得设备ID” 命令(0xF2)并等待回应,微软的Intellimouse用0x04 这样设备ID 应答并且使用如下的4 字节位移数据包,如表1.4所示:表1.4 五键4字节数据包格式D7D6D5D4D3D2D1D0Byte1Y overflowX overflowY sign bitX sign bitAlways1Middle BtnRight BtnLeft BtnByte2X MovementByte3Y MovementByte1Always0Always05th Btn4th BtnZ3Z2Z1Z0Z0-Z3是2的补码,用于表示从上次数据报告以来滚轮的位移量,有效范围从-8 到+7。第4键:1=第4键按下了;0=第4键没有按下。第5键:1=第5键按下了;0=第5键没有按下。1.2 操作模式根据鼠标工作的模式来处理的数据报告有四种标准的工作模式。Reset鼠标在上电或收到“Reset”(0xFF)命令后进入Reset 模式Stream这是缺省模式在Reset执行完成后,也是多数软件使用鼠标的模式。如果主机先前把鼠标设置到了Remote模式,那它可以发送Set Stream Mode(0xEA)命令给鼠标,让鼠标重新进入Stream模式。Remote在某些情况下Remote模式很有用可以通过发送Set Remote Mode(0xF0)命令进入。Wrap除了为测试鼠标和它的主机之间的连接外这个模式不是特别地有用。Wrap模式可以通过发送Set Wrap Mode(0xEE)命令给鼠标来进入,要退出Wrap 模式主机必须发布Reset(0xFF)命令或Reset Wrap Mode(0xEC)命令。如果Reset(0xFF)命令收到了,鼠标将进入Reset 模式。如果收到的是Reset Wrap Mode(0xEC)命令鼠标将进入Wrap 模式前的那个模式。(注意鼠标同样可以进入extended操作模式,正如本文后面所述但是这不是标准PS/2 鼠标的特征。)1.2.1、Reset模式鼠标在上电后或应答“Reset”(0xFF)命令就进入reset模式。进入这个模式后鼠标执行象前面提到的BAT (基本保证测试)一样的自检并设置如下的缺省值:采样速率100 采样点/秒分辨率4 个计数值/毫米缩放比例1:1数据报告被禁止然后发送BAT完成代码,这个代码不是0xAA(BAT 成功)就是0xFC(错误)如果主机收到了不是0xAA的回应,它可能重新给鼠标供电,这样来引起鼠标复位并重新执行BAT。接着BAT完成代码(0xAA 或0xFC)的后面鼠标发送它的设备ID 0x00。 这个ID 用来区别设备是键盘还是处于扩展模式中的鼠标(从发复位命令到鼠标发送它的设备ID时间大概为360mS)。在一些文件中说主机在没收到设备ID 前不会假定发送任何数据。但有些BIOS 在上电复位并收到0xAA 后立刻发送“Reset”(0xFF) 命令。鼠标发送自己的设备ID 给主机后它就进入了Stream 模式。注意鼠标设置的一个缺省值之一是数据报告被禁止,这就意味着鼠标在没收到“使能数据报告”(0xF4)命令之前不会发送任何位移数据包给主机。1.2.2、Stream模式在Stream 模式中,一旦鼠标检测到位移或发现一个或多个鼠标键的状态改变了就发送位移数据包。数据报告的最大速率被认为是采样速率。参数的范围从10 采样点/秒到200 采样点/秒,这个参数的缺省值是100采样点/秒。主机可以用设置采样速率(0xF3)命令来改变它。Stream 模式是操作的缺省模式。1.23、Remote模式在这个模式下鼠标以当前的采样速率读取输入,并更新它的计数器和标志。但是它只在主机请求数据的时候才报告给主机位移和按键状态。主机通过“读数据”(0xEB)命令来获得数据,在收到命令后鼠标发送位移数据包并复位它的位移计数器1.24、Wrap模式这是一个回声模式,鼠标收到的每个字节都会被发回主机,甚至收到的是一个有效的命令鼠标都不会应答这条命令,它只把这个字节回送给主机。但是有两个例外“Reset”(0xff)命令和“Reset Wrap Mode” (0xEC)命令鼠标认为这两条命令是一有效的命令,并且不会回送它们到主机。1.3 初始化下面是在计算机运行Win98SE 和鼠标之间的通讯。启动的时候插有一个PS/2 鼠标,PS/2 鼠标的初始化过程相当的典型。如果你要仿真一个PS/2 鼠标必须至少能支持如下的命令序列:上电复位Mouse: AA 自我测检通过Mouse: 00 鼠标IDHost: FF 主机发送复位命令Mouse: FA 鼠标应答Mouse: AA 自我测检通过Mouse: 00 鼠标IDHost: FF 主机发送复位命令Mouse: FA 鼠标应答Mouse: AA 自我测检通过Mouse: 00 鼠标IDHost: FF 主机发送复位命令Mouse: FA 鼠标应答Mouse: AA 自我测检通过Mouse: 00 鼠标IDHost: F3 设置采样速率,识别鼠标是否带滚轮Mouse: FA 鼠标应答Host: C8 采样速率 200点/秒Mouse: FA 鼠标应答Host: F3 设置采样速率Mouse: FA 鼠标应答Host:64 采样速率 100点/秒Mouse: FA 鼠标应答Host: F3 设置采样速率Mouse: FA 鼠标应答Host:50 采样速率 80点/秒Host: F2 获取设备IDMouse: FA 鼠标应答Mouse: 00 鼠标ID,如果回应的是03带滚轮的三键鼠标/-此段不知有何作用-Mouse: FA 鼠标应答Host: F3 设置采样速率Mouse: FA 鼠标应答Host:0A 采样速率 10点/秒Mouse: FA 鼠标应答Host: F2 获取设备IDMouse: FA 鼠标应答Mouse: 00 鼠标ID /-Host: E8 设置分辨率Mouse: FA 鼠标应答Host: 03 8个计数值/毫米Mouse: FA 鼠标应答Host: E6 缩放比例1:1Mouse: FA 鼠标应答Host: F3 设置采样速率Mouse: FA 鼠标应答Host28 采样速率 40点/秒Mouse: FA 鼠标应答Host: F4 使能数据报告Mouse: FA 鼠标应答初始化完成1.4 命令集下面列出的是仅可发送给鼠标的命令,如果鼠标工作在Stream模式,主机在发送任何其他命令之前,要先禁止数据报告(命令0xF5)。 0xFF (Reset)鼠标用应答0xFA,回应这条命令并进入Reset模式 0xFE (Resend)只要从鼠标收到无效数据,主机就发送这条命令,鼠标的回应是重新发送它最后发给主机的数据包。如果鼠标用了另外一个非法的包来回应主机,要么发布另一条Resend 命令,要么发布Error命令要么让鼠标重新上电来复位它,或者禁止通讯把时钟线拉低,采取什么样的动作取决于主机。 0xF6 (Set Defaults)鼠标用应答0xFA来回应,然后载入如下的值:采样率=100,分辨率 = 4个值/毫米、比例1 :1禁止数据报告,接着鼠标清空它所有的位移计数器,并进入stream 模式。 0xF5 (Disable Data Reporting)鼠标用应答0xFA回应命令,然后禁止数据报告,并复位它的位移计数器。这仅对Stream模式下的数据报告有效。并且它不能禁止采样。禁止的stream模式功能与remote 模式相同。 0xF4 (Enable Data Reporting)鼠标用应答0xFA回应命令,然后使能数据报告,并复位它的位移计数器。这条命令可以对在Remote模式或Stream模式下的鼠标发布。但只对Stream模式下的数据报告有效。 0xF3 (Set Sample Rate)鼠标用应答0xFA 回应命令,然后从主机读入一个或更多字节。鼠标保留这个字节作为新的采样速率在收到采样速率后,鼠标再次用应答0xFA 回应,并复位它的位移计数器。有效的采样速率是10、20、40 、60、80、100和200 采样点/秒。 0xF2 (Get Device ID)鼠标用应答0xFA 回应命令,后面跟着它的设备ID,对标准PS/2 鼠标来说是0x00;鼠标同样会复位它的位移计数器。 0xF0(Set Remote Mode)鼠标用应答0xFA回应,然后复位它的位移计数器并进入盘Remote模式。 0xEE(Set Wrap Mode)鼠标用应答0xFA回应,然后复位它的位移计数器并进入wrap模式。 0xEC(Reset Wrap Mode)鼠标用应答0xFA回应,然后复位它的位移计数器并进入wrap模式之前的那个模式(stream模式或remote模式)。 0xEB(Read Data)鼠标用应答0xFA 回应,然后发送位移数据包。这是在remote模式中读数据的唯一方法,在数据包成功地被发送后,鼠标将复位它的位移计数器。 0xEA (Set Stream Mode)鼠标用应答0xFA 回应,然后复位它的位移计数器并进入stream模式。 0xE9 (Status Request)鼠标用应答0xFA 回应,然后发送如表1.5,3个字节的状态包, 然后复位它的位移计数器。表1.5 鼠标状态包格式Byte1Always0ModeEnableScalingAlways0Left BtnMiddle BtnRight BtnByte2分辨率Byte3采样速率右键、中键、左键 =1,表示键被按下;=0 ,表示键没有按下。Scaling = 1缩放比例位2:1; =0,比例为1 :1;见命令0xE7和0xE6。Enable = 1表示数据报告被使能;=0,示数据报告被禁止;见命令0xF5和0xF4。Mode = 1表示remote 模式被使能;=0,表示stream模式被使能;见命令0xF0和0xEA。 0xE8 (Set Resolution )鼠标用应答0xFA 回应,然后从主机读取一个字节,并再次用鼠标用应答0xFA应然回应,然后复位它的位移计数器,从主机读入的字节决定了分辨率如表1.6所示:表1.6 鼠标位移分辩率对应表主机发过来的数据分辨率0x001 计数值/毫米0x012 计数值/毫米0x024 计数值/毫米0x038 计数值/毫米 0xE7 (Set Scaling 2:1)鼠标用应答0xFA回应,然后使能2:1比例。 0xE6 (Set Scaling 1:1)鼠标用应答0xFA回应,然后使能1:1比例。对于标准鼠标而言,只有(Resend )0xFE和(Error) 0xFC 命令会发送给主机。这两条命令的工作情况和主机到设备间的命令一样。注: 1、2 :1比例仅适用于Stream模式的自动数据报告中,对于回应Read Data 0xEB命令的报告数据是无效的。2、鼠标和主机不缓冲Resend 0xFF 命令,这意味着0xFE 绝不会作为Resend 命令的回应来发送。3、一个数据包可以是3字节的位移数据包,或4字节的位移数据包,Intellimouse的或3 字节的状态包Status Request 0xE9命令或2字节的完成代码ID包,0xAA 、0x00或0xFC、0x00或1字节的命令回应。4、当PS/2数据线常置零时,PS/2鼠标将不断产生时钟脉冲。1.5 PS/2通讯协议PS2通讯协议是一种双向同步串行通讯协议。通讯的两端通过Clock(时钟脚)同步,并通过Data(数据脚)交换数据。任何一方如果想抑制另外一方通讯时,只需要把clock(时钟脚)拉到低电平。如果是PC机和PS2键盘间的通讯,则PC机必须做主机,也就是说,PC机可以抑制PS2键盘发送数据,而PS2键盘则不会抑制PC机发送数据, 也即主机总是在总线上有优先权。一般两设备间传输数据的最大时钟频率是33KHz,大多数PS2设备工作在1020KHz。推荐值在15KHz左右,也就是说,clock(时钟脚)高、低电平的持续时间都为40。每一数据帧包含1112个位,具体含义如表1.7所列。表1.7 PS/2通讯数据帧格式1个起始位总是逻辑08个数据位(LSB)低位在前1个奇偶校验位奇校验1个停止位总是逻辑11个应答位仅用在主机对设备的通讯中表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。1.5.1、PS/2设备到主机的通讯时钟频率为10-16.7kHz 。从时钟脉冲的上升沿到一个数据转变的时间至少要有5微秒。数据变化到时钟脉冲的下降沿的时间至少要有5 微秒,并且不大于25微秒。这个定时非常重要你应该严格遵循它。主机可以在第11个时钟脉冲停止位之前把线拉低,导致设备放弃发送当前字节,这是非常罕见的。在停止位发送后设备在发送下个包前至少应该等待50微秒。这将给主机时间,当它处理接收到的字节时抑制发送(主机在收到每个包时通常自动做这个)。在主机释放抑制后,设备至少应该在发送任何数据前等50微秒。其通讯时序图如图1.1所示。从PS2向PC机发送一个字节可按照下面的步骤进行:1) 检测时钟线电平,如果时钟线为低,则延时50;2) 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);3) 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向PS2设备发送数据,所以PS2设备要转移到接收程序处接收数据);4) 延时20(如果此时正在发送起始位,则应延时40);5) 输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保PC机没有抑制PS2设备,如果有则中止发送;6) 输出8个数据位到数据线上;7) 输出校验位;8) 输出停止位(1);9) 延时30(如果在发送停止位时释放时钟信号则应延时50);按如下的过程发送单个位1) 设置/复位数据2) 延迟20微秒3) 把时钟拉低4) 延迟40微秒5) 释放时钟6) 延迟20微秒图1.1 设备到主机的通讯1.5.2、主机到PS/2设备的通讯首先PS/2 设备总是产生时钟信号,如果主机要发送数据它必须首先把时钟和数据线设置为请求。发送状态如下示 通过下拉时钟线至少100微秒来抑制通讯 通过下拉数据线来应用请求,发送然后释放时钟设备应该在不超过10 毫秒的间隔内就要检查这个状态。当设备检测到这个状态,它将开始产生时钟信号,并且时钟脉冲标记下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线而数据在时钟脉冲的上升沿被锁存,当发生在设备到主机通讯的过程中时正好相反。在停止位发送后,设备要应答接收到的字节,就把数据线拉低并产生最后一个时钟脉冲,如果主机在第11 个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放然后设备将产生一个错误。通讯时序图如图1.2、1.3所示。主机可以在第11 个时钟脉冲应答位前中止一次传送,只要下拉时钟线至少100微秒。主机必须按下面的步骤发送数据到PS/2设备1) 把时钟线拉低至少100微秒2) 把数据线拉低3) 释放时钟线4) 等待设备把时钟线拉低5) 设置/复位数据线发送第一个数据位6) 等待设备把时钟拉高7) 等待设备把时钟拉低8) 重复 5-7步发送剩下的7个数据位和校验位9) 释放数据线10) 等待设备把数据线拉低11) 等待设备把时钟线拉低12) 等待设备释放数据线和时钟线图1.2 主机到设备的通讯图1.3 主机到设备通讯的详细过程图1.3描述了两个重要的定时条件:a和b。a在主机最初把数据线拉低后,设备开始产生时钟脉冲的时间,必须不大于15ms;b数据包被发送的时间,必须不大于2ms 。如果这两个条件不满足,主机将产生一个错误。在包收到后,主机为了处理数据立刻把时钟线拉低来抑制通讯,如果主机发送的命令要求有一个回应,这个回应必须在主机释放时钟线后20ms之内被收到。如果没有收到则主机产生一个错误,在设备到主机通讯的情况中,时钟改变后的5微秒内不应该发生数据改变的情况。1.6方案设计1.6.1、设计思想针对FPGA做时序控制不方便的缺点,本设计简化了通讯协议,对PS2鼠标的操作只用了一条指令,使能数据报告(0xF4)。利用鼠标上电自动复位并进入Stream模式后,送使能数据报告指令(0xF4),便完成对鼠标的初使化。之后便可以接收PS2鼠标发送过来的数据包。该方案的优点是简化程序,节省资源;缺点是不能软复位,即鼠标由于出现异常情况而不正常工作,不能用软件复位,只能重新插拔鼠标。但出现异常状况的情况比较少,所以总来的该方案是比较合理的。1.6.2、接口与控制 Clock(input)系统时钟,默认为48MHz,如要改为其它频率,需要改动如下几个参数:parameter WATCHDOG_TIMER_VALUE = 19200; /看门狗计时器,400uSparameter WATCHDOG_TIMER_BITS = 15; /400uS计时器所需计数器位数parameter TIMER_5US_VALUE = 240; / 5uS计数值parameter TIMER_5US_BITS = 8; / 5uS计时器所需计数器位数 reset(input)复位信号,高电平有效。复位时不会向PS/2鼠标发送复位命令,只向鼠标发送数据使能报告。 ps2_clk(bidir)PS/2时钟线,为双向端口,外围电路需加上拉电阻。 ps2_data(bidri)PS/2数据线,为双向端口,外围电路需加上拉电阻。 left_button(output)左键标志位,高电平表示左键按下。 right_button(output)右键标志位,高电平表示右键按下。 middle_button(output)中键标志位,高电平表示中键按下。 x_increment8.0(output)X轴增量,为9位二进制补码,最高位为符位。鼠标左移,位移增量为负;右移,位移增量为正。 y_incremetn8.0(output)Y轴增量,为9位二进制补码,最高位为符位。鼠标上移,位移增量为负;下移,位移增量为正。 data_ready(output)高电平表示有新数据输出。输出为一个时钟脉冲。1.7 调试总结在调试过程中,最大的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论