Linux下复位usb设备

13 篇文章 0 订阅

前言

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 = 21780
    
    int 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 = 21780
    try:
        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)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值