From: Juergen B. <ju...@kr...> - 2010-04-26 09:02:18
|
Hi list, currently I'm trying to increase transfer speed from my FTDI 245 based application to the host (instead of using the very slow tty kernel implementation). This FTDI 245 device will transfer the data my application processor writes into its FIFO in chunks of 62 bytes. The FTDI 245 device itself adds two modem status bytes to the transfer, so the full transfer can be 64 bytes. On the host side I have to discard these additional modem bytes. But now I'm confused about the way libusb1 does this transfer: The API doc tells me, there can be a LIBUSB_ERROR_TIMEOUT return value per transfer. But it seems not a real error message, it only occurs if the transfer was splitted (with data already transferred). But if it was splitted: Do I receive the modem status bytes with the next call again, or do I receive only the remaining bytes to complete the transfer? This is the way, I currently trigger the transfer: rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, buffer, 64, &read, 5000); I tried to understand how libftdi handles it, but it is still not clear to me, how to sort out the modem status bytes correctly. Regards, Juergen |
From: Xiaofan C. <xia...@gm...> - 2010-04-26 09:37:32
|
On Mon, Apr 26, 2010 at 4:35 PM, Juergen Beisert <ju...@kr...> wrote: > rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, > buffer, 64, &read, 5000); > > I tried to understand how libftdi handles it, but it is still not clear to me, > how to sort out the modem status bytes correctly. > It seems they just skip these two bytes. http://developer.intra2net.com/git/?p=libftdi-1.0;a=blob_plain;f=src/ftdi.c;hb=HEAD http://developer.intra2net.com/git/?p=libftdi;a=blob;f=src/ftdi.c;hb=HEAD -- Xiaofan http://mcuee.blogspot.com |
From: Juergen B. <ju...@kr...> - 2010-04-26 16:40:15
|
On Montag, 26. April 2010, Xiaofan Chen wrote: > On Mon, Apr 26, 2010 at 4:35 PM, Juergen Beisert <ju...@kr...> wrote: > > rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, > > buffer, 64, &read, 5000); > > > > I tried to understand how libftdi handles it, but it is still not clear > > to me, how to sort out the modem status bytes correctly. > > It seems they just skip these two bytes. Yes, they skip them. And I want to skip them also. But how to guess what bytes? When the libusb_bulk_transfer() call returns happy (return code = 0) I expect it forwards 0 bytes or at least 2 bytes to me (the two modem status bytes) and maybe at least one additional byte of real data I'm interested in. |-status-|-- real data --| So, I can skip the |-status-| bytes. But what happens when libusb_bulk_transfer() returns LIBUSB_ERROR_TIMEOUT and I call libusb_bulk_transfer() later again? Do I receive: 1st call: |-status-|-- real data part 1 --| 2nd call: |-- real data part 2--| (=remaining data) or 1st call: |-status-|-- real data part 1--| 2nd call: |-status-|-- real data part 2--| (full data again) ? Juergen |
From: Juergen B. <ju...@kr...> - 2010-04-26 17:17:25
|
On Montag, 26. April 2010, Xiaofan Chen wrote: > On Mon, Apr 26, 2010 at 4:35 PM, Juergen Beisert <ju...@kr...> wrote: > > rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, > > buffer, 64, &read, 5000); > > > > I tried to understand how libftdi handles it, but it is still not clear > > to me, how to sort out the modem status bytes correctly. > > It seems they just skip these two bytes. > > http://developer.intra2net.com/git/?p=libftdi-1.0;a=blob_plain;f=src/ftdi.c >;hb=HEAD > http://developer.intra2net.com/git/?p=libftdi;a=blob;f=src/ftdi.c;hb=HEAD Don't bother with my question. I found this: http://lists.apple.com/archives/usb/2010/Feb/msg00042.html and it claryfies the handling. Thanks, Juergen |
From: Peter S. <pe...@st...> - 2010-04-26 17:44:06
|
Juergen Beisert wrote: > > > rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, > > > buffer, 64, &read, 5000); > > Don't bother with my question. I found this: > http://lists.apple.com/archives/usb/2010/Feb/msg00042.html > and it claryfies the handling. Well, that's Apple's API, not neccessarily libusb. I would expect that a timeout from libusb means that the device did not send any data at all. //Peter |
From: Juergen B. <ju...@kr...> - 2010-04-27 09:26:31
|
On Montag, 26. April 2010, Peter Stuge wrote: > Juergen Beisert wrote: > > > > rc = libusb_bulk_transfer(usb_handle, FTDI_DEFAULT_IN_EP, > > > > buffer, 64, &read, 5000); > > > > Don't bother with my question. I found this: > > http://lists.apple.com/archives/usb/2010/Feb/msg00042.html > > and it claryfies the handling. > > Well, that's Apple's API, not neccessarily libusb. But it makes me understand the modem status bytes re-movement I found in the libftd and kernel's FTDI driver. > I would expect that a timeout from libusb means that the device did > not send any data at all. Hmm, my understanding is: If I try to read via bulk 256 bytes and the device answers with three 64 byte transfers and one 8 byte transfer the call returns successfully with 200 bytes received (and does not wait for the remaining 56 bytes). If the timout happens while the third 64 byte transfer, it also returns, but with only 192 bytes received. BTW: And for the 3x64+8 byte transfer the ftdi and kernel routines removing the modem status bytes at offset 0/1, 64/65, 128/129 and 192/193. Regards, Juergen |