1433d6423SLionel Sambuc #ifndef _DDEKIT_USB_H 2433d6423SLionel Sambuc #define _DDEKIT_USB_H 3433d6423SLionel Sambuc 4433d6423SLionel Sambuc #include <ddekit/ddekit.h> 5433d6423SLionel Sambuc #include <ddekit/types.h> 6433d6423SLionel Sambuc 7433d6423SLionel Sambuc /** isochronous transfer */ 8433d6423SLionel Sambuc #define DDEKIT_USB_TRANSFER_ISO 0 9433d6423SLionel Sambuc /** interrupt transfer */ 10433d6423SLionel Sambuc #define DDEKIT_USB_TRANSFER_INT 1 11433d6423SLionel Sambuc /** control transfer */ 12433d6423SLionel Sambuc #define DDEKIT_USB_TRANSFER_CTL 2 13433d6423SLionel Sambuc /** bulk transfer */ 14433d6423SLionel Sambuc #define DDEKIT_USB_TRANSFER_BLK 3 15433d6423SLionel Sambuc 16433d6423SLionel Sambuc #define DDEKIT_USB_IN 1 17433d6423SLionel Sambuc #define DDEKIT_USB_OUT 0 18433d6423SLionel Sambuc 19433d6423SLionel Sambuc struct ddekit_usb_dev; 20433d6423SLionel Sambuc struct ddekit_usb_urb; 21433d6423SLionel Sambuc 22433d6423SLionel Sambuc struct ddekit_usb_device_id { 23433d6423SLionel Sambuc ddekit_uint16_t idVendor; 24433d6423SLionel Sambuc ddekit_uint16_t idProduct; 25433d6423SLionel Sambuc ddekit_uint32_t bcdDevice; 26433d6423SLionel Sambuc 27433d6423SLionel Sambuc ddekit_uint8_t bDeviceClass; 28433d6423SLionel Sambuc ddekit_uint8_t bDeviceSubClass; 29433d6423SLionel Sambuc ddekit_uint8_t bDeviceProtocol; 30433d6423SLionel Sambuc 31433d6423SLionel Sambuc ddekit_uint8_t bInterfaceClass; 32433d6423SLionel Sambuc ddekit_uint8_t bInterfaceSubClass; 33433d6423SLionel Sambuc ddekit_uint8_t bInterfaceProtocol; 34433d6423SLionel Sambuc 35433d6423SLionel Sambuc }; 36433d6423SLionel Sambuc 37433d6423SLionel Sambuc struct ddekit_usb_iso_packet_desc { 38433d6423SLionel Sambuc ddekit_int32_t offset; 39433d6423SLionel Sambuc ddekit_int32_t length; /* expected length */ 40433d6423SLionel Sambuc ddekit_int32_t actual_length; 41433d6423SLionel Sambuc ddekit_int32_t status; 42433d6423SLionel Sambuc }; 43433d6423SLionel Sambuc 44433d6423SLionel Sambuc typedef void (*ddekit_usb_completion_cb)(void* priv); 45433d6423SLionel Sambuc 46433d6423SLionel Sambuc typedef void (*ddekit_usb_connect_cb)(struct ddekit_usb_dev *dev, 47433d6423SLionel Sambuc unsigned int interfaces); 48433d6423SLionel Sambuc 49433d6423SLionel Sambuc typedef void (*ddekit_usb_disconnect_cb)(struct ddekit_usb_dev *dev); 50433d6423SLionel Sambuc 51433d6423SLionel Sambuc typedef void *(*ddekit_usb_malloc_fn)(unsigned size); 52433d6423SLionel Sambuc typedef void (*ddekit_usb_free_fn)(void *ptr); 53433d6423SLionel Sambuc 54433d6423SLionel Sambuc struct ddekit_usb_driver { 55433d6423SLionel Sambuc ddekit_usb_completion_cb completion; 56433d6423SLionel Sambuc ddekit_usb_connect_cb connect; 57433d6423SLionel Sambuc ddekit_usb_disconnect_cb disconnect; 58433d6423SLionel Sambuc }; 59433d6423SLionel Sambuc 60433d6423SLionel Sambuc 61433d6423SLionel Sambuc struct ddekit_usb_urb { 62433d6423SLionel Sambuc struct ddekit_usb_dev *dev; 63433d6423SLionel Sambuc ddekit_int32_t type; 64433d6423SLionel Sambuc ddekit_int32_t endpoint; 65433d6423SLionel Sambuc ddekit_int32_t direction; 66433d6423SLionel Sambuc ddekit_int32_t status; 67433d6423SLionel Sambuc ddekit_int32_t interval; 68433d6423SLionel Sambuc ddekit_uint32_t transfer_flags; 69433d6423SLionel Sambuc ddekit_uint32_t size; 70433d6423SLionel Sambuc ddekit_uint32_t actual_length; 71433d6423SLionel Sambuc ddekit_int32_t number_of_packets; 72433d6423SLionel Sambuc ddekit_int32_t error_count; 73433d6423SLionel Sambuc ddekit_int32_t start_frame; 74433d6423SLionel Sambuc char *setup_packet; 75433d6423SLionel Sambuc char *data; 76433d6423SLionel Sambuc struct ddekit_usb_iso_packet_desc *iso_desc; 77433d6423SLionel Sambuc void *priv; 78433d6423SLionel Sambuc void *ddekit_priv; 79433d6423SLionel Sambuc }; 80433d6423SLionel Sambuc 81*2d64210cSWojciech Zajac /* USB message types */ 82*2d64210cSWojciech Zajac typedef enum { 83*2d64210cSWojciech Zajac 84*2d64210cSWojciech Zajac DDEKIT_HUB_PORT_LS_CONN, /* Low speed device connected */ 85*2d64210cSWojciech Zajac DDEKIT_HUB_PORT_FS_CONN, /* Full speed device connected */ 86*2d64210cSWojciech Zajac DDEKIT_HUB_PORT_HS_CONN, /* High speed device connected */ 87*2d64210cSWojciech Zajac DDEKIT_HUB_PORT_DISCONN /* Device disconnected */ 88*2d64210cSWojciech Zajac } 89*2d64210cSWojciech Zajac ddekit_msg_type_t; 90*2d64210cSWojciech Zajac 91433d6423SLionel Sambuc int ddekit_usb_dev_set_data(struct ddekit_usb_dev *dev, void *data); 92433d6423SLionel Sambuc void *ddekit_usb_dev_get_data(struct ddekit_usb_dev *dev); 93433d6423SLionel Sambuc void ddekit_usb_get_device_id(struct ddekit_usb_dev *dev, struct 94433d6423SLionel Sambuc ddekit_usb_device_id *id); 95433d6423SLionel Sambuc int ddekit_usb_submit_urb(struct ddekit_usb_urb *d_urb); 96433d6423SLionel Sambuc int ddekit_usb_cancle_urb(struct ddekit_usb_urb *d_urb); 97*2d64210cSWojciech Zajac long ddekit_usb_info(struct ddekit_usb_dev *, long, long); 98433d6423SLionel Sambuc 99433d6423SLionel Sambuc /* 100433d6423SLionel Sambuc * This one is only implemented for the client side. For the server side is 101433d6423SLionel Sambuc * has to be implemented in the DDELinux/FBSD part. 102433d6423SLionel Sambuc */ 103433d6423SLionel Sambuc int ddekit_usb_init(struct ddekit_usb_driver *drv, ddekit_usb_malloc_fn 104433d6423SLionel Sambuc *_m, ddekit_usb_free_fn *_f); 105433d6423SLionel Sambuc 106433d6423SLionel Sambuc #endif 107