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

一. 简介

前一篇文章简单学习了 Linux下usb设备驱动实现流程,文章如下:

编写Linux下usb设备驱动方法:usb设备驱动实现流程-CSDN博客

本文来学习一下 usb设备驱动的 probe函数要完成的任务。

当usb主控制器检测到设备与 驱动相匹配时,就会执行usb的 probe函数。

二. 编写Linux下usb设备驱动的方法:probe函数中要进行的工作

当 USB主控制器驱动发现一个设备与你的 id_table 匹配时,probe函数就会执行。probe函数的主要任务:

(1) 验证设备基本信息(合法性检查)

在进行资源分配前,需先确认设备的硬件特性是否符合驱动预期,避免对不兼容设备进行错误初始化:

  • 检查设备描述符:验证设备的接口数量、端点类型、传输能力等是否与驱动支持的范围匹配(例如驱动只支持中断端点,需检查设备是否存在中断端点)。
  • 确认端点参数:通过 usb_interface 的 cur_altsetting 成员获取当前接口的端点描述符,检查端点地址、最大包长(wMaxPacketSize)、中断间隔(bInterval)等是否符合驱动设计(例如确保缓冲区大小不超过端点最大包长)。
  • 检查设备版本 / 功能:对于复杂设备(如带多个配置的 USB 设备),可能需要验证设备固件版本、支持的功能集等。
static int my_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) {struct usb_device* dev = interface_to_usbdev(intf);struct usb_endpoint_descriptor* ep_desc;//检查设备是否有中断输入端点for(int i = 0; i < (intf->cur_altsetting->desc.bNumEndpoints); i++) {ep_desc = &intf->cur_altsetting->endpoint[i].desc;if(!usb_endpoint_is_int_in(ep_desc))break;}//检查端点最大包长是否符合要求(例如不超过64字节)if(le16_to_cpu(ep_desc->wMaxPacketSize) > 64) break;//...其他检查
}

(2) 分配与初始化驱动私有数据结构: 使用 kzalloc 或 devm_kzalloc

  • 分配私有数据内存:使用 kzalloc分配内存(确保初始化为 0,避免野指针)。
  • 关联核心对象:将 usb_deviceusb_interface等核心结构体指针存入私有数据(需通过    usb_get_dev 增加设备引用计数,确保设备不被意外释放)。
  • 初始化关键成员:如数据传输缓冲区大小、URB 指针初始化为 NULL 等。

(3) 初始化数据传输机制(URB 准备)

USB 设备的核心功能是数据传输,probe函数需为传输准备好 URB(USB Request Block,USB 请求块)—— 内核中 USB 传输的 “载体”:

  • 分配 URB:通过 usb_alloc_urb 分配与端点类型匹配的 URB(如中断端点用 usb_alloc_urb(0, ...),等时端点需指定 iso 包数量)。
  • 填充 URB:根据端点类型调用对应的填充函数(如中断端点用 usb_fill_int_urb,批量端点用 usb_fill_bulk_urb ),设置传输方向、缓冲区、完成回调函数等。
  • 关联 URB 与私有数据:将私有数据设为 URB 的 context,便于回调函数中访问设备资源。

usb四种传输类型中,控制传输和批量传输,可以不用进行URB传输块的分配,填充,关联等刚工作。可以使用 usb内核提供的函数接口进行传输:

控制传输可以使用 usb_control_msg()函数进行传输,批量传输可以使用 usb_bulk_msg() 函数进行传输(在使用 usb_control_msg()函数或 usb_bulk_msg()函数进行 USB 控制传输时,USB 内核已经封装了 URB(USB Request Block)的分配、填充、提交和释放等底层工作,开发者无需手动操作 URB 结构)。

(4) 注册用户空间接口(可选)

若驱动需要与用户空间程序交互(如通过 ioctl 发送命令、读写数据),probe 函数需注册字符设备、sysfs 节点或其他接口:

字符设备注册:通过 cdev_init、cdev_add 注册字符设备,关联文件操作结构体(file_operations),让用户空间可通过 /dev/xxx 访问。

sysfs 节点创建:通过 sysfs_create_group 等函数创建属性文件,暴露设备状态或配置参数(如 echo 1 > /sys/class/myusb/enable 开启设备)。

(5) 启动数据传输(可选)

对于需要 “设备插入后立即开始工作” 的场景(如传感器设备周期性上报数据),probe函数可在初始化完成后直接提交 URB,启动首次数据传输:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94549.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划:为什么暴力算法会有重复子问题

第一步&#xff1a;先明确 “子问题” 和 “重复子问题” 的定义 在算法中&#xff0c;“子问题” 不是泛指 “小一点的问题”&#xff0c;而是具有明确 “状态参数” 的、可独立求解的问题单元。 状态参数&#xff1a;描述子问题核心信息的变量&#xff08;比如 01 背包中的 “…

【网络】添加路由时,via和dev参数作用、直连路由

文章目录概述1、带via1.1 添加路由前的初始状态1.2. 执行添加路由的命令1.3. 添加路由后的状态2、不带 via (使用设备接口)&#xff0c;直连3、带via还是不带via ?4、dev xx的作用4.1 命令中带via时&#xff0c;建议不带 dev eth0 (让系统自动判断)4.2 命令中带via&#xff0c…

云原生---企业级Kubernetes

一、Kubernetes介绍 1.简介 kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器…

无人机三维路径规划首选算法:RRT_

无人机三维路径规划首选算法&#xff1a;RRT* 要判断哪种算法更适合无人机三维路径规划&#xff0c;需先明确无人机三维路径规划的核心需求&#xff0c;再结合各算法的底层逻辑与特性进行匹配。以下先梳理核心需求&#xff0c;再逐一分析算法特性&#xff0c;最终通过对比得出结…

CentOS 7 服务器初始化:从 0 到 1 的安全高效配置指南

前言 对于运维或开发人员而言&#xff0c;新到手的 CentOS 7 服务器绝非 “开箱即用”—— 默认的国外软件源下载缓慢、系统缺乏基础工具、防火墙未做安全配置&#xff0c;这些问题都会影响后续使用效率与服务器安全性。本文整理了 CentOS 7 服务器初始化的全套实操方案&#…

32.Attention-注意力机制

不是所有的信息都是有用的&#xff0c;或者说重要的。我们应该把注意力放在他该在的地方。 在人工智能领域&#xff0c;注意力机制被广泛应用。他可以帮助模型关注与当前任务相关的特征&#xff0c;而忽略不重要的特征&#xff0c;以提高准确率。注意力机制本质&#xff1a;即通…

如何设计 “用户共创型” IP 成长社群模型?​

“用户共创型” IP 成长社群的核心&#xff0c;是从 “IP 单向输出” 转向 “IP 与用户共生”&#xff0c;让用户从 “被动接收者” 变为 “主动参与者”&#xff0c;通过 “需求共建、内容共造、价值共享” 形成闭环&#xff0c;既强化用户归属感&#xff0c;又为 IP 注入持续…

Windows 命令行:mkdir 命令

专栏导航 上一篇&#xff1a;Windows 命令行&#xff1a;dir 命令 回到目录 下一篇&#xff1a;MFC 第一章概述 本节前言 本节&#xff0c;我们来讲解一个常见的命令&#xff0c;mkdir 命令。 学习本节知识&#xff0c;需要你首先懂得如何打开一个命令行界面&#xff0c;…

Linux系统编程——进程(函数)

回调函数&#xff1a;atexit()原型&#xff1a; int atexit(void (*function)(void));功能&#xff1a; 注册进程退出前执行的函数参数&#xff1a; function 函数指针&#xff0c;指向void返回值void参数的函数指针返回值 成功 返回0失败 …

均胜电子上半年毛利率持续提升,汽车智能化与机器人业务多点突破

8月25日&#xff0c;全球领先的智能汽车科技解决方案提供商均胜电子&#xff08;600699.SH&#xff09;发布2025上半年业绩&#xff0c;报告期内公司实现营业收入约303.47亿元&#xff0c;同比增长12.07%&#xff1b;营业利润总额约12.47亿元&#xff0c;归母净利润同比增长11.…

【QT入门到晋级】进程间通信(IPC)-共享内存

前言 前面分享了几种IPC通信技术&#xff0c;都有成熟的交互机制&#xff08;阻塞和非阻塞方式交互&#xff09;&#xff0c;而本文分享的共享内存&#xff0c;更像是系统提供了一张“白纸”&#xff0c;让多个进程自己构建管理及安全机制&#xff0c;而有些场景只需要简单的机…

自动化测试概念与 Web 自动化实战(基于 Selenium)

在软件测试领域&#xff0c;自动化测试是提升测试效率、保障回归测试质量的核心手段。尤其对于 C 开发的项目&#xff0c;自动化测试能有效减少重复手工操作&#xff0c;避免新增功能对历史功能的影响。本文从自动化基础概念入手&#xff0c;详解自动化分类、Web 自动化测试核心…

NeRAF、ImVid论文解读

目录 一、NeRAF 1、概述 2、方法 3、训练过程 4、实验 二、ImVid 1、概述 2、Imvid数据集 3、STG方法 一、NeRAF 1、概述 NeRF类方法仅支持视觉合成功能&#xff0c;缺乏声学建模能力。对于以往的声学建模&#xff08;如NAR/INRAS&#xff09;会忽略三维场景几何对声…

重复文件删除查找工具 Duplicate Files Search Link v10.7.0

软件介绍 Duplicate Same Files Searcher 是一款面向 Windows 平台的专业重复文件检索与清理工具&#xff0c;兼具符号链接替换与 NTFS 高级特性支持&#xff0c;可在无损数据的前提下大幅缩减磁盘冗余。 软件使用 软件打开后是英文版&#xff0c;手动切换中文&#xff08;按…

简易shell

目录 一、整体功能概述 函数准备 1.env命令 2.getenv()函数 3.snprintf 4.strtok()函数 三、全局变量 四、核心功能函数解析 1. 信息获取函数 2. 命令行交互 3. 命令解析 4. 普通命令执行 5. 内置命令处理&#xff08;核心功能&#xff09; 五、主函数流程 六、总…

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环 基于 Spring Cloud Gateway + Spring Cloud Alibaba Nacos ——一篇可落地的技术方案与源码级实现 1. 场景与痛点 在微服务网关层做 统一资源权限校验 时,必须满足: 启动阻塞:所有权限规则加载完成前,不监听端口,拒…

open webui源码分析8—管道

我们可以把Open WebUI想象成一个管道系统&#xff0c;数据通过管道和阀门流动。管道作为open webui的插件&#xff0c;可以为数据构建新的通路&#xff0c;可以自定义逻辑和处理数据&#xff1b;阀门是管道的可配置部件&#xff0c;控制数据流过管道时的行为。管道可以理解成用…

深入理解 C 语言 hsearch 哈希表:限制、技巧与替代方案

概述 C 语言标准库中的 hsearch 系列函数提供了一套简单易用的哈希表实现,包含在 <search.h> 头文件中。这组函数虽然接口简洁,但在实际使用中存在一些重要的限制和注意事项。本文将深入探讨 hsearch 的功能特点、设计局限,并提供实用的解决方案和替代建议。 hsearc…

Web网络开发 -- HTML和CSS基础

HTML 超文本编辑语言 HTML 介绍 HTML的英文全称是 Hyper Text Markup Language&#xff0c;即超文本标记语言。HTML是由WEB的发明者 Tim Berners-Lee &#xff08;蒂姆伯纳斯李&#xff09;和同事 Daniel W. Connolly于1990年创立的一种标记语言&#xff0c; 它是标准通用化标…

Python爬虫实战:研究开源的高性能代理池,构建电商数据采集和分析系统

1. 绪论 1.1 研究背景与意义 随着互联网技术的飞速发展,网络数据已成为信息时代的核心资源之一。从商业角度看,企业通过分析竞争对手的产品信息、用户评价等数据,可制定更精准的市场营销策略;从学术研究角度,研究者通过爬取社交媒体数据、学术文献等,可开展社会网络分析…