本文主要是介绍Linux下复位usb设备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Linux下复位usb设备
- 前言
- 1、原理
- 2. C语言实现
- 2. python实现
前言
C++程序设计中,我们经常会使用一些第三方usb设备,有时会出现一些异常,我们一般可以插拔一下usb设备,让设备恢复正常。但是为了满足自动化需求或者针对不能插拔的情况,为了能够自动恢复,实际上也可以通过软件来复位usb设备。本文包含C语言和python两种实现方案。
1、原理
复位指定USB需要知道指定USB设备属于哪个主设备控制器,对应的设备号是多少。获取这两个关键参数后利用ioctl函数以文件io的形式实现USB复位操作。 在linux终端键入 lsusb 命令,可以看到在系统中对应的USB主控制器为002,设备名为003。 可知设备在Linux系统中设备名是:/dev/bus/usb/002/003.
bash Bus 002 Device 003: ID 0fe9:9010 DVICO
2. C语言实现
- 保存下面代码为usbreset.c文件
/* usbreset -- send a USB port reset to a USB device */#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <linux/usbdevice_fs.h>#define USBDEVFS_RESET = 21780int main(int argc, char **argv) {const char *filename;int fd;int rc;if (argc != 2) {fprintf(stderr, "Usage: usbreset device-filename\n");return 1;}filename = argv[1];fd = open(filename, O_WRONLY);if (fd < 0) {perror("Error opening output file");return 1;}printf("Resetting USB device %s\n", filename);rc = ioctl(fd, USBDEVFS_RESET, 0);if (rc < 0) {perror("Error in ioctl");return 1;}printf("Reset successful\n");close(fd);return 0; }
- 编译程序
gcc usbreset.c -o usbreset
- 获取要重置的USB设备的总线和设备ID
lsusb e.g. Bus 002 Device 003: ID 0fe9:9010 DVICO
- 赋予权限
chmod +x usbreset
- 执行复位程序,根据lsusb显示的Bus和Device号组成设备路径
sudo ./usbreset /dev/bus/usb/002/003
2. python实现
#!/usr/bin/env python
import os
import sys
import fcntl
def reset_usb_device(dev_path):USBDEVFS_RESET = 21780try:f = open(dev_path, 'w', os.O_WRONLY)fcntl.ioctl(f, USBDEVFS_RESET, 0)print('Successfully reset %s' % dev_path)sys.exit(0)except Exception as ex:print('Failed to reset device! Error: %s' % ex)sys.exit(-1)
这篇关于Linux下复位usb设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!