zoukankan      html  css  js  c++  java
  • 设备offline时如何自动重置

    在linux底层

    Linux/include/uapi/linux/usbdevice_fs.h中,重置_IO('U', 20)可以重置usb设备。

    因此,我们可以在脚本中利用这个方法去重置USB

    代码链接:https://gist.github.com/PaulFurtado/fce98aef890469f34d51

    """
        Example code for resetting the USB port that a Teensy microcontroller is
        attached to. There are a lot of situations where a Teensy or Arduino can
        end up in a bad state and need resetting, this code is useful for 
    """
    
    import os
    import fcntl
    import subprocess
    
    
    # Equivalent of the _IO('U', 20) constant in the linux kernel.
    USBDEVFS_RESET = ord('U') << (4*2) | 20
    
    
    def get_teensy():
        """
            Gets the devfs path to a Teensy microcontroller by scraping the output
            of the lsusb command
            
            The lsusb command outputs a list of USB devices attached to a computer
            in the format:
                Bus 002 Device 009: ID 16c0:0483 Van Ooijen Technische Informatica Teensyduino Serial
            The devfs path to these devices is:
                /dev/bus/usb/<busnum>/<devnum>
            So for the above device, it would be:
                /dev/bus/usb/002/009
            This function generates that path.
        """
        proc = subprocess.Popen(['lsusb'], stdout=subprocess.PIPE)
        out = proc.communicate()[0]
        lines = out.split('
    ')
        for line in lines:
            if 'Teensyduino' in line:
                parts = line.split()
                bus = parts[1]
                dev = parts[3][:3]
                return '/dev/bus/usb/%s/%s' % (bus, dev)
    
    
    def send_reset(dev_path):
        """
            Sends the USBDEVFS_RESET IOCTL to a USB device.
            
            dev_path - The devfs path to the USB device (under /dev/bus/usb/)
                       See get_teensy for example of how to obtain this.
        """
        fd = os.open(dev_path, os.O_WRONLY)
        try:
            fcntl.ioctl(fd, USBDEVFS_RESET, 0)
        finally:
            os.close(fd)
    
    
    def reset_teensy():
        """
            Finds a teensy and reset it.
        """
        send_reset(get_teensy())
  • 相关阅读:
    多变的鸭子策略模式
    反序列化和序列化
    UBUNTU eclipse必须是 jdk5.0以上
    Ubuntu Linux:MySQL安装指南
    phpMyAdmin下载、安装和使用入门
    读者-写者问题
    wget用法2
    在linux下安装mysql
    linux下数字转成字符串
    [SQLServer]必须知道的SQL
  • 原文地址:https://www.cnblogs.com/alexkn/p/6742536.html
Copyright © 2011-2022 走看看