关闭

关闭

封号提示

内容

首页 PS2鼠标键盘协议-仅含PS2部分.pdf

PS2鼠标键盘协议-仅含PS2部分.pdf

PS2鼠标键盘协议-仅含PS2部分.pdf

上传者: 木恋顾 2012-03-01 评分 4.5 0 95 13 432 暂无简介 简介 举报

简介:本文档为《PS2鼠标键盘协议-仅含PS2部分pdf》,可适用于IT/计算机领域,主题内容包含第一章PS协议引言PS设备接口用于许多现代的鼠标和键盘它是由IBM开发并且最初出现在IBM技术参考手册里。但是当我知道的时候这篇文件就已经很多年没有符等。

第一章PS协议引言PS设备接口用于许多现代的鼠标和键盘它是由IBM开发并且最初出现在IBM技术参考手册里。但是当我知道的时候这篇文件就已经很多年没有印刷了因此关于这个内容现在没有官方的出版物。我无法访问IBM的技术参考手册所以本文中的所有信息都来自于我自己的经验及一些参考的帮助。这个文件描述了用于PS鼠标、PS键盘的接口。我将论及物理和电气接口也包括协议。如果你需要更高级的信息诸如命令、数据包的格式或者其他关于键盘鼠标的特别细节详见本文第二章和第三章。连接器常用的PS端口是脚的miniDINPC键盘常用的也是脚的miniDIN。具有脚miniDIN的键盘通常被叫做“PS”键盘。现在流行的键盘(和鼠标)大多是PS或USB的。这篇文章不适用于USB设备它们使用了一种完全不同的接口。PS连接器的引脚定义如下所示:在PS连接器上有四个管脚:电源地、V、数据和时钟。主机提供V并且键盘鼠标的地线连接到主机的电源地上。数据和时钟都是集电极开路(OC)的因此任何你连接到PS鼠标、键盘或主机的设备在时钟和数据线上都要有一个大的上拉电阻(一般取KΩ)。置“”就把线拉低置“”就让线上浮成高电平。参考右图中数据和时钟线的一般接口。(注意:如果你打算使用象这样的微控制器由于它们的IO管脚是双向的你可以跳过晶体管和缓冲门并且通用同一个管脚进行输入和输出。)一般性描述PS鼠标和键盘履行一种双向同步串行协议。换句话说每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入。键盘鼠标可以发送数据到主机而主机也可以发送数据到设备但主机总是在总线上有优先权它可以在任何时候抑制来自于键盘鼠标的通讯只要把时钟拉低即可。从键盘鼠标发送到主机的数据在时钟信号的下降沿(当时钟从高变到低的时候)被读取从主机发送到键盘鼠标的数据在上升沿(当时钟从低变到高的时候)被读取。不管通讯的方向怎样键盘鼠标总是产生时钟信号。如果主机要发送数据它必须首先告诉设备开始产生时钟信号(这个过程在后面中详细讲解)。最大的时钟频率是kHz而且大多数设备工作在-kHz。如果你要制作一个PS设备我推荐你把频率控制在kHz左右这就意味着时钟应该是高us低us。所有数据安排在字节中每个字节为一帧包含了-个位。这些位的含义如下:个起始位总是为个数据位低位在前个校验位奇校验个停止位总是为个应答位仅在主机对设备的通讯中当主机发送数据给键盘鼠标时设备回送一个握手信号来应答数据包已经收到。这个位不会出现在设备发送数据到主机的过程中。设备到主机的通讯过程数据和时钟线都是集电极开路结构(正常保持高电平)。当键盘或鼠标等待发送数据时它首先检查时钟以确认它是否是高电平。如果不是那么是主机抑制了通讯设备必须缓冲任何要发送的数据直到重新获得总线的控制权(键盘有字节的缓冲区而鼠标的缓冲区仅存储最后一个要发送的数据包)。如果时钟线是高电平设备就可以开始传送数据。如在上一节提及的键盘和鼠标使用一种每帧包含位的串行协议。这些位含义是:个起始位总是为个数据位低位在前个校验位奇校验个停止位总是为每位在时钟的下降沿被主机读入如图和所示:时钟频率为-kHz。从时钟脉冲的上升沿到一个数据转变的时间至少要有us数据变化到时钟脉冲的下降沿的时间至少要有us并且不大于us。这个定时必须严格遵循。主机可以在第个时钟脉冲(停止位)之前把时钟线拉低导致设备放弃发送当前字节(这是非常罕见的)。在停止位发送后设备在发送下个包前至少应该等待us。这将给主机一定时间处理接收到的字节(主机在收到每个包时通常自动做这个)在处理字节这段时间内主机应抑制其发送。在主机释放抑制后设备至少应该在发送任何数据前等us。我推荐仿真键盘鼠标采用下面的过程发送一字节的数据到主机:)等待Clock线为高电平即等待主机释放Clock线)延时us)判断Clock线是否为高电平?No――跳到第步)Data线是否为高电平?No――放弃(跳到从主机读取字节的程序中)。)延迟us输出起始位()然后延迟us再拉低Clock线保持us后释放Clock线形成一个脉冲)延时us测试Clock线是否为高电平?No――跳到第步)输出第个数据位然后延时us再拉低Clock线保持us后释放Clock线形成一个脉冲图设备到主机的通讯当时钟为高数据线改变状态在时钟信号的下降沿数据被锁存。图”Q”键的扫描码从键盘发送到计算机通道A是时钟信号通道B是数据信号。)重复步发送剩下的个数据位和校验位)延时us测试Clock线是否为高电平?No――跳到第步)输出停止位()然后延时us再拉低Clock线保持us后释放Clock线形成最后一个脉冲。主机到设备的通讯过程在这里被发送的数据包有点不同于设备到主机的通讯过程。首先PS设备总是产生时钟信号。如果主机要发送数据它必须首先把时钟和数据线设置为“请求发送”状态即:通过下拉时钟线至少us来抑制通讯通过下拉数据线来应用“请求发送”然后释放时钟。PS设备应该在不超过ms的间隔内就要检查这个状态。当设备检测到这个状态它将开始产生标记下的八个数据位和一个停止位的时钟脉冲。主机仅当时钟线为低的时候改变数据线而数据在时钟脉冲的上升沿被锁存。这与发生在设备到主机的通讯过程中正好相反。在停止位发送后设备要应答接收到的字节就把数据线拉低并产生最后一个时钟脉冲。如果主机在第个时钟脉冲后不释放数据线设备将继续产生时钟脉冲直到数据线被释放(然后设备将产生一个错误)。主机可以在第个时钟脉冲(应答位)前中止一次传送只要下拉时钟线至少us。要使得这个过程易于理解主机必须按下面的步骤发送数据到PS设备:)把Clock线拉低至少us)把Data线拉低)释放Clock线)等待PS设备把Clock线拉低)设置复位Data线发送第一个数据位)等待PS设备把时钟拉高)等待PS设备把时钟拉低)重复步发送剩下的个数据位和校验位)释放Data线即发送停止位())等待PS设备把Clock线拉高此步可省略,因为下一步PS设备还是会把Data线拉低的)等待PS设备把Data线拉低)等待PS设备把Clock线拉低)等待PS设备释放Clock线和Data线。图用图形图以单独的时序表示了由主机产生的信号及由PS设备产生的信号。注意应答位时序的改变-数据改变发生在Clock线为高的时候(不同于其它位是Clock线为低的时候)。图描述了两个重要的定时条件:(a)和(b)。(a)从主机最初把Clock线拉低到PS设备开始产生时钟脉冲(即Clock线被PS设备拉低)这段时间间隔必须不大于ms。(b)发送数据包(位数据位和校验位图主机到设备的通讯图主机到设备通讯的详细过程的总时间必须不大于ms。如果这两个条件不满足主机将产生一个错误。在包收到后主机为了处理数据应立刻把时钟线拉低来抑制通讯。如果主机发送的命令要求有一个应答这个应答必须在主机释放Clock线后ms之内被收到如果没有收到则主机产生一个错误。在设备到主机通讯的情况中时钟改变后的us内不应该发生数据改变的情况。如果你要仿真一个鼠标或键盘我推荐你按如下的过程从主机读入数据:在你的主程序中至少每ms检测一次Data线是否为低如果Data线已被主机拉低则从主机读取一个字节的数据。即:)等待Clock线为高电平即等待主机释放Clock线)Data线仍然为低吗?No-有错误发生放弃。)读入个数据位在读入这些位后)读入校验位测试时钟线数否被主机拉低)读入停止位这就意味着放弃这次传送。)Data线仍旧为低吗?Yes-继续产生Clock信号直到Data线为高电平然后产生一个错误)输出应答位)检查校验位如果校验位不正确则产生一个错误)延迟us(给主机时间抑制下次的传送)。按如下次序读取每位(个数据位、校验位和停止位):)延迟us)把Clock线拉低)延迟us)释放Clock线)延迟us)读Data线。按如下次序发送应答位:)延迟us)把Data线拉低)延迟us)把Clock线拉低)延迟us)释放Clock线)延迟us)释放Data线。(后注:PS设备发送个数据位时是按照从最低位到最高位的顺序依次发出的。)第二章ATPS键盘接口引言本章试着囊括AT和PS键盘各方面的问题它包含了如低级别信号和协议、扫描码、命令集、初始化、兼容性问题和其他各种信息。我还包含了关于PC键盘控制器的信息这是由于它们非常相关。应该说明的是在这篇文章里提到的信息来自我自己的经验和其他资源因此可能不正确。我没有参考任何官方的文件因为没有我能用到的。因而我提出如下的弃权:ALLINFORMATIONWITHINTHISARTICLEISPROVIDED"ASIS"ANDWITHOUTANYEXPRESSORIMPLIEDWARRANTIES,INCLUDING,WITHOUTLIMITATION,THEIMPLIEDWARRANTIESOFMERCHANTIBILITYANDFITNESSFORAPARTICULARPURPOSEIDONOTGUARANTEEANYINFORMATIONINTHISARTICLEISACCURATE,ANDITSHOULDBEUSEDFORABSTRACTEDUCATIONALPURPOSESONLY(译者注:大伙们自己看原文吧这个申明对要使用该文的人来说很重要!)相关的历史现今仍在使用中的绝大多数流行的键盘包括:USB键盘――最后出现的键盘被所有新式的计算机支持(Macintosh和IBM及其兼容机)。它们有自己相关的复杂接口并且不包含这篇文章中。IBM机器兼容键盘――也叫做“AT键盘”或“PS键盘”所有现代的PC都支持这个设备。它们是最容易使用的接口也是本文的主题。ADB键盘――连接到老式Macintosh系统的Apple桌面总线不包含在这篇文章中。IBM引入了一种新型的键盘作为它每种主要桌面计算机型号的配备。最早的IBMPC和后来的IBMXT使用的我们称之为“XT键盘”。它们很古老并和现代的键盘一点都不相同关于XT键盘没有在本文中论及。后来出现了IBMAT系统再后来出现IBMPS。他们引进的键盘我们至今还在使用也是本文的主题。AT键盘和PS键盘是十分相似的设备但是PS使用了更小的连接器并且支持少量附加的特征。虽然如此它仍保留了与AT系统向后兼容以及一些曾经流行的附加特征(因为软件总要保持向后兼容)。下面是IBM三种主要键盘的概要:IBMPCXT键盘():键脚DIN连接器简单的单向串行协议采用我们现在提及的作为第一套扫描码集没有主机到键盘的命令IBMAT键盘():-(不向后兼容XT系统)-键脚DIN连接器双向串行协议采用我们现在提及的作为第二套扫描码集八个主机到键盘的命令IBMPS键盘():(兼容AT系统不兼容XT系统)-键脚miniDIN连接器双向串行协议提供可选的第三套扫描码集个主机到键盘的命令PS键盘最初是AT键盘的扩展它支持少量附加的主机到键盘的命令并以小型连接器为特征在这两种设备之间只有这两个区别。但是计算机硬件决不会有象兼容性这样多的标准。由于这种原因你今天买到的任何键盘都与PS和AT系统兼容但它可能不完全支持原始键盘的所有特征。今天“AT键盘”和“PS键盘”仅涉及它们的连接器大小。任何给定的键盘支持或不支持哪些设置及命令是每个人的猜测。例如我现在使用的键盘有一个PS风格的连接器但它仅完全支持七个命令部分支持两个命令对其他的命令只是“应答”。作为对照我做测试的键盘有一个AT风格的连接器但是支持原始PS设备的每个特征命令(还加上少量额外的命令)。这就重要的说明了现代的键盘是兼容性的而不是标准。如果你的工程依赖于某些不一般的特征它可能在一些系统上工作而在另一些上却不能。现代ATPS兼容键盘任意数目的按键(通常是或)脚或脚连接器通常包括了适配器双向串行协议只有第二套扫描码集是保证的应答所有的命令但可能不是所有的都起作用脚注):XT键盘使用了一套与AT和PS系统中用的完全不同的协议因此它不和较新的PC兼容。但是在某些键盘控制器中有一转换过程可以既支持XT又支持ATPS键盘(通过开关、跳线或自适应)同样这些键盘在两类系统都可以工作(再次重申是通过开关或者自适应)。如果你有这样的PC或键盘不要被它愚弄了因为XT键盘并不兼容于现代的计算机。一般性描述键盘上包含了一个大型的按键矩阵它们是由安装在电路板上的处理器(叫做“键盘编码器”)来监视的。具体的处理器在键盘与键盘之间是多样化的但它们基本上都做着同样的事情:监视哪些按键被按下或释放了并在适当的时候传送数据到主机。如果有必要处理器处理所有的去抖动并在它的字节缓冲区里缓冲数据。你的主板包含了一个“键盘控制器”负责解码所有来自键盘的数据并告诉你的软件什么事件发生了。在主机和键盘之间的通讯使用IBM的协议。脚注):最初IBM使用Intel微处理器作为它的键盘编码器。如下是现代键盘编码器的简短清单:Holtek:HTKA,HTKA,HTKA,HTKEEMC:EM,EMH,EMH,EMH,Intel:,Motorola:,HC,Zilog:Z,Z,Z,ZC,ZE脚注):最初IBM使用Intel的微控制器作为它的键盘控制器。现在已经被兼容设备取代并整合到主板的新品组中。键盘控制器是本文稍后论及的内容。电气接口协议AT和PS键盘使用了与PS鼠标一样的协议详见第一章的内容。扫描码键盘的处理器花费很多的时间来扫描或监视按键矩阵。如果它发现有键被按下、释放或按住键盘将发送“扫描码”的信息包到计算机。扫描码有两种不同的类型:“通码”和“断码”。当一个键被按下或按住就发送通码当一个键被释放就发送断码。每个按键被分配了唯一的通码和断码这样主机通过查找唯一的扫描码就可以测定是哪个按键。每个键一整套的通断码组成了“扫描码集”。现在有三套标准的扫描码集分别是第一套、第二套和第三套所有现代的键盘默认使用第二套扫描码。那么你能计算出每个按键的扫描码吗?不幸的是没有一个简单的公式可以计算扫描码。如果你要知道某特定按键的通码和断码你将不得不查表获得。我已经把所有三套扫描码集中所有的通码和断码做成了表格。第一套扫描码集-原始的XT扫描码集某些现代的键盘还支持第二套扫描码集-所有现代键盘默认的扫描码集第三套扫描码集-可选的PS扫描码集(很少使用)。(译者注:这是我见过的收录最全的扫描码集详见本文附录。感谢AdamChapweske所做的工作。)脚注):最初AT键盘只支持第二套PS键盘默认使用第二套且支持所有这三套。许多现代键盘行为象PS设备但我遇到少数不支持第一套、第三套或这两套都不支持的。同样如果你曾经做过低级PC编程你可能注意到键盘控制器缺省支持第一套扫描码。这是因为键盘控制器转换所有进来的扫描码到第一套(这是为了和XT系统的软件保持兼容)。但是它仍旧下发第二套扫描码到键盘的串行线。通码断码和机打重复率只要一个键被按下这个键的通码就被发送到计算机。通码只表示键盘上的一个按键它不表示印刷在按键上的那个字符。这就意味着在通码和ASCII码之间没有已定义好的关联直到主机把扫描码翻译成一个字符或命令。虽然多数第二套通码都只有一个字节宽但也有少数“扩展按键”的通码是两字节或四字节宽。这类的通码第一个字节总是为EH。正如键按下通码就被发往计算机一样只要键一释放断码就会被发送。每个键都有它自己唯一的通码它们也都有唯一的断码。幸运的是你不用总是通过查表来找出按键的断码――在通码和断码之间存在着必然的联系。多数第二套断码有两字节长它们的第一个字节是FH第二个字节是这个键的通码。扩展按键的断码通常有三个字节它们前两个字节是EHFH最后一个字节是这个按键通码的最后一个字节。作为一个例子我在下面列出了几个按键的第二套通码和断码:例如:通码和断码是以什么样的序列发送到你的计算机使得字符“G”出现在你的字处理软件里呢?因为这是一个大写字母需要发生这样的事件次序:按下“Shift键”按下“G键”释放“G键”释放“Shift键”。与这些时间相关的扫描码如下:“Shift键”的通码(H)“G键”的通码(H)“G键”的断码(FHH)“Shift键”的断码(FHH)。因此发送到你的计算机的数据应该是:HHFHHFHH。如果你按了一个键这个键的通码被发送到计算机。当你按下并按住这个键则这个键就变成了机打这就意味着键盘将一直发送这个键的通码直到它被释放或者其他键被按下。要想证实这点只要打开一个文本编辑器并按下“A键”。当你首先按下这个键字符a立刻出现在你的屏幕上。在一个短暂的延迟后接着出现一整串的“a”直到你释放“A键”。这里有两个重要的参数:机打延时是第一个和第二个a之间的延迟机打速率是在机打延时后每秒有多少字符出现你的屏幕上。机打延时的范围可以从秒到秒机打速率的范围可以从cps(字符每秒)到cps。你可以用“SetTypematicRateDelay”(xF)命令来改变机打速率和延时。机打的数据不被键盘所缓冲。在多个键被按下的情况下只有最后一个按下的键变成机打。当这个键被释放时机打重复就停止了甚至于其他的键依然还按着。脚注):实际上在第一第二套扫描码里没有“PauseBreak键”的断码。当这个键按下时发送它的通码当它释放时什么都没有被发送。复位在上电或软件复位(见“Reset”命令)后键盘执行诊断自检叫做BAT(基本保证测试)并载入如下的缺省值:机打延迟为ms机打速率为cps*第二套扫描码集*置所有按键为机打通码断码注:“*”所指的项在某些键盘上是可变的而在其他键盘上是硬件编码的(不可变)。当进入BAT键盘点亮它的三个LED指示器并在完成BAT后关闭它们。此时BAT完成代码发送xAA(BAT成功)或xFC(有错误)到主机。多数键盘忽略它们的时钟和数据线直到BAT完成代码发送后。所以“抑制”条件(时钟线拉低)可能不能防止键盘发送它们的BAT完成代码。命令集每个发送到键盘的字节都从键盘获得一个xFA(“应答”)的回应。唯一例外的是键盘对“Resend”和“Echo”命令的回应。在发送下一个字节给键盘之前主机要等待“应答”。键盘应答任何命令后清除自己的输出缓冲区下面列出了所有可能被发给键盘的命令。xFF(Reset)-引起键盘进入“Reset”模式。(见“复位”部分)xFE(Resend)-只能用在主机接收键盘数据出现了错误后发送。键盘的响应就是重发送最后的扫描码或者命令回应给主机。但是xFE绝不会作为“Resend”命令的回应而被发送。*xFD(SetKeyTypeMake)-允许主机指定一个按键只发送通码。这个按键不发送断码或进行机打重复。指定的按键采用它的第三套扫描码。*xFC(SetKeyTypeMakeBreak)-类似于“SetKeyTypeMake”只有通码和断码是使能的(机打被禁止了)。*xFB(SetKeyTypeTypematic)-类似于前两条命令通码和机打是使能的而断码被禁止。*xFA(SetAllKeysTypematicMakeBreak)-缺省设置。所有键的通码、断码和机打重复都使能(除了“PrintScreen”键它在第一套和第二套中没有断码。)*xF(SetAllKeysMake)-所有键都只发送通码断码和机打重复被禁止。*xF(SetAllKeysMakeBreak)-类似于前两条命令除了只是机打重复被禁止外。*xF(SetAllKeysTypematic)-类似于前三条命令仅断码被禁止通码和机打重复是使能的。xF(SetDefault)-载入缺省的机打速率延时(cpsms)按键类型(所有按键都使能机打通码断码)以及第二套扫描码集。xF(Disable)-键盘停止扫描载入缺省值(见“SetDefault”命令)等待进一步指令。xF(Enable)-在用上一条命令禁止键盘后重新使能键盘。xF(SetTypematicRateDelay)-主机在这条命令后会发送一个字节的参数来定义机打速率和延时具体含义如下:*xF(ReadID)-键盘回应两个字节的设备ID:xABx。*xF(SetScanCodeSet)-主机在这个命令后发送一个字节的参数指定键盘使用哪套扫描码集。参数字节可以是x、x或x分别选择扫描码集第一套、第二套或第三套。如果要获得当前正在使用的扫描码集只要发送带x参数的本命令即可。xEE(Echo)-键盘用“Echo”(xEE)的回应。xED(SetResetLEDs)-主机在本命令后跟随一个参数字节用于指示键盘上NumLockCapsLock和ScrollLockLED的状态。这个参数字节的定义如下:注:*最初只可用于PS键盘。i键盘控制器写到文章的这里从硬件的观点来说所有的信息都已经被提出。但是如果你打算给hostPC写一低级的与键盘相关的程序你却不能直接和键盘通讯。而键盘控制器提供了键盘和周边总线之间的接口。控制器不但封装了所有信号级和协议的细节又提供了相关转换解释和扫描码及命令的句柄。Intel或兼容微控制器被用作PC键盘的控制器。在现代的计算机中这个微控制器被隐藏到了主板的芯片组中主板的芯片组在一个单一封装中整合了很多的控制器。虽然如此但设备仍旧是存在的键盘控制器一般仍按“”来论及。依赖于主板的不同键盘控制器可以工作于两个模式之一:“AT”兼容模式或“PS”兼容模式。如果主板支持PS鼠标就工作在后一种模式下。在这种情况下的作用是键盘控制器和鼠标控制器。键盘控制器根据键盘端口的连线情况自动检测它应该工作在何种模式下。包含了如下的寄存器:一个字节的输入缓冲区-包含从键盘读入的字节只读。一个字节的输出缓冲区-包含要写到键盘的字节只写。一个字节的状态寄存器-个状态标志只读。一个字节的控制寄存器-个控制标志读写。前三个寄存器(输入、输出、状态)可以通过x和x端口直接存取。最后那个寄存器(控制)要使用“ReadCommandByte”命令读使用“WriteCommandByte”命令写。下表示出周边端口示如何于接口的:写x端口不会写入到任何特定的寄存器中但是解释为发送命令给。如果命令接收一个参数则参数被发往x端口。同样命令的任何返回结构可以从x端口读出。在描述时我偶尔提及它的物理IO管脚这些管脚定义如下:(注意:读键盘控制器数据表可能会迷惑你其中提到的“输入缓冲区”是指“输出缓冲区”反之亦然。这是取决于你看问题的观点是从控制器的固件还是从控制器的接口。在本文中我所提到的“输入缓冲区”指放置从键盘获得的输入的地方“输出缓冲器”指放置把输出发送到键盘的数据的地方。)状态寄存器的状态标志是从x端口读出的。它们包含了错误信息、状态信息和输入输出缓冲区里有无数据的指示。这些标志的定义如下:OBF(输出缓冲区满)-指示是否成功写入输出缓冲区。:输出缓冲区空-写入到x端口成功:输出缓冲区满-不能写到x端口IBF(输入缓冲区满)-指示是否可以从输入缓冲区中读入。:输入缓冲区空-不能从x端口读入数据:输入缓冲区满-有新的数据输入了可以从x端口读入SYS(系统标志)-Post读取这个标记测定是否上电复位还是软件复位。:上电-系统处于上电自检中:BAT代码完成-系统已经完成了初始化A(地址线A)-键盘控制器内部使用。:A=-最后写入的是端口x:A=-最后写入的是端口xINH(禁止标志)指示键盘通讯是否被禁止。:键盘时钟=-键盘被禁止:键盘时钟=-键盘没有被禁止TxTO(发送超时)-指示键盘不可接受输入(比如键盘没有插入)。:无错误-键盘接收了最后一个给它的字节:超时错-键盘在ms的“请求发送”时间内没有产生时钟信号RxTO(接收超时)-指示键盘不能回应命令(键盘可能是坏的)。:无错误-键盘回应了最后一个字节:超时错-键盘在ms的命令接收期内没有产生时钟信号PERR(校验错误)-指示和键盘的通讯有错误(可能有干扰或者连接松掉了)。:无错误-接收到了奇校验并且收到了适当的命令回应:校验错-接收到偶校验或者xFE作为命令回应被收到了MOBF(鼠标输出缓冲区满)类似于OBF但不包括PS鼠标。:输出缓冲区空-写到扩展设备的输出缓冲区成功:输出缓冲区满-不可以写到辅助设备的输出缓冲区端口T(一般性超时)指示在命令写入或回应中有超时(和TxTORxTO一样)。:无错误-键盘收到并回应了最后一条命令:超时错-参考TxTO和RxTO获得更多信息『例如:在我的PC上“”状态寄存器的正常值是h=b。这个值说明键盘通讯没有被禁止已经完成了自检(“BAT”)。状态寄存器可以从h端口读取(“INAL,h”)』读键盘的输入当从键盘收到有效的扫描码就把它转换成第一套相等的扫描码。转换后的扫描码放置在输入缓冲区IBF(输入缓冲区满)标志被设置产生IRQ。而且此时如果有其他来自键盘的字节将抑制更多的接收(通过“把时钟线拉低”)这样就不会收到更多的扫描码一直到输入缓冲区被清空。如果中断是使能的IRQ将激活键盘驱动程序这是指向x号中断向量的。驱动程序从x端口读取扫描码这个动作会释放IRQ并复位IBF标志。接着扫描码被驱动程序处理如回应特殊键的组合更新系统RAM保留给键盘输入的区域里的数据等。如果你不打算在中断x中嵌入个补丁你可以轮询键盘控制器来输入数据。这是通过禁止IBF中断再轮询IBF标志来实现的。数据如果再输入缓冲区是可用的标志就会被置如果数据从输入缓冲区里被读出了标志就会被清。读输入缓冲区就是读x端口中的数据IBF标志在x端口的第位。往键盘写数据当你写数据到的输出缓冲区(通过x端口)控制器设置OBF(输出缓冲区满)标志并处理数据。将发送这个数据到键盘并等待一个回应。如果键盘没有接收或者在指定时间内没有回应相应的超时标志就会被设置(见状态寄存器的定义给获得更多信息)。如果键盘继续发送错误的字节状态寄存器里的“校验错”标志就会被置位。如果没有错误发生回应字节就会放到输入缓冲区中IBF(输入缓冲区满)标志被置位IRQ被激活发信号给键盘驱动程序。键盘控制器命令发送命令给键盘控制器就是写x端口。在命令发送后命令参数写到x端口。结果也返回到x端口。在写命令或参数到之前总是要测试OBF(输出缓冲区满)标志的。x(读命令字节)-返回命令字节。(参考下面的“写命令字节”)x(写命令字节)-存储参数作为命令字节。命令字节定义如下:INT(输入缓冲区满中断)-如果设置了当输入缓冲区有有效数据时产生IRQ。:IBF中断禁止-你必须轮询状态寄存器的<IBF>来读取输入:IBF中断使能-在中断x中的键盘驱动软件俘获输入SYS(系统标志)-常用于手动设置清除状态寄存器中的SYS标志。:上电-告诉POST执行上电自检及初始化:BAT代码收到-告诉POST执行热启动测试及初始化OVR(忽略禁止)-在某些老主板上忽略键盘的“禁用”开关。:禁用开关使能-如果P脚为高则禁用键盘:禁用开关禁止-键盘不被禁用甚至于P为高EN(禁止键盘)-禁止使能键盘接口。:使能-键盘接口使能:禁止-所有键盘通讯被禁止PC(“PC模式”)-在某种情况下使能键盘接口:禁止-:使能-(译者注:这个命令显然作者不知道是如何工作的所以我也不知道。)XLAT(翻译扫描码)-使能禁止翻译成第一套扫描码。:翻译禁止-从键盘读入的数据直接放入输入缓冲区:翻译使能-扫描码在放入输入缓冲区之前先翻译成第一套的对应值INT(鼠标输入缓冲区满中断)-当设置后。如果鼠标数据有效则产生IRQ。:辅助IBF中断禁止:辅助IBF中断使能EN(禁止鼠标)-禁止使能鼠标接口:使能-辅助的PS设备接口被使能:禁止-辅助的PS设备接口被禁止xxF(写到输出端口)-写命令的低位到输出端口的低位(见输出端口的定义)。xA(获得版本号)-返回固件的版本号。xA(获得密码)-如果密码存在则返回xFA否则返回xF。xA(设置密码)-设置新的密码发送一个以空字符结束的扫描码字串作为命令的参数。xA(比较密码)-把键盘输入和当前的密码相比较。xA(禁止鼠标接口)-仅用于PS模式。类似于“禁止键盘接口”(xAD)命令。xA(使能鼠标接口)-仅用于PS模式。类似于“使能键盘接口”(xAE)命令。xA(鼠标接口测试)-若通过则返回x若时钟线保持低不变则返回x若时钟线保持高不变则返回x若数据线保持低不变则返回x若数据线保持高不变则返回x。xAA(控制器自检)-若成功则返回x。xAB(键盘接口测试)-若通过则返回x若时钟线保持低不变则为x若时钟线保持高不变则为x若数据线保持低不变则为x若数据线保持高不变则为x。xAD(禁止键盘接口)-设置命令字节的第位并禁止所有与键盘间的通讯。xAE(使能键盘接口)-清除命令字节的第位并重新使能与键盘的通讯。xAF(获得版本)xC(读输入端口)-返回输入端口中的值(参考输入端口的定义)。xC(拷贝输入端口的LSn)-仅用于PS模式。拷贝输入端口的低四位到状态寄存器(参考输入端口定义)。xC(拷贝输入端口的MSn)-仅用于PS模式。拷贝输入端口的高四位到状态寄存器(参考输入端口定义)。xD(读输出端口)-返回输出端口的值(参考输出端口定义)。xD(写输出端口)-写参数到输出端口(参考输出端口定义)。xD(写键盘缓冲区)-把参数写到输入缓冲区就像是从键盘接收到的一样。xD(写鼠标缓冲区)-把参数写到输入缓冲区就像是从鼠标接收到的一样。xD(写鼠标设备)-发送参数给辅助的PS设备。xE(读测试端口)-返回测试端口的值(参考测试端口的定义)。xFxFF(脉冲输出端口)-在脉冲下输出命令的低四位到输出端口的低四位(参考输出端口定义)。现代键盘控制器到目前为止我只讨论了键盘控制器。虽然现代的键盘控制器保持了和原始设备的兼容性但兼容是他们唯一的需求(和目标)。我的主板上的键盘控制器是一个重要的例子。我把一个微控制器和LCD并接到我的键盘上来观察键盘控制器发送了哪些数据。上电后键盘控制器发送了“设置LED状态”关闭了所有的LED。然后读取键盘的ID。当我试着写数据到输出缓冲区我发现键盘控制器只转发了“设置LED状态”命令和“设置机打速率延时”命令。它不允许任何其他命令发往键盘。但是在适当时候它通过放置“应答”到输入缓冲区来仿真键盘的应答(和xEE回应“Echo”命令)。此外如果键盘发送了一个错误的字节键盘控制器将拿走错误俘获(发送“Retry”命令“如果字节仍旧是错的发送错误代码给键盘并将错误代码放入输入缓冲区)。再说一次记住芯片组的设计者对兼容比标准更有兴趣。初始化如下的通讯过程发生在我的计算机和键盘之间。当计算机启动后我相信前三个命令是初始化键盘控制器后一条命令(使能NumlockLED)是由BIOS发送的剩下来的命令是由我的OS(WinSE)发送的。记住在我计算机上这么结果是明确的但是它只是给你一个一般性的概念告诉你启动时发生了什么。Keyboard:AASelftestpassedKeyboardcontrollerinitHost:EDSetResetStatusIndicatorsKeyboard:FAAcknowledgeHost:TurnoffallLEDsKeyboard:FAAcknowledgeHost:FReadIDKeyboard:FAAcknowledgeKeyboard:ABFirstbyteofIDHost:EDSetResetStatusIndicatorsBIOSinitKeyboard:FAAcknowledgeHost:TurnonNumLockLEDKeyboard:FAAcknowledgeHost:FSetTypematicRateDelayWindowsinitKeyboard:FAAcknowledgeHost:msreportssecKeyboard:FAAcknowledgeHost:FEnableKeyboard:FAAcknowledgeHost:FSetTypematicRatedelayKeyboard:FAAcknowledgeHost:msreportssecKeyboard:FAAcknowledge第三章PS鼠标接口电气接口协议PS鼠标使用和PS键盘一样的协议。这个标准最初出现在IBM技术参考手册里但我知道现在已经没有关于这个标准的任何官方文件了。不过你可以查看本文第一章获得我收集的关于这个协议的细节。输入分辨率和缩放比例标准的PS鼠标支持下面的输入:X(左右)位移Y(上下)位移左键中键和右键。鼠标以一个固定的频率读取这些输入并更新不同的计数器然后标记出反映的移动和按键状态。有很多PS指示设备具有额外的输入并可以报告不同于本文描述的数据。一个受欢迎的扩充是我在文章后面介绍的Microsoft的Intellimouse它既支持标准输入也支持滚轮和两个附加的按键。标准的鼠标有两个计数器保持位移的跟踪:X位移计数器和Y位移计数器。可存放位的进制补码并且每个计数器都有相关的溢出标志。它们的内容连同三个鼠标按钮的状态一起以三字节移动数据包的形式发送给主机(描述见下一部分)。位移计数器表示从最后一次位移数据包被送往主机后有位移量发生。当鼠标读取它的输入的时候它记录按键的当前状态然后检查位移。如果位移发生它就增加(对正位移)或减少(对负位移)X和或Y位移计数器的值。如果有一个计数器溢出了就设置相应的溢出标志。决定位移计数器增减数量的参数叫分辨率。缺省的分辨率为计数单位毫米主机可以用“设置分辨率”(xE)命令改变这个值。有一个参数不影响位移计数器的值但是影响这些计数器报告的值(见本章的脚注)。这个参数就是缩放比例。缺省情况下鼠标使用:比例因此对报告的鼠标位移没有影响。但是主机可以用“设置比例:”(xE)命令选择:比例。如果启用了:比例鼠标在发数据给主机前采用如下的算法运算计数器内容:位移数据包标准的PS鼠标发送位移和按键信息给主机采用如下的字节数据包格式(见本章脚注)。位移计数器是一个位的补码整数。它的最高位作为符号位出现在位移数据包的第一个字节里。这些计数器在鼠标读取输入发现有位移时被更新。这些值是自从最后一次发送位移数据包给主机后位移的累计量(即最后一次包发给主机后位移计数器被复位)。位移计数器可表示的值的范围是到。如果超过了范围相应的溢出位就被设置并且在复位前计数器不会增减。正如我前面提及的一旦位移数据包成功地发送给主机位移计数器就会复位。同样鼠标在收到主机不是“Resend”(xFE)命令外的其他命令计数器也会复位。操作模式根据鼠标工作的模式来处理的数据报告有四种标准的工作模式:Reset-鼠标在上电或收到“Reset”(xFF)命令后进入Reset模式。Stream-这是缺省模式(在Reset执行完成后)也是多数软件使用鼠标的模式。如果主机先前把鼠标设置到了Remote模式那它可以发送“SetStreamMode”(xEA)命令给鼠标让鼠标重新进入Stream模式。Remote-在某些情况下Remote模式很有用可以通过发送“SetRemoteMode”(xF)命令进入。Wrap-除了为测试鼠标和它的主机之间的连接外这个模式不是特别地有用。Wrap模式可以通过发送命令“SetWrapMode”(xEE)命令给鼠标来进入。要退出Wrap模式主机必须发布“Reset”(xFF)命令或“ResetWrapMode”(xEC)命令。如果“Reset”(xFF)命令收到了鼠标将进入Reset模式。如果收到的是“ResetWrapMode”(xEC)命令鼠标将进入Wrap模式前的那个模式。(注意:鼠标同样可以进入“extended”操作模式正如本文后面所述。但是这不是标准PS鼠标的特征。)Reset模式鼠标在上电后或应答“Reset”(xFF)命令就进入reset模式。进入这个模式后鼠标执行象前面提到的BAT(基本保证测试)一样的自检并设置如下的缺省值:采样速率-采样点秒分辨率-个计数值毫米缩放比例-:数据报告被禁止然后发送BAT完成代码这个代码不是xAA(BAT成功)就是xFC(错误)。如果主机收到了不是xAA的回应它可能重新给鼠标供电这样来引起鼠标复位并重新执行BAT。接着BAT完成代码(xAA或xFC)的后面鼠标发送它的设备IDx。这个ID用来区别设备是键盘还是处于扩展模式中的鼠标。我读到的文件中说主机在没收到设备ID前不会假定发送任何数据。但是我发现有些BIOS在上电复位并收到xAA后立刻发送“Reset”(xFF)命令。鼠标发送自己的设备ID给主机后它就进入了Stream模式。注意鼠标设置的一个缺省值之一是“数据报告被禁止”。这就意味着鼠标在没收到“使能数据报告”(xF)命令之前不会发送任何位移数据包给主机。Stream模式在Stream模式中一旦鼠标检测到位移或发现一个或多个鼠标键的状态改变了就发送位移数据包。数据报告的最大速率被认为是采样速率。参数的范围从采样点秒到采样点秒。这个参数的缺省值是采样点秒主机可以用“设置采样速率”(xF)命令来改变它。Stream模式是操作的缺省模式。Remote模式在这个模式下鼠标以当前的采样速率读取输入并更新它的计数器和标志但是它只在主机请求数据的时候才报告给主机位移(和按键状态)。主机通过“读数据”(xEB)命令来获得数据。在收到命令后鼠标发送位移数据包并复位它的位移计数器。Wrap模式这是一个“回声”模式鼠标收到的每个字节都会被发回主机。甚至收到的是一个有效的命令鼠标都不会应答这条命令-它只把这个字节回送给主机。但是有两个例外:“Reset”(xff)命令和“ResetWrapMode”(xEC)命令。鼠标认为这两条命令是一有效的命令并且不会回送它们到主机。Intellimouse的扩展对标准的PS鼠标的一个流行的扩展是微软的Intellimouse。它包括支持五个鼠标按键和三个位移轴(左右、上下和滚轮)。这些附加特征要求使用字节的位移数据包而不是标准字节包。由于标准PS鼠标的驱动程序不能识别该数据包格式因此在没有能识别改数据包的驱动程序被安装的情况下Intellimouse操作起来跟标准的PS鼠标一样。所以如果Intellimouse在一台仅支持标准PS鼠标的电脑上使用时除滚轮和增加的第四、第五个按键外它仍能正常工作。微软的Intellimouse工作起来象标准的PS鼠标(也就是使用字节位移数据包和标准PS鼠标一样回应所有命令报告设备IDx)。要进入滚轮模式主机应该发送如下的命令序列:SetsamplerateSetsamplerateSetsamplerate主机然后应该发布“获得设备ID”(xF)命令并等待回应。如果安装的是标准PS鼠标(非Intellimouse)它回应设备IDx。在这种情况下主机会认为这个鼠标没有滚轮并继续把它当作是标准PS鼠标。但是如果安装的是微软的Intellimouse它返回的ID是x。这就告诉主机挂接的定点设备有滚轮并且主机认为鼠标使用字节的位移数据包:Z位移是的补码表示滚轮的自上次数据报告以来的位移。有效值的范围在到。这意味着数值实际只有低四位高四位仅用作符号扩展位。要进入滚轮键模式主机要发送如下命令序列:SetsamplerateSetsamplerateSetsamplerate主机接着发布“获得设备ID”(xF)命令并等待回应。微软的Intellimouse用x这样设备ID应答并且使用如下的字节位移数据包:ZZ是的补码用于表示从上次数据报告以来滚轮的位移量有效范围从到。第键:=第键按下了=第键没有按下。第键:=第键按下了=第键没有按下。你也许见过有两个滚轮的鼠标:一个是垂直的一个是水平的。这种鼠标使用上面介绍的微软Intellimouse数据包格式。如果垂直的滚轮向上滚动Z计数器加如果这个滚轮向下滚动Z计数器减这是滚轮的正常操作。但是如果水平的滚轮向右滚动Z计数器增加向左滚动Z计数器减少。看上去象用一种临时的途径实现了第二个滚轮但是由于放置了两个滚轮所以不可能同时使用这两个滚轮。(如果你试着欺骗软件同时使用它们你会发现软件忽略了水平的那个滚轮。)命令集下面列出的是仅可发送给鼠标的命令。如果鼠标工作在Stream模式主机在发送任何其他命令之前要先禁止数据报告(命令xF)。xFF(Reset)-鼠标用“应答”(xFA)回应这条命令并进入Reset模式。

精彩专题

职业精品

上传我的资料

热门资料

资料评价:

/ 28
所需积分:1 立即下载

意见
反馈

返回
顶部

Q