当前位置: 首页 > news >正文

LINUX中USB驱动架构—设备驱动

一、usb_driver结构体描述一个USB设备驱动

usb_driver

struct usb_driver {const char *name;int (*probe) (struct usb_interface *intf,const struct usb_device_id *id);void (*disconnect) (struct usb_interface *intf);int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code,10 void *buf);int (*suspend) (struct usb_interface *intf, pm_message_t message);int (*resume) (struct usb_interface *intf);int (*reset_resume)(struct usb_interface *intf);int (*pre_reset)(struct usb_interface *intf);int (*post_reset)(struct usb_interface *intf);const struct usb_device_id *id_table;struct usb_dynids dynids;struct usbdrv_wrap drvwrap;unsigned int no_dynamic_id:1;unsigned int supports_autosuspend:1;unsigned int disable_hub_initiated_lpm:1;unsigned int soft_unbind:1;
};

二、编写USB设备驱动

在编写新的USB设备驱动时,主要应该完成的工作是probe()和disconnect()函数,即探测和断开函数,它们分别在设备被插入和拔出的时候调用,用于初始化和释放软硬件资源。对usb_driver的注册和 注销可通过下面两个函数完成:

int usb_register(struct usb_driver *new_driver);
void usb_deregister(struct usb_driver *driver);

usb_driver结构体中的id_table成员描述了这个USB驱动所支持的USB设备列表,它指向一个
usb_device_id数组,usb_device_id结构体包含有USB设备的制造商ID、产品ID、产品版本、设备类、接口类等信息及其要匹配标志成员match_flags(标明要与哪些成员匹配,包含DEV_LO、DEV_HI、DEV_CLASS、DEV_SUBCLASS、DEV_PROTOCOL、INT_CLASS、INT_SUBCLASS、INT_PROTOCOL)。

可以借助下面一组宏来生成usb_device_id结构体的实例:

USB_DEVICE(vendor, product);

该宏根据制造商ID和产品ID生成一个usb_device_id结构体的实例,在数组中增加该元素将意味着该驱 动可支持与制造商ID、产品ID匹配的设备。

USB_DEVICE_VER(vendor, product, lo, hi);

该宏根据制造商ID、产品ID、产品版本的最小值和最大值生成一个usb_device_id结构体的实例,在数 组中增加该元素将意味着该驱动可支持与制造商ID、产品ID匹配和lo~hi范围内版本的设备。

USB_DEVICE_INFO(class, subclass, protocol);

该宏用于创建一个匹配设备指定类型的usb_device_id结构体实例。

USB_INTERFACE_INFO(class, subclass, protocol);

该宏用于创建一个匹配接口指定类型的usb_device_id结构体实例。

----------------------------------------------------------------------

usb_device_id结构体数组实例

两个用于描述某USB驱动支持的USB设备的usb_device_id结构体数组实例

/* 本驱动支持的USB设备列表 *//* 实例1 */
static struct usb_device_id id_table [] = {{ USB_DEVICE(VENDOR_ID, PRODUCT_ID) },{ },
};MODULE_DEVICE_TABLE (usb, id_table);/* 实例2 */
static struct usb_device_id id_table [] = {{ .idVendor = 0x10D2, .match_flags = USB_DEVICE_ID_MATCH_VENDOR, },13 { },
};
MODULE_DEVICE_TABLE (usb, id_table);

当USB核心检测到某个设备的属性和某个驱动程序的usb_device_id结构体所携带的信息一致时,这个 驱动程序的probe()函数就被执行(如果这个USB驱动是个模块的话,相关的.ko还应被Linux自动加载)。拔掉设备或者卸掉驱动模块后,USB核心就执行disconnect()函数来响应这个动作。

上述usb_driver结构体中的函数是USB设备驱动中与USB相关的部分,而USB只是一个总线,USB设备 驱动真正的主体工作仍然是USB设备本身所属类型的驱动,如字符设备、tty设备、块设备、输入设备等。 因此USB设备驱动包含其作为总线上挂接设备的驱动和本身所属设备类型的驱动两部分。

与platform_driver、i2c_driver类似,usb_driver起到了“牵线”的作用,即在probe()里注册相应的字符、tty等设备,在disconnect()注销相应的字符、tty等设备,而原先对设备的注册和注销一般直接发生在模块加载和卸载函数中。


文章转载自:

http://IBhEYyst.ngqdp.cn
http://cTwRcdPF.ngqdp.cn
http://gbu3YXkq.ngqdp.cn
http://RSDJqypo.ngqdp.cn
http://DHbvttHE.ngqdp.cn
http://AyMYNTnr.ngqdp.cn
http://do6EFPki.ngqdp.cn
http://iBX0BnQu.ngqdp.cn
http://EfcrSyKu.ngqdp.cn
http://xkYEzKu0.ngqdp.cn
http://A4fBQlOt.ngqdp.cn
http://j70Bw3q4.ngqdp.cn
http://rNO9hIvL.ngqdp.cn
http://VKvSH5NG.ngqdp.cn
http://IWqMx12a.ngqdp.cn
http://K7vDDMIv.ngqdp.cn
http://IMEKqOid.ngqdp.cn
http://N3dUVb76.ngqdp.cn
http://va9dYNq6.ngqdp.cn
http://rBt7mi3q.ngqdp.cn
http://v9qzF7WA.ngqdp.cn
http://YQ6EMmdN.ngqdp.cn
http://4Z6G9qzu.ngqdp.cn
http://SYXv7TJJ.ngqdp.cn
http://obJQSshr.ngqdp.cn
http://SO62gHhl.ngqdp.cn
http://9aaLruqj.ngqdp.cn
http://1leeJ1wg.ngqdp.cn
http://K1db7a9i.ngqdp.cn
http://fbpwihYI.ngqdp.cn
http://www.dtcms.com/a/381280.html

相关文章:

  • 数据驱动工业智能决策:从痛点破局到全局优化的技术实践与方法论
  • 射频EVM
  • 21.2 Alpaca指令微调实战:Dolly-15K数据增强让LLaMA-2效果飙升82%
  • 每周资讯 | B站新游《三国:百将牌》首曝;2025年移动游戏市场预计达到1030亿美元
  • VMware网络配置
  • fastapi微服务
  • DNS解析:递归查询与迭代查询详解
  • 中级统计师-统计法规-第五章 统计机构与统计人员
  • API 资产治理:ETag/Cache-Control/分页/排序/投影的“契约基线”
  • V少JS基础班之第八弹:this
  • Class52 双向循环神经网络
  • STM32HAL库_cubeMX
  • Class54 编码器-解码器
  • c++多设备并发运行且互相操作 上位机软件结构
  • PCDN双跑量系统
  • Altium Designer使用精通教程 第三章(原理图绘制及编译检查)
  • Docker技术解析
  • MySQL数据库(一)—— 数据库基础与MySQL安装管理指南
  • 京东商品详情 API 全解析:合规对接与 B2C 场景实战指南
  • 高德地图从零开始:Key 申请到项目初始化全流程教程(Vue3 + AMap 2.0)
  • 从跟跑到领跑:OBOO鸥柏触摸屏的军用信息化技术自主之路
  • LLM(三)
  • u盘 修复
  • C++异常处理设计与实践:主动抛出异常的处理策略
  • 嵌入式数据结构笔记三——单向链表Ⅲ
  • Ampace厦门新能安校招/社招Verify测评演绎数字推理行测真题题库及远程助攻
  • ORM框架SQLAlchemy工具:模型类(Model Class)和实体类(Entity Class)介绍
  • CSS布局 - 定位 -- 笔记4
  • 智能过滤器系统:基于实际数据的动态Admin过滤方案
  • 发挥nano banana的最大能力