[usb linux ISO] 1 grande image : plusieurs urb's ou un seul grand ?

1 grande image : plusieurs urb's ou un seul grand ? [usb linux ISO] - C - Programmation

Marsh Posté le 08-02-2005 à 19:12:05    

Bonjour à tous. Je suis sur la confection d'un driver de camera en usb, sous linux 2.4.20-8 et je me pose la question suivante :
 
Je dois récupérer une image 1024*1024 ... en unsigned int, soit une taille totale de 1024*1024*4 = 4194304 octets. Je précise que je ne cherche pas à faire un flux continue, je veux juste récupérer une image.
 
Sachant que le endpoint iso de ma caméra possède un wMaxPacketSize de 644, je dois donc faire passer 4194304/644 = 6512 packets entiers (plus 1 non entier).
 
Je vais donc créer mon URB et le soumettre ... mais je me demandais s'il fallait que je soumette :  
- un seul urb, donc le transfert_buffer fait 4194304 octets et le number_of_packets fait 6513 (auquel cas le core gèrerait tout seul le fait d'avancer dans le buffer et d'y copier au fur et à mesure les octets du endpoint ... est-ce le cas ???)
- ou 6513 URB's ... tous attachés les uns aux autres par le next, et dont le transfert_buffer fait 644 octets et le number_of_packets fait 1. Ce serait alors à moi de récupérer les octets situés dans chacun des urb.
 
Je passe peut-etre à coté d'une notion évidente mais entre toutes ces docs, je me suis un peu perdu. Si certains ont la réponse, cela m'arrangerai énormément. Merci d'avance à tous !

Reply

Marsh Posté le 08-02-2005 à 19:12:05   

Reply

Marsh Posté le 09-02-2005 à 14:52:09    

Bon je pense avoir ma réponse mais est-ce que quelqu'un pourrait me la confirmer ? :
 
Je vais utiliser 6513 urb's avec pour chacun :
urb[i].transfer_buffer_length = 644;  
urb[i].number_of_packets=1;  
urb[i].next=urb[i+1]; //sauf pour le dernier
 
ensuite, je fais un submit_urb de chacun et puis j'attend leur completion. A chaque completion, je copie le transfert_buffer de l'urb au bon offset dans mon image.
 
Est-ce bon ? Merci d'avance !

Reply

Marsh Posté le 09-02-2005 à 16:40:58    

Je pense m'être craqué, il apparait etre OK d'utiliser un seul URB avec :
urb[i].transfer_buffer_length = 4194304;  
urb[i].number_of_packets=6513;
 
... du coup, je me pose une petite question sur l'utilisation de vmalloc plutot que kmalloc (pour allouer mon buffer énorme de 4Mo, dans un contexte kernel, ... mais je vais la poser dans un nouveau post !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed