Android Qcom USB Driver学习(四)
VID/PID识别USB设备
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 设备 |
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学习(四)的更多相关文章
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Delphi 调试连接 任意Android手机/平板/盒子(要安装Google USB Driver,并且还有USB的相关许多文章)
Delphi有时候无法连接调试一些手机,解决方案: 1.安装Google USB Driver 2.通过设备管理器查看手机或平板USB的VID,PID 3.修改你的电脑上的android_winusb ...
- 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 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- Android Wear(手表)开发 - 学习指南
版权声明:欢迎自由转载-非商用-非衍生-保持署名.作者:Benhero,博客地址:http://www.cnblogs.com/benhero/ Android Wear开发 - 学习指南 http: ...
- 转--Android按钮单击事件的四种常用写法总结
这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的 ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- Android艺术开发探索第四章——View的工作原理(下)
Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...
随机推荐
- Jetpack Compose学习(12)——Material Theme的主题色切换
原文:Jetpack Compose学习(12)--Material Theme的主题色切换-Stars-One的杂货小窝 闲着无事研究了下Jetpack Compose M3 主题切换效果 本系列以 ...
- 怎么使用github action定时运行js脚本?
github action是使用yaml文件来做到CI/CD的,文件位置存放在 .github/workflows,yaml文件内容如下: name: ncatest.cx.js on: push: ...
- docker部署苍穹外卖
首先修改配置信息和自己的docker部署信息相符:MySQL.redis.记得把MySQL数据导上去(记得数据库信息的完整) 1.通过maven下载三个jar包 2.上传,编写dockerfile,注 ...
- Miniconda 切换python版本
要在 Miniconda 中切换 Python 版本,可以按照以下步骤进行操作: 打开命令提示符或者 Anaconda Prompt(如果已经安装了). 输入 conda info --envs 查看 ...
- 趣谈n++与++n的differences
前言:今天小白在学习时无意发现一组有趣的孪生兄弟** n++ 与 ++n** 探索:二者不同之处 工具:VS2022 过程: 前者是++n,输出11,12,13,14 后者是n++,输出10,11,1 ...
- 【FastDFS】环境搭建 02 测试
自带工具测试: 编辑客户端配置文件: vim client.conf 配置完成后,随便上传一个图片到root目录下 运行FastFDS文件上传程序,并将客户端配置文件作为加载参数1,要上传的图片文件位 ...
- ComfyUI插件:ComfyUI layer style 节点(三)
前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点.该节点几乎将PhotoShop的全部功能迁移到Comf ...
- 【转载】 arXiv论文提交流程
原文地址: https://blog.csdn.net/u010705932/article/details/105834469 =================================== ...
- 深度学习框架 MindSpore —— 华为出品的AI计算框架, docker 安装
深度学习框架 MindSpore -- 华为出品的AI计算框架 官网地址: https://www.mindspore.cn/ 源代码地址: https://gitee.com/devilma ...
- oracle执行报错 ORA-01722: 无效数字
1.背景 执行Oracle存储过程时报错:ORA-01722: 无效数字 2.错误描述 1.对于两个类型不匹配,一个数字类型,一个非数字类型的值进行赋值操作;2.两个类型不匹配的值进行比较操作,比如一 ...