【usb】linux内核USB键盘驱动解析--普通键值上报及转化

这篇具有很好参考价值的文章主要介绍了【usb】linux内核USB键盘驱动解析--普通键值上报及转化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概况

  • 建议阅读前置文章【usb】linux内核USB键盘驱动解析–特殊键值上报及转化
  • 以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.gz
  • 文件路径:linux-5.10/drivers/hid/usbhid/usbkbd.c
  • 本次我们主要分析第120~139行的这个for循环。

二、探索

  • for循环变量i范围是2-7,是因为普通键值存放在数组的第2-7个元素。第一个存放的是特殊键值,第二个保留。
  • kbd->old[i] > 3这个判断是因为,0-3几个键值是保留的没有对应的物理按键。所以我们不需要关注。具体说明见hut1_4第10节。
		if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {
			if (usb_kbd_keycode[kbd->old[i]])
				input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
  • 上面这段代码,首先memscan的功能是 在一块内存中查找一个字符,也就是在kbd->new + 2这块内存中查找字符kbd->old[i]。6表示kbd->new + 2这块内存大小为6。如果找到了则返回该字符地址,否则返回该内存块末尾地址+1。
  • 所以这段代码的意思是,在新报上来的键值中查找旧的键值,如果没有找到,并且if (usb_kbd_keycode[kbd->old[i]])旧的键值为有效键值,那么就上报旧的键值已释放(按键已松开/抬起)。
if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {
			if (usb_kbd_keycode[kbd->new[i]])
				input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
  • 这段代码逻辑和上面的差不多,在旧的键值中查找新的键值,如果没有找到这个新的键值,并且这个新的键值是有效的,那么就上报该新键值被按下。

三、总结

  • kbd->old中保存了上次报上来的键值,kbd->new中是本次报上来的键值。如果上次报了某键值,但是本次没报,说明该按键被释放了,所以上报案件旧释放事件。如果上次没有报某按键而这次报了,说明该按键是这次被按下了,所以要上报按键按下事件。

四、参考资料

hut1_4
memscan(9) — linux-manual-4.8文章来源地址https://www.toymoban.com/news/detail-404613.html

到了这里,关于【usb】linux内核USB键盘驱动解析--普通键值上报及转化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 12.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在12.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(106)
  • Android 13.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在13.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(56)
  • linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

    目前服务器领域centos7基本是主流的操作系统,而linux相对于Windows来说,软硬件方面的支持是差很多的,在硬件方面来说,以一个免驱的网卡为例,window xp可能不会自动识别到,但Windows10基本都会自动识别到,简简单单的即插即用。根本原因在Windows随着版本的升级,内置的各

    2024年01月20日
    浏览(84)
  • USB标准键盘按键数据包格式解析

    标准键盘一次发送8个字节,解释如下: BYTE1 – |–bit0: Left Control是否按下,按下为1 |–bit1: Left Shift 是否按下,按下为1 |–bit2: Left Alt 是否按下,按下为1 |–bit3: Left GUI 是否按下,按下为1 |–bit4: Right Control是否按下,按下为1 |–bit5: Right Shift 是否按下,按下为1 |–bit6: Right

    2024年02月01日
    浏览(43)
  • USB HID键盘实现全键无冲解析

    目录 前言 设备描述符 配置描述符 配置描述符 接口描述符 HID描述符 端点描述符 HID类报表描述符 输入输出数据解析 其他         看了稚辉君的瀚文键盘的源码之后对于键盘全键无冲的实现还是存在很多疑问。1、HID报表描述符的内容到底什么意思?2、瀚文源码里的键值映射

    2024年02月09日
    浏览(60)
  • stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    查阅网上的博客与代码,很多都是关于USB的鼠标配置、USB的键盘配置、USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因为不理解这些数字代表着什么。但只要理解每个数字代表什么意思,

    2024年02月13日
    浏览(41)
  • 嵌入式linux下如何使用usb键盘

    首先usb键盘驱动的源代码位于一下目录: drivers/usb/input/usbkbd.c 将usb键盘驱动编译进内核: #make menuconfig Device Drivers—USB support----USB HIDBP Keyboard (simple Boot) support (注意:有可能默认设置USB键盘驱动是不可见的,需修改当前目录下的Kconfig文件) 保存设置后,重新编译内核: #sour

    2024年02月11日
    浏览(47)
  • Linux USB 驱动实验

    USB 是很常用的接口,目前大多数的设备都是USB 接口的,比如鼠标、键盘、USB 摄像头等,我们在实际开发中也常常遇到USB 接口的设备,本章我们就来学习一下如何使能Linux内核自带的USB 驱动。注意!本章并不讲解具体的USB 开发,因为USB 接口很复杂,不同的设备其协议也不同

    2024年02月07日
    浏览(39)
  • Linux: USB Gadget 驱动简介

    限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 本文所有分析基于 Linux 4.14 内核代码。 USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式 ,分为 USB 设备主机侧驱动 (主模式) ,或者 USB 设备从机侧驱动 (从模式

    2024年02月07日
    浏览(36)
  • Rockchip linux USB 驱动开发

    Linux USB 协议栈是一个分层的架构,如下图 5-1 所示,左边是 USB Device 驱动,右边是 USB Host 驱动,最底层是 Rockchip 系列芯片不同 USB 控制器和 PHY 的驱动。                                               Linux USB 驱动架构 Rockchip 系列芯片,主要使用两种 USB 2.0 PHY IP:Innosi

    2024年01月25日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包