Page 1 of 1

Automatically restart usb interface

Posted: Saturday 07 November 2020 21:19
by Matthiasfr
Here is a way to reset your USB connected devices using a cronjob. This can be usefull if you have problems with your usb devices (they can become unresponsive after some time). Rebooting the whole devices takes much more time than using this script. With this script it resets 'instantly'.

You can check your connected USB devices by typing in the command line:

Code: Select all

lsusb
I found this script to reset a connected USB devices (https://askubuntu.com/questions/645/how ... mmand-line):

Code: Select all

/* 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;
}
You need to compile it (assume you saved the code as usbreset.c):

Code: Select all

cc usbreset.c -o usbreset
If you want to reset for instance device 2 on bus one, you run the following:

Code: Select all

sudo ./usbreset /dev/bus/usb/001/002
I wrote the following bash script to reset all usb connected devices on bus 1 (RPI has only one bus). Save it for instance as usbreset.sh:

Code: Select all

#!/bin/bash
for i in /dev/bus/usb/001/* ; do
  sudo /home/pi/usbreset/usbreset ${i}
done
In this code /home/pi/usbreset is the folder where your compiled file can be found.

You can add something like this to your crontab.

Code: Select all

0 * * * * bash /home/pi/usbreset/bashscript.sh
This will execute the bash script every hour. /home/pi/usbreset/bashscript.sh is the path to the bash script.