web-dev-qa-db-ja.com

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

私はttyUSB%nに自動的に(または手動で)接続するためのカスタムPIDを備えたFTDI USB-シリアルデバイスを取得しようとしていますが、あまり成功していません。デバイスの通常の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にアタッチしません。ここで私が間違っていることについて何か提案はありますか?

19
trycatch

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

  1. デバイスのプラグを抜きます
  2. _modprobe ftdi_sio_
  3. _echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id_
  4. デバイスを接続する

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

もう1つの方法は、bind sysfsインターフェースを使用することです。その場合は、_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_でした。カーネルに関する深い知識を持つ人なら、おそらくそれが何であるかを教えてくれ、反例を示すでしょう。

17
robbat2

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

  1. 次の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. デバイスを接続します。

14
Stephen

siLabsのevalボードでもまったく同様の状況が発生しています。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'"

1
Oleg Kokorin