Android Qcom USB Driver学习(四)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)
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 1kernel/msm-4.19/drivers/usb/gadget/function/f_acm.c
以上配置依赖于USB CDC serial (ACM) function driverstatic 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 0x10eakernel/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_inithid_quirks_init(quirks_param, BUS_USB, MAX_USBHID_BOOT_QUIRKS);查找insmod 时给的pid,vid参数在quirks列表中是否有,如果有,就替换。没有就创建hid_device_probehid_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_listhid_gets_squirk(hdev) //static ↑↑↑ hid_quirks/hid_ignore_listbl_entry = hid_match_id(hdev, hid_quirks);quirks |= bl_entry->driver_data;//HID_QUIRK_NO_INIT_REPORTShdrv->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 devicedev/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 Qcom USB Driver学习(二)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) BC v1.2充电规范 Battery Charging Specification USB port 如 ...
- Android Qcom USB Driver学习(八)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 因为要看usb charging的问题,所以需要补充一下battery的相关知识,算是入门吧 BAT SC ...
- Android Qcom USB Driver学习(一)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...
- Android Qcom USB Driver学习(六)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼 ...
- Android Qcom USB Driver学习(九)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 高通的某些平台将电源管理移植到了ADSP Subsystem, 分析一下其中比较关心的部分 Archite ...
- Android Qcom Audio架构学习
总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...
- Android Qcom lcd display 学习(1)
LCD的结构 TFT-LCD屏幕构造组成原理 Android LCD(一):LCD基本原理篇 LCD: 奇景光电 (hx8399) .敦泰 (ft8719) .京东方 .联咏等IC厂商 由于TFT-L ...
- Android Qcom lcd display 学习(4)
DRM Linux DRM(二)基本概念和特性 DRM(Direct Rendering Manager)学习简介 DRM 的诞生就是用来处理多个程序对 Video Card 资源的协同使用问题,通过 ...
- Android Qcom lcd display 学习(3)
Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...
最新文章
- 老生常谈:文字常量区的那点事
- 虚拟机中docker安装mysql远程无法访问解决方法
- mvn test BUILD FAILURE
- 计算智能-群智能算法-蚁群算法matlab实现
- think in java - 第四章 学习笔记
- 一个利用正则表达式进行代码重构,去除冗余代码的例子
- mysql fetch next from_MySql 存储过程 动态sql
- 二、Get和Post的区别
- linux 程序运行出错的时候,如何进行调试动态库
- F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍
- 解决在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'
- 首届“马栏山杯”国际音视频算法优化大赛颁奖盛典暨高峰论坛圆满落幕
- 哈理工OJ 1391 Orz odd(规律【没证出来】)
- 利用图神经网络进行社交机器人检测
- JavaWeb——会话追踪之Cookie和Session
- Ubuntu/Debian 微信安装
- OBS(Open Broadcaster Software)桌面视频直播软件/直播推流工具使用方法指南
- 中国风来袭!如何用ArcGIS制作水墨风山水画?
- 【uni-app 怎么获取当前时间,获取年月日,获取星期,解决小程序在苹果手机少了八个小时】
- c语言编译通过无法运行程序,请教:这是一个模拟寒食薛定锷方程的程序,编译通过后但无法运行...