讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux如何开发USB设备驱动_LinuxUSBDriver开发基础

云伟同学_7314

云伟同学_7314

发布时间:2025-11-25 17:56:51

|

456人浏览过

|

来源于php中文网

原创

开发Linux USB设备驱动需理解USB子系统架构,包括usbcore、HCD和设备驱动三部分;通过定义usb_driver结构体并实现probe和disconnect回调,可注册驱动匹配特定VID/PID设备;在probe中获取设备信息并利用URB进行控制、批量等传输;使用usb_control_msg发送控制请求,结合Makefile编译为模块后通过insmod加载,dmesg查看日志,完成设备识别与通信。

linux如何开发usb设备驱动_linuxusbdriver开发基础

开发Linux下的USB设备驱动,需要理解内核中USB子系统的架构以及如何与硬件交互。Linux提供了一套完整的API和框架来支持USB驱动开发,开发者只需关注设备特性的实现,底层通信由内核处理。

理解Linux USB子系统结构

Linux的USB子系统位于/drivers/usb目录下,核心组件包括:

  • USB核心(usbcore):负责管理USB总线、设备枚举、带宽分配等通用任务
  • 主机控制器驱动(HCD):如EHCI、XHCI,控制物理主机控制器硬件
  • 设备驱动:面向具体设备,比如U盘、摄像头、串口适配器等

当插入USB设备时,内核通过描述符识别设备类型,并尝试匹配已注册的驱动。匹配成功后调用驱动的probe函数进行初始化。

编写一个简单的USB设备驱动

最基础的USB驱动通常基于usb_driver结构体注册,并实现probe和disconnect回调。

示例代码框架:

#include <linux/module.h>
#include <linux/usb.h>
<p>/<em> 定义支持的设备ID </em>/
static const struct usb_device_id my_usb_table[] = {
{ USB_DEVICE(0x1234, 0x5678) }, /<em> VID, PID </em>/
{ } /<em> 表结束 </em>/
};
MODULE_DEVICE_TABLE(usb, my_usb_table);</p><p>/<em> Probe函数:设备连接时调用 </em>/
static int my_probe(struct usb_interface <em>interface,
const struct usb_device_id </em>id)
{
printk(KERN_INFO "My USB Device Connected: %04x:%04x\n",
id->idVendor, id->idProduct);
return 0; /<em> 成功返回0 </em>/
}</p><p>/<em> Disconnect函数:设备拔出时调用 </em>/
static void my_disconnect(struct usb_interface *interface)
{
printk(KERN_INFO "My USB Device Disconnected\n");
}</p><p>/<em> 驱动结构体 </em>/
static struct usb_driver my_usb_driver = {
.name = "my_usb_driver",
.id_table = my_usb_table,
.probe = my_probe,
.disconnect = my_disconnect,
};</p><p>/<em> 模块加载 </em>/
static int __init my_init(void)
{
return usb_register(&my_usb_driver);
}</p><p>/<em> 模块卸载 </em>/
static void __exit my_exit(void)
{
usb_deregister(&my_usb_driver);
}</p><p>module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");</p>

这个驱动会在系统插入指定VID/PID的设备时打印消息。你可以将其编译为模块,使用make和insmod加载测试。

获取设备信息与数据传输

在probe函数中,可通过interface_to_usbdev(interface)获取struct usb_device指针,进而访问设备描述符、配置等信息。

Linux Ai Server
Linux Ai Server

Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。

下载

常用操作包括:

  • 读取描述符:usb_get_descriptor() 获取设备、接口或端点信息
  • 提交URB(USB请求块):用于发送控制、中断、批量或等时传输
  • 端点通信:通过端点地址确定数据流向和类型

例如,向控制端点发送命令:

int ret;
u8 cmd = 0x01;
ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
                      0x09,                     // 请求
                      USB_TYPE_VENDOR | USB_DIR_OUT,
                      0x1234, 0x5678,           // wValue, wIndex
                      &cmd, sizeof(cmd),        // 数据指针和长度
                      1000);                    // 超时ms
if (ret < 0)
    printk(KERN_ERR "Control request failed\n");

编译与调试技巧

将驱动保存为my_usb_driver.c,编写Makefile:

obj-m += my_usb_driver.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean

编译后使用以下命令加载并查看日志:

  • sudo insmod my_usb_driver.ko
  • dmesg | tail 查看内核输出
  • lsmod | grep my_usb_driver 确认模块加载
  • sudo rmmod my_usb_driver 卸载模块

使用lsusb可列出当前USB设备及其VID/PID,帮助确认目标设备是否存在。

基本上就这些。掌握USB驱动开发的关键是熟悉描述符结构、URB机制和内核提供的API。从简单探测开始,逐步实现数据交互,就能完成实际功能驱动。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4814

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4971

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3168

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4989

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3789

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

3950

2025.09.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn