xref: /minix3/minix/include/ddekit/usb.h (revision 2d64210c1dbcd340904718f2d4e9e81adeab3c7d)
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