This is an old revision of the document!
Includes
#include <dev/usb/usb.h> #include <dev/usb/usbdi.h>
usb_error_t usb_pipe_open(struct usb_device *udev,
const uint8_t *ifaces, struct usb_pipe **,
const struct usb_config *, int count,
void *priv);
void usb_pipe_halt(struct usb_pipe *);
void usb_pipe_ready(struct usb_pipe *);
void usb_pipe_drain(struct usb_pipe *);
void usb_pipe_close(struct usb_pipe **, int count);
void usb_clear_stall(struct usb_pipe *);
struct usb_urb *usb_alloc_urb(struct usb_pipe *, int flags);
int usb_set_frame_data(struct usb_urb *, int index, void *, int len);
int usb_copyin_urb(struct usb_urb *, void *, int offset, int len);
int usb_copyout_urb(struct usb_urb *, void *, int offset, int len);
void usb_cancel_urb(struct usb_urb *);
void usb_free_urb(struct usb_urb *);
void usb_submit_urb(struct usb_pipe *, struct usb_urb *, int flags);
Example
ep_config {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
.bufsize = MCLBYTES,
.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
.callback = write_callback,
.timeout = 5000, /* ms */
.min_urb = 8,
} {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = MCLBYTES,
.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
.callback = read_callback,
.min_urb = 8,
}
attach()
error = usb_pipe_open(uaa->device,
&iface_index, sc->sc_xfer, ep_config,
XXX_N_TRANSFER, sc);
detach()
usb_pipe_close(sc->sc_xfer, XXX_N_TRANSFER);
init()
usb_pipe_ready(sc->sc_xfer);
start(m)
urb = usb_alloc_urb(sc->sc_xfer, 0);
usb_set_frame_data(urb, 0, m->data, m->len);
usb_set_priv(urb, m);
usb_submit_urb(urb);
write_callback(urb, error)
pipe = urb->pipe;
if (error)
usb_clear_stall(pipe);
m = usb_get_priv(urb);
usb_free_urb(urb);
m_freem(m);