Portál AbcLinuxu, 12. května 2025 18:21

Dotaz: udev rule - dual-port usb modem

22.5.2009 10:11 nosretep
udev rule - dual-port usb modem
Přečteno: 370×
Odpovědět | Admin

Dobry den,

potykam se s problemem vytvoreni symlinku modemu (Axesstel) pomoci pravidel UDEV.
Modem sam obsadi dva porty (ttyUSB0 a ttyUSB1), pricemz na tom druhem portu je cosi jako "AXESSTEL DIAGNOSTIC PORT". Modem samotny je vyuzitelny vzdy jen na prvnim portu.

Problem je ten, ze pokud pouziju pravidlo pracujici s ID vyrobce a produktu, symlink se vytvori u obou portu a tedy ten druhy prepise ten prvni. Ve vysledku mam tedy jeden symlink vedouci na ttyUSB1.

Pouziti parametru %n v symlinku by to sice do jiste miry resilo, ale zase bych se v pripade pripojeni vicero ttyUSB* zarizeni musel tak jako tak divat jake ID se vlastne priradilo.

Toto je pravidlo, ktere pouzivam (s kterym jsou problemy ohledne symlinku):

KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1726", ATTRS{idProduct}=="1000", NAME="%k", SYMLINK+="axesstel"

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.5.2009 11:32 coques | skóre: 21 | blog: FailSystem
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nejde to urobiť len pre  KERNEL=="ttyUSB0"  ?

Polívčička byla..
22.5.2009 11:40 Peterson Larson | skóre: 9
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem

No to zcela jiste nejde, protoze nikdy dopredu nevim nebudu-li mit na stroji nejake jine ttyUSB zarizeni. Vzdy je dobre usit pravidlo na miru konkretnimu produktu...

24.5.2009 20:00 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ta dvě ttyUSB zařízení na jednom USB zařízení jsou reprezentována jako dvě různá rozhraní nebo end-pointy. Rozlišující čísla najdete přes lsusb nebo někde v sysfs. Pak by mohlo fungovat přidat udevu ATTRS{tadyNazevNevim}=="cislo". Správný název si ale zjistěte sám, já tady žádné USB zařízení nemám.
25.5.2009 09:06 Peterson Larson | skóre: 9
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem

Diky za nasmerovani... Nakonec se to vyresilo tak, ze sice nepouzivam ID vyrobce ani produktu, ale vzal jsem zavdek nasledujicimu bloku:

# udevinfo -ap `udevinfo -q path -n /dev/ttyUSB0`
------------------------------------------------------------
  looking at parent
device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0':
    KERNELS=="5-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="option"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{modalias}=="usb:v1726p1000d0000dc00dsc00dp00icFFiscFFipFF"
    ATTRS{interface}=="AXESSTEL USB MODEM"


# udevinfo -ap `udevinfo -q path -n /dev/ttyUSB1`
------------------------------------------------------------
  looking at parent
device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1':
    KERNELS=="5-1:1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="option"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{modalias}=="usb:v1726p1000d0000dc00dsc00dp00icFFiscFFipFF"
    ATTRS{interface}=="AXESSTEL DIAGNOSTIC PORT"

Z tohoto je tedy patrne, ze jako jednoznacny identifikator lze pouzit napriklad parametr ATTRS{bInterfaceNumber} spolu s ATTRS{interface}.

Vysledny zapis pravidla (fungujiciho) pak muze vypadat nasledovne:

KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="00", ATTRS{interface}=="AXESSTEL USB MODEM", NAME="%k", SYMLINK+="axesstel"

Diky vsem zucastnenym, pokud vsak ma nekdo lepsi reseni, jiste jim nepohrdnu.

25.5.2009 11:02 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem
Pořadové číslo rozhraní je zadrátováno v zařízení, takže se nemění. Osobně bych podmínku napsal jako vendorId & productId & bInterfaceNumber, protože interface je jen textový popisek, do kterého si výrobce může strčit, co chce, ale vendorId je posvěcené autoritou.
25.5.2009 11:19 Peterson Larson | skóre: 9
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem

Diky za odpoved, "nicmene vendorID" a "productID" je nanestesti v jinem bloku (viz. udevinfo) nez "bInterfaceNumber" a tak je nelze pouzit dohromady (tedy nenasel jsem zpusob jak dva a vice bloku "sparovat").

Pro jistotu uvadim plny vypis obou zarizeni:

Nejprve pro ttyUSB0:

# udevinfo -ap `udevinfo -q path -n /dev/ttyUSB0`

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/ttyUSB0/tty':
    KERNELS=="tty"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="option1"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0':
    KERNELS=="5-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="option"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{modalias}=="usb:v1726p1000d0000dc00dsc00dp00icFFiscFFipFF"
    ATTRS{interface}=="AXESSTEL USB MODEM"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1':
    KERNELS=="5-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{urbnum}=="15"
    ATTRS{idVendor}=="1726"
    ATTRS{idProduct}=="1000"
    ATTRS{bcdDevice}=="0000"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="5"
    ATTRS{devnum}=="2"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="AXESSTEL CO., LTD."
    ATTRS{product}=="AXESSTEL DATA MODEM"
    ATTRS{serial}=="A00000000100"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5':
    KERNELS=="usb5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="27"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0001"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="5"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="2"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27-gentoo-r8 uhci_hcd"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="uhci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x2830"
    ATTRS{subsystem_vendor}=="0x1028"
    ATTRS{subsystem_device}=="0x026f"
    ATTRS{class}=="0x0c0300"
    ATTRS{irq}=="23"
    ATTRS{local_cpus}=="3"
    ATTRS{local_cpulist}=="0-1"
    ATTRS{modalias}=="pci:v00008086d00002830sv00001028sd0000026Fbc0Csc03i00"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Nyni pro ttyUSB1:

# udevinfo -ap `udevinfo -q path -n /dev/ttyUSB1`

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1/ttyUSB1/tty/ttyUSB1':
    KERNEL=="ttyUSB1"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1/ttyUSB1/tty':
    KERNELS=="tty"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1/ttyUSB1':
    KERNELS=="ttyUSB1"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="option1"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1':
    KERNELS=="5-1:1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="option"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{modalias}=="usb:v1726p1000d0000dc00dsc00dp00icFFiscFFipFF"
    ATTRS{interface}=="AXESSTEL DIAGNOSTIC PORT"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1':
    KERNELS=="5-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{urbnum}=="15"
    ATTRS{idVendor}=="1726"
    ATTRS{idProduct}=="1000"
    ATTRS{bcdDevice}=="0000"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="5"
    ATTRS{devnum}=="2"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="AXESSTEL CO., LTD."
    ATTRS{product}=="AXESSTEL DATA MODEM"
    ATTRS{serial}=="A00000000100"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5':
    KERNELS=="usb5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="27"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0001"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="5"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="2"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27-gentoo-r8 uhci_hcd"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="uhci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x2830"
    ATTRS{subsystem_vendor}=="0x1028"
    ATTRS{subsystem_device}=="0x026f"
    ATTRS{class}=="0x0c0300"
    ATTRS{irq}=="23"
    ATTRS{local_cpus}=="3"
    ATTRS{local_cpulist}=="0-1"
    ATTRS{modalias}=="pci:v00008086d00002830sv00001028sd0000026Fbc0Csc03i00"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

 

Mozna, kdyz se tak na to divam, by se dalo vytvorit pravidlo, ktere by pomoci zoliku checkovalo "ATTRS{modalias}" ve stejnem bloku (konkretne se jedna o 4. blok - "looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.1':") kde je potrebny "bInterfaceNumber".

Napr. takto (?):

KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="00", ATTRS{modalias}=="usb:v1726p1000*", NAME="%k", SYMLINK+="axesstel"

25.5.2009 13:36 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem
"nicmene vendorID" a "productID" je nanestesti v jinem bloku (viz. udevinfo) nez "bInterfaceNumber" a tak je nelze pouzit dohromady

Tak to je docela trapné. Čekal jsem, že se atributy budou dědit.

KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="00", ATTRS{modalias}=="usb:v1726p1000*", NAME="%k", SYMLINK+="axesstel"

A tohle vám funguje? Kam bude ukazuje symlink? Na ttyUSB* nebo na usb*?

Tady vám asi neporadím, protože udev moc neznám.

25.5.2009 13:45 Peterson Larson | skóre: 9
Rozbalit Rozbalit vše Re: udev rule - dual-port usb modem

take jsem cekal, ze bude probihat nejake dedeni, ale to jsem si nabehl...

V kazdem pripade to posledni funguje zcela dle ocekavani - tedy dobre. Symlink ukazuje na prvni port, tedy na /dev/ttyUSB0. Pokud jiz budu mit pripojeny napriklad jeden takovy modem (kuprikladu AnyData - taktez dual-portovy hybrid, tedy ttyUSB0 a ttyUSB1) a pote pripojim dalsi (treba prave zminovany Axesstel), tento obsadi dalsi porty v rade, konkretne ttyUSB3 a ttyUSB4, bude nyni symlink /dev/axesstel ukazovat na /dev/ttyUSB3... To je presne tak jak potrebuji...

Diky vsem za prispevky

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.