udev und MOSCHIP USb-to-Serial-Adapter

14/04/2016 - 12:20 von Marc Haber | Report spam
Hallo,

ich möchte gerne auf einem Rechner, der mit einem
USB-to-Serial-Adapter mit MOSCHIP Chipsatz ausgerüstet ist, die
seriellen Ports dieses Adapter mit reproduzierbaren devicenodenamen in
/dev versehen.

Das kenne ich normalerweise so, dass ein n-fach USB-to-Serial-Adapter
simpel aus einem n-Fach Hub mit n einzelnen USB-to-Serial-Chips von
FTDI oder PL2303 besteht, die man stumpf über ihre Adresse auf dem USB
adressieren kann:

|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="ftdi_sio", \
| KERNELS=="1-1:1.2", \
| SYMLINK="USBserialB"
|
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="ftdi_sio", \
| KERNELS=="1-1:1.3", \
| SYMLINK="USBserialA"

Bei dem MOSCHIP-Chip geht das nicht, das ist nur _ein_ USB-Device mit
n Ports, damit ist die Adresse auf dem USB für alle Ports gleich:

| looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0':
| KERNEL=="ttyUSB0"
| SUBSYSTEM=="tty"
| DRIVER==""
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0':
| KERNELS=="ttyUSB0"
| SUBSYSTEMS=="usb-serial"
| DRIVERS=="mos7840"
| ATTRS{port_number}=="0"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0':
| KERNELS=="1-1.1:1.0"
| SUBSYSTEMS=="usb"
| DRIVERS=="mos7840"
| ATTRS{authorized}=="1"
| ATTRS{bAlternateSetting}==" 0"
| ATTRS{bInterfaceClass}=="ff"
| ATTRS{bInterfaceNumber}=="00"
| ATTRS{bInterfaceProtocol}=="ff"
| ATTRS{bInterfaceSubClass}=="00"
| ATTRS{bNumEndpoints}=="09"
| ATTRS{supports_autosuspend}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
| KERNELS=="1-1.1"
| SUBSYSTEMS=="usb"
| DRIVERS=="usb"
| ATTRS{authorized}=="1"
| ATTRS{avoid_reset_quirk}=="0"
| ATTRS{bConfigurationValue}=="1"
| ATTRS{bDeviceClass}=="ff"
| ATTRS{bDeviceProtocol}=="ff"
| ATTRS{bDeviceSubClass}=="00"
| ATTRS{bMaxPacketSize0}=="64"
| ATTRS{bMaxPower}=="500mA"
| ATTRS{bNumConfigurations}=="1"
| ATTRS{bNumInterfaces}==" 1"
| ATTRS{bcdDevice}=="0001"
| ATTRS{bmAttributes}=="a0"
| ATTRS{busnum}=="1"
| ATTRS{configuration}==""
| ATTRS{devnum}=="3"
| ATTRS{devpath}=="1.1"
| ATTRS{idProduct}=="7840"
| ATTRS{idVendor}=="9710"
| ATTRS{ltm_capable}=="no"
| ATTRS{maxchild}=="0"
| ATTRS{quirks}=="0x0"
| ATTRS{removable}=="unknown"
| ATTRS{speed}=="480"
| ATTRS{urbnum}=="45"
| ATTRS{version}==" 2.00"

| looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB1/tty/ttyUSB1':
| KERNEL=="ttyUSB1"
| SUBSYSTEM=="tty"
| DRIVER==""
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB1':
| KERNELS=="ttyUSB1"
| SUBSYSTEMS=="usb-serial"
| DRIVERS=="mos7840"
| ATTRS{port_number}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0':
| KERNELS=="1-1.1:1.0"
| SUBSYSTEMS=="usb"
| DRIVERS=="mos7840"
| ATTRS{authorized}=="1"
| ATTRS{bAlternateSetting}==" 0"
| ATTRS{bInterfaceClass}=="ff"
| ATTRS{bInterfaceNumber}=="00"
| ATTRS{bInterfaceProtocol}=="ff"
| ATTRS{bInterfaceSubClass}=="00"
| ATTRS{bNumEndpoints}=="09"
| ATTRS{supports_autosuspend}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
| KERNELS=="1-1.1"
| SUBSYSTEMS=="usb"
| DRIVERS=="usb"
| ATTRS{authorized}=="1"
| ATTRS{avoid_reset_quirk}=="0"
| ATTRS{bConfigurationValue}=="1"
| ATTRS{bDeviceClass}=="ff"
| ATTRS{bDeviceProtocol}=="ff"
| ATTRS{bDeviceSubClass}=="00"
| ATTRS{bMaxPacketSize0}=="64"
| ATTRS{bMaxPower}=="500mA"
| ATTRS{bNumConfigurations}=="1"
| ATTRS{bNumInterfaces}==" 1"
| ATTRS{bcdDevice}=="0001"
| ATTRS{bmAttributes}=="a0"
| ATTRS{busnum}=="1"
| ATTRS{configuration}==""
| ATTRS{devnum}=="3"
| ATTRS{devpath}=="1.1"
| ATTRS{idProduct}=="7840"
| ATTRS{idVendor}=="9710"
| ATTRS{ltm_capable}=="no"
| ATTRS{maxchild}=="0"
| ATTRS{quirks}=="0x0"
| ATTRS{removable}=="unknown"
| ATTRS{speed}=="480"
| ATTRS{urbnum}=="45"
| ATTRS{version}==" 2.00"

Das unterscheidet sich nur noch in ATTRS{port_number} in der zweiten
"Strophe".

Der naive Ansatz:
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="mos7840", \
| KERNELS=="1-1.1:1.0", ATTRS{port_number}=="0", \
| SYMLINK="USBserialA"
|
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="mos7840", \
| KERNELS=="1-1.1:1.0", ATTRS{port_number}=="1", \
| SYMLINK="USBserialB"

funktioniert schonmal nicht (obwohl alle Matches nur aus zwei Strophen
kommen, udev hatte da IIRC eine unverstàndliche Beschrànkung). Hat
jemand eine Idee für die Fehlersuche?

Ich bin auch für Hinweise auf passende Mailinglisten, gerne
englishsprachig dankbar; ich weiß dass udev ein fortgeschrittenes
Thema ist, das hier im Usenet eventuell nicht mehr die notwendige
Abdeckung findet.

Grüße
Marc
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
 

Lesen sie die antworten

#1 Rudolf Mueller
14/04/2016 - 16:32 | Warnen spam
Hallo,

in den udev-rules alle reproduzierbar erkennen:
SUBSYSTEM=="tty", KERNEL=="ttyUSB*", ATTRS{idVendor}=="9710", ATTRS{idProduct}=="7840", SYMLINK+="ttyUSB_MOS%n", ENV{SYSTEMD_WANTS}="FixMosPorts.service"

(FixMosPorts.service ruft dann im Prinzip nur eine weitere Alias-Setzung auf)

Das Problem ist nur, je nach dem, wann diese erkannt werden fàngt das n bei irgendwas >= 0 an
(bei mir mal mit 0 oder mit 1)
Bei mir ist es ein externer 8-fach mit intern 2x4seriell.

Deshalb ist noch etwas in der Art:
# entsprechende persistene Links auf den 8-fach anlegen
# ttyUSB_MOSx ist der neue udev-Symlink
# ttyUSB_mosx der normalisierte Symlink
if [ -L /dev/ttyUSB_MOS0 ] ; then
# MOS geht von 0-7
ln -snf /dev/ttyUSB_MOS0 /dev/ttyUSB_mos1
ln -snf /dev/ttyUSB_MOS1 /dev/ttyUSB_mos2
ln -snf /dev/ttyUSB_MOS2 /dev/ttyUSB_mos3
ln -snf /dev/ttyUSB_MOS3 /dev/ttyUSB_mos4
ln -snf /dev/ttyUSB_MOS4 /dev/ttyUSB_mos5
ln -snf /dev/ttyUSB_MOS5 /dev/ttyUSB_mos6
ln -snf /dev/ttyUSB_MOS6 /dev/ttyUSB_mos7
ln -snf /dev/ttyUSB_MOS7 /dev/ttyUSB_mos8
else
if [ -L /dev/ttyUSB_MOS1 ] ; then
# MOS geht von 1-8
ln -snf /dev/ttyUSB_MOS1 /dev/ttyUSB_mos1
ln -snf /dev/ttyUSB_MOS2 /dev/ttyUSB_mos2
ln -snf /dev/ttyUSB_MOS3 /dev/ttyUSB_mos3
ln -snf /dev/ttyUSB_MOS4 /dev/ttyUSB_mos4
ln -snf /dev/ttyUSB_MOS5 /dev/ttyUSB_mos5
ln -snf /dev/ttyUSB_MOS6 /dev/ttyUSB_mos6
ln -snf /dev/ttyUSB_MOS7 /dev/ttyUSB_mos7
ln -snf /dev/ttyUSB_MOS8 /dev/ttyUSB_mos8
fi
fi

Marc Haber <mh+ wrote:
Hallo,

ich möchte gerne auf einem Rechner, der mit einem
USB-to-Serial-Adapter mit MOSCHIP Chipsatz ausgerüstet ist, die
seriellen Ports dieses Adapter mit reproduzierbaren devicenodenamen in
/dev versehen.

Das kenne ich normalerweise so, dass ein n-fach USB-to-Serial-Adapter
simpel aus einem n-Fach Hub mit n einzelnen USB-to-Serial-Chips von
FTDI oder PL2303 besteht, die man stumpf über ihre Adresse auf dem USB
adressieren kann:

|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="ftdi_sio", \
| KERNELS=="1-1:1.2", \
| SYMLINK="USBserialB"
|
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="ftdi_sio", \
| KERNELS=="1-1:1.3", \
| SYMLINK="USBserialA"

Bei dem MOSCHIP-Chip geht das nicht, das ist nur _ein_ USB-Device mit
n Ports, damit ist die Adresse auf dem USB für alle Ports gleich:

| looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0':
| KERNEL=="ttyUSB0"
| SUBSYSTEM=="tty"
| DRIVER==""
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0':
| KERNELS=="ttyUSB0"
| SUBSYSTEMS=="usb-serial"
| DRIVERS=="mos7840"
| ATTRS{port_number}=="0"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0':
| KERNELS=="1-1.1:1.0"
| SUBSYSTEMS=="usb"
| DRIVERS=="mos7840"
| ATTRS{authorized}=="1"
| ATTRS{bAlternateSetting}==" 0"
| ATTRS{bInterfaceClass}=="ff"
| ATTRS{bInterfaceNumber}=="00"
| ATTRS{bInterfaceProtocol}=="ff"
| ATTRS{bInterfaceSubClass}=="00"
| ATTRS{bNumEndpoints}=="09"
| ATTRS{supports_autosuspend}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
| KERNELS=="1-1.1"
| SUBSYSTEMS=="usb"
| DRIVERS=="usb"
| ATTRS{authorized}=="1"
| ATTRS{avoid_reset_quirk}=="0"
| ATTRS{bConfigurationValue}=="1"
| ATTRS{bDeviceClass}=="ff"
| ATTRS{bDeviceProtocol}=="ff"
| ATTRS{bDeviceSubClass}=="00"
| ATTRS{bMaxPacketSize0}=="64"
| ATTRS{bMaxPower}=="500mA"
| ATTRS{bNumConfigurations}=="1"
| ATTRS{bNumInterfaces}==" 1"
| ATTRS{bcdDevice}=="0001"
| ATTRS{bmAttributes}=="a0"
| ATTRS{busnum}=="1"
| ATTRS{configuration}==""
| ATTRS{devnum}=="3"
| ATTRS{devpath}=="1.1"
| ATTRS{idProduct}=="7840"
| ATTRS{idVendor}=="9710"
| ATTRS{ltm_capable}=="no"
| ATTRS{maxchild}=="0"
| ATTRS{quirks}=="0x0"
| ATTRS{removable}=="unknown"
| ATTRS{speed}=="480"
| ATTRS{urbnum}=="45"
| ATTRS{version}==" 2.00"

| looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB1/tty/ttyUSB1':
| KERNEL=="ttyUSB1"
| SUBSYSTEM=="tty"
| DRIVER==""
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB1':
| KERNELS=="ttyUSB1"
| SUBSYSTEMS=="usb-serial"
| DRIVERS=="mos7840"
| ATTRS{port_number}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0':
| KERNELS=="1-1.1:1.0"
| SUBSYSTEMS=="usb"
| DRIVERS=="mos7840"
| ATTRS{authorized}=="1"
| ATTRS{bAlternateSetting}==" 0"
| ATTRS{bInterfaceClass}=="ff"
| ATTRS{bInterfaceNumber}=="00"
| ATTRS{bInterfaceProtocol}=="ff"
| ATTRS{bInterfaceSubClass}=="00"
| ATTRS{bNumEndpoints}=="09"
| ATTRS{supports_autosuspend}=="1"
|
| looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1':
| KERNELS=="1-1.1"
| SUBSYSTEMS=="usb"
| DRIVERS=="usb"
| ATTRS{authorized}=="1"
| ATTRS{avoid_reset_quirk}=="0"
| ATTRS{bConfigurationValue}=="1"
| ATTRS{bDeviceClass}=="ff"
| ATTRS{bDeviceProtocol}=="ff"
| ATTRS{bDeviceSubClass}=="00"
| ATTRS{bMaxPacketSize0}=="64"
| ATTRS{bMaxPower}=="500mA"
| ATTRS{bNumConfigurations}=="1"
| ATTRS{bNumInterfaces}==" 1"
| ATTRS{bcdDevice}=="0001"
| ATTRS{bmAttributes}=="a0"
| ATTRS{busnum}=="1"
| ATTRS{configuration}==""
| ATTRS{devnum}=="3"
| ATTRS{devpath}=="1.1"
| ATTRS{idProduct}=="7840"
| ATTRS{idVendor}=="9710"
| ATTRS{ltm_capable}=="no"
| ATTRS{maxchild}=="0"
| ATTRS{quirks}=="0x0"
| ATTRS{removable}=="unknown"
| ATTRS{speed}=="480"
| ATTRS{urbnum}=="45"
| ATTRS{version}==" 2.00"

Das unterscheidet sich nur noch in ATTRS{port_number} in der zweiten
"Strophe".

Der naive Ansatz:
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="mos7840", \
| KERNELS=="1-1.1:1.0", ATTRS{port_number}=="0", \
| SYMLINK="USBserialA"
|
|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="mos7840", \
| KERNELS=="1-1.1:1.0", ATTRS{port_number}=="1", \
| SYMLINK="USBserialB"

funktioniert schonmal nicht (obwohl alle Matches nur aus zwei Strophen
kommen, udev hatte da IIRC eine unverstàndliche Beschrànkung). Hat
jemand eine Idee für die Fehlersuche?

Ich bin auch für Hinweise auf passende Mailinglisten, gerne
englishsprachig dankbar; ich weiß dass udev ein fortgeschrittenes
Thema ist, das hier im Usenet eventuell nicht mehr die notwendige
Abdeckung findet.

Grüße
Marc

Ähnliche fragen