Marco Burmeister

  private Homepage



Linux - openSuSE USB Gerät / Device connection Reset

In einem Linux openSuSE 15.4 System von mir gibt es das Problem, dass nach einem Systemstart angesteckte USB Geräte nicht immer aktiv werden.
Um diese Geräte zu aktivieren, kann ich natürlich den Stecker herausziehen und wieder einstecken. Wer aber keine Lust hat an das Gerät heranzugehen, kann auch einen Reset schicken, welcher dann wirkt, als wäre das Gerät neu eingesteckt worden.
In meinem Fall waren eine USB-Disk und der WLAN-Stick von dem Phänomen betroffen. Diese Seite erklärt, wie ein Reset an das Gerät / Device geschickt werden kann.
Das Ganze ist unterteilt in ein Programm, welches ich im Internet gefunden habe und ein Shell-Script, welches mir die Bedienung erleichtern soll.

Die Seite ist in die folgenden Bereiche eingeteilt:




top Tool USB-Reset

Auf der folgenden Seite habe ich ein Programm gefunden, welches den USB-Reset an ein Gerät schicken kann.
Die Seite ist zu erreichen bei askUbuntu unter dem direkten Link: How do you reset a USB device from the command line?

Auf der Seite ist der folgende Code von Alan Stern zu finden (hier nur als quasi Backup, für den Fall, dass die Original-Seite verschwindet):


  1. /* usbreset -- send a USB port reset to a USB device */
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. int main(int argc, char **argv)
  9. {
  10. const char *filename;
  11. int fd;
  12. int rc;
  13. if (argc != 2) {
  14. fprintf(stderr, "Usage: usbreset device-filename\n");
  15. return 1;
  16. }
  17. filename = argv[1];
  18. fd = open(filename, O_WRONLY);
  19. if (fd < 0) {
  20. perror("Error opening output file");
  21. return 1;
  22. }
  23. printf("Resetting USB device %s\n", filename);
  24. rc = ioctl(fd, USBDEVFS_RESET, 0);
  25. if (rc < 0) {
  26. perror("Error in ioctl");
  27. return 1;
  28. }
  29. printf("Reset successful\n");
  30. close(fd);
  31. return 0;
  32. }

Der Code muss dann noch kompiliert werden. Hierzu kann der folgende Befehl verwendet werden: cc usbreset.c -o usbreset.
Im Anschluss muss es noch ausführbar gemacht werden.

Das Programm verwende ich dann in meinem Script, um die entsprechenden Devices zu resetten.
Zur Nutzung des Programms muss zunächst via Commandline Befehl lsusb herausgefunden werden, an welchem Bus das USB Gerät hängt und wie seine Device-Nummer ist.

Beispiel für mein WLAN-Adapter:

  1. Bus 001 Device 002: ID 0bda:c811 Realtek Semiconductor Corp. 802.11ac NIC

Das Programm usb-reset wird dann aufgerufen mit der Syntax:

  1. usbreset /dev/bus/usb/<Bus-Nummer>/<Device-Nummer>

Beispiel:

  1. usbreset /dev/bus/usb/001/002

Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!

top Shell-Script für das Tool USB-Reset

Einleitung

Ich habe mir zur Unterstützung ein kleines Shell-Script erstellt. Das Script stellt nicht ein ausgefuchstes Script dar.
Vielleicht hilft es aber anderen Nutzern.

Nutzung des Shell-Scripts

Das Shell-Script benötigt zunächst das Executable usb-reset (siehe oben). Dessen Pfad muss inkl. Pfad in der Variablen USBPRG angegeben werden. Dann muss im Bereich Suchstring für die beiden Variablen die passende Ausgabe aus lsusb für die zu aktivierenden USB Geräte / Devices angegeben werden. Wer mehr oder weniger Gerät hat, muss dann die Variablen anpassen und die u.a. if-then-else-Schleife pflegen.
Abschließend muss das Script noch ausführbar gemacht werden.

Das Script ist einfach gehalten, weil das eigentlich nur mir persönlich helfen sollte und ich da nicht so viel Energie in das Scripting stecken wollte.

Shell-Script Code

Code (Scipt-Name usb-reset.sh):

  1. #!/bin/bash
  2. #
  3. # USB Reset
  4. #
  5. #
  6. # Init
  7. #
  8. #
  9. # Variable
  10. #
  11. # Eingabe
  12. eingabe=""
  13. # Hilfsstring
  14. helpstr=""
  15. # Reset PRG
  16. USBPRG=/opt/usb-reset/usb-reset_v1/usbreset
  17. # List USB
  18. USBLIST=/usr/bin/lsusb
  19. # Suchstring
  20. SUCHWLAN="Realtek Semiconductor Corp. 802.11ac NIC"
  21. SUCHDISK="JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s"
  22. #
  23. # Funktionen
  24. #
  25. function f_usbreset {
  26. suchstr="$1"
  27. # USB Device ermitteln
  28. helpstr=$(${USBLIST} |grep "${suchstr}" )
  29. # Behandlung
  30. if [ -z "${helpstr}" ];
  31. then
  32. # nichts gefunden
  33. echo ""
  34. echo "Kein Device zum Suchstring gefunden."
  35. echo "SUCH: ${suchstr}"
  36. echo ""
  37. exit 10
  38. else
  39. # gefunden
  40. echo "${USBPRG} /dev/bus/usb/\$(echo \"${helpstr}\" | cut -d \" \" -f 2)/\$(echo \"${helpstr%%:*}\" | cut -d \" \" -f 4) "
  41. ${USBPRG} /dev/bus/usb/$(echo "${helpstr}" | cut -d " " -f 2)/$(echo "${helpstr%%:*}" | cut -d " " -f 4)
  42. fi
  43. }
  44. #
  45. # Start
  46. #
  47. echo "Welches USB-Device soll resettet werden ?"
  48. echo "-1- USB Disk"
  49. echo "-2- WLAN"
  50. echo "Eingabe: Ziffer + [RETURN]"
  51. read eingabe
  52. if [ "${eingabe}" -eq 1 ];
  53. then
  54. echo ""
  55. echo "Resette USB Disk"
  56. echo ""
  57. f_usbreset "${SUCHDISK}"
  58. elif [ "${eingabe}" -eq 2 ];
  59. then
  60. echo ""
  61. echo "Resette WLAN"
  62. echo ""
  63. f_usbreset "${SUCHWLAN}"
  64. else
  65. echo ""
  66. echo "Ende"
  67. echo ""
  68. exit 0
  69. fi

Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!



top Links zum Thema

Hinweis:
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!