一、概况

  • 建议阅读前置文章【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

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

  1. 【usb】linux内核USB键盘驱动解析--特殊键值转化及上报

    文章目录 一.概况 二.探索 入口 usb_kbd_irq 三.总结 四.参考资料 一.概况 以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors.edge.kerne ...

  2. 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统

    剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...

  3. linux 键盘驱动下载,嵌入式Linux系统的键盘驱动实现

    嵌入式Linux系统的键盘驱动实现1引言 Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用.很多嵌入式Linux系统,特别是一些具有与用户强 ...

  4. linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset

    Linux内核之设备驱动-底层数据结构kobject/kset kobject kobject是组成device.driver.bus.class的基本结构.如果把前者看成基类,则后者均为它的派生产物 ...

  5. Linux内核的Nand驱动流程分析

    最近在做Linux内核移植,总体的感觉是这样的,想要彻底的阅读Linux内核代码几乎是不可能的,至少这还不是嵌入式学期初期的重要任务.内核代码解压后有250M左右,据统计,有400多万行,而且涉及到了 ...

  6. Linux进程调用execve,linux内核系统调用函数do_execve()解析实例源码

    linux内核系统调用函数do_execve()解析,彻底解析内核调用用户空间代码入口函数do_execve() sys_execve() –> do_execve() /usr/src/lin ...

  7. 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面

    解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...

  8. 如何获取自己键盘上按键的键值(KeyCode)

    文章目录 通过C语言获取部分按键键值 获取字母按键键值 获取方向键键值 键码值汇总 字母和数字的键值 数字键盘上按键的键值 功能键的键值 控制键键值 多媒体按键键值 通过C语言获取部分按键键值 这里提 ...

  9. linux usb 键盘 内核配置文件,Linux 内核USB 驱动

    通用串行总线(USB)是一个在主机和许多外设之间的连接. 最初它被创建来替代许多慢速和不同的总线- 并口, 串口, 和键盘连接--有一个单个的所有设备都可以连接的总线类型.[45] USB 已经成长超 ...

最新文章

  1. 今天清华学长手把手带你做UI自动化测试
  2. 【笔记】css卡片式地展示人物信息和一些展示信息的相关美化记录
  3. 正确使用cookie中的domain
  4. leetcode61 旋转链表
  5. 无盘服务器 cpu占用,顺网科技网维大师程序占CPU资源多的解决过程
  6. 提前为小米11让路?小米10高配版官网已缺货
  7. 【渝粤教育】 广东开放大学21秋期末考试会议运行管理10036k2
  8. ubuntu LVM
  9. php酒店预订源码,如家快捷酒店预订源码 for php
  10. 计算机基础1.4习题答案,中职计算机应用基础习题集及答案~.doc
  11. MySQL 数据库规范
  12. 系统仿真实践中的精益思维(随感)
  13. 项目合同与劳务合同的区别
  14. 【周赛266】leetcode2062.统计字符串中的的元音子字符串
  15. 中国云计算行业研究报告
  16. IPv6路由器警告(alert)选项
  17. 全局zomm缩放后echarts鼠标偏移的问题(鼠标触发提示框位置有偏差)
  18. 计算机硬盘改造u盘,iPhone扩容硬盘不要扔!变废为宝!手把手教你如何改装U盘...
  19. 五年北京,这个改变我命运的城市,终于要离开了
  20. 百度输入法皮肤工具提示 CSS,如何利用百度输入法超级皮肤增加特别键盘

热门文章

  1. 揭秘:甜橙金融如何实现PB级数据跨千公里的零丢失迁移
  2. 天邑TY1608-高安版-905L3B-EMMC-当贝纯净桌面-免拆卡刷固件包
  3. Android工具类篇 图片拼接
  4. windows开机进入grub解决方案 (无easyUEFI删除Linux启动项)
  5. 深度学习基础----ROC曲线和AUC值
  6. Python浪漫表白源码(附带详细教程)
  7. python表白程序源码_程序员python表白代码
  8. 知识图谱应用——煤矿安全知识图谱构建技术研究学习
  9. 直方图hist函数解释
  10. 自强创新之路 打造真正上网不花钱8500WN已面世