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

Matei ŢENE matei.tene at cti.pub.ro
Tue Jul 5 12:47:34 EEST 2011


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] Î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


More information about the pso mailing list