urbh in general (should this be a transfer handle?)
find/get devices API
config struct/function naming
+typedef _cb or _cb_fn or _cb_t?
devh->fd = fd;
devh->dev = dev;
list_add(&devh->list, &open_devs);
+ usbi_add_pollfd(fd, POLLOUT);
return devh;
}
static void do_close(struct libusb_dev_handle *devh)
{
- close(devh->fd);
+ usbi_remove_pollfd(devh->fd);
+ close(devh->fd);
}
API_EXPORTED void libusb_close(struct libusb_dev_handle *devh)
/* create array */
ret = calloc(cnt, sizeof(struct libusb_pollfd));
+ if (!ret)
+ return -ENOMEM;
/* add fds */
list_for_each_entry(devh, &open_devs, list) {
* are always placed at the very end. */
static struct list_head flying_urbs;
+/* user callbacks for pollfd changes */
+static libusb_pollfd_added_cb fd_added_cb = NULL;
+static libusb_pollfd_removed_cb fd_removed_cb = NULL;
+
void usbi_io_init()
{
list_init(&flying_urbs);
+ fd_added_cb = NULL;
+ fd_removed_cb = NULL;
}
static int calculate_timeout(struct libusb_urb_handle *urbh,
return 0;
}
+#include <stdio.h>
int handle_transfer_completion(struct libusb_dev_handle *devh,
struct libusb_urb_handle *urbh, enum libusb_urb_cb_status status)
{
if (urb->type == USB_URB_TYPE_CONTROL) {
libusb_ctrl_cb_fn callback = urbh->callback;
+ int i;
+ printf("ctrl completed status %d\n", status);
+ for (i = 0; i < urbh->transferred + sizeof(struct libusb_ctrl_setup); i++)
+ printf("%02x ", ((unsigned char *) urb->buffer)[i]);
+ printf("\n");
if (callback)
callback(devh, urbh, status, urb->buffer,
urb->buffer + sizeof(struct libusb_ctrl_setup), urbh->transferred,
free(urbh);
}
+API_EXPORTED void libusb_set_pollfd_notifiers(libusb_pollfd_added_cb added_cb,
+ libusb_pollfd_removed_cb removed_cb)
+{
+ fd_added_cb = added_cb;
+ fd_removed_cb = removed_cb;
+}
+
+void usbi_add_pollfd(int fd, short events)
+{
+ usbi_dbg("add fd %d events %d", fd, events);
+ if (fd_added_cb)
+ fd_added_cb(fd, events);
+}
+
+void usbi_remove_pollfd(int fd)
+{
+ usbi_dbg("remove fd %d", fd);
+ if (fd_removed_cb)
+ fd_removed_cb(fd);
+}
+
/* async I/O */
-struct libusb_pollfd {
- int fd;
- short events;
-};
-
libusb_urb_handle *libusb_async_control_transfer(libusb_dev_handle *devh,
struct libusb_control_transfer *transfer, libusb_ctrl_cb_fn callback,
void *user_data, unsigned int timeout);
libusb_urb_handle *urbh);
void libusb_urb_handle_free(libusb_urb_handle *urbh);
-int libusb_poll_timeout(struct timeval *tv);
-int libusb_poll(void);
-int libusb_get_next_timeout(struct timeval *tv);
-size_t libusb_get_pollfds(struct libusb_pollfd **pollfds);
-
/* sync I/O */
int libusb_control_transfer(libusb_dev_handle *devh,
struct libusb_bulk_transfer *transfer, int *transferred,
unsigned int timeout);
+/* polling and timeouts */
+struct libusb_pollfd {
+ int fd;
+ short events;
+};
+
+int libusb_poll_timeout(struct timeval *tv);
+int libusb_poll(void);
+int libusb_get_next_timeout(struct timeval *tv);
+size_t libusb_get_pollfds(struct libusb_pollfd **pollfds);
+
+typedef void (*libusb_pollfd_added_cb)(int fd, short events);
+typedef void (*libusb_pollfd_removed_cb)(int fd);
+void libusb_set_pollfd_notifiers(libusb_pollfd_added_cb added_cb,
+ libusb_pollfd_removed_cb removed_cb);
+
#ifdef __cplusplus
}
#endif
extern struct list_head open_devs;
void usbi_io_init(void);
+void usbi_add_pollfd(int fd, short events);
+void usbi_remove_pollfd(int fd);
int usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest);
int usbi_parse_configuration(struct libusb_config_descriptor *config,