USB: how transmit more than wMaxPacketSize of bulk data in one submission ?

Oct 11, 2006 0 Replies

Hi fellows,



I'm confused about the different size aspects, when setting up a USB transmission. Here's a brief example of what I want:



bulk_size is 512 bytes (USB 2.0) (endpoint->wMaxPacketSize) data size is 1000 bytes



From LDD I learnt, that it should be possible to set up the URB so that all data are delivered in one bunch and the core parts between the submission and the completion callback do the division and transmissions in adequate blocks. So I want to hand over to the URB a buffer containing the 1000 bytes, and receive an alertion (completion callback handler), when all 1000 bytes are out.



To transmit 512 bytes, I would do this: ------------------------- urb = usb_alloc_urb(0,GFP_KERNEL); buf = usb_buffer_alloc (udev, bulk_size, GFP_KERNEL, &urb->transfer_dma); memcpy(buf,data,bulk_size); usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(..), buf, bulk_size, callback,dev); urb->transfer_buffer_length = bulk_size; usb_submit_urb(urb, GFP_KERNEL);



and then, in callback handler (or at least after that): usb_buffer_free(udev, bulk_size, buf, urb->transfer_dma); usb_free_urb(urb); ------------------------------ Please check the '?'s. What must be filled in? Are my guesses ok? urb = usb_alloc_urb(0,GFP_KERNEL); buf = usb_buffer_alloc (udev, ?data_size?, GFP_KERNEL, &urb->transfer_dma); memcpy(buf,data,?data_size?); usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(..), buf, ?data_size?, callback,dev); urb->transfer_buffer_length = ?bulk_size?; usb_submit_urb(urb, GFP_KERNEL);



and then, in callback handler (or at least after that): usb_buffer_free(udev, ?data_size?, buf, urb->transfer_dma); usb_free_urb(urb); ------------------------------ What happens after submission? First packet goes out. And then? Is the second packet (with the rest of the data) automatically set up and submitted internally, before the callback handler is launched? Or is any further action required from my side?



I'd appreciate, if anybody could shed some light onto this. Bernhard



Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required