Add support for streams to LibUSB v2.0.

MFC after:	2 weeks
This commit is contained in:
Hans Petter Selasky 2012-08-13 18:10:52 +00:00
parent e9cec01683
commit 07b6ce3ba9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239239
5 changed files with 43 additions and 14 deletions

View File

@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd October 14, 2010
.Dd August 13, 2012
.Dt LIBUSB20 3
.Os
.Sh NAME
@ -48,6 +48,7 @@ USB access library (libusb -lusb)
.Fn libusb20_tr_close "struct libusb20_transfer *xfer"
.Ft int
.Fn libusb20_tr_open "struct libusb20_transfer *xfer" "uint32_t max_buf_size" "uint32_t max_frame_count" "uint8_t ep_no"
.Fn libusb20_tr_open_stream "struct libusb20_transfer *xfer" "uint32_t max_buf_size" "uint32_t max_frame_count" "uint8_t ep_no" "uint16_t stream_id"
.Ft struct libusb20_transfer*
.Fn libusb20_tr_get_pointer "struct libusb20_device *pdev" "uint16_t tr_index"
.Ft uint16_t
@ -284,6 +285,16 @@ Non-zero return values indicate a LIBUSB20_ERROR value.
.
.Pp
.
.Fn libusb20_tr_open_stream
is identical to
.Fn libusb20_tr_open
except that a stream ID can be specified for BULK endpoints having
such a feature.
.Fn libusb20_tr_open
can be used to open stream ID zero.
.
.Pp
.
.Fn libusb20_tr_get_pointer
will return a pointer to the allocated USB transfer according to the
.Fa pdev

View File

@ -154,6 +154,13 @@ libusb20_tr_close(struct libusb20_transfer *xfer)
int
libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
uint32_t MaxFrameCount, uint8_t ep_no)
{
return (libusb20_tr_open_stream(xfer, MaxBufSize, MaxFrameCount, ep_no, 0));
}
int
libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id)
{
uint32_t size;
uint8_t pre_scale;
@ -188,7 +195,7 @@ libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
memset(xfer->ppBuffer, 0, size);
error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
MaxFrameCount, ep_no, pre_scale);
MaxFrameCount, ep_no, stream_id, pre_scale);
if (error) {
free(xfer->ppBuffer);

View File

@ -202,6 +202,7 @@ struct libusb20_quirk {
/* USB transfer operations */
int libusb20_tr_close(struct libusb20_transfer *xfer);
int libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no);
int libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no, uint16_t stream_id);
struct libusb20_transfer *libusb20_tr_get_pointer(struct libusb20_device *pdev, uint16_t tr_index);
uint16_t libusb20_tr_get_time_complete(struct libusb20_transfer *xfer);
uint32_t libusb20_tr_get_actual_frames(struct libusb20_transfer *xfer);

View File

@ -110,7 +110,7 @@ typedef int (libusb20_set_config_index_t)(struct libusb20_device *pdev, uint8_t
typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev);
/* USB transfer specific */
typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no, uint8_t pre_scale);
typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id, uint8_t pre_scale);
typedef int (libusb20_tr_close_t)(struct libusb20_transfer *xfer);
typedef int (libusb20_tr_clear_stall_sync_t)(struct libusb20_transfer *xfer);
typedef void (libusb20_tr_submit_t)(struct libusb20_transfer *xfer);

View File

@ -741,9 +741,13 @@ ugen20_process(struct libusb20_device *pdev)
static int
ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
uint32_t MaxFrameCount, uint8_t ep_no, uint8_t pre_scale)
uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id,
uint8_t pre_scale)
{
struct usb_fs_open temp;
union {
struct usb_fs_open fs_open;
struct usb_fs_open_stream fs_open_stream;
} temp;
struct usb_fs_endpoint *fsep;
if (pre_scale)
@ -754,20 +758,26 @@ ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
fsep = xfer->pdev->privBeData;
fsep += xfer->trIndex;
temp.max_bufsize = MaxBufSize;
temp.max_frames = MaxFrameCount;
temp.ep_index = xfer->trIndex;
temp.ep_no = ep_no;
temp.fs_open.max_bufsize = MaxBufSize;
temp.fs_open.max_frames = MaxFrameCount;
temp.fs_open.ep_index = xfer->trIndex;
temp.fs_open.ep_no = ep_no;
if (ioctl(xfer->pdev->file, USB_FS_OPEN, &temp)) {
return (LIBUSB20_ERROR_INVALID_PARAM);
if (stream_id != 0) {
temp.fs_open_stream.stream_id = stream_id;
if (ioctl(xfer->pdev->file, USB_FS_OPEN_STREAM, &temp.fs_open_stream))
return (LIBUSB20_ERROR_INVALID_PARAM);
} else {
if (ioctl(xfer->pdev->file, USB_FS_OPEN, &temp.fs_open))
return (LIBUSB20_ERROR_INVALID_PARAM);
}
/* maximums might have changed - update */
xfer->maxFrames = temp.max_frames;
xfer->maxFrames = temp.fs_open.max_frames;
/* "max_bufsize" should be multiple of "max_packet_length" */
xfer->maxTotalLength = temp.max_bufsize;
xfer->maxPacketLen = temp.max_packet_length;
xfer->maxTotalLength = temp.fs_open.max_bufsize;
xfer->maxPacketLen = temp.fs_open.max_packet_length;
/* setup buffer and length lists using zero copy */
fsep->ppBuffer = libusb20_pass_ptr(xfer->ppBuffer);