[pso] Răspuns: Răspuns: [USB core]Intervalul intre doua USB frame-uri

Andrei Voinescu voinescu.andrei at gmail.com
Tue Jul 5 14:06:56 EEST 2011


Salut,

My 2cents,

125 de microsecunde este durata unui microframe de USB 2.0.
Host-ul face scheduling în cadrul acestui microframe pentru tranzacțiile
care trebuiesc făcute (cu toate {device}x{endpoint} de pe bus). Ceea ce
presupun (guesstimate) că se întâmplă este că usb_control_msg adaugă o
tranzacție pe Endpoint-ul 0 al device-ului pentru microframe-ul următor.
N-ar fi exclus ca o singură tranzacție cu Endpoint-ul 0 al unui device să
fie permisă per microframe.

Problema este că și pentru endpoint-uri cu garanții de latență (Interrupt
Endpoint), acea latență este multiplu de 125 us pentru high-speed. Obviously
poți să verifici cu usbmon+wireshark, să vezi ce endpoint-uri sunt folosite
(ftdi parcă are un bulk endpoint OUT și un endpoint 0 pentru host->device).

Alternativa ar fi să folosești placa de PM, cum zicea Matei. Bănuiesc că
redesigning the hardware is out of the question, pentru că atunci ar fi
soluții.

If all else fails, aștepți FTDI de USB 3.0 :) (LE: or not, latența pe
Interrupt transfers e aceeași)

Baftă!

Andrei


2011/7/5 Matei ŢENE <matei.tene at cti.pub.ro>

> Salut!
>
> Nu vad o solutie simpla pentru ceea ce vrei sa faci. Desi nu-l cunosc,
> banuiesc ca e un motiv bun pentru care pregatirea unui miniframe USB dureaza
> 125 us.
> S-ar putea sa fii nevoit sa schimbi abordarea.
>
> Incearca cu Synchronous sau Asynchronous Bit Banging, care folosesc 4 din
> cei 8 biti CBUS:
>
> http://www.ftdichip.com/Support/Documents/AppNotes/AN_232R-01_Bit_Bang_Mode_Available_For_FT232R_and_Ft245R.pdf
> Application note-ul mentioneaza  limitarea de care te-ai lovit pentru CBUS
> Bit Banging.
>
> Eu unul tot cu placa de PM as cauta sa rezolv problema:
> Daca as putea face configurarile ca sa pot avea 2 slaves pe magistrala SPI,
> as pune firmware-ul pe cardul SD si as face operatiile astfel:
> Bucata firmware de pe SD --SPI--> Buffer Atmega --SPI--> Device
>
> Altfel, daca ai o placa video Intel, poti sa scoti prin portul VGA o
> interfata I2C (two-wire interface):
> http://www.paintyourdragon.com/?p=43
> Pe Linux ai pachetul i2c-tools. Acesta contine modulul i2c-dev, care-ti
> creeaza un fisier in /dev pt fiecare magistrala I2C disponibila in sistem,
> inclusiv cea VGA DDC.
> Cu putina programare, o sa obtii o configuratie de genul:
> PC --I2C--> Atmega --UART si SPI --> Device.
> E adevarat, de data asta esti limitat la viteza magistralei I2C .. dar
> oricum e mai bine decat ce ai acum.
>
> Alte idei nu am.
> Succes!
>
> Matei
> ________________________________________
> De la: pso-bounces at cursuri.cs.pub.ro [pso-bounces at cursuri.cs.pub.ro]
> &#206;n numele Alex Stefan [alexandru.stefan at cti.pub.ro]
> Trimis: 5 iulie 2011 08:01
> Către: pso at cursuri.cs.pub.ro
> Subiect: Re: [pso]      Răspuns: [USB core]Intervalul intre doua USB
> frame-uri
>
> Matei ŢENE <matei.tene at ...> writes:
>
> >
> > Salut!
> >
> > Daca nu vrei sa-ti implementezi propriul driver pt FTDI, ai la dispozitie
> doar
> cele 2 metode:
> > a) folosesti libftdi
> > b) utilizezi unul din fisierele /dev/ttyUSB* pe care ti le creeaza
> driver-ul
> (am folosit FT2232D, care are
> > 2 interfete seriale, deci ttyUSB0 si ttyUSB1).
> >
> > Eu am testat ambele variante, si am tras concluzia ca sunt echivalente
> (i.e.
> dadeau aceleasi erori de
> > kernel acum un an, cand era un bug in driver).
> > Nu am experienta in utilizarea SPI. Citind pe wiki, am inteles ca la
> fiecare
> tick de ceas ai transmisie full
> > duplex a unui bit intre master si slave (deci 1 bit dus si 1 bit intors =
> 2
> biti transmisi).
> > Clock frquencies are "commonly in the range of 1–70 MHz". Deci ai maxim
> 2*70MegaBiti pe secunda, ceea ce
> > este sub viteza maxima a USB 2.0 (60 MegaBytes/secunda), dar este
> problematic,
> daca nu imposibil, pentru RS232.
> > Deci daca ai o problema de viteza, nu cred ca USB-ul este sursa, ci
> device-ul
> cu care vrei sa comunici pe seriala.
> > O idee, la care banuiesc ca te-ai gandit, ar fi sa incerci sa maresti
> baud
> rate-ul, atat in configurarea
> > device-ului cat si al host-ului, si vezi daca asta rezolva problema.
> >
> > Altfel, ai putea sa incerci sa conectezi placa de PM la FTDI, sa-i spui
> pe
> seriala ce vrei sa faca, si ea sa se
> > ocupe de comunicatia SPI prin interfata proprie (dar esti limitat la
> maxim 16
> MHz).
> >
> > Succes!
> > Matei
> > ________________________________________
> > De la: pso-bounces <at> cursuri.cs.pub.ro [pso-bounces <at>
> cursuri.cs.pub.ro]
> În numele Alex Stefan [alexandru.stefan <at> cti.pub.ro]
> > Trimis: 4 iulie 2011 18:30
> > Către: pso <at> cursuri.cs.pub.ro
> > Subiect: [pso] [USB core]Intervalul intre doua USB frame-uri
> >
> > Salut,
> >
> > Apelez la ajutorul vostru si in 'vacanta' :).
> >
> > Am un chip FTDI conectat prin USB. Biblioteca pe care o folosesc pentru a
> > comunica cu chip-ul (libftdi) apeleaza 'usb_control_msg()', M-am uitat in
> > functia din kernel si ea initiaza cate un URB (USB RequestBlock) pentru
> fiecare
> > operatie.
> >
> > Problema e ca timingul e crucial (mesajele transmise catre FTDI sunt
> folosite
> > pentru a implementa software protocolul SPI) si sunt curios daca e vreo
> solutie
> > ca driver-ul USB sa transmita frame-urile mai rapid.
> >
> > Mersi,
> > Alex
> >
> > _______________________________________________
> > http://elf.cs.pub.ro/so2/wiki/resurse/lista-discutii
> > _______________________________________________
> > http://elf.cs.pub.ro/so2/wiki/resurse/lista-discutii
>
> Sunt obligat sa folosesc libftdi. Comunicatia nu se desfasoara pe portul
> principal al chip-ului FTDI ci pe CBUS (portul principal este conectat la
> UART-
> ul celuilalt chip. ) Ce fac eu pe CBUS este sa implementez software SPI
> (done
> that). Chestia e ca, libftdi (si mai departe chipul FTDI probabil) nu
> permit
> pentru CBUS decat 2 functii:
> ftdi_set_bitmode - seteaza pinii dupa masca pe care o pasez ca parametru
> ftdi_read_pins - citeste starea pinilor .
>
> In cazul celuilalt port, unde functiile sunt un pic mai complexe, as fi
> putut
> pasa o secventa de masti, seta un baudrate, iar el sa-i transmita chip-ului
> FTDI
> toata secventa de masti intr-o singura operatie. Chip-ul mai departe nu ar
> fi
> trebuit decat sa ia pe rand acele masti din buffer si sa le seteze la
> frecventa
> stabilita. Pe CBUS acest lucru nu e posibil.
>
> Deci, pentru a transmite (si receptiona) un singur bit prin SPI, eu fac 2
> apeluri ftdi_set_bitmode si un apel ftdi_read_pins. Oricare dintre cele 2
> functii imi introduce un delay de ~125us. Care, iti dai seama, se
> transforma in
> ~3ms/byte transmis. Cum eu trebuie sa transmit un firmware intreg prin SPI
> (~30KB) + comenzile aferente am ajuns la un timp de flashuire de 5 minute
> pentru
> 10 KB. Ceea ce e inacceptabil.
>
> Despre SPI, ceasul acestuia e dat exclusiv de master (chip-ul FTDI la mine)
> si
> il fac manual, tot prin bit-banging.
>
> Ca sa concluzionez, implementarea functioneaza, doar ca prea incet. Asta
> pentru
> ca la fiecare schimbare de stare a pinilor (scriere/citire) mi se introduce
> din
> apelul functiei 'usb_control_msg' (care este apelata de ftdi_set_bitmode si
> ftdi_read_pins) un delay de ~125 us. Eu caut o solutie sa fac driver-ul de
> USB
> sa trimita frame-uri de date mai repede de 125 us.
>
> Mersi,
> Alex
>
>
> _______________________________________________
> http://elf.cs.pub.ro/so2/wiki/resurse/lista-discutii
> _______________________________________________
> http://elf.cs.pub.ro/so2/wiki/resurse/lista-discutii
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20110705/750c9c58/attachment-0001.htm>


More information about the pso mailing list