【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
【usb】linux内核USB键盘驱动解析--普通键值上报及转化相关推荐
- 【usb】linux内核USB键盘驱动解析--特殊键值转化及上报
文章目录 一.概况 二.探索 入口 usb_kbd_irq 三.总结 四.参考资料 一.概况 以Linux5.10内核中USB键盘驱动为例进行解析:https://mirrors.edge.kerne ...
- 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统
剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...
- linux 键盘驱动下载,嵌入式Linux系统的键盘驱动实现
嵌入式Linux系统的键盘驱动实现1引言 Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用.很多嵌入式Linux系统,特别是一些具有与用户强 ...
- linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset
Linux内核之设备驱动-底层数据结构kobject/kset kobject kobject是组成device.driver.bus.class的基本结构.如果把前者看成基类,则后者均为它的派生产物 ...
- Linux内核的Nand驱动流程分析
最近在做Linux内核移植,总体的感觉是这样的,想要彻底的阅读Linux内核代码几乎是不可能的,至少这还不是嵌入式学期初期的重要任务.内核代码解压后有250M左右,据统计,有400多万行,而且涉及到了 ...
- Linux进程调用execve,linux内核系统调用函数do_execve()解析实例源码
linux内核系统调用函数do_execve()解析,彻底解析内核调用用户空间代码入口函数do_execve() sys_execve() –> do_execve() /usr/src/lin ...
- 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面
解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...
- 如何获取自己键盘上按键的键值(KeyCode)
文章目录 通过C语言获取部分按键键值 获取字母按键键值 获取方向键键值 键码值汇总 字母和数字的键值 数字键盘上按键的键值 功能键的键值 控制键键值 多媒体按键键值 通过C语言获取部分按键键值 这里提 ...
- linux usb 键盘 内核配置文件,Linux 内核USB 驱动
通用串行总线(USB)是一个在主机和许多外设之间的连接. 最初它被创建来替代许多慢速和不同的总线- 并口, 串口, 和键盘连接--有一个单个的所有设备都可以连接的总线类型.[45] USB 已经成长超 ...
最新文章
- 今天清华学长手把手带你做UI自动化测试
- 【笔记】css卡片式地展示人物信息和一些展示信息的相关美化记录
- 正确使用cookie中的domain
- leetcode61 旋转链表
- 无盘服务器 cpu占用,顺网科技网维大师程序占CPU资源多的解决过程
- 提前为小米11让路?小米10高配版官网已缺货
- 【渝粤教育】 广东开放大学21秋期末考试会议运行管理10036k2
- ubuntu LVM
- php酒店预订源码,如家快捷酒店预订源码 for php
- 计算机基础1.4习题答案,中职计算机应用基础习题集及答案~.doc
- MySQL 数据库规范
- 系统仿真实践中的精益思维(随感)
- 项目合同与劳务合同的区别
- 【周赛266】leetcode2062.统计字符串中的的元音子字符串
- 中国云计算行业研究报告
- IPv6路由器警告(alert)选项
- 全局zomm缩放后echarts鼠标偏移的问题(鼠标触发提示框位置有偏差)
- 计算机硬盘改造u盘,iPhone扩容硬盘不要扔!变废为宝!手把手教你如何改装U盘...
- 五年北京,这个改变我命运的城市,终于要离开了
- 百度输入法皮肤工具提示 CSS,如何利用百度输入法超级皮肤增加特别键盘