最近遇到了USB 插拔后,系统重启的问题,抓取串口log发现如下问题,log中查看trace分析就是空指针造成的panic

Unable to handle kernel read from unreadable memory at virtual address 0000000000000000
Mem abort info:
ESR = 0x96000005
Exception class = DABT (current EL), IL = 32 bits
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000005
CM = 0, WnR = 0
user pgtable: 4k pages, 39-bit VAs, pgdp = 00000000dd92c597
...
Workqueue: usb_hub_wq hub_event
pstate: 60400005 (nZCv daif +PAN -UAO)
pc : hidown_disconnect+0x2c/0x98
lr : hidown_disconnect+0x24/0x98
sp : ffffff800808b840
x29: ffffff800808b840 x28: ffffff91017008f8
...
Call trace:

这里PC已经解析出了出错位置hidown_disconnect+0x2c/0x98,如果能得到对应的address的话可以通过add2line解析到对应函数和行数

./aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -f -e vmlinux ffffff800808b820

在之前在USB系列四学习到了usb Interface的接口类型有很多,那接触到这个usb驱动,发现usb hid的功能也是有分类,有以下几种

/kernel/msm-4.19/include/linux/hid.h

#define HID_CLAIMED_INPUT	BIT(0)
#define HID_CLAIMED_HIDDEV BIT(1)
#define HID_CLAIMED_HIDRAW BIT(2)
#define HID_CLAIMED_DRIVER BIT(3) /*
* HID connect requests
*/ #define HID_CONNECT_HIDINPUT BIT(0)
#define HID_CONNECT_HIDINPUT_FORCE BIT(1)
#define HID_CONNECT_HIDRAW BIT(2)
#define HID_CONNECT_HIDDEV BIT(3)
#define HID_CONNECT_HIDDEV_FORCE BIT(4)
#define HID_CONNECT_FF BIT(5)
#define HID_CONNECT_DRIVER BIT(6)
#define HID_CONNECT_DEFAULT (HID_CONNECT_HIDINPUT|HID_CONNECT_HIDRAW| \
HID_CONNECT_HIDDEV|HID_CONNECT_FF)

这里看到有clamied和connect_mask,感觉功能有重复,为什么会出现这样呢?

kernel/msm-4.19/drivers/hid/hid-own.c     hidraw不需要进行hid parse,可以直接传输raw原始数据
hdev->claimed = HID_CLAIMED_HIDRAW;
hdev->quirks = HID_QUIRK_NO_INIT_REPORTS;
error = hid_hw_start(hdev, 0); // mask = 0
hdev->claimed = 0; kernel/msm-4.19/drivers/hid/hid-multitouch.c
hid_hw_start(hdev, HID_CONNECT_DEFAULT); // mask = HID_CONNECT_DEFAULT int hid_hw_start(struct hid_device *hdev, unsigned int connect_mask)
int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev))
hdev->claimed |= HID_CLAIMED_HIDRAW; if (hdev->claimed & HID_CLAIMED_HIDRAW)
len += sprintf(buf + len, "%shidraw%d", len ? "," : "",
((struct hidraw *)hdev->hidraw)->minor); hid-input.c
hidinput_connect + hidinput_configure_usage 注册输入设备,配置输入接口
usbhid/hiddev.c
hiddev_connect 将hid device连接到hiddev driver
hidraw_connect
hidraw.c 接受所有的hid device设备,注册到/sys/class/hidraw/hidrawx

通过上述我个人理解的connect_mask与hdev->claimed应该功能区别不大,connect_mask最终也是决定claimed的内容。

Android Qcom USB Driver学习(七)的更多相关文章

  1. Android破解心得——记学习七少月安卓大型安全公开课

    第一课 讲解了关于在安卓破解之中环境的配置及所需要用到的软件,重要的软件是Androidkiller,安卓逆向助手 第二课讲解了java与smali的关系,从smail角度详细的分析了一个简单的Hel ...

  2. Delphi 调试连接 任意Android手机/平板/盒子(要安装Google USB Driver,并且还有USB的相关许多文章)

    Delphi有时候无法连接调试一些手机,解决方案: 1.安装Google USB Driver 2.通过设备管理器查看手机或平板USB的VID,PID 3.修改你的电脑上的android_winusb ...

  3. CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.

    CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android.Buffer Overflow Vu ...

  4. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  5. Android Wear(手表)开发 - 学习指南

    版权声明:欢迎自由转载-非商用-非衍生-保持署名.作者:Benhero,博客地址:http://www.cnblogs.com/benhero/ Android Wear开发 - 学习指南 http: ...

  6. Android 高级控件(七)——RecyclerView的方方面面

    Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...

  7. Android群英传笔记——第七章:Android动画机制和使用技巧

    Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. MyBatis学习七:spring和MyBatis整合

    <\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...

  10. Head First Android --- Enable USB debugging on your device

    1. Enable USB debugging on your device    On your device, open “Developer options” (in Android 4.0 o ...

随机推荐

  1. 算法·理论:KMP 学习笔记

    \(\text{KMP}\) 笔记! 上次比赛,出题人出了一个 \(\text{KMP}\) 模板,我敲了个 \(\text{SAM}\) 跑了,但是学长给的好题中又有很多 \(\text{KMP}\ ...

  2. 【Vue】Re15 Router 第二部分(缺省路由、动态路由)

    一.设置首页重定向: import Vue from 'vue'; import Router from 'vue-router'; import Home from "../compone ...

  3. ubuntu22.04下安装nvidia-docker

    首先需要保证docker engine已经安装成功,具体见: https://www.cnblogs.com/devilmaycry812839668/p/17269122.html ======== ...

  4. Dolphinscheduler Docker部署全攻略

    作者| 陈逸飞 Docker部署的目的是在容器中快速启动部署Apache Dolphinscheduler服务. 先决条件 docker-compose docker 使用容器单机部署Dolphins ...

  5. CSP_J2023总结

    维护中 T1 [CSP-J 2023] 小苹果 题目描述 小 Y 的桌子上放着 $n$ 个苹果从左到右排成一列,编号为从 $1$ 到 $n$. 小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果. 每 ...

  6. Spring Security入门教程 通俗易懂 超详细 【内含案例】

    Spring Security的简单使用 推荐 Java 常见面试题 简介 SSM 整合 Security 是比较麻烦的,虽然Security的功能比 Shiro 强大,相反却没有Shiro的使用量多 ...

  7. CH01_WPF概述

    第1章:WPF概述 本章目标 了解Windows图形演化 了解WPF高级API 了解分辨率无关性概念 了解WPF体系结构 了解WPF 4.5 WPF概述 ​ 欢迎使用 Windows Presenta ...

  8. spring手动事务控制

    在项目开发中需要用到手动事务进行控制.现说下遇到的问题以及解决方案: 如果程序需要使用嵌套事务,则需要在配置文件中添加一个配置属性,如下: <bean id="transactionM ...

  9. 树莓派CM4(三): 定制自己的树莓派镜像

    1. 镜像下载 使用树莓派最新的镜像Raspberry Pi OS Lite,内核版本6.6 下载链接 https://downloads.raspberrypi.com/raspios_lite_a ...

  10. 卧槽,牛逼!vue3的组件竟然还能“暂停”渲染!

    前言 有的时候我们想要从服务端拿到数据后再去渲染一个组件,为了实现这个效果我们目前有几种实现方式: 将数据请求放到父组件去做,并且使用v-if控制拿到子组件后才去渲染子组件,然后将数据从父组件通过pr ...