組み込みのttyUSB0にカスタムPIDを持つUSBシリアルデバイスを接続する


19

私は、カスタムPIDを備えたFTDI USB-Serialデバイスを取得して、自動的に(または手動で)ttyUSB%nに接続しようとしていますが、あまり成功していません。デバイスの通常のVID / PIDは0403/6001です。この方法でプログラムすると、完全に機能し、プラグイン時にttyUSB0に自動的に接続されます。新しいPIDを尊重するように再コンパイルされたドライバーでも、カスタム1でプログラムするとttyUSB0は表示されませんが、ftdi_sioデバイスとして認識されますドライバーをロードします。

ヘッダーとソースにPIDを追加しました:

// in ftdi_sio_ids.h
#define FTDI_CUSTOM_PID 0xABCD // not the actual pid
// then in ftdi_sio.c
static struct usb_device_id id_table_combined [] = {
    // devices....
    { USB_DEVICE(FTDI_VID, FTDI_CUSTOM_PID) },
    // ....

カーネル全体を再コンパイルし、デバイスを再フラッシュしました。デバイスを接続すると、次のようになります。

usb 1-1: new full-speed USB device number 2 using at91_ohci
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

lsusbは正しいカスタムVID / PIDを表示します。ドライバーはftdi_sioを使用することになっていることを認識しているようですが、変更されていないPIDの場合のようにttyUSB0に接続しません。ここで私が間違っていることについての提案はありますか?


1
これはどの埋め込みタイプですか?UDEVがありますか?もしそうなら、UDEVがあなたの最善策です(そして、私はそれについてさらに手助けすることができます)。
ブライアンレッドビアード

回答:


17

カーネルを一度だけ変更する必要はありません。上書きできます。

  1. デバイスのプラグを抜きます
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. デバイスを接続します

そして、デバイスは動作するはずです。

他の代替手段は、bindsysfsインターフェースを使用することです。lsusb -tその場合は、正しいパスとインターフェイスを見つけるために使用することをお勧めします。

私のシステムのusbストレージデバイスの部分的な例を使用します(usbシリアルでも非常によく似ています)。

$ lsusb -t
...
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    |__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/3p, 5000M
        |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/3p, 5000M
            |__ Port 3: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
 ...
 $ echo '4-1.3.3:1.0' >/sys/bus/usb/drivers/usb-storage/bind

番号の形式は次のとおりBUS-PORT(.PORT)+:1.INTERFACEです。lsusbの出力に表示されない唯一の数字は、コロンの後の最初の数字です。そして、それは常に1私の経験の中にありました。カーネルの知識が深い人は、おそらくそれが何であるかを教えてくれ、反例を提供できます。


完璧に働きました、ありがとう。受け入れられた答えであるべきです。
アムルベヒット14

1
考えてみてください:気が変わって、このvid / pidでftdi_sioドライバーを使用したいが、別のドライバーを使用したくない場合、このステップを元に戻すにはどうすればよいですか?
ブラム

vid / pidをremove_idに書き込み、new_idへのエコーを取り消します。
-robbat2

@trycatch答えを受け入れてください。
-robbat2

1
@kay new_id / remove_idは、動的に追加されたIDを削除するためだけのものです。私があなたが何をしたいのか理解しているなら:あなたは特定のドライバーがいくつかのデバイスのためにロードするのを防ぎたい。
robbat2

12

カーネルを変更する必要はありません。次のようにプロセスを自動化できます。

  1. 次の単一行を追加します /etc/udev/rules.d/99-ftdi.rules

    ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0403 6001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

  2. 再起動するか実行sudo udevadm control --reloadして、新しいルールを取得します。

  3. デバイスのプラグを抜きます。

  4. デバイスを接続します。


1

SiLabsの評価ボードでもまったく同じ状況が発生しました。USB-UARTチップCP2102には不規則なVID / PIDが提供されています。

lsusb

Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.

前述のように、モジュールcp210xをロードしてVID / PIDを送信することで問題が解決しました。

sudo modprobe cp210x

sudo -s

echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id

udevに対応する99-cp210.rulesファイルは次のようになります。

ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="804c", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id'"


仕事にHUSBZB-1スティックを取得しようと、将来の旅行者のために、ここでは上記のようにcp210xドライバをリンクするudevのファイルがある、と/ dev /ジグビーと/ dev / zの波にttyデバイスシンボリックリンク ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="8a2a", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 8a2a > /sys/bus/usb-serial/drivers/cp210x/new_id'" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ Z-Wave Com Port", SYMLINK+="zwave" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ ZigBee Com Port", SYMLINK+="zigbee"
漠然とした
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.