[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