键值从键盘到Linux内核传输过程分析

本文介绍了如何在Linux下调试键盘输入事件,重点关注了键盘驱动程序`usbhid/usbkbd.c`中的键值码分析。通过`getevent`命令获取键盘事件,包括`EV_SYN`, `EV_KEY`和`EV_MSC`类型。文章还讨论了内核级的自动重复实现,并提供了禁用内核自动重复的代码示例。" 132873106,19755745,C#与台达PLC Modbus TCP通信及Halcon视觉检测实践,"['C#编程', 'PLC通讯', 'Modbus TCP协议', '工业自动化', 'Halcon视觉']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               
键值从键盘到Linux内核传输过程分析


        这是一个以前没有了解过的一个盲区。
        源于在制作一个带有特殊键的键盘,键盘厂商让挑选择殊键的实现方法。并举例说明了普通按键z在他们的MCU中其实是00 00 1d 00 00 00 00 00(以下简称:MCU键值)即0x1d十进制29,我立即通过hexdump /dev/input/eventX方法查看键盘上z键的在Linux内核上传过来的值(以下简称:Linux键值),一看是0x2c(十进制:44)。那么这两个值是什么关系呢?
        于是乎我赶紧Google一番,更离奇的是Windows系统中将z键定义为90(以下简称:Windows键值)。这下出现了三套键值,事情变得复杂又觉得有些清晰了。
        既然同一个键盘可以在Linux和Windows下正常使用,那么他们之间必须有一个共用的标准。先抛开Windows不说,看看在Linux内核中是如何将29转换为44的。

        定位到Linux内核中usb键盘的驱动程序是drivers/hid/usbhid/usbkbd.c,然后上来就搜索[44],结果真就出来了一张"表",且经过分析后29恰恰是44所在位置的坐标。


        问题进一步清晰了,那么接下来想要明白的是 29 在哪个表中,那个表应该也是一个标准的协议规范,代码中也没有关于这个的注释,我应该怎么办?在我准备给代码的作者发邮件时,键盘厂商发来了一个对这个问题的说明。并附上了一个《USB HID to PS/2 Scan Code Translation Table》的表,而29(0x1d)正是在上表中。
        Google搜索《 USB HID to PS/2 Scan Code Translation Ta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值