Automatically restart usb interface
Posted: Saturday 07 November 2020 21:19
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:
I found this script to reset a connected USB devices (https://askubuntu.com/questions/645/how ... mmand-line):
You need to compile it (assume you saved the code as usbreset.c):
If you want to reset for instance device 2 on bus one, you run the following:
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:
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.
This will execute the bash script every hour. /home/pi/usbreset/bashscript.sh is the path to the bash script.
You can check your connected USB devices by typing in the command line:
Code: Select all
lsusb
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;
}
Code: Select all
cc usbreset.c -o usbreset
Code: Select all
sudo ./usbreset /dev/bus/usb/001/002
Code: Select all
#!/bin/bash
for i in /dev/bus/usb/001/* ; do
sudo /home/pi/usbreset/usbreset ${i}
done
You can add something like this to your crontab.
Code: Select all
0 * * * * bash /home/pi/usbreset/bashscript.sh