JavaFTD2xx

Dobrý den,
už se nějakou dobu pokouším zprovoznit D2xx z javy. Našel jsem na to pár knihoven ale tuto jedinou jsem byl schopen rozchodit alespoň pod windows: https://kenai.com/projects/javaftd2xx/pages/Home/revisions/29
Nejsem schopný to rozchodit pod linuxem. Zkoušel jsem také to co psali na již odkazované stránce:

  1. $ lsusb
    Bus 001 Device 002: ID 064e:a103 Suyin Corp. Acer/HP Integrated Webcam [CN0314]
    Bus 006 Device 005: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
    Bus 007 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
    Bus 008 Device 002: ID 0a5c:2101 Broadcom Corp. BCM2045 Bluetooth
    zařízení na druhém řádku je můj FTDI čip. (odpojení a zapojení to ověřilo)
    Tak jsem si pro to vytvořil UDEV pravidlo:
    $ cat /etc/udev/rules.d/11-ftdi.rules
    SUBSYSTEM==“usb”, ATTRS{idVendor}==“403”, ATTRS{idProduct}==“6015”, GROUP=“usb”
    (použil jsem skupinu usb, kterou jsem vytvořil kvůli USBasp se kterým velmi podobný soubor funguje)
    $ udevadm trigger
    toto by tedy mělo povolit celou knihovnu --> nefungovalo to
  2. proto jsem následovně zkusil druhou radu na stránkách:
    $ sudo rmmod ftdi_sio
    $ sudo rmmod usbserial
    rmmod: ERROR: Module usbserial is not currently loaded
    Toto je první error co se mi zobrazil.
    A stále nefunguje

Co jsem udělal špatně?

Asi vsechno. :slight_smile:

  1. FTDI prevodnik staci v linuxu pripojit a vytvori ti zarizeni /dev/ttyUSB0 ktere se chova jako seriovy port a muzes s nim pracovat jako s kazdym linuxovy dev zarizenim.
  2. Pravidlo udev tedy kvuli 1. v zasade nepotrebujes pokud uz ho vytvaris, mas spatne vendora (cele pravidlo jsem nekontroloval), chybi ti tam nula.
  3. rmmod je odstraneni ovladace, pokud neco takoveho chces delat musis vedet co to znamena. V tomto pripade odstranujes ovldac pro FTDI - zarizeni /dev/ttyUSBx nesmi byt v te chvili pouzivano - tedy nebude nadale dostupny tento prevodnik v systemu.
    rmmod usbserial odstranuje ovladac podkladni vrstvy prace se seriovymi usb prevodniky, ktery je ale ve Fedore zrejme napevno zakompilovat v jadre a tedy nejde odebrat.

Troufam si tedy tvrdit, ze svou pozornost zamerujes spatnym smerem. Pokud ti po pripojeni prevodniku vypise dmesg ze vytvoril pro tento prevodnik zarizeni v /dev pak je z hlediska systemu vse v poradku. Je tedy potreba se podivat do toho Java kodu, co je za problem tam, nikoli snazit se opravit systemove ovladace. Ten priklad na uvedene strance, dela jen enumeraci FTDI zarizeni v systemu a nastaveni parametru serioveho portu. Otazka tedy je - co nefunguje v te jave a co to pise?

  1. Ano jistě. Sériový port (přes vcp ovladač) používat jde třeba z putty a pravděpodobně i z javy. Jenže já chci použít d2xx protože chci mít možnost tuto aplikaci použít i ve Windowsech. To je taky důvod proč to dělám z javy.
  2. Nulu jsem přidal stejně nejde.
  3. rmmod jsem použil protože byl na odkazované stránce s java knihovnou. A to, že odstraňuje ovladač jsem pochopil (a také, že ho odstraňuje jen do restartu)
  4. Můj java kód špatně není protože to jede z windowsů a vzhledem k tomu, že stránka nabízí tipy k rozjetí na linuxu, které jsem podle svého dodržel tak bych tipoval, že to autor na linuxech skoušel.
    Jinak ještě existuje jedno alternativní řešení, které mi však příliš nevyhovuje (nemá výhody d2xx např.: listování zařízení) a to totiž používání FTDI jako sériového portu z linuxu a d2xx z windowsů.
    Děkuji za Váš čas

EDIT: Ta aplikace má zatím jen jednu funkci: vypsat všechna připojená FTDI, která jsou přístupná přes d2xx. Na linuxu to prostě vypíše, že žádné FTDI není připojeno a na windows to správně vypíše to 1 moje připojené zařízení. Je to přímo zkopírovaný kód z odkazovaných stránek.

Dobre, a kdyz vrazis ten provodnik do pocitace pod linuxem, co se ti vypise do dmesg resp. /var/log/messages? (to udev pravidlo zrus, podle me nema zadny smysl)

$dmesg

[ 898.451047] usb 6-1: new full-speed USB device number 6 using uhci_hcd
[ 898.636088] usb 6-1: New USB device found, idVendor=0403, idProduct=6015
[ 898.636094] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 898.636098] usb 6-1: Product: FT231X USB UART
[ 898.636101] usb 6-1: Manufacturer: FTDI
[ 898.636104] usb 6-1: SerialNumber: DB005W1J
[ 898.643147] ftdi_sio 6-1:1.0: FTDI USB Serial Device converter detected
[ 898.643191] usb 6-1: Detected FT-X
[ 898.643195] usb 6-1: Number of endpoints 2
[ 898.643199] usb 6-1: Endpoint 1 MaxPacketSize 64
[ 898.643202] usb 6-1: Endpoint 2 MaxPacketSize 64
[ 898.643205] usb 6-1: Setting MaxPacketSize 64
[ 898.645326] usb 6-1: FTDI USB Serial Device converter now attached to ttyUSB0

EDIT:
Ještě jednou jsem se to pokusil najít na googlu a našel jsem oficiální manuál k d2xx:
http://www.ftdichip.com/Support/Documents/AppNotes/AN_220_FTDI_Drivers_Installation_Guide_for_Linux%20.pdf
A i tam píšou:
$ rmmod usbserial
$ rmmod ftdi_sio
s tím, že jsou VCP a D2xx nekompatibilní takže problém bude v tom, že nelze vypnout vcp driver

Proletl jsem ten dokument - je tam psano, ze pro FTDI jsou dva ovladace, ten co je v jadre (ftdi_sio) a D2xx. D2xx se da stahnout na http://www.ftdichip.com/Drivers/D2XX.htm - tzn. aby ti D2xx fungovalo na linuxu, musis mit zkompilovany tento driver. Co se tyce ten javy, tak nevim zda tedy vyzaduje tento driver, ci implementuje to same jako kod, ktery se da stahnout z ftdichip.com

Java driver nevyžaduje. Neměla by. Ale rozhodně: pokusil jsem se zkompilovat a spustit ty Céčkové příklady na stránkách FTDI. Zkompilovat se mi je povedlo (žádný errory atd.) a když jsem je spustil tak to dopadlo stejně jako s javou: nic to nenašlo. Dle mého je tedy problém v tom, že D2xx proprietární driver je nekompatibilní s reverse-engineered driver zakomponovaném v případě fedory přímo v jádře. Teď uvažuji o tom, že bych si kvůli tomu zkompiloval kernel bez usbserial.
A měl jste pravdu usbserial je přímo v jádře:
$ modprobe -r usbserial
modprobe: FATAL: Module usbserial is builtin.
A někde jsem také našel, že ubuntu právě z tohoto důvodu má usbserial jako externí modul (ne že bych kvůli tomu chtěl přejít na ubuntu) a tipuji, že to tak bude i na Debianu, který je druhou FTDI testovanou distribucí :frowning:

Fuj to jsem si oddechl. Nakonec jsem to vyřešil i bez rekompilace kernelu:
$ sudo echo “alias usbserial off” >> /etc/modprobe.conf
zablokuje načítání modulu usbserial do kernelu a to i přesto, že je built-in
pak už stačí jen
$ rmmod ftdi_sio
který odstraní modul ftdi_sio (ale jen do znovuzapojení zařízení)
Pak už Céčkový program funguje (javu jsem ještě neskoušel) zatím jen pod superuserem.
Bohužel jsem si tímto krokem zablokoval sériový mód (nemůžu použít už zmiňovanou putty)
Ještě napíšu jak se mi to povedlo rozběhat pod javou a ne-su

Muzes zkusit dat do bugzilly pozadavek na vycleneni usbserial do vlasniho modulu.

Nejsem si ale jist, ze je usbserial nejaky reverse engineering driver, podle me je to nejake univerzalni pozadi (backend) pro seriova zarizeni na USB, pouziva se i pro modemy atd., ktere nemusi vubec byt zalozene na FTDI. Jak je videt, bude tedy multiplatformnost aplikace, byt s pouzitim D2xx, diskutabilni, protoze aby to fungovalo, tak by uzivatel musel zakaza usbserial a treba mu prestane fungovat 3G modem atd. coz asi neni optimalni.

To je fakt. Usbserial asi není reverse-engineer pro ftdi.
No rozhodně jsem konečně rozjel to udev pravidlo abych k těm zařízením mohl přistupovat i jako ne-root. Pokud se později setkám s něčím, co bude také vyžadovat usbserial nebo dokonce ftdi_sio tak už to nějak pořeším asi přepsáním mojí aplikace pro fungování s vcp. Rozhodně díky za pomoc
P.S. Jdu otestovat tu javu :slight_smile:
EDIT:
Z javy to nejede ale toto už není vina systému driverů nebo čeho ještě. Toto je vina toho, že je to pravděpodobně otestované hlavně pro windows :frowning: Ale našel jsem fórum, kam někdo psal a nakonec to rozjel tak nevím.