Bagaimana cara mereset perangkat USB menggunakan skrip?

11

Saya memiliki modem USB GSM yang tidak selalu memiliki properti kerja (Huawei E367u-2). Kadang-kadang itu akan direset (perangkat USB putuskan / sambungkan kembali dalam log) dan ketika muncul kembali, ia memiliki nomor ttyUSB yang berbeda. Terkadang saat boot, usb_modswitch sepertinya tidak dipecat. Komputer adalah Raspberry Pi yang menjalankan Raspbian.

Saya punya solusi sederhana untuk ini, setiap menit CRON menjalankan skrip berikut:

If WVDIAL is not running:
    Run WVDIAL

Saya ingin mengubah skrip menjadi ini:

If /dev/ttyUSB0 is not present:
    If DevicePresent(12d1:1446):
        ResetDevice(12d1:1446)
    ElseIs DevicePresemt(12d1:1506)
        ResetUSB(12d1:1506)
If WVDIAL is not running:
    Run WVDIAL

Jelas ini adalah kode semu, tetapi saya memiliki baris-baris berikut yang perlu saya rangkai, tetapi saya tidak tahu caranya:

Ini memuat wvdial jika tidak berjalan:

#! /bin/sh 
# /etc/init.d/wvdial

### BEGIN INIT INFO
# Provides:          TheInternet
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Simple script to start a program at boot
# Description:       A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting GPRS Internet"
    # run application you want to start
    /sbin/start-stop-daemon --start --background --quiet --exec /usr/bin/wvdial internet
    ;;
  stop)
    echo "Stopping GPRS Internet"
    # kill application you want to stop
    /sbin/start-stop-daemon --stop --exec /usr/bin/wvdial 
    ;;
  *)
    echo "Usage: /etc/init.d/noip {start|stop}"
    exit 1
    ;;
esac

exit 0

Ini memungkinkan saya menemukan /sysjalur ke perangkat tertentu:

for X in /sys/bus/usb/devices/*; do
    echo "$X"
    cat "$X/idVendor" 2>/dev/null
    cat "$X/idProduct" 2>/dev/null
    echo
done

Dan ini me-reset perangkat USB jika Anda mengetahui jalur / sys yang benar:

echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized

Jadi, saya perlu merangkai 2 bagian terakhir dan tes untuk /dev/ttyUSB0menjadi bagian yang berada di bawah bagian "Jika Anda ingin perintah untuk selalu berjalan. Letakkan di sini"

PEMBARUAN 1

usbreset, meskipun berfungsi, tidak melakukan pekerjaan. Hanya gema 0 1 ke dalam yang authroizedbenar mensimulasikan putuskan hubungan perangkat / menghubungkan kembali.
Inilah yang menjadi trik untuk mem-boot perangkat atau usb_modeswitch kembali ke kehidupan. Karena itu, saya berhasil mengoceh bersama ini:

echo "Searching for $1"
devPath=`lsusb | grep $1 | sed -r 's/Bus ([0-9]{3}) Device ([0-9]{3}).*/bus\/usb\/\1\/\2/g;'`
echo "Found $1 @ $devPath"
echo "Searching for sysPath"
for sysPath in /sys/bus/usb/devices/*; do
    echo "$sysPath/uevent"
    devName=`cat "$sysPath/uevent" | grep $devPath`
    #echo devName=$devName
    if [ ! -z $devName ] 
    then
        break
    fi
done
if [ ! -z  $devName ] 
then
    echo "Found $1 @ $sysPath, Resetting"
    echo "echo 0 > $sysPath/authorized"
    echo 0 > $sysPath/authorized
    echo "echo 1 > $sysPath/authorized"
    echo 1 > $sysPath/authorized
else
    echo "Could not find $1"
fi

Karena itu saya pikir yang harus saya lakukan sekarang adalah meletakkan ini di skrip init.d:

if ttyUSB0 not present
    if 12d1:1446 present
        /usr/sbin/resetdevicebyauthorized 12d1:1446
    else if 12d1:1506 present
        /usr/sbin/resetdevicebyauthorized 12d1:1506
    fi
fi
RoboJ1M
sumber
1
+1 usbresetgagal dengan modem Huawei, modem tidak dapat pulih dan macet saat reboot. Saat ini saya sedang memecahkan masalah yang sama, dan mungkin memiliki solusi yang berfungsi segera.
yo
Saya tahu itu bukan apa yang ingin Anda dengar, tetapi setelah tongkat yang saya gunakan yang menyebabkan masalah ini tergores sendiri, saya mengambil Huawei E3131 untuk dari Tesco (£ 10). Ini adalah router di tongkat, Anda cukup tancapkan dan Anda mendapatkan eth1 dengan NAT'd IP dan Anda selesai. Bahkan memiliki antarmuka web untuk konfigurasi. Dan itu dapat dibalik ke mode PPP normal jika Anda perlu. @tohecz
RoboJ1M
Nah, beri tahu saya jika ada 4G yang sangat murah, dan Anda adalah pahlawan saya! :) (Saya saat ini dengan tarif 4G dan modem 3G, ya, dan dengan modem 4G yang tidak memiliki driver ARM.)
yo '
Kemungkinan duplikat Reset perangkat usb dari terminal
rishta
Lihat pertanyaan terkait ini di Unix & Linux SE.
Dmitry Grigoryev

Jawaban:

2

saya membuat skrip bash sederhana untuk mengatur ulang perangkat USB tertentu.

#!/bin/bash
#type lsusb to find "vendor" and "product" ID in terminal
 set -euo pipefail
 IFS=$'\n\t'

        #edit the below tow lines of vendor and product values using lsusb result
        dev=$(lsusb -t | grep usbdevicename | grep 'If 1' | cut -d' ' -f13|cut -d"," -f1)
        #VENDOR=05a3
        #PRODUCT=9230
        VENDOR=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f1)
        PRODUCT=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f2)

        for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
          if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
                $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
            echo 0 > $DIR/authorized
            sleep 0.5
            echo 1 > $DIR/authorized
          fi
        done
Thoht
sumber
9

Anda dapat mengatur ulang bus USB melalui program C ini. https://gist.github.com/x2q/5124616

Unduh kode C dari github

wget -c --no-check-certificate https://gist.githubusercontent.com/x2q/5124616/raw/3f6e5f144efab2bc8e9d02b95b8301e1e0eab669/usbreset.c -O usbreset.c

Kompilasi kode C sebagai usbreset

cc usbreset.c -o usbreset

Berikan izin eksekusi ke program

chmod +x usbreset

Daftar perangkat USB Anda melalui perintah lsusb

lsusb

Anda akan melihat entri perangkat USB di output Anda dan memeriksa perangkat yang ingin Anda atur ulang.

Perangkat Bus 002 003 : ID 0fe9: 9010 DVICO

Jalankan program usbreset dengan argumen

sudo ./usbreset /dev/bus/usb/002/003
gurcanozturk
sumber
Masih perlu disatukan menjadi sebuah skrip. Sesuatu seperti: x = lsusb | grep xxxx:yyyy /usr/sbin/usbreset $x. Sayangnya sepertinya kita tidak bisa memasukkan kalimat dalam komentar
RoboJ1M
Saya membutuhkannya di skrip init.d saya ( wvdialer). Saat ini CRON menjalankannya setiap menit, dan memuat ulang wvdial jika tidak ada (menggunakan start-stop-daemon). Tetapi itu tidak akan dimulai jika ttyUSB0 tidak ada. Sekarang karena berbagai alasan, tongkat terkadang perlu dihidupkan kembali. Jadi dalam naskah itu saya perluIf ttyUSB0 is not present reset the USB stick
RoboJ1M
1
Gunakan perintah lsusb untuk mendapatkan informasi lebih lanjut? Contoh; lsusb -d xxxx: yyyy lalu periksa apakah modem USB Anda ada, jika tidak memanggil usbreset.
gurcanozturk
2

Anda dapat menggunakan pyusb untuk mengatur ulang perangkat:

Pertama instal pyusb:

sudo pip install pyusb

Kemudian buat skrip ini dan jalankan:

#!/usr/bin/python
from usb.core import find as finddev
dev = finddev(idVendor=0x1234, idProduct=0x5678)
dev.reset()

Adaptasi idVendordan idProductke perangkat yang ingin Anda atur ulang (Anda dapat menemukan id melalui lsusb)

Rishta
sumber
0

Terima kasih banyak! Kode-C ini bekerja dengan sangat baik. Ini adalah skrip shell sederhana yang saya lakukan untuk mengidentifikasi perangkat USB

#!/bin/bash
USBNAME=webcam
LSUSB=$(lsusb | grep --ignore-case $USBNAME)
FOLD="/dev/bus/usb/"$(echo $LSUSB | cut --delimiter=' ' --fields='2')"/"$(echo $LSUSB | cut --delimiter=' ' --fields='4' | tr --delete ":")
echo $LSUSB
echo $FOLD
sudo ./usbreset $FOLD
McPeppr
sumber
0

Mengatur ulang modem Huawei saya tidak selalu berhasil. Karena saya melakukan panggilan dengan layanan systemd, saya menambahkan beberapa baris yang benar-benar menghilangkan ikatan semua perangkat USB dan mem - boot ulang raspberry setelah 5 menit :-)

[Unit]
Description=GSM Internet
Requires=network.target
# If unable to start within 12hrs, unpower all USB and reboot
StartLimitIntervalSec=43200
StartLimitBurst=300
OnFailure=unpower-usb-reboot.service

[Service]
Type=forking
User=root
ExecStartPre=/bin/ls /dev/serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if00-port0
ExecStart=/usr/bin/pon
RemainAfterExit=yes
ExecStop=/usr/bin/poff
Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target
[Unit]
Description=Unpowers all USB and reboots
[Service]
User=root
ExecStart=/bin/sh -c 'echo 0 > /sys/devices/platform/soc/20980000.usb/buspower; sleep 5m; shutdown -r now'
ree2k
sumber