USBD_SHORT_XFER_OK is being set by libusb. The problem is that input data is queuing up in the background (from what I can tell). I have a buffer full of status messages. What I need is a way to stop the polling in the background from queuing the messages.

With debugging on, ugen shows that it gets 32 characters and is in sync with my app until finally there is a 16 byte read.

With usb debugging on I can see a constant stream of 16 byte reads on EP1 (see below), per the polling interval.

For a mouse or keyboard this would be ideal, but in my case I only want the current reading.

Rob.

Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: pipe=0xc3c97900 xfer=0xc3c19400 status=0 actlen=16 Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: repeat=1 new head=0xc3c19400 Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: pipe=0xc3c97900 xfer=0xc3c19400 status=0 actlen=16 Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: repeat=1 new head=0xc3c19400 Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: pipe=0xc3c97900 xfer=0xc3c19400 status=0 actlen=16 Jul 22 09:05:31 bsdtest kernel: usb_transfer_complete: repeat=1 new head=0xc3c19400




Rob.


On Jul 22, 2006, at 2:08 AM, Hans Petter Selasky wrote:

On Friday 21 July 2006 21:46, rnilsson wrote:
I am working on porting owfs over to FreeBSD, and I've run into a strange
issue when I'm trying to read the status of a device (DS2490
http://pdfserv.maxim-ic.com/en/ds/DS2490.pdf) on EP 1, an interrupt IN
endpoint.

One of the routines (a data request) writes data to ep 2, sends a control message that indicates a read from bus operation, and then gets status on
EP 1, waiting for a register to reflect the proper number of bytes
available for read. EP 1 can return up to 32 bytes of data, but will only
provide 16 bytes unless there is an error condition.

On Linux this works correctly. Each call to read EP1 will return when there is new data available from the device. On the FreeBSD side, from the time a control message is issued, status messages on EP1 start queuing up.
Each read will return 32 bytes of data (or more if I make the buffer
larger) until I exhaust the buffer - the only way I can get only the 16 expected. This can take anywhere from 5 to 50 loops reading EP1 to clear out the data, depending on the time between the control command and the
read.

I thought the USB device (INTERRUPT mode endpoint) was supposed to wait until data was requested to send it's information. This is running through libusb, and I've turned on debug in the ugen driver to make sure it really
is interrupt driven.

Is there some setting that causes this type of queing of interrupt data?
I've seen other messages about the timeout not working with interrupt
reads, so is this device related?
Where can I go from here?

The buffer you allocate should be 32 bytes long. Then you must use the flag USBD_SHORT_XFER_OK. Then you check the "xfer->actlen" after that the transfer
has happened. Isn't this 16 bytes ?

--HPS

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to