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.