该系列文章总目录链接与各部分简介: 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学习(四)相关推荐

  1. Android Qcom USB Driver学习(二)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) BC v1.2充电规范 Battery Charging Specification USB port 如 ...

  2. Android Qcom USB Driver学习(八)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 因为要看usb charging的问题,所以需要补充一下battery的相关知识,算是入门吧 BAT SC ...

  3. Android Qcom USB Driver学习(一)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...

  4. Android Qcom USB Driver学习(六)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼 ...

  5. Android Qcom USB Driver学习(九)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 高通的某些平台将电源管理移植到了ADSP Subsystem, 分析一下其中比较关心的部分 Archite ...

  6. Android Qcom Audio架构学习

    总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...

  7. Android Qcom lcd display 学习(1)

    LCD的结构 TFT-LCD屏幕构造组成原理 Android LCD(一):LCD基本原理篇 LCD: 奇景光电 (hx8399) .敦泰 (ft8719) .京东方 .联咏等IC厂商 由于TFT-L ...

  8. Android Qcom lcd display 学习(4)

    DRM Linux DRM(二)基本概念和特性 DRM(Direct Rendering Manager)学习简介 DRM 的诞生就是用来处理多个程序对 Video Card 资源的协同使用问题,通过 ...

  9. Android Qcom lcd display 学习(3)

    Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...

最新文章

  1. 老生常谈:文字常量区的那点事
  2. 虚拟机中docker安装mysql远程无法访问解决方法
  3. mvn test BUILD FAILURE
  4. 计算智能-群智能算法-蚁群算法matlab实现
  5. think in java - 第四章 学习笔记
  6. 一个利用正则表达式进行代码重构,去除冗余代码的例子
  7. mysql fetch next from_MySql 存储过程 动态sql
  8. 二、Get和Post的区别
  9. linux 程序运行出错的时候,如何进行调试动态库
  10. F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍
  11. 解决在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'
  12. 首届“马栏山杯”国际音视频算法优化大赛颁奖盛典暨高峰论坛圆满落幕
  13. 哈理工OJ 1391 Orz odd(规律【没证出来】)
  14. 利用图神经网络进行社交机器人检测
  15. JavaWeb——会话追踪之Cookie和Session
  16. Ubuntu/Debian 微信安装
  17. OBS(Open Broadcaster Software)桌面视频直播软件/直播推流工具使用方法指南
  18. 中国风来袭!如何用ArcGIS制作水墨风山水画?
  19. 【uni-app 怎么获取当前时间,获取年月日,获取星期,解决小程序在苹果手机少了八个小时】
  20. c语言编译通过无法运行程序,请教:这是一个模拟寒食薛定锷方程的程序,编译通过后但无法运行...

热门文章

  1. 苹果iOS 5限制应用本地存储问题
  2. 防泄密-工业自动化控制行业源代码防泄密以及技术文档防泄密解决方案
  3. eclipse中字体大小及背景颜色设置
  4. 空调变频和定频的区别?
  5. Java多线程-实现Callable接口的call()方法,示例
  6. RocketMQ的Rebalance详解
  7. mysql视图之创建可更新视图
  8. delphi bde mysql_Delphi- 连接MySQL数据库BDE
  9. php获取用户豆瓣电影,用来获取豆瓣网上电影信息的简介
  10. AutoCAD .NET开发1:环境搭建