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

编写Linux下usb设备驱动方法:disconnect函数中要完成的任务

一. 简介

前一篇文章学习了 usb设备驱动开发中,probe函数中要完成的工作,文章如下:

编写Linux下usb设备驱动方法:probe函数中要进行的工作-CSDN博客

本文继续学习 Linux嵌入式 usb设备驱动实现,主要简单学习一下 disconnect函数要进行的工作。

二. 编写Linux下usb设备驱动方法:disconnect函数中要完成的任务

在 USB 设备驱动中,disconnect 函数是 struct usb_driver 结构体中的一个关键回调函数,主要负责在 USB 设备与驱动断开连接时(如设备被物理拔出、驱动被卸载或系统重启时)执行资源清理操作,是保障内核稳定性的重要机制。

1. disconnect函数的核心作用

  • 资源释放:释放 probe 函数中分配的所有资源(内存、URB、设备节点等),避免内存泄漏。
  • 状态清理:重置设备相关的状态标志,确保驱动退出时系统状态一致。
  • 通知处理:必要时通知用户空间程序设备已断开连接。

2. disconnect函数调用时机

disconnect 函数由内核在以下场景自动调用:

(1) USB设备被物理拔出时;

(2) 驱动模块被卸载时(rmmod),对已绑定的设备执行清理;

(3) 设备在枚举过程中失败,需要解除驱动绑定;

(4) 系统关闭或重启时;

3. disconnect函数中需要进行的工作

(1) 资源释放:释放所有在 probe函数中分配的资源

(2) 设备注销:从系统中注销设备节点和字符设备

(3) URB清理:停止和释放所有未完成的 usb请求块(URB传输块)

(4) 状态清理:清理设备状态,确保系统稳定性

(5) 引用计数管理:正确管理引用计数,防止内存泄漏

三. disconnect函数实现框架

disconnect函数示例如下:

//设备私有数据
struct my_usb_dev {struct usb_device *udev;    //usb设备指针struct usb_interface * intf;//接口指针struct urb *read_urb;       //URB传输块unsigned char * read_buf;   //读缓冲区struct cdev cdev;           //字符设备结构struct class *class;//... 其他需要释放的资源
};//disconnect函数
static void my_usb_disconnect(struct usb_interface *intf) {//获取probe函数中关联到接口的私有数据struct my_usb_dev* usb_dev = usb_get_intfdata(intf);if(!usb_dev) {return;}//1. 终止URB传输(避免设备已断开但URB仍在等待)usb_kill_urb(usb_dev->read_urb); //强制终止URBusb_free_urb(usb_dev->read_urb); //释放URB结构体//2. 释放内核内存缓冲区kfree(usb_dev->read_buf);//3. 注销字符设备(如果创建了/dev节点)cdev_del(&usb_dev->cdev);unregister_chrdev_region(MAJOR(usb_dev->dev_num, 0), 1);device_destroy(usb_dev->class, usb_dev->dev_num);//4. 释放USB设备引用(减少设备计数,允许内核释放设备结构体)usb_put_dev(usb_dev->udev);//5. 释放私有数据结构本身kfree(usb_dev);//6.清除接口关联的私有数据(避免野指针)usb_set_intfdata(intf, NULL);//输出调试信息dev_info(&intf->dev, "USB device disconnected and resources released\n");
}

http://www.dtcms.com/a/359976.html

相关文章:

  • 【数学建模学习笔记】异常值处理
  • RAG(检索增强生成)技术的核心原理与实现细节
  • 【Unity开发】Unity核心学习(三)
  • macos自动安装emsdk4.0.13脚本
  • 在Ubuntu系统上安装和配置JMeter和Ant进行性能测试
  • 基于SpringBoot + Vue 的宠物领养管理系统
  • 【Spring Cloud微服务】7.拆解分布式事务与CAP理论:从理论到实践,打造数据一致性堡垒
  • ANR InputDispatching TimeOut超时判断 - android-15.0.0_r23
  • 拆分TypeScript项目的学习收获:处理编译缓存和包缓存,引用本地项目,使用相对路径
  • 配置 Kubernetes Master 节点不可调度的标准方法
  • 【51单片机】【protues仿真】基于51单片机音乐喷泉系统
  • 记录测试环境hertzbeat压测cpu高,oom问题排查。jvm,mat,visulavm
  • opencv 梯度提取
  • [Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战
  • 掩码语言模型(Masked Language Model, MLM)
  • android-studio 安装
  • 基于计算机视觉的海底图像增强系统:技术详述与实现
  • 如何正确校正电脑时间?
  • 【开源】AI模型接口管理与分发系统开源项目推荐
  • Redis八股小记
  • 人工智能学习:机器学习相关面试题(二)
  • 【开题答辩全过程】以 基于vue+springboot的校园疫情管理系统的设计与实现为例,包含答辩的问题和答案
  • 企业级开发模型:从软件生命周期到 Git 分支管理
  • 【C++ 】string类:深拷贝与浅拷贝解析
  • DSPFilters实现低通滤波器(QT)
  • 电力电子技术知识学习-----晶闸管
  • 前端组件拆分与管理实战:如何避免 props 地狱,写出高可维护的项目
  • 接口测试:如何定位BUG的产生原因
  • Python实现异步多线程Web服务器:从原理到实践
  • 萌宝喂养日志-我用AI做喂养记录小程序1-原型设计