Cihaz kimlikleri port adreslerine nasıl kilitlenir?


5

Bazı USB bağlantı noktalarını belirli aygıtlara ayırmak istiyorum. Bunu nasıl yapabilirim?

Örneğin: ttyUSB0'in farem olmasını ve ttyUSB1'in klavyem olmasını istiyorum (her zaman). Linux'un başlangıcının asla değişmeyeceğinden emin olmak istiyorum.

Aslında mesele şu ki, genellikle USB0’a giden XBee’ye ve USB1’e giden ikinci bir FTDI’ya sahibim, güvenlik nedeniyle kodlarımda her zaman aynı adresin çalışmasını istiyorum.

Saygılarımla


1
Bunun Linux olduğuna emin misin? Linux ttyUSBx USB seri terminaller için cihazlardır. Fare ve amp; klavye HID cihazlarıdır, onları / dev / input'ta izleyin.
Eddy_Em

Hangi işletim sistemini çalıştırdığım ile ilgili olarak nasıl hata yapabilirim? Bu bir Ahududu Pi'deki Debian.
Christian

Yanıtlar:


7

Çekirdek atanan adlar her zaman aygıtların algılandığı sırada atanır ve bunları değiştiremezsiniz. (Artık değil, yine de - bu işlev, "kalıcı ad" kurallarının neden olduğu çeşitli yarış koşulları nedeniyle kaldırıldı.)

Ama sen söyleyebilirsin udev yaratmak sembolik bağlar seçtiğiniz isimlerle. Aslında, modern sistemlerde çoktan sahip altında linkler /dev/serial Hem cihazın yolundan hem de benzersiz kimliğinden sonra adlandırılmış; Örneğin:

  • /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0ttyUSB0

  • /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00ttyACM0

  • /dev/disk/by-id/ata-ST9640320AS_5WX1ZH91-part1sda1

  • /dev/disk/by-partlabel/Archsda3

  • /dev/input/by-id/usb-PIXART_USB_OPTICAL_MOUSE-mousemouse1

Ve bunun gibi. Sadece koşmak tree /dev veya ls -lR /dev cihazınızı bulmak için.

Ayrıca koşabilirsin udevadm info /dev/ttyUSB0 ve bu aygıta ait tüm bağlantılar S: ... çizgiler.


Bu yeterli değilse, kendi udev kurallarınızı yazabilirsiniz. İlk çalıştırma udevadm info /dev/ttyUSB0 ve tanımlayıcı herhangi bir özelliği (örneğin ID_PATH USB bağlantı noktası için). Her zaman alt sistemi de dahil etmek iyi bir fikirdir.

Sonra bir dosyayı açın (veya oluşturun). /etc/udev/rules.d/ (örneğin, serial-symlinks.rules ) ve udev kuralını buraya koy.

Örneğin, çıktı için ttyUSB0 geçerli:

$ udevadm info /dev/ttyUSB0
. . .
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.2:1.0
. . .
E: SUBSYSTEM=tty
. . .

... bu kuralı yazabilirsiniz:

SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:00:1d.0-usb-0:1.2:1.0", SYMLINK+="tty-xbee"

... ve udev her zaman sembolik /dev/tty-xbee USB port 2'ye bağladığınız her cihaza.


(Not: Yapma çekirdeğin aygıt düğümleri için kullandığı gibi aynı isimleri de kullanın. kullanma SYMLINK+="ttyUSB0" irade kötü şeylerin olmasına neden olur.)


Mükemmel yazı! Teşekkürler. Kodumu durdurduğum bir süre XBee'nin portu USB0'dan USB1'e değiştireceğini unutmayın. Bunun nedenini bilmiyorum, ancak / dev / ttyUSB0 yolunu kullanmak yerine kodumda yer alırsam, örneğin /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00 kullanılır. ?
Christian

@ Hıristiyan: Evet.
grawity

@grawity, fiziksel topolojiye göre veya rastgele (paralel keşif gibi herhangi bir nedenle) keşif sırasına göre tahsis edilen `/ dev / serial / by-path / 'altındaki pci ve usb bağlantı noktası kimlikleridir?
Julio Guerra

@JulioGuerra: Fiziksel topolojiyi temsil etmeleri gerekiyordu (bu çok fazla bütün mesele arasında by-path aşırı ardışık tty* adları). Not nasıl pci etiketinin ardından PCI domain: bus: slot.func, örneğin. /// Firmware karar verirse fiziksel topoloji de değişebilir - Aynı fiziksel PCI yuvasının, diğer slotların dolup dolmadığına bağlı olarak farklı bir kimlik alacağı birkaç PC duydum ... ayrıca bir endişe, kullanım by-id isimler.
grawity

0

USB seri aygıtlarla yaptığım şey:

  1. cd /dev/serial/by-id
  2. ls -l

    Örneğin:

    root@toaster:/dev/serial/by-id# ls -l

    total 0
    lrwxrwxrwx 1 root root 13 Jan 1 1970 usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 -> ../../ttyUSB0

  3. Bu L-O-N-G isminden, seçtiğiniz bir dizinde seçtiğiniz bir isme bağlantı verin. Benim durumumda, bu bir sistem cihazıdır ve sadece root kontrol eder, böylece bağlantı kurarım /root, sevmek:

    ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 /root/easydigi
    
  4. Programlarınızda veya seri cihazın cihaz adına neye ihtiyacı varsa, sadece "/ root / easydigi" nin üstündeki bağlantınızı "/ dev / ttyUSB0" yerine kullanabilirsiniz.

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.