Kroko Just another WordPress weblog

March 7, 2014

Linux usbreset

Filed under: Linux — admin @ 10:35 am
Force Linux's USB stack to perform a port reset and re-enumerate a device using
 usbfs.
Note however, that reset followed by re-enumeration is _not_ the same thing as
 power-cycle followed by reconnect and re-enumeration.

Run the following commands in terminal:

  1. Compile the program:
    $ cc usbreset.c -o usbreset
    
  2. Get the Bus and Device ID of the USB device you want to reset:
    $ lsusb
    Bus 004 Device 002: ID 19d2:0016 ZTE WCDMA Technologies MSM
    Make our compiled program executable:
    
  3. $ chmod +x usbreset
    
  4. Execute the program with sudo privilege; make necessary substitution for <Bus>
  5.  and <Device> ids as found by running the lsusb command:
    $ sudo ./usbreset /dev/bus/usb/004/002  

code:

/* 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>

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;
}

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress