linuxusb子系统(三):通过usbfs操作设备的用户空间驱动

Linux USB 子系统(三): 通过 USBFS 操作设备的用户空间驱动

介绍

在 Linux 上,USB 设备被连接到系统后,内核会根据设备的类别和 ID 进行识别和自动加载驱动模块,从而让其能够正常使用。一般情况下,我们编写的用户空间应用程序只需要与内核交互,而不需要直接操作设备。

但是,有些情况下,我们需要在用户空间直接操作 USB 设备,比如要调试驱动的实现,该设备的驱动程序不存在等等情况。此时,我们可以使用 USB 文件系统 (USBFS) 在用户空间中操作 USB 设备。

USBFS

USBFS 是一种虚拟文件系统,由内核提供,可以让用户空间程序访问 USB 子系统以及 USB 设备。USBFS 在根据 USB 设备的 class 和 subclass 进行自动挂载时,会在 /proc/bus/usb 下创建相应的 USB 设备文件:

/proc/bus/usb/001/001
/proc/bus/usb/001/002
...

其中 /proc/bus/usb/001 表示 USB 控制器的端口号,001 表示该端口上的第一个设备的设备号,002 表示第二个设备的设备号,以此类推。

操作流程

操作流程如下:

  1. 打开 USB 设备

在用户空间可以使用 open() 函数打开 USB 设备文件,比如:

int fd;
fd = open("/proc/bus/usb/001/001", O_RDWR);
if (fd < 0) {
    perror("open");
    exit(1);
}
  1. 获取设备描述符

打开 USB 设备之后,我们需要获取设备描述符,可以使用 ioctl() 函数,调用 USBDEVFS_CONTROL 命令,获取设备描述符:

int ret;
struct usbdevfs_ctrltransfer ctrl;
unsigned char buf[256];

ctrl.bRequestType = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE;
ctrl.bRequest = USB_REQ_GET_DESCRIPTOR;
ctrl.wValue = cpu_to_le16(USB_DT_DEVICE << 8);
ctrl.wIndex = 0;
ctrl.data = buf;
ctrl.wLength = 18;

ret = ioctl(fd, USBDEVFS_CONTROL, &ctrl);
if (ret < 0) {
    perror("ioctl");
    exit(1);
}

通过上面的代码,可以获取设备描述符,存放在 buf 数组中。设备描述符的具体格式可以参考 USB 规范。

  1. 发送控制命令

如果需要给 USB 设备发送控制命令,可以使用 ioctl() 函数,调用 USBDEVFS_CONTROL 命令,发送控制命令:

int ret;
struct usbdevfs_ctrltransfer ctrl;

ctrl.bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
ctrl.bRequest = 0x11;
ctrl.wValue = 0x1234;
ctrl.wIndex = 0;
ctrl.data = NULL;
ctrl.wLength = 0;

ret = ioctl(fd, USBDEVFS_CONTROL, &ctrl);
if (ret < 0) {
    perror("ioctl");
    exit(1);
}

通过上面的代码,可以给 USB 设备发送一个 vendor 命令,命令值为 0x11,参数为 0x1234

  1. 读取、写入数据

如果需要读取或写入 USB 设备的数据,可以使用 read()write() 函数读写 USB 设备文件。

int ret;
unsigned char buf[64];

ret = read(fd, buf, sizeof(buf));
if (ret < 0) {
    perror("read");
    exit(1);
}

ret = write(fd, buf, sizeof(buf));
if (ret < 0) {
    perror("write");
    exit(1);
}
  1. 关闭 USB 设备

最后,需要使用 close() 函数关闭 USB 设备文件:

close(fd);

总结

通过 USBFS,在用户空间中可以直接操作 USB 设备,实现 USB 设备的调试、测试等功能。但是需要注意的是,这种方式并不安全,因为用户空间程序可以直接修改 USB 设备的寄存器等数据。

因此,如果需要在用户空间中编写 USB 设备驱动程序,建议使用更加安全的 libusb 库。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linuxusb子系统(三):通过usbfs操作设备的用户空间驱动 - Python技术站

(0)
上一篇 2023年3月29日
下一篇 2023年3月29日

相关文章

  • beautifulsoup官方文档

    BeautifulSoup官方文档 BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它提供了一种简单的方式来遍历文档树,搜索和修改文档内容。以下是BeautifulSoup官方文档的完整攻略。 步骤 以下是BeautifulSoup官方文档的步骤: 访问BeautifulSoup官方文档网站。 阅读文档中的介绍、安装、使…

    other 2023年5月6日
    00
  • react项目引入antd框架方式以及遇到的一些坑

    下面是react项目引入antd框架的攻略,包括以下内容: 安装antd 引入antd样式 引入antd组件 遇到的常见问题及解决方案 1. 安装antd 在安装antd之前,需要确保已经安装了react和react-dom,可以使用以下命令安装: npm install react react-dom 接着,使用以下命令安装antd: npm instal…

    other 2023年6月27日
    00
  • Win10正式版哪些预装的应用可以卸载?Win10释放空间的详细教程

    Win10正式版预装的应用数量较多,在一定程度上占用了系统的存储空间,因此卸载一些不必要的应用是释放空间的一个有效途径。本攻略将详细讲解Win10正式版中哪些预装的应用可以卸载,以及如何释放空间的详细操作步骤,具体如下: Win10正式版哪些预装的应用可以卸载? Win10正式版中预装的应用列表较长,其中有一些是系统自带的核心应用,不能卸载,但也有部分应用是…

    other 2023年6月25日
    00
  • C++类继承时的构造函数

    在C++类的继承中, 子类不仅要继承父类的属性和方法,而且还要继承其构造函数和析构函数。本文将详细讲解在C++类继承时的构造函数。 构造函数和析构函数的继承规则 在C++中,子类的构造函数和析构函数会默认调用父类的构造函数和析构函数。具体规则如下: 子类的构造函数会默认调用父类的无参构造函数。 如果父类没有无参构造函数,则必须在子类的构造函数中显示的调用父类…

    other 2023年6月26日
    00
  • 精通CSS高级web标准解决方案 下载

    如何精通CSS高级web标准解决方案下载,可以分为以下步骤: 步骤一:了解书籍概述 首先,需要了解书籍的概述,包括书籍的作者、出版社、出版时间、书籍简介等相关信息。可以在网络上寻找相关的介绍内容,并阅读一些评论或者书评,以获取更多的信息和评价。 例如,针对《精通CSS高级web标准解决方案》这本书,可以从豆瓣上了解到该书的基本信息,包括作者的背景、书籍目录、…

    other 2023年6月26日
    00
  • Grpc微服务从零入门

    gRPC微服务从零入门的完整攻略 gRPC是一种高性能、开源的远程过程调用(RPC)框架,可以在不同的平台上运行。本文将为您提供gRPC微服务从零入门的完整攻略,并提供两个示例说明。 步骤1:安装gRPC 在使用gRPC进行微服务开发之前,需要先安装gRPC。可以使用以下命令在Python中安装gRPC: pip install grpcio 步骤2:定义服…

    other 2023年5月5日
    00
  • 什么是物联网?

    物联网(IoT)是指互连的物理设备、车辆、家庭用品、工具等等通过互联网实现相互通信、数据传输、智能化操作的系统。为了实现物联网的完整攻略,我们需要遵循以下步骤: 1. 设计物联网架构 首先,我们需要设计一套物联网架构,包括硬件和软件方面的设计。此步骤的目标是建立一个可拓展、稳定和高效的系统。 硬件层面,我们需要考虑使用哪些设备,如何连接它们,以及如何收集和处…

    其他 2023年4月19日
    00
  • MySQL深分页问题及三种解决方案

    MySQL深分页问题及三种解决方案 什么是MySQL深分页问题? MySQL深分页问题指当我们需要从MySQL数据库中获取大量数据,并且需要进行分页展示时,如果我们采用传统的LIMIT offset, count语句进行查询,查询偏移量越大,查询效率就会越低,甚至会导致查询时间过长、内存溢出等问题,这就是MySQL深分页问题。 为什么会存在MySQL深分页问…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部