1 (edytowany przez SzymonKubisiak 2014-10-09 10:14:41)

Temat: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Mam 2 urządzenia USB i nie potrafię sobie dać rady z napisaniem właściwego skrytpu do hotpluga. Próbuję wg http://eko.one.pl/?p=openwrt-linkidoportowszeregowych :

#!/bin/sh
if [ "$DEVTYPE" = "usb_interface" ] && [ "$ACTION" = "add" ]; then
    for tty in /sys/$DEVPATH/ttyUSB*; do
        [ -d "$tty" ] || continue
        OLDD=${tty##*/}

        # to jest E3131
        if [ "x$PRODUCT" = "x12d1/1506/102" ]; then
            NEWD=${DEVPATH##*.}
            if [ $NEWD = "0" ]; then
                echo $OLDD >> /tmp/hottest.txt
                #uci set network.wan.device=$OLDD
                #uci commit network
            fi
        fi
    done
fi

problemem jest to że zamiast /dev/ttyUSB0 lub /dev/ttyUSB1 skrypt ustawia wprost "ttyUSB0".

fragment loga z ww. artykułu

--------
DEVNAME=bus/usb/001/006
USER=root
ACTION=add
SHLVL=2
HOME=/
SEQNUM=643
BUSNUM=001
HOTPLUG_TYPE=usb
MAJOR=189
DEVPATH=/devices/platform/ehci-platform/usb1/1-1/1-1.3
DEVICENAME=1-1.3
LOGNAME=root
TERM=linux
SUBSYSTEM=usb
board=MYNET-N600
PATH=/bin:/sbin:/usr/bin:/usr/sbin
MINOR=5
TYPE=0/0/0
DEVNUM=006
PRODUCT=12d1/1506/102
PWD=/
DEVTYPE=usb_device
--------
USER=root
ACTION=add
SHLVL=2
HOME=/
SEQNUM=644
HOTPLUG_TYPE=usb
DEVPATH=/devices/platform/ehci-platform/usb1/1-1/1-1.3/1-1.3:1.0
DEVICENAME=1-1.3:1.0
LOGNAME=root
TERM=linux
SUBSYSTEM=usb
board=MYNET-N600
PATH=/bin:/sbin:/usr/bin:/usr/sbin
MODALIAS=usb:v12D1p1506d0102dc00dsc00dp00icFFisc02ip01in00
TYPE=0/0/0
INTERFACE=255/2/1
PRODUCT=12d1/1506/102
PWD=/
DEVTYPE=usb_interface
--------
(...) i tak aż do 1.5

Urządzenia to  WD MyNet n600 z BB, hub 7-portowy (który w rzeczywistości jest 2 hubami 4-portowymi), antminer U2 oraz E3131 który chciałbym by działał zarówno przy obecności jak i braku U2.

Oczywiście nie rozumiem podstaw działania /dev w *xie - może jest na to jakaś przystępna dokumentacja? Gógl niestety zasypuje tutorialami jak uruchomić dane urządzenie, a mi chodzi o teorię systemu.

To czego najbardziej nie rozumiem to jak ostatni znak DEVPATH=/devices/platform/ehci-platform/usb1/1-1/1-1.3/1-1.3:1.0 przekłada się na numer w /dev/ttyUSB0.

TP-Link WDR4300 + E398
WD MyNet N600 + E3131 + E3372
WNDR3700v2
WGT634U

2

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Zerknij tu. Ładnie opisali jak zidentyfikować urządzenie.

3

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Poprawiłem skrypt bo tam /dev/ zabrakło, ale właśnie sprawdziłem - u mnie działa. Jako pierwszy masz włożony serial który daje /dev/ttyUSB0. Następnie włożony jest modem, dla $NEWD = 0, czyli pierwszego modemu interfejsu identyfikuje się ttyUSB1 czy ten co trzeba (ttyUSB0 jest zajęte przez serial). U mnie jest to /sys/devices/platform/ohci-platform/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB1

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

4

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

A właśnie, Cezary możesz podpowiedzieć jak powiązać port szeregowy z numerem fizycznego portu w hubie przy takich samych VID:PID?

Wally

5

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Jedne z tych cyferek (1-1/1-1.3/1-1.3:1.) to port huba które wykrył. (bus numer, port numer).

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

6

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

To już doczytałem smile W skrypcie jest zmienna PRODUCT, a w tym przypadku musi być inna - i tu jest pies pogrzebany smile Podpowiesz?

Wally

7

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Wyświetl ją sobie po podłączeniu urządzenia. Nie wiem jaki produkt podłączasz smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Dwa jednakowe modemy - dwie jednakowe zmienne PRODUCT, stąd pomysł powiązania z portami fizycznymi:

Bus 001 Device 006: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Wally

9

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

W logu Ci zeszło, masz 12d1/1506/102.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10 (edytowany przez pepe2k 2014-10-10 09:59:21)

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Wally napisał/a:

Dwa jednakowe modemy - dwie jednakowe zmienne PRODUCT, stąd pomysł powiązania z portami fizycznymi:

Bus 001 Device 006: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard

Ja sobie w takim przypadku rozróżniam modemy albo po numerze seryjnym, albo po IMEI lub też SIM ICCID w modemie.

11 (edytowany przez Wally 2014-10-10 10:03:45)

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Chwila, skoro są identyczne ID, to podłączając je w różnej kolejności za każdym razem dostaną różne porty ttyUSBx, dobrze myślę? Przy różnych konfiguracjach kart SIM żaden się nie połączy.
Właśnie tak się dzieje po restarcie - zzależy który zostanie wykryty pierwszy, to połączenie wstanie lub nie.

Wally

12

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

I właśnie po to ten skrypt jest, prawda? Żebyś rozpoznał który modem jest który i dostosował konfigurację do odpowiednich nazw interfejsów.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

13

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

pepe2k napisał/a:
Wally napisał/a:

Dwa jednakowe modemy - dwie jednakowe zmienne PRODUCT, stąd pomysł powiązania z portami fizycznymi:

Bus 001 Device 006: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard

Ja sobie w takim przypadku rozróżniam modemy albo po numerze seryjnym, albo po IMEI lub też SIM ICCID w modemie.

Niestety, nie mają numeru seryjnego. Port fizyczny byłby najlepszym rozwiązaniem: modemy są wpięte cały czas, port fizyczny będzie wykryty szybciej niż zczytanie IMEI czy IMSI (chyba że się mylę) a loteria z portami jest tylko przy restarcie.

Wally

14 (edytowany przez SzymonKubisiak 2014-10-10 10:17:16)

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Cezary napisał/a:

Poprawiłem skrypt bo tam /dev/ zabrakło, ale właśnie sprawdziłem - u mnie działa. Jako pierwszy masz włożony serial który daje /dev/ttyUSB0. Następnie włożony jest modem, dla $NEWD = 0, czyli pierwszego modemu interfejsu identyfikuje się ttyUSB1 czy ten co trzeba (ttyUSB0 jest zajęte przez serial). U mnie jest to /sys/devices/platform/ohci-platform/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB1

No właśnie tego nie rozumiem.  DEVPATH to /devices/platform/ehci-platform/usb1/1-1/1-1.3/1-1.3:1.0 - bez żadnego tty na końcu. $NEWD = 0, czyli pierwszy interfejs nowego device. Ale skąd wiadomo czy to jest dev/ttyUSB0, 1, czy 9 ?

TP-Link WDR4300 + E398
WD MyNet N600 + E3131 + E3372
WNDR3700v2
WGT634U

15

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

A zobaczyłeś co skrypt robi w ogóle? hotplug daje zmienną DEVPATH, a skrypt zagląda do katalogu /sys/$DEVPATH/  żeby zobaczyć jakie tam się skrywają interfejsy. Jeżeli jest to pierwszy devpath (czyli ten z zerem na końcu) to odczytuje ttyUSB który jest w tym katalogu i jego biorę do konfiguracji, bo wiem ze dla tego konkretnego huawei to ma być właśnie pierwszy dostępny interfejs.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Cezary napisał/a:

I właśnie po to ten skrypt jest, prawda? Żebyś rozpoznał który modem jest który i dostosował konfigurację do odpowiednich nazw interfejsów.

No tak. Ale chyba dopadła mnie dziś pomroczność jasna.
Ten kawałek:

# to jest E3131
            if [ "x$PRODUCT" = "x12d1/1506/102" ]; then

będzie identyczny dla obydwu modemów, niezależnie który pierwszy i gdzie zostanie wpięty. Mam rację?

Wally

17

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Wally napisał/a:
Cezary napisał/a:

I właśnie po to ten skrypt jest, prawda? Żebyś rozpoznał który modem jest który i dostosował konfigurację do odpowiednich nazw interfejsów.

No tak. Ale chyba dopadła mnie dziś pomroczność jasna.
Ten kawałek:

# to jest E3131
            if [ "x$PRODUCT" = "x12d1/1506/102" ]; then

będzie identyczny dla obydwu modemów, niezależnie który pierwszy i gdzie zostanie wpięty. Mam rację?

I dlatego ty zaproponowałeś portu huba, a pepe2k wspomniał też o możliwości odczytania numerów karty SIM. Zadajesz pytania na które odpowiedzi już masz smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

18

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Wally napisał/a:
Cezary napisał/a:

I właśnie po to ten skrypt jest, prawda? Żebyś rozpoznał który modem jest który i dostosował konfigurację do odpowiednich nazw interfejsów.

No tak. Ale chyba dopadła mnie dziś pomroczność jasna.
Ten kawałek:

# to jest E3131
            if [ "x$PRODUCT" = "x12d1/1506/102" ]; then

będzie identyczny dla obydwu modemów, niezależnie który pierwszy i gdzie zostanie wpięty. Mam rację?

Tak i dlatego potrzebujesz coś, co jednoznacznie pozwoli Ci rozróżnić modemy. IMEI jest do tego idealny, bo masz pewność, że jest unikalny (no, powiedzmy... zdarzały mi się różne przeboje z chińskimi modemami). Ja czytam sobie IMEI podłączonego modemu w skrypcie hotpluga i już wiem, który to jest. A tak naprawdę, to mam ustawienia dla modemów powiązane z numerem karty SIM aktualnie podłączonej do modemu, bo to jest istotniejsze (apn, dane dostępowe, itd.). A mam w maszynie 6 modemów smile

19

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Coś mi świta smile
Czyli w skrypcie wystarczyło by sprawdzić

if [ "$DEVPATH" = "cośtam" ]; then
 NEWD=${DEVPATH##*.}
                if [ $NEWD = "0" ]; then
    uci set network.wan1.device="/dev/"$OLDD

i analogicznie dla drugiego modemu?

Wally

20

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

Cezary napisał/a:

A zobaczyłeś co skrypt robi w ogóle? hotplug daje zmienną DEVPATH, a skrypt zagląda do katalogu /sys/$DEVPATH/  żeby zobaczyć jakie tam się skrywają interfejsy. Jeżeli jest to pierwszy devpath (czyli ten z zerem na końcu) to odczytuje ttyUSB który jest w tym katalogu i jego biorę do konfiguracji, bo wiem ze dla tego konkretnego huawei to ma być wyłaśnie pierwszy dostępny interfejs.

Mój błąd, pomyliłem zmienne OLDD i NEWD. Zajrzenie do katalogu DEVPATH też pomogło. Teraz wydaje mi się że rozumiem cały skrypt (najniebezpieczniejszy moment).

TP-Link WDR4300 + E398
WD MyNet N600 + E3131 + E3372
WNDR3700v2
WGT634U

21

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

jeżeli zdaży się po reboocie że modemy  z jakichś przyczyn nie zostaną wykryte poprawnie (zdaża mi sie taki stan, nie wiem jeszcze czemu) to czy jest metoda na ich wykrycie później ?
(bez wypinania fizycznego, oraz bez usbreset - bo na USb mam tez rootfsa

# lsusb
Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 004: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 003: ID 5136:4678 
(...)

dwa modemy jeden to E3131 drugi E3372 oba jako 12d1:1506
na 5136:4678 mam pendrive i rootfsa

da sie wykonac usbreset tylko dla 1 i 2 pozycji ?

22

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

W usbreset mogłeś podać konkretne urządzenie, więc tak.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

23 (edytowany przez marcint43 2016-05-02 22:25:28)

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

ustaliłem że modem który ma złe linki to:
Bus 001 Device 004: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard

a więc:

# ls -l /dev/bus/usb/001/004
crw-r--r--    1 root     root      189,   3 Jan  1  1970 /dev/bus/usb/001/004

# usbreset  001/004

Mon May  2 23:01:53 2016 kern.info kernel: [ 4821.960000] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0  (i tak dalej ...ttyUSB0,1,2)

Mon May  2 23:01:53 2016 kern.info kernel: [ 4822.110000] usb 1-1.3: reset high-speed USB device number 4 using ehci-platform

Mon May  2 23:01:53 2016 kern.info kernel: [ 4822.240000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0  (i tak dalej ... ttyUSB0,1,2)


hotplug/usbmisc sie wykonuje, ale dla usb juz nie ... ?

===========DEBUG : 9329 : START
Mon May  2 23:23:28 CEST 2016
DEVTYPE=
ACTION=remove
DEVPATH=/devices/platform/ehci-platform/usb1/1-1/1-1.3/1-1.3:1.1/usbmisc/cdc-wdm0
DEVPATH_hash=1/usbmisc/cdc-wdm0
PRODUCT=
TTY_hash=
TTY=
KONIEC
===========DEBUG : 9392 : START
Mon May  2 23:23:28 CEST 2016
DEVTYPE=
ACTION=add
DEVPATH=/devices/platform/ehci-platform/usb1/1-1/1-1.3/1-1.3:1.1/usbmisc/cdc-wdm0
DEVPATH_hash=1/usbmisc/cdc-wdm0
PRODUCT=
TTY_hash=
TTY=
KONIEC


skrypty hotplug/usb nie dzialają przy takim resecie ?  ... niby wypisuje ze disconnected i connected ...

24

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

ha! działają ale w kontekscie hotplug/tty ...

25 (edytowany przez marcint43 2016-05-03 21:44:59)

Odp: hotplug.d - rozpoznawanie które urządzenie jest na jakim tyyUSBn

zrobiłem, działą wyśmienicie, moze ktos skorzysta

w jednym zdaniu: reinicjalizacja konfiguracji do modemów na żądanie (USBreset  + wykrycie i zmiana konfiguracji analogicznie jak w poradniku)


kod:

fn_show_reset_modem ()
{
   PASUJEDO=`grep -l "$PRODx" /sys/bus/usb/devices/*/product` && UEV=`dirname ${PASUJEDO}`/uevent && BUSNUM=`grep "^BUSNUM=" $UEV` && DEVNUM=`grep "^DEVNUM=" $UEV` 


#np stronka www:
echo "Reset konfiguracji modemu: <A .........."
#gdzie  $BUSNUM i  $DEVNUM mamy obie wartosci do usbresetu

(...)

}

wywolanie:
WANx="wan_dostawca1";
PRODx="HUAWEI_MOBILE"
fn_show_reset_modem;

WANx="wan_dostawca2";
PRODx="HUAWEI Mobile"
fn_show_reset_modem;

====

finalnie: wykonywany jest:

usbreset $BUSnumer/$DEVnumer

========================
a pod spodem, w hotplugu:

lokalizacja:   /etc/hotplug.d/tty/tutajplik.sh

#!/bin/sh

if [ "$ACTION" == "add" ]; then
#sanity check DEVPATH
   echo $DEVPATH | egrep "^/devices/platform/ehci-platform/usb.*ttyUSB.*" || { echo "pomijam, nie rozpoznaje tu modemu (DEVPATH=$DEVPATH)" | logger -t HotREPLUG; exit 0; }
   tty=$DEVPATH
   OLDD=${tty##*/}
   PROD=`cat  /sys/${tty}/../../product`

   if [ "x$PROD" == "xHUAWEI Mobile" ]; then  #modem E3131  _dostawca2
      egrep "^1506$" /sys/${tty}/../../idProduct && egrep "^12d1$" /sys/${tty}/../../idVendor;
      OK=$?
      if [ "x$OK" == "x0" ] ; then
         W=${DEVPATH##*.};
         Wtty=${W%%/*};
            if [ $Wtty = "0" ]; then
               uci set network.wan_dostawca2.device="/dev/"$OLDD
               fi;
      else
         echo "nie znam modemu o?" | logger -t HotREPLUG
         exit;
      fi;
   elif [ "x$PROD" == "xHUAWEI_MOBILE" ]; then  #modem E3372 _dostawca1

...analogicznie


   else
      echo "to nie modem (PROD=$PROD) tty=$tty" | logger -t HotREPLUG
      exit;
   fi;

fi;