FPGA模拟PS/2键盘

FPGA模拟PS/2键盘

  • ———— VerilogHDL + SpinalHDL

众所周知,PS/2是一种很常见的键盘鼠标接口,很多开发板上都有,不论是单片机还是FPGA,基本例程都少不了PS/2控制器。但是,绝大部分代码都是作为PS/2主机来读取键盘鼠标发送的数据,很少有作为键盘鼠标设备来跟电脑通信的。Arduino倒是有几个PS/2键盘的库,只是难以移植,而用FPGA实现PS/2设备的方案,一个字都搜不到!因此作本文以记录笔者实现FPGA模拟PS/2键盘的全过程,希望能对大家有所帮助。

1. PS/2协议简介

1.1 首先,重要的话说三遍

  • PS/2接口不支持热插拔!!!

  • PS/2接口不支持热插拔!!!

  • PS/2接口不支持热插拔!!!

1.2 参考资料

《PS2技术参考》(Adam Chapweske著)是教科书级的参考资料,一定要潜心拜读。文章较长,一次性读完肯定记不住,最好先大致浏览,待遇到问题时反复查阅。

1.3 “协议栈”

为便于理解,在此冒用现代网络技术的概念。

1.3.1 物理层

连接器
通常电脑上是母的,键盘和鼠标是公的,键盘是紫色,鼠标是绿色。时钟线和数据线都是5V,兼容3.3V CMOS。时钟信号总是由设备产生,时钟周期一般取40us。

1.3.2 数据链路层

与常用的串口类似,不管是上行还是下行,每帧都包含以下内容:

1个起始位 总为0
8个数据位(payload) 低位(LSB)在前
1个校验位 奇校验
1个停止位 总为1

此外,在主机到设备的传输中,最后还有一个应答位。
记住这些,很重要。

1.3.3 传输层

这一层将低层与高层解耦合,将发送与接收的细节封装起来,为应用层打基础。
需要注意的问题有帧之间的延时、发送与接收间的干扰、与高层的总线时序等。

1.3.4 会话层

键盘与鼠标在本层分道扬镳,本文仅讨论键盘,不涉及鼠标。
要让电脑(host)识别到你写的键盘(device)是个艰巨的任务。电脑会在开机时发送一连串指令,每条指令都要得到正确的响应,稍有不慎就会被当做无效设备而抑制通信,严重时甚至使电脑无法正常启动!
因为会话是在开机时建立的,所以开机后再插入键盘是无效的,正所谓 “不支持热插拔”

1.3.5 应用层

成功被主机识别后,就可以愉快地发送扫描码了。🚀当键盘检测到有键按下时发送通码,有键抬起时发送断码。断码即在通码前加了一字节“F0h”。并不是每个键的通码都只有一字节,有的键Prt Sc甚至没有断码。

2. Arduino开源库移植测试

先用单片机把协议学明白了才能用FPGA实现

Arduino有很多模拟PS/2键盘的库,随便找一个能用的移植到正点原子的mini板上(因为笔者手头上只有这块单片机开发板带PS/2接口),点击下载完整工程

2.1 GPIO配置——物理层

首先一定要看清楚这个引脚耐压有没有5V!⚡️因为主机上带5V上拉,所以开发板有没有上拉电阻都无所谓,配置为开漏输出即可——STM32F1系列的GPIO配置成开漏输出时也是可以直接读IDR的。

2.2 观察总线波形——数据链路层

串行总线的本质是波形图

判断键盘有没有被成功识别最简单的办法就是发送一个键看电脑有没有反应,但这个过程很难用FPGA实现(尤其是还有bug的时候),所以调试时一般用示波器观察,正好双通道。用公对公PS/2线连接开发板与电脑,时钟线与数据线对应的IO已由排针引出,反复开关机观察示波器有以下发现:

  • 总线空闲时均为高电平,但时钟线会周期性地被主机拉低
  • 若未正确应答主机的指令,时钟线会被永久性拉低
  • 通常主机接收完一帧的瞬间会立即拉低时钟来抑制通信
  • 主机可能不释放时钟就开始发送
  • 主机发送时,数据在时钟的下降沿转变
  • BIOS初始化时有密集通信,Windows初始化时只发送LED

2.3 记录初始化过程——会话层

用串口输出PS/2总线上传输的每一字节:

initing...
sending aa
sent  
init ok!!!
received 0xf5 
sending fa
sent  
received 0xff 
sending fa
sent  
sending aa
sent  
received 0xed 
sending fa
sent  
received 0x2 
sending fa
sent  
received 0xf5 
sending fa
sent  
received 0xf4 
sending fa
sent  
received 0xf5 
sending fa
sent  
received 0xf4 
sending fa
sent  
received 0xed 
sending fa
sent  
received 0x2 
sending fa
sent  
received 0xf5 
sending fa
sent  
received 0xf4 
sending fa
sent  
received 0xf5 
sending fa
sent  
received 0xf4 
sending fa
sent  
received 0xed 
sending fa
sent  
received 0x2 
sending fa
sent  
received 0xff 
sending fa
sent  
sending aa
sent  
received 0xf3 
sending fa
sent  
recei
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值