SB485 fy Papouch v OS Linux

1) Stav podpory v OS Linux obecně

Převodník USB - RS422/485 SB485 je v Linuxu podporován driverem "ftdi_sio" (nyní aktuální verze 1.4.3), díky němuž je k zařízení (typicky "/dev/ttyUSBx") možno přistupovat jako k normálnímu sériovému portu. Všechny větší distribuce používají modulární jádro (kernel), do kterého je možno za běhu jednotlivé moduly (např. drivery, podporu protokolů, kryptování, znakových sad, souborových systémů atd.) přidávat a odebírat. Další popis bude pro takováto modulární jádra; monolitická jádra s pevně zakompilovanými moduly se užívají hlavně u zapouzdřených a specializovaných systémů a pak následující popis nemusí platit a může být nutno zvolit jiné řešení.

2) Verze "Usnadnění instalace pro OS Linux"

pokud je převodník dodán s USB VendorID(VID)=0x0403 a ProductID(PID)=0x6003, pak by měl být novějšími verzemi Linuxu rozpoznán a jeho driver (modul) systémem sám zaveden. Pokud ne, je možné jej zavést (po připojení SB485) příkazem:

modprobe ftdi_sio

Pokud OS nepodporuje dynamickou správu zařízení "udev", pak je nutno speciální soubor zařízení vytvořit ručně předem příkazem:

mknod /dev/ttyUSB0 c 188 0

(hlavní číslo souboru zařízení je 188 a vedlejší je 0 pro ttyUSB0, 1 pro ttyUSB1 atd.

V systémech s jádry 2.6.x a udev podporou se v adresáři "/dev" nebo v jeho podadresářích objeví nové zařízení "ttyUSBx", kde x je číslo udev systémem přidělené, počínaje od 0. Pokud v systému máme jen jedno USB serial zařízení, je situace jednoduchá, pod "/dev" dynamicky vytvořené zařízení bude vždy ttyUSB0 a na ně se mohou používající programy obracet. Pokud v systému je více SB485 nebo další zařízení s "ftdi_sio" driverem nebo obecně další USB serial zařízen, pak může nastat problém s rozlišením zařízení, protože bude existovat několik zařízení ttyUSBx. Jednou z elegantních možností je použití vlastních pravidel pro udev daemona, pomocí kterých je kromě ttyUSBx možno vytvořit i symbolické linky pevných jmen, které ukazují na příslušné ttyUSBx. Blíže viz jako v následující bod:

3) Verze bez "Usnadnění instalace pro OS Linux"

pokud je převodník dodán s USB VID a PID fy Papouch (nevím, jaká jsou, pro pokusy jsem si do FTDI FT232BM eeprom zapsal VID=0x8765 a PID=0x4321, takže je třeba tyto hodnoty nahradit skutečnými), ftdi_sio modul je zatím nezná, systém zařízení nerozpozná a neví jaký ovladač použít. Ale ftdi_sio modul lze zavést s hodnotami VID a PID jako parametrem, čehož lze využít takto:

3a) pokud OS nepodporuje dynamickou správu zařízení "udev" :
do souboru "/etc/modprobe.conf" zapíšeme řádky:
alias sb485 ftdi_sio
options sb485 vendor=0x8765 product=0x4321

a ftdi_sio modul zavedeme ručně (nebo ve startovacích scriptech Linuxu ap.)
3b) pokud OS podporuje dynamickou správu zařízení "udev" :
V adresáři "/etc/udev/rules.d" si vytvoříme vlastní soubor pravidel pro udev daemona nazvaný např. "55-sb485.rules". Pokud jeho obsah budou tyto 4 řádky (2 s "#" na začátku jsou komentář a nejsou nutné) :
#  Tohle udela v /dev/ zarizeni "ttyUSBx" a na nej ukazujici symlinky "sb485" a "sb485-{SERIAL_NO}" :
ACTION="add" SUBSYSTEM="tty" BUS=="usb" SYSFS{idVendor}=="8765", SYSFS{idProduct}=="4321", SYMLINK+="sb485 sb485-%s{serial}"
# Zavedeni driveru "ftdi_sio" s pro driver neznamymi VID a PID :
ACTION="add" BUS=="usb" SYSFS{idVendor}=="8765", SYSFS{idProduct}=="4321", RUN+="/sbin/modprobe ftdi_sio vendor=0x8765 product=0x4321"

potom nám po připojení SB485 vznikne klasicky (viz bod 2 výše) pod "/dev" zařízení ttyUSBx kde číslo x závisí na USB serial zařízeních v systému. Ale zároveň ve stejném adresáři vzniknou na toto ttyUSBx odkazující symlinky "sb485" a "sb485-{serial}" (kde {serial} je sériové číslo USB zařízení - nesmí obsahovat znak "/"). Pro program používající SB485 se situace zjednoduší - pokud je v systému jen jedno SB485, bude otevírat "/dev/sb485"; pokud je jich více, může s výhodou otevírat "/dev/sb485-{serial}", které bude pro jedno konkrétní SB485 vždy stejné bez ohledu na jaké ttyUSBx symlink ukazuje. Pro mé zařízení příkaz (abych to měl pěkně na konci) :
ls --format=long --sort=time --reverse /dev
vypíše:
crw-rw---- 1 root    uucp   188,   0 zář  1 04:00 ttyUSB0
lrwxrwxrwx 1 root    root          7 zář  1 04:00 sb485 -> ttyUSB0
lrwxrwxrwx 1 root    root          7 zář  1 04:00 sb485-PPOZ8LPB -> ttyUSB0

kde "PPOZ8LPB" je sériové číslo zařízení. V programu se pak budu obracet na zařízení "sb585" (pokud mám jen jedno), nebo na "sb485-PPOZ8LPB" (pokud jich mám více).

4) Poznámky: