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了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...
随机推荐
- mysql 参数调优
临时调整mysql内存,最好在项目开始的时候直接改配置不用临时设置 SET GLOBAL innodb_buffer_pool_size = 2147483648; 查询当前使用内存: SHOW VA ...
- 2023/4/15 SCRUM个人博客
1.我昨天的任务 获得了人脸识别作弊检测和绘制界面的分工,准备先从作弊检测入手 2.遇到了什么困难 对作弊检测的组件不熟悉,进展缓慢,需要进行对点的学习 3.我今天的任务 初步学习cython
- Diffutoon下载介绍:真人视频转动漫工具,轻松获得上千点赞
最近在刷短视频的时候,偶尔能看到一些真人转动漫风的作品,看起来给人一种新鲜感,流量都还不错,简简单单跳个舞,就能获得上千个点赞~ 那么,这种视频是怎么制作的? 本期给大家介绍一款AI转绘工具Diffu ...
- 【Linux】Re03
一.软连接 语法用法 ln -s 源文件或者目录位置 链接名称 [root@localhost ~]# mkdir -p aa/bb/cc/dd [root@localhost ~]# ln -s a ...
- OneFlow框架0.9.1dev版本,成功安装并运行
安装cuda和cudnn: (此步骤可以忽略,pip安装框架时会自动安装依赖的cuda和cudnn环境) conda install cudatoolkit==11.8.0 python3 -m pi ...
- 【转载】 在Ubuntu环境下,搜狗输入法乱码问题的解决
原文作者:高坦的博客 | Tan's Blog 原文链接:https://www.cnblogs.com/gtscool/p/12234104.html本文采用 BY-NC-SA 许可协议.转载请注明 ...
- baselines算法库common/atari_wrappers.py模块分析
common/atari_wrappers.py模块代码如下: import numpy as np import os os.environ.setdefault('PATH', '') from ...
- 面向分布式强化学习的经验回放框架——Reverb: A Framework for Experience Replay
论文题目: Reverb: A Framework for Experience Replay 地址: https://arxiv.org/pdf/2102.04736.pdf 框架代码地址: htt ...
- python语言版(代码):计算百分数的概率单位
相关资料: [转载]百分数的概率单位变换--解惑:概率确实没有单位但是数学里面确实有"概率单位"这个词 百分比与概率单位对照表 https://www.docin.com/p-22 ...
- Sealos 就是小团队的神器
作者:阳明.Kubernetes 布道师,公众号 K8s 技术圈主理人 最近我们新开发了一个项目 fastclass.cn,这个项目是一个独立开发者的学习网站,我们的目标是帮助你使用 Figma.Py ...