Gömülü ttyUSB0'a özel PID'li USB Seri cihaz ekleme


19

Özel bir PID ile bir FTDI USB Seri aygıtını çok başarılı olmadan otomatik olarak (veya elle) ttyUSB% n'ye eklemek için almaya çalışıyorum. Cihazın normal VID / PID değeri 0403/6001'dir. Bu şekilde programlandığında, mükemmel çalışır ve takıldığında kendini otomatik olarak ttyUSB0'a bağlar. Sürücü yeni PID'ye saygı göstermek için yeniden derlenmiş olsa bile, özel bir ttyUSB0 ile programlandığında görünmez, ancak bir ftdi_sio aygıtı olarak algılar ve sürücüyü yükler.

Başlığa ve kaynağa PID ekledim:

// 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) },
    // ....

Tüm çekirdeği yeniden derledi ve cihazı yeniden kilitledi. Cihazı taktığımda:

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 doğru özel VID / PID'yi gösterir. Sürücü, onunla ftdi_sio kullanması gerektiğini biliyor, ancak değiştirilmemiş PID'de olduğu gibi ttyUSB0'a eklemiyor. Burada neyi yanlış yaptığım konusunda herhangi bir öneriniz var mı?


1
Bu hangi gömülü tip? UDEV var mı? Eğer öyleyse, UDEV en iyi bahistir (ve bununla ilgili daha fazla yardımcı olabilirim).
Brian Redbeard

Yanıtlar:


17

Çekirdeği yalnızca bir kez değiştirmenize gerek yoktur; geçersiz kılabilirsiniz.

  1. Cihazı fişten çıkarmak
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. Cihazı takın

Ve cihazınız çalışmalı.

Diğer alternatifiniz bindsysfs arayüzünü kullanmaktır ; lsusb -tBu durumda doğru yol + arabirimini bulmak için kullanmanızı öneririm .

Bir USB depolama cihazının sistemimden kısmi bir örnek kullanarak (usb-seri için çok benzer olacaktır).

$ 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

Numarasının biçimi şöyledir: BUS-PORT(.PORT)+:1.INTERFACE. Lsusb çıktısında görünmeyen tek sayı, iki nokta üst üste işaretinden sonraki ilk basamaktır; ve her zaman 1benim deneyimim oldu. Daha derin çekirdek bilgisine sahip biri muhtemelen bana bunun ne olduğunu söyleyebilir ve karşı bir örnek verebilir.


Mükemmel çalıştı, teşekkürler. Kabul edilen cevap olmalı.
Amr Bekhit

1
Sadece merak ediyorum: fikrimi değiştirirsem ve bu vid / pid'in ftdi_sio sürücüsünü ama başka bir sürücüyü kullanmasını istemiyorsam, bu adımı nasıl geri alabilirim?
Bram

New_id yankısını geri almak için remove_id öğesine vid / pid yazın.
robbat2

@ trycatch lütfen cevabı kabul edebilir misiniz?
robbat2

1
@kay new_id / remove_id yalnızca dinamik olarak eklenen kimlikleri kaldırmak içindir. Ne yapmak istediğinizi anlarsam: belirli bir sürücünün bazı aygıtlar için yüklenmesini önlemek istersiniz.
robbat2

13

Çekirdeği değiştirmeniz gerekmez, işlemi şu şekilde otomatikleştirebilirsiniz:

  1. Aşağıdaki tek satırı şuraya ekle: /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 --reloadYeni kuralı almak için yeniden başlatın veya çalıştırın .

  3. Cihazı fişten çıkarmak.

  4. Cihazı fişe takın.


1

SiLabs'ın değerlendirme panosunda kesinlikle benzer bir durum oldu - USB-UART yongası CP2102'ye düzensiz VID / PID sağlandı:

lsusb

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

cp210x modülü yüklenerek ve daha önce belirtildiği gibi VID / PID gönderilerek sorun çözüldü:

sudo modprobe cp210x

sudo -s

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

udev için karşılık gelen 99-cp210.rules dosyası aşağıdaki gibidir:

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'"


Gelecekteki yolcuları işe bir HUSBZB-1 sopa almaya çalışırken, aşağıda / dev / ZigBee ve / dev / z dalga yukarıda belirtildiği gibi cp210x sürücüsü bağlayabilir ve tty cihazlarını sembolik köprüyü bir Udev dosyasıdır 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"
belirsiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.