Як скинути USB-пристрій за допомогою сценарію?


11

У мене є USB-модем USB, який не дозволяє працювати з властивостями (Huawei E367u-2) Іноді він стає скинутим (відключення / підключення USB-пристрою в журналах), і коли він повертається назад, він має різні номери ttyUSB. Іноді під час завантаження, схоже, usb_modswitch просто не звільняється. Комп'ютер - це Raspberry Pi, на якому працює Raspbian.

У мене є просте рішення цього питання, щохвилини CRON виконує такий сценарій:

If WVDIAL is not running:
    Run WVDIAL

Я хочу змінити сценарій таким:

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

Очевидно, що це псевдо-код, але у мене є такі рядки, які мені потрібно з'єднати, але я не можу зрозуміти, як:

Це завантажує wvdial, якщо він не працює:

#! /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

Це дозволяє мені знайти /sysшлях до певного пристрою:

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

І це скидає USB-пристрій, якщо ви знаєте правильний шлях / sys:

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

Отже, мені потрібно ввести останні два розділи та тест до /dev/ttyUSB0розділу, який підпадає під розділ "Якщо ви хочете, щоб команда завжди виконувалася. Покладіть її сюди"

ОНОВЛЕННЯ 1

usbreset, хоча функціонує, не виконує роботи. Тільки відлуння 0 1 в authroizedправильно імітує відключення / підключення пристрою.
Ось у чому полягає хитрість завантаження пристрою чи usb_modeswitch назад у життя. Як такий, мені вдалося зібратися разом із цим:

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

Я думаю, тому все, що мені потрібно зробити зараз, - це помістити це в сценарій 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

1
+1 usbresetне вдається з модемами Huawei, модем не в змозі відновитись і зависає при перезавантаженні. Наразі я вирішую ту саму проблему, і незабаром, можливо, буде повністю працююче рішення.
йо

Я знаю, що це не те, що ви хочете почути, але після того, як палиця, яку я використовував, викликала цю проблему, обсмажилася сама, я взяв Huawei E3131 для Tesco (£ 10). Це маршрутизатор в паличці, ви просто підключите його, і ви отримаєте eth1 з NAT'd IP, і ви закінчите. Він навіть має веб-інтерфейс для конфігурації. І це може бути переведено на звичайний режим ДПП, якщо вам потрібно. @tohecz
RoboJ1M

Ну, скажи мені, чи є такий 4G такий дешевий, а ти мій герой! :) (Я зараз з тарифом 4G і 3G модемом, так, і з 4G модемом, у якому немає драйверів ARM.)
yo

Можливий дублікат Resetting usb device from terminal
rishta

Ознайомтесь із цим пов’язаним питанням на Unix & Linux SE.
Дмитро Григор’єв

Відповіді:


2

Я створив простий скрипт для скидання конкретного пристрою USB.

#!/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

9

Ви можете скинути шину USB через цю програму C. https://gist.github.com/x2q/5124616

Завантажте код C від github

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

Скомпілюйте код C у форматі usbreset

cc usbreset.c -o usbreset

Надайте дозвіл на виконання програми

chmod +x usbreset

Перерахуйте свої USB-пристрої за допомогою команди lsusb

lsusb

Ви повинні побачити записи USB-пристроїв у своєму виході та перевірити пристрій, для якого потрібно скинути.

Шина 002 Пристрій 003 : ID 0fe9: 9010 DVICO

Запустіть програму usbreset з аргументами

sudo ./usbreset /dev/bus/usb/002/003

Ще потрібно скласти це разом у сценарій. Що - щось на кшталт: x = lsusb | grep xxxx:yyyy /usr/sbin/usbreset $x. На жаль, здається, що ми не можемо ставити перерви у коментарях
RoboJ1M

Мені це потрібно в моєму скрипті init.d ( wvdialer). В даний час CRON працює щохвилини, і він завантажує wvdial, якщо його немає (використовуючи start-stop-daemon). Але воно не почнеться, якщо ttyUSB0 не буде. Тепер з різних причин палиця іноді потребує відштовхування життя. Тож у тому мені потрібен сценарійIf ttyUSB0 is not present reset the USB stick
RoboJ1M

1
Використовувати команду lsusb для отримання додаткової інформації? Приклад; lsusb -d xxxx: yyyy, тоді перевірте, чи є у вас USB-модем, якщо він не викликає usbreset.
gurcanozturk

2

Ви можете використовувати pyusb для скидання пристрою:

Спочатку встановіть pyusb:

sudo pip install pyusb

Потім створіть цей сценарій і запустіть його:

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

Адаптуйте idVendorі idProductдо пристрою, який ви хочете скинути (його можна знайти через lsusb)


0

Дуже дякую! Цей C-Code працює чудово. Це простий скрипт оболонки, який я зробив для ідентифікації 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

0

Скидання мого модему Huawei не завжди працює. Оскільки я все одно набираю номер із систематизованою службою, я додав кілька ліній, які повністю живлять усі USB-пристрої та перезавантажують малину через 5 хвилин :-)

[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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.