背景:公司有一个PS2键盘驱动的项目,没有控制器,需要模拟PS2协议,检测按键并通过input子系统将按键时间上报
一、准备:
1、PS2协议:
PS2有两个控制线,时钟线和数据线。当按键按下或抬起,设备会向主机发送键码。时钟由设备产生,主机需要在下降沿去数据线采集一位数据。按键码由多个11位数据组成:0 (起始)+ 8位(数据)+1/0(奇偶校验位)+1(结束位)。数据位是先发的低位!
PS2接口是以前台式电脑后边留的圆形接口,6个引脚,主要用VCC,GND,clk,data。与AT(5脚)一样
2、键码:
PS2键码大致分为两类:
第1类按键 通码为一个字节,断码为0xF0+通码形式。如A键,其通码为0x1C;断码为0xF0 0x1C。
第2类按键 通码为两字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式。如Right Ctrl键,其通码为0xE0 0x14;断码为0xE0 0xF0 0x14。
通码为按下,段码为抬起
3、input 子系统下的PS2键盘驱动(因为没有驱动器,没有使用这个框架):
1,Linux X86 PS/2 键盘驱动框架流程(以下均已Intel 8042键盘控制器为例):
1.1 设备初始化注册流程:
键盘控制器硬件驱动(i8042.c) -> 串口驱动核心(serio.c) -> 串口驱动(atkbd.c)
-> 输入驱动核心(input.c) -> 输入事件驱动程序(keyboard.c) -> 虚拟控制台驱动模块;
注册流程:
1.1.1,键盘控制器硬件驱动(i8042.c):
1)、首先键盘硬件驱动程序读写键盘硬件控制器寄存器,配置寄存器并获取相控制器硬件信息(PS/2键盘控制器一共有三个寄存器加一个命令端口,命令数量也不多,下载地址:https://download.csdn.net/download/a372048518/9835565)
注意:Intel8042键盘控制器内部已经实现了PS/2时序协议,硬件驱动程序只需要读写相关寄存器即可;