[pso] Răspuns: [USB core]Intervalul intre doua USB frame-uri
Alex Stefan
alexandru.stefan at cti.pub.ro
Tue Jul 5 08:01:34 EEST 2011
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
More information about the pso
mailing list