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

yizhihongxing

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日

相关文章

  • golang将float转换为int

    以下是Golang将float转换为int的完整攻略,包括转换方法、注意事项、示例说明等内容。 1. 转换方法 在Golang中,我们可以使用int()函数将float类型的变量转换为int类型。以下是一个将float类型变量f转换为int类型的示例: f := 3.14 i := int(f) 在上述示例中,我们首先定义一个float类型的变量f,其值为3…

    other 2023年5月10日
    00
  • 在mybatis中去除多余的前缀或者后缀操作

    在MyBatis中,可以使用<trim>元素来去除多余的前缀或后缀操作。<trim>元素可以用于动态地处理SQL语句的前缀和后缀,以便根据条件添加或删除它们。 以下是使用<trim>元素去除多余前缀或后缀的完整攻略: 去除前缀示例: <select id=\"getUserList\" resul…

    other 2023年8月5日
    00
  • 远程连接工具rdcman

    当然,我很乐意为您提供有关“远程连接工具rdcman”的完整攻略。以下是详细的步骤和两个示例: 1. 远程连接工具rdcman rdcman是一款由微软提供的免费远程连接管理工具,可以帮助用户轻松管理多个远程连接。rdcman支持多种协议,包括RDP、VMRC、VNC、SSH等。 2. 远程连接工具rdcman的安装 以下是rdcman的安装步骤: 2.1 …

    other 2023年5月6日
    00
  • 简单了解python变量的作用域

    简单了解Python变量的作用域 在Python中,变量的作用域指的是变量在程序中可访问的范围。了解变量的作用域对于编写可维护和可理解的代码非常重要。Python中有三种主要的变量作用域:全局作用域、局部作用域和嵌套作用域。 全局作用域 全局作用域是在整个程序中都可访问的作用域。在全局作用域中定义的变量可以在程序的任何地方使用。可以使用global关键字来在…

    other 2023年7月29日
    00
  • Android开发之滑动数值选择器NumberPicker用法示例

    Android开发之滑动数值选择器NumberPicker用法示例攻略 简介 在Android开发中,滑动数值选择器(NumberPicker)是一个常用的UI组件,它允许用户通过滑动手势选择一个特定的数值。本攻略将详细介绍NumberPicker的用法,并提供两个示例说明。 示例1:基本用法 以下是使用NumberPicker的基本步骤: 在XML布局文件…

    other 2023年9月5日
    00
  • 详细对比php中类继承和接口继承

    当我们编写面向对象的代码时,经常需要使用到类继承和接口继承。本文将详细对比PHP中类继承和接口继承,从继承的概念、语法、应用场景等多个方面进行讲解。 一、类继承 1. 概念 类继承是指子类继承父类的属性和方法,并且可以在子类中新增属性和方法,或者覆盖父类的方法。子类也可以继承父类的常量。 2. 语法 class 父类名 { // 父类的属性和方法 } cla…

    other 2023年6月27日
    00
  • i5 9400F和i5 8400哪个值得买 Intel酷睿i5-9400F和8400区别对比

    i5 9400F和i5 8400的区别对比 1. 性能比较 i5 9400F 核心/线程数:6核心/6线程 基础频率:2.9 GHz 最大睿频:4.1 GHz 缓存:9 MB TDP:65W i5 8400 核心/线程数:6核心/6线程 基础频率:2.8 GHz 最大睿频:4.0 GHz 缓存:9 MB TDP:65W 从性能上来看,i5 9400F和i5 …

    other 2023年8月6日
    00
  • 新手进阶 透彻认识64位操作系统

    新手进阶:透彻认识64位操作系统攻略 介绍 64位操作系统是一种能够处理64位数据的操作系统。相比于32位操作系统,64位操作系统具有更大的内存寻址能力和更高的性能。本攻略将帮助新手透彻认识64位操作系统,并提供两个示例说明。 步骤 1. 了解64位操作系统的基本概念 首先,我们需要了解64位操作系统的基本概念。64位操作系统是指使用64位寻址空间的操作系统…

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