zoukankan      html  css  js  c++  java
  • [ExpOS]键盘扫描码、键盘控制器

    thanks Adam Chapweske
    信号和协议, 扫描码, 命令集, 初始化,兼容性问题, pc的键盘控制器.
    参考


    历史

    常用键盘包括:
    USB 键盘 - 最近为所有的新机器所支持(Macintosh and IBM/compatible).
    IBM/兼容 键盘 - 也称 "AT keyboards" 或者 "PS/2 keyboards", 现代pc都支持. 本文的主题.
    ADB 键盘 - Apple Desktop Bus of older Macintosh systems.
    原来的IBM 以及兼容机使用一种称作 "XT "的键盘. 现在不多见了,我们不介绍.后来IBM引入 AT 系统, AT之后是IBM PS/2. AT 键盘和 PS/2

    键盘类似,是我们常用的键盘. PS/2 设备使用更小的连接器,支持更多一点的特性. 同时兼容AT, 新的特性几乎不使用.

    IBM 的几种键盘:

    IBM PC/XT 键盘 (1981):
    83 个键
    5-pin DIN 连接器
    简单单向串口协议
    使用扫描码 set 1
    没有 host-to-keyboard 的命令

    IBM AT 键盘 (1984) - 不兼容XT
    84 到 101键
    5-pin DIN 连接器
    双向串口协议
    使用扫描码 set 2
    8个 host-to-keyboard 命令

    IBM PS/2 键盘(1987) - 兼容AT
    84 到 101 键
    6-pin mini-DIN 连接器
    双向串口协议
    可选扫描码 set 3
    17 个 host-to-keyboard 命令


    今天买的键盘都兼容 PS/2 和 AT .所以今天的 "AT" 和 "PS/2" 有意义的只有他们的接口大小. 尽量不使用扩展特性.


    现代兼容 AT-PS/2 键盘
    任意键数目 (通常是101 或 104)
    5-pin or 6-pin 连接器
    双向串口协议
    扫描码 set 2 肯定支持
    应答所有的命令,但是可能并无此功能.



    简单描述:

    键盘包含一个由 keys组成的矩阵. 所有的键都为一个板上处理器监控,称作键盘编码器, (一般是i8048? 见下表).虽然这种芯片挺多,但是其职
    能基本如下:
    监控是哪个或那几个键被按下/释放,把相应的数据送到主板. 这个处理器处理所有的 debouncing(?what!) ,把数据缓存到他的16-byte 的缓冲区中. 在IBM兼容机上,主板也有一个板上芯片,称作键盘控制器.一般是8042. 他负责解码从键盘来的信息,通知系统软件各种事件.在host 和主板的通讯中 都使用IBM 协议.


    现代键盘的encoders:
    Holtek: HT82K28A, HT82K628A, HT82K68A, HT82K68E?EMC: EM83050, EM83050H, EM83052H, EM83053H,?Intel: 8048, 8049
    Motorola: 6868, 68HC11, 6805
    Zilog: Z8602, Z8614, Z8615, Z86C15, Z86E23


    电器接口和协议:
    AT 和 PS/2 键盘使用和 PS/2 鼠标一样的协议. 这里是协议的细节.
    扫描码:
    键盘处理器(encoder)大部分时间在"扫描", 监视着键矩阵. 一旦发现有键被按下,释放,或被按住不放,encoder就会向计算机发送一个数据包,称为扫描码. 有两种不同的扫描码, "make codes" 和 "break codes". make code 是键被按下,按住不放是产生的. break code 是键被释放时产生的. 每个键都有自己唯一的make code 和 break code. make code 和 break codes 的集合称为扫描码集. 共有三种标准的扫描码集.所有现代的键盘默认使用扫描码集 set 2.

    详细情况见:
    Scan Code Set 1 - 原来的 XT 扫描码集, 也有现代键盘支持此种东东.
    Scan Code Set 2 - 现代键盘的缺省扫描码集.
    Scan Code Set 3 - 可选的 PS/2 扫描码集,很少使用.

    Make Codes, Break Codes, and Typematic Repeat:
    a make code 和一个 ASCII 码之间并无固定的转换关系.尽管set 2的 make codes 大部分只有1个字节宽度, 但是有"extended keys" 的make codes 是2或4个字节宽,这些扩展键的make codes 的第一个字节总是 E0h.?每个键也有自己的唯一 break code(1). 但总是和make code有联系, 给程序设计带来不少方便. set 2 的大部分break codes 有2个字节宽,第一个字节是 F0h 第二个是那个键的make code. 扩展键的 Break codes 通常3个字节,前两个字节是E0h, F0h, 最后一个字节是那个键的 make code的最后一个字节.
    按住一个键不放时,那个key 变成 typematic, 意味着键盘会不断的向主板发送那个键,直到释放他,或者另外一个键按下.这个过程有两个参数: typematic 延迟, typematic 速率. typematic 延迟从 0.25 秒到 1.00 秒, typematic 速率从 2.0 cps (characters per second) 到 30.0 cps. 可以使用"Set Typematic Rate/Delay" (0xF3) 命令改变这个值.如果多个键被按住不放,只有最后一个键成为typematic. 实际上,"Pause/Break" 键没有 break code(set 1,2).


    i8042 :键盘控制器

    以上的讨论都是针对硬件,其实,如果写一个底层的键盘相关的软件for PC,是不该直接和键盘通信的. 主板上一般都有键盘控制器,它在键盘和外设总线间是一个接口. 这个控制器处理 signal-level的东东和协议的细节 ,同时提供转换,解释,处理扫描码,执行命令的功能.
    PC 的键盘一般使用Intel 8042/兼容 的微控制器.现代计算机上,这个功能一般集成到南桥 . 然而,这个设备逻辑上仍然叫做 "the 8042".基于主板的不同,键盘控制器可以工作于:"AT-兼容" 模式, 或者 "PS/2-兼容" 模式. 如果主板支持 PS/2 鼠标就会使用后者. 这时, 8042 既是键盘控制器又是鼠标控制器. 键盘控制器根据硬连线的方式自动决定工作于哪种模式.

    8042 包含如下寄存器:

    1字节的输入缓存 - 包含从键盘来的数据,只读
    1字节的输出缓存 - 包含,要被写到键盘的数据;只写
    1字节的状态寄存器 - 8 个状态位; 只读
    1字节控制寄存器 - 7 个控制位; 读写?

    前三个寄存器可以被cpu通过io端口0x60 and 0x64直接访问.最后一个必须使用"Read Command Byte" 命令读, 使用"Write Command Byte" 命令写.(见关于键盘的其他帖)

    8042的端口在cpu的io空间地址如下:

    port----Read/Write-----Function
    0x60----Read----------Read Input Buffer
    0x60----Write---------Write Output Buffer
    0x64----Read----------Read Status Register
    0x64----Write---------Send Command


    写端口 0x64 不会写任何指定的寄存器, 只是给8042一个命令. 如果命令有参数,参数就送到端口0x60. 命令的返回值也从端口 0x60去读.
    ("input buffer" : input from the keyboard, "output buffer": output to be sent to the keyboard.)

    键盘复位
    加电时,(或者"Reset" 命令) , 键盘进行 BAT (Basic Assurance Test)并装载下面的缺省值:

    Typematic delay 500 ms.
    Typematic rate 10.9 cps.
    *选择扫描码集 set 2.
    *把所有键设置为 typematic/make/break 统统使能.

    * 一些键盘可以改变,一些不能.

    进入 BAT后, 三个 LED 点亮,BAT 完成之后熄灭.同时,BAT 代码返回给host: 0xAA (BAT successful) , 0xFC (Error). 许多键盘在BAT时忽略CLOCK 和 DATA 线, 直到BAT完成.因此, "禁止条件" (CLOCK line low) 不能键盘阻止向host发送BAT code.





    参考资料
    Adam's micro-Resources Home
    Keyboard Scan Codes
    PS/2 Mouse/Keyboard Protocol - Protocol used by AT and PS/2 keyboards.
    Keyboard Code/Projects
  • 相关阅读:
    css引入方式
    HTML标签
    动态导入模块impoerlib
    pymysql连接数据库
    创建数据库表之引擎
    IO多路复用互动聊天,select函数监听
    欧拉筛法求素数个数
    与三角形相关的问题 WITH 有向面积
    时间复杂度的计算
    折半查找
  • 原文地址:https://www.cnblogs.com/huqingyu/p/105376.html
Copyright © 2011-2022 走看看