web-dev-qa-db-ja.com

複数ノードのUSBデバイスに一致するUdevルール

5つのttyノードを作成する3G/GPSデバイスがありますが、これは1つの物理USB接続にすぎません。基本的に、マルチポートUSBシリアルアダプター。

私はいくつかのudevルールを作成して、それらのノードが常に同じ名前、または少なくともそれらへのシンボリックリンクを持っていることを確認しようとしています。

私は確かに/sys/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/でデバイスを見つけることができます。内部には1-2.2:1.0/から1-2.2:1.4/があり、5つのノードが作成します。

/sys/bus/usb/devices/1-2.2でも見つけることができます。

デバイスのudev情報は次のとおりです。

udevadm info -a -p /sys/bus/usb/devices/1-2.2/1-2.2\:1.0
looking at device '/bus/usb/devices/1-2.2/1-2.2:1.0':
KERNEL=="1-2.2:1.0"
SUBSYSTEM=="usb"
DRIVER=="option"
ATTR{bInterfaceNumber}=="00"
ATTR{bAlternateSetting}==" 0"
ATTR{bNumEndpoints}=="03"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="01"
ATTR{bInterfaceProtocol}=="01"
ATTR{modalias}=="usb:v12D1p1506d0000dc00dsc00dp00icFFisc01ip01"
ATTR{supports_autosuspend}=="0"

この時点から、すべてのノードは同じ情報を持ちます。また、ノード間で異なるのは、bInterfaceNumberプロパティとデバイスパスだけです。そこで、開発パスでルールを書くことを考えました。

さて、何らかの理由で、次のルールはそれらすべてのノードに一致します。

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"

つまり、基本的に、huawey0は列挙された最後のノードを指します。デバイスはttyUSB2から6までのノードを作成し、このリンクはUSB6を指しています。

だから、私はカーネルノードで試しました:

ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"

現在、/ devには何も表示されていません。

この後、bInterfaceNumberを使用してそれらを分離しようとしました。次のルールを使用しました

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]" ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

それでも、何も起こりません。私はルールの縮小版も試しました。

ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

それでも何も起こりません。なぜ一致しないのですか?

7
Joao Pincho

すべてのルールに構文エラーがあります:

  1. =は代入用です==は比較用なので、実際にDEVが何と等しいかを見ていなかったので、代入していました。
  2. すべてのステートメントの間に,が必要です。SYMLINK+=の前には何もありませんでした。

拳ルール

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"

2番目のルール

ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"

第三のルール

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

4番目のルール

ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

これらのルールはすべて、あなたが今望むものを実行するはずです(私は最初のものを個人的に使用します)。

5
Alex Layton

この投稿は3年前に尋ねられたものであり、これは答えに対応していない可能性がありますが、今後の参考のために、私の成功した経験をここで共有したいと思います。

Jens Reimannの Identify GSM modem devices using udev によると、「デバイス属性「bInterfaceNumber」はttyデバイスではなく、USBデバイスの親階層」ので、FTDI usb-to-4-port-serialアダプターに2つのルールを作成しました。

SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="ttyUSB_FTDI_4_PORT_%E{.LOCAL_ifNum}"

これにより、属性「bInterfaceNumber」が環境変数「.LOCAL_ifNum」に格納されます(接頭辞のドットは一時変数または非表示変数の表記です)。 2番目のルールでは、「%E」構文を使用して同じ変数が取得されます。新しいudevバージョンは、「%E」の代わりに「$ env」もサポートします。
(Jens Reimann著)

ここで、ttyUSB_FTDI_4_PORT_はシンボリックリンク名です。これらの2つのルールは、ttyUSB_FTDI_4_PORT_00ttyUSB_FTDI_4_PORT_01ttyUSB_FTDI_4_PORT_02ttyUSB_FTDI_4_PORT_03としてシンボリックリンクを作成します。 ATTRS{serial}属性を追加して、列挙をさらに制限できます。

Jens Reimannは、 Ketan Patel のU&L質問 のUdevルールファイルが機能していないderobert による accepted answer を使用.

4
Roice

アレックスのコメントに加えて、別の問題があります。そうみたいです ATTR{bInterfaceNumber}が何らかの理由で機能しません。 関連する質問への答え を引用するには、次の行に沿って何かを使用する必要があります

SUBSYSTEM=="tty", ACTION=="add", \
    ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}="2303", \
    ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0"
0
Dan Stahlke