diff options
author | Daniel Drake <dsd@gentoo.org> | 2008-03-13 12:36:56 +0000 |
---|---|---|
committer | Daniel Drake <dsd@gentoo.org> | 2008-03-13 12:46:08 +0000 |
commit | c0c9432d38b22784070dce3a7874c62c31786a27 (patch) | |
tree | 825ca9817d3609a0645dbe3f1a1e46aa40dc1ff9 /libusb/libusbi.h | |
parent | de4c5341d168697baa4c0901c406deb47e78aae7 (diff) | |
download | libusb-c0c9432d38b22784070dce3a7874c62c31786a27.tar.gz |
Beginnings of cross-platform abstraction
This also includes a libusb_get_pollfds API change
Diffstat (limited to 'libusb/libusbi.h')
-rw-r--r-- | libusb/libusbi.h | 85 |
1 files changed, 77 insertions, 8 deletions
diff --git a/libusb/libusbi.h b/libusb/libusbi.h index 2ef2573..2d56d64 100644 --- a/libusb/libusbi.h +++ b/libusb/libusbi.h @@ -25,11 +25,10 @@ #include <endian.h> #include <stddef.h> -#include <sys/ioctl.h> +#include <sys/select.h> #include <time.h> #include <libusb.h> -#include <usbfs.h> #define DEVICE_DESC_LENGTH 18 @@ -146,15 +145,15 @@ struct libusb_device { struct list_head list; int refcnt; unsigned long session_data; - char *nodepath; struct libusb_device_descriptor desc; struct libusb_config_descriptor *config; + unsigned char os_priv[0]; }; struct libusb_device_handle { struct list_head list; struct libusb_device *dev; - int fd; + unsigned char os_priv[0]; }; #define USBI_TRANSFER_SYNC_CANCELLED (1<<0) @@ -164,11 +163,12 @@ struct usbi_transfer { /* must come first */ struct libusb_transfer pub; - struct usb_urb urb; struct list_head list; struct timeval timeout; int transferred; uint8_t flags; + + unsigned char os_priv[0]; }; /* bus structures */ @@ -181,15 +181,84 @@ struct usb_descriptor_header { /* shared data and functions */ -extern struct list_head open_devs; +extern struct list_head usbi_open_devs; void usbi_io_init(void); -void usbi_add_pollfd(int fd, short events); -void usbi_remove_pollfd(int fd); + +struct libusb_device *usbi_alloc_device(unsigned long session_id); +struct libusb_device *usbi_get_device_by_session_id(unsigned long session_id); + +void usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status); +void usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); int usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest); int usbi_parse_configuration(struct libusb_config_descriptor *config, unsigned char *buffer); +/* polling */ + +struct usbi_pollfd { + /* must come first */ + struct libusb_pollfd pollfd; + + struct list_head list; +}; + +int usbi_add_pollfd(int fd, short events); +void usbi_remove_pollfd(int fd); + +/* device discovery */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +struct discovered_devs { + size_t len; + size_t capacity; + struct libusb_device *devices[0]; +}; + +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev); + +/* OS abstraction */ + +struct usbi_os_backend { + const char *name; + int (*init)(void); + void (*exit)(void); + + int (*get_device_list)(struct discovered_devs *discdevs); + + int (*open)(struct libusb_device_handle *handle); + void (*close)(struct libusb_device_handle *handle); + + int (*claim_interface)(struct libusb_device_handle *handle, int iface); + int (*release_interface)(struct libusb_device_handle *handle, int iface); + + void (*destroy_device)(struct libusb_device *dev); + + int (*submit_transfer)(struct usbi_transfer *itransfer); + int (*cancel_transfer)(struct usbi_transfer *itransfer); + + int (*handle_events)(fd_set *readfds, fd_set *writefds); + + /* number of bytes to reserve for libusb_device.os_priv */ + size_t device_priv_size; + + /* number of bytes to reserve for libusb_device_handle.os_priv */ + size_t device_handle_priv_size; + + /* number of bytes to reserve for usbi_transfer.os_priv */ + size_t transfer_priv_size; +}; + +extern const struct usbi_os_backend * const usbi_backend; + +extern const struct usbi_os_backend linux_usbfs_backend; + #endif |