蓝牙HID驱动:某键盘,Fn组合键,小概率无响应,普通Keyboard功能正常。

分析:同平台产品ABC,A搭配定制键盘,有该问题,B,C均无此问题。

初步判断为A搭配的键盘有问题。但看了HCI log,可看到,键值在对应时间点有上报。又与我们的推断想悖。

adb shell

getevent   就能看到各个注册设备

于是,正面刚。

HID写数据给Input子节点流程:

键盘手柄à按键发送Keycode(HCI)à协议栈(bta_hh_le_input_rpt_notify()函数)àHID驱动()àInput子节点(getEvnet)<-安卓上层(游戏,输入法)监听实现

由于Kernel基本不会出问题,搭配的其他平台的键盘产品,也没有该问题,猜测是键盘问题,但不能确凿。于是开始各种加维测日志,追流程。(kernel/msm-4.19/drivers/hid)hid-core.c , hid-input.c ; uhid.c ;

不卖关子,直接讲根因:

加维测log,定位到 hid_field *hid_register_field中的 report->maxfield = 0 时,会出现的异常。

在次函数中,有一个内存申请函数kzalloc

当出现异常时,我们打印出来usages的值,为8192,    对比其他键盘基本在20以下。由此确定是键盘的 report map 的值,传的太大,申请内存失败引起的。

总结:键值上报的 report map 中针对Fn组合键的maxmum值过大,导致连接时,需要申请较大的连续内存(256K级别),针对256K级别内存,系统无法保证每次都能申请成功,这就解释了为什么是小概率的出现。从而导致report->maxfield无法++,为0。键盘上报的键值,kernel在hid_report_raw_event 中,就不会执行hid_input_field,不会将键值写到input子节点中。Event拿不到键值,按键无响应。

对比其他键盘,上报的map中针对Fn组合键设置的maxmum较小,连接时,申请的内存较少,系统基本可以保证每次都能申请成功。

kerne流程:

uhid.c   -------->     uhid_dev_input()

|

hid-core.c------>    hid_input_report()   (This is data entry for lower layers.)

|

hid_report_raw_event()                        (当内存申请失败,report->maxfiled = 0 ,if条件不满足,hid_input_field()不能执行)

|

hid_input_field()

|

hid_process_event()

|

hidinput_hid_event()

|

input_event()

至此,UHID就将数据,发送到了input子系统。

源码参考:AndroidXRef

参考文章:Linux设备驱动之HID驱动---非常全面而且深刻_UPON的博客-CSDN博客

蓝牙HID驱动:某键盘,Fn组合键,小概率无响应,普通Keyboard功能正常。相关推荐

  1. Android 蓝牙 HID 键值收发-小概率无响应处理

    同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦.​​​​​​​ ...

  2. 华硕电脑重装系统后fn组合键部分屏幕无显示

    华硕电脑重装系统后fn快捷键屏幕无显示 华硕键盘热键与 Fn 键一起使用,用于提供对某些功能的快速访问和切换.它还支持 OSD(屏幕显示)来显示热键的当前状态. 在重装系统后这个软件没有了,重新安装一 ...

  3. 关闭笔记本显示器指定组合键才能打开_八大品牌笔记本Fn组合键大全

    掌握笔记本Fn组合键,对全面了解笔记本电脑的功能至关重要,这些组合键能够让你轻松的使用笔记本.不同品牌的电脑Fn组合键有所不同.下面分别介绍联想.华硕.戴尔.三星.惠普.东芝.NEC.IBM八大品牌笔 ...

  4. THINKPAD笔记本Fn组合键介绍

    THINKPAD笔记本Fn组合键介绍 Fn键作为笔记本的组合键,和其他键组合使用时会有强大的功能,很多使用技巧都是通过Fn组合键来实现的.下边就为大家总结一下IBM ThinkPad系列笔记本Fn键的 ...

  5. 最新版的各品牌笔记本FN组合键的作用大揭秘

    笔记本的键盘有一个蓝色的FN键,它的功能非常强大而方便.FN 键就是组合式功能键,与其他键组合,可以快捷实现某功能.不同的品牌或者不同的型号的本本,FN键的作用都可能不一样.下面列出各品牌的FN组合键 ...

  6. acer计算机的无线功能键,Acer笔记本Fn组合键功能说明

    Fn按钮是笔记本电脑上的独特按钮功能.我们可以使用" Fn"组合键来调节屏幕亮度,音量,打开或关闭无线网络等.这使我们可以更快地设置和管理计算机,但是不同品牌笔记本电脑的按键功能也 ...

  7. Linux快捷键不能调节亮度,Linux(Ubuntu)无法调节亮度的终极解决方案(还原Fn组合键调节方法...

    5年前我花了一周时间也没解决的问题,现在只用了2个小时就完美解决了 重要提示 这篇文章展示了我的思考及尝试过程,其中一些诸如文件保存的方法等简单操作没有加入,如果你很着急或是刚刚接触Linux,请参考 ...

  8. 微软笔记本 Surface Pro 键盘失灵组合键重启的方法(原理不详)

    现象 微软笔记本 Surface Pro 键盘失灵,触摸板失灵,电源键可以正常使用. 操作步骤 1.长按电源鍵,持续按住直至电脑强制关机. 2.长按音量+键和电源键15秒以上,中间别管屏幕上显示什么, ...

  9. 分享如何监听按下键盘任意组合键

    一. 按下某个键 document.addEventListener('keydown',e => {console.log(e.key,'key=='); }) 二. 按下ctrl,shift ...

最新文章

  1. html 文件、图片、txt 下载 链接和按钮
  2. 初学者自学python要看什么书-从python初学者到入门算法,这几本书一定要看,附PDF...
  3. 23种设计模式C++源码与UML实现--命令模式
  4. idea搭建web项目及tomcat部署总结
  5. 连接postgresql
  6. 【数据库】Window环境安装MySQL Server 5.7.21
  7. 参数pyinstaller_Python用PyInstaller打包笔记
  8. 动态绘制柱状图饼状图
  9. centos 7 yum php swoole_自动化部署技能—搭建企业级YUM仓库
  10. php检索条件丢失,php – 从SQL Server检索时丢失的某些图像的一部分
  11. 【安装教程】python3.6安装Tensorflow-GPU路上的那些坑(WIN10)
  12. win10无限重启_让迷你掌上电脑更具生产力,GPD安装 Win10+Ubuntu双系统
  13. 使用opencv创建一张纯黑色的图片与其他图片进行合成
  14. 超详细:将iPhone中音乐导出到电脑里的简单方法(完美支持最新iOS15.2系统)
  15. 病毒、蠕虫和木马的区别
  16. Hadoop HA (三) --------- HDFS-HA 自动模式
  17. MySQL 条件查询
  18. 当手机产业进入硬件能力过剩时代
  19. java+mysql基于ssm企业进销存管理系统【计算机毕业设计】
  20. pandas_设计样本(资产)组合

热门文章

  1. echart堆叠柱状图,顶部显示堆叠柱总数的技巧
  2. googleplay经验总结
  3. 倍福--程序拷贝到另一个控制器的方式
  4. 卫星地图影像数据在城市规划中的应用
  5. 人工智能与机器学习——人脸表情识别
  6. zf3 php,php – ZF3中的ServiceManager
  7. PHPStudy后门事件分析
  8. 解决SpringCloud的Gateway网关无法访问服务的静态资源
  9. 三极管的介绍及工作原理
  10. 公开密钥加密之RSA算法【概念+计算+代码实现】