VID/PID识别USB设备

CDC-ACM驱动介绍

CDC-ACM(Communication Device Class——Abstract Control Model)驱动实现以USB设备驱动和tty设备驱动为基础,将USB设备驱动的实现看作tty驱动和硬件之间数据流转换的桥梁。tty数据发送,相当于将串口数据需要转换为USB数据,再经由USB设备驱动传递给CDC串口硬件。tty数据接收,相当于硬件接收的数据先经过USB传递给USB设备驱动,在USB数据接收处理中将串口数据传递给tty驱动程序。

kernel/msm/drivers/usb/class/cdc-acm.c
#define X1_ACM_INF0(x) \
USB_DEVICE_AND_INTERFACE_INFO(0x0C2E, x, \
USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \
USB_CDC_ACM_PROTO_AT_V25TER) #define X1_ACM_INF1(x) \
USB_DEVICE_AND_INTERFACE_INFO(0x0C2E, x, \
USB_CLASS_CDC_DATA, 0, \
USB_CDC_PROTO_NONE) static const struct usb_device_id acm_ids[] = {
/* quirky and broken devices */
{ X1_ACM_INF0(0x10ea),
.bInterfaceNumber = 0, 如果一个配置有多个接口的话,那么每个接口的编号都有一个独立的编号,编号从0开始递增
},
{ X1_ACM_INF1(0x10ea),
.bInterfaceNumber = 1,
},
... MODULE_DEVICE_TABLE(usb, acm_ids); 将acm_ids输出到用户空间,在加载模块时就知道了什么模块对应什么硬件设备,常用于热插拔中。

USB NCM usbnet 枚举流程代码分析初始化 usb_device_id 结构体时,可以通过kernel/msm-4.19/include/linux/usb.h的宏控来更快速的对每个成员赋值

interface description
USB_DEVICE(vendor, product) 可用来只匹配特定供应商和产品 ID 值,常用于需要特定驱动的 USB 设备
USB_DEVICE_VER(vendor, product, lo, hi) 可以用来在一个版本范围中只匹配特定供应商和产品 ID 值
USB_DEVICE_INFO(class, subclass, protocol) 可以用来只匹配一个特定类的 USB 设备
USB_INTERFACE_INFO(class, subclass, protocol) 可以用来只匹配一个特定类的 USB 接口
USB_DEVICE_AND_INTERFACE_INFO(vendor,product,class,subclass,protocol) 可以用来匹配具有特定类 USB 接口的特定 USB 设备

USB描述符-HID描述符USB Class Code

InterfaceClass
#define USB_CLASS_COMM 0x02 == 02h Both Communications and CDC Control
#define USB_CLASS_HID 0x03 == 03h Interface HID (Human Interface Device)
#define USB_CLASS_CDC_DATA 0x0a == 0Ah Interface CDC-Data USB_CDC_SUBCLASS_ACM
InterfaceSubClass
#define USB_CDC_SUBCLASS_ACM 0x02
InterfaceProtocol
#define USB_CDC_PROTO_NONE 0 当InterfaceSubClass为0x00,此值无效
#define USB_CDC_ACM_PROTO_AT_V25TER 1 kernel/msm-4.19/drivers/usb/gadget/function/f_acm.c
以上配置依赖于USB CDC serial (ACM) function driver static struct usb_interface_descriptor acm_control_interface_desc = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */
.bNumEndpoints = 1,
.bInterfaceClass = USB_CLASS_COMM,
.bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
.bInterfaceProtocol = USB_CDC_ACM_PROTO_AT_V25TER,
/* .iInterface = DYNAMIC */
}; static struct usb_interface_descriptor acm_data_interface_desc = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */
.bNumEndpoints = 2,
.bInterfaceClass = USB_CLASS_CDC_DATA,
.bInterfaceSubClass = 0,
.bInterfaceProtocol = 0,
/* .iInterface = DYNAMIC */
};

Linux下USB HID device driver研究(二)Linux下USB HID device driver研究(三)

usb hid quirks(configure more HID quirks at module load time)中文的意思是怪癖的意思,即某种特性与通常的USB设备不同,在hid-quirks.c中有一些列表,hid_quirks、hid_ignore_list等,描述了某个设备有什么样的问题需要修正或者是否需要忽略等,HID_QUIRK_NO_INIT_REPORTS不初始化包含重要信息的功能reports

kernel/msm/drivers/hid/hid-ids.h
#define USB_VENDOR_ID_x 0x0c2e
#define USB_DEVICE_ID_x1 0x10ea kernel/msm-4.19/drivers/hid/hid-quirks.c
static const struct hid_device_id hid_quirks[] = {
...
{ HID_USB_DEVICE(USB_VENDOR_ID_x, USB_DEVICE_ID_x1), HID_QUIRK_NO_INIT_REPORTS },
{ 0 }
};
/*
* If HID_QUIRK_NO_INIT_REPORTS is set, make sure we don't initialize
* the reports.
*/ kernel/msm-4.19/drivers/hid/hid-core.c
hid_init
hid_quirks_init(quirks_param, BUS_USB, MAX_USBHID_BOOT_QUIRKS);
查找insmod 时给的pid,vid参数在quirks列表中是否有,如果有,就替换。没有就创建 hid_device_probe
hid_match_device + hid_match_one_id (VID+PID检测)
hdrv->match(hdev, hid_ignore_special_drivers )
hdev->quirks = hid_lookup_quirk(hdev);
hid_exists_dquirk(hdev) //Dynamic ↑↑↑ quirks_param - dquirks_list
hid_gets_squirk(hdev) //static ↑↑↑ hid_quirks/hid_ignore_list
bl_entry = hid_match_id(hdev, hid_quirks);
quirks |= bl_entry->driver_data;//HID_QUIRK_NO_INIT_REPORTS
hdrv->probe(hdev, id); //drivers/hid/usbhid/usbmouse.c probe 在老一点的linux kernel版本中,静态的检测只有一个hid_blacklist数组,功能与hid_quirks一致

识别log

usb 1-1.2: New USB device found, idVendor=0c2e, idProduct=10ea, bcdDevice= 1.68
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.2: Product: product
usb 1-1.2: Manufacturer: company
usb 1-1.2: SerialNumber: 34567890
cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device dev/ttyACM0 On a Linux host running the ACM driver
dev/ttyUSB0 On a Linux host running the USB generic serial driver

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

  1. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  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 开源项目及其学习

    Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...

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

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

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

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

  7. 转--Android按钮单击事件的四种常用写法总结

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下     很多学习Android程序设计的人都会发现每个人对代码的 ...

  8. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  9. Android(java)学习笔记160:Framework运行环境之 Android进程产生过程

    1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...

  10. Android艺术开发探索第四章——View的工作原理(下)

    Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...

随机推荐

  1. mysql 主从复制 + thinkphp 读写分离

    好处:加快查询速度.数据库热备份等 注意:要跨服务器,先准备一个虚拟机或者docker,同一个服务器意义不大,而且风险大. 注意:本文档学习原理使用,线上可使用阿里云rds自带的读写分离 主从复制: ...

  2. Telegram手机号码反查工具

    Telegram手机号码反查工具 项目地址:https://github.com/bellingcat/telegram-phone-number-checker v1.2.1版本 要求python的 ...

  3. PyCharm设置背景主题

    PyCharm修改主题的路径: File->Settings->Appearance &Behavior->Appearance 1.  Intellij:白色 2. Dar ...

  4. 用了组合式 (Composition) API 后代码变得更乱了,怎么办?

    前言 组合式 (Composition) API 的一大特点是"非常灵活",但也因为非常灵活,每个开发都有自己的想法.加上项目的持续迭代导致我们的代码变得愈发混乱,最终到达无法维护 ...

  5. 【Android】构建Android12项目报错

    报错信息: Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Man ...

  6. iOS开发基础146-深入解析WKWebView

    WKWebView是苹果在iOS 8中引入的重要组件,它替代了UIWebView,为开发者提供了高性能.高稳定性的网页显示和交互能力.在本文中,我们将深入探讨WKWebView的底层架构.关键特性.使 ...

  7. 国产深度学习框架 OneFlow 是否靠谱?

    OneFlow框架的设计目标是实现:一个使用多机多卡就像使用单机单卡一样容易的深度学习框架. 可以说,这是国内最早的深度学习框架之一,也是至今还活着的公司中开发支持力度最低的,也是最缺少技术支持.用户 ...

  8. springboot中统一日志输出logback

    1.背景 为了便于分析和记录系统的运行,一个系统输出其运行的关键日志是非常必要的 比如输出:请求参数.请求url.请求方式.执行的sql.重要操作的日志.响应结果等 而这些日志中,大部分不需要我们手动 ...

  9. MySQL手动执行rollback,内部实现分析

    -- 测试手动回滚操作 -- 1手动开启事务 START TRANSACTION -- 2执行更新操作语句 UPDATE FraBakNtuAnalysize SET IsDeleted = 0 WH ...

  10. 项目管理工具Maven的简单配置示例

    Maven是一个强大的项目管理工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建.报告和文档.以下是一些关于Maven的具体例子,涵盖了项目配置.依赖管理.插件使用等方面: ...