xref: /minix3/minix/include/minix/usb.h (revision 2d64210c1dbcd340904718f2d4e9e81adeab3c7d)
1 #ifndef _MINIX_USB_H
2 #define _MINIX_USB_H
3 
4 #include <sys/types.h>
5 #include <minix/com.h>
6 #include <minix/ipc.h>
7 #include <stdio.h>
8 
9 #define USB_URBSIZE(data_size, iso_count) \
10 	(data_size + sizeof(struct usb_urb) + iso_count * \
11 	sizeof(struct usb_iso_packet_desc))
12 
13 #define USB_PREPARE_URB(urb, data_size, iso_count) \
14 	do { \
15 		if(iso_count)\
16 			urb->iso_data.iso_desc = data_size;\
17 			urb->urb_size = data_size+sizeof(struct usb_urb)+iso_count * \
18 			sizeof(struct usb_iso_packet_desc); \
19 	} while (0)
20 
21 
22 struct usb_urb;
23 
24 struct usb_driver {
25 	void (*urb_completion)(struct usb_urb *urb);
26 	void (*connect_device)(unsigned dev_id, unsigned int interfaces);
27 	void (*disconnect_device)(unsigned dev_id);
28 };
29 
30 struct usb_device_id {
31 	u16_t idVendor;
32 	u16_t idProduct;
33 	u32_t bcdDevice;
34 
35 	u8_t  bDeviceClass;
36 	u8_t  bDeviceSubClass;
37 	u8_t  bDeviceProtocol;
38 
39 	u8_t  bInterfaceClass;
40 	u8_t  bInterfaceSubClass;
41 	u8_t  bInterfaceProtocol;
42 };
43 
44 struct usb_iso_packet_desc {
45 	unsigned int offset;
46 	unsigned int length;		/* expected length */
47 	unsigned int actual_length;
48 	unsigned int status;
49 };
50 
51 /** isochronous transfer */
52 #define USB_TRANSFER_ISO 0
53 /** interrupt transfer */
54 #define USB_TRANSFER_INT 1
55 /** control transfer */
56 #define USB_TRANSFER_CTL 2
57 /** bulk transfer */
58 #define USB_TRANSFER_BLK 3
59 
60 #define USB_IN  0
61 #define USB_OUT 1
62 
63 #define USB_INVALID_URB_ID 0
64 
65 struct usb_urb {
66 	/* private */
67 	struct usb_urb *next;
68 
69 	/** ID identifying the device on HCD side */
70 	int dev_id;
71 	int type;
72 	int endpoint;
73 	int direction;
74 	int status;
75 	int error_count;
76 	size_t size;
77 	size_t actual_length;
78 	void *priv;
79 	int interval;
80 
81 	unsigned long transfer_flags;
82 
83 
84 	/* housekeeping information needed by usb library */
85 	unsigned urb_id;
86 	size_t urb_size;
87 	cp_grant_id_t gid;
88 
89 	size_t iso_desc_offset;
90 	int number_of_packets;
91 	int start_frame;
92 	char setup_packet[8];
93 
94 	/* data allways starts here */
95 	char buffer[1];
96 };
97 
98 struct usb_ctrlrequest {
99         u8_t bRequestType;
100         u8_t bRequest;
101         u16_t wValue;
102 		u16_t wIndex;
103         u16_t wLength;
104 } __attribute__ ((packed));
105 
106 #ifdef DEBUG
dump_urb(struct usb_urb * urb)107 static void dump_urb(struct usb_urb *urb) {
108 	printf("================\n");
109 	printf("DUMP: urb (0x%p)\n", urb);
110 	printf("================\n");
111 	printf("= dev_id: %d\n", urb->dev_id);
112 	printf("= type: %d\n", urb->type);
113 	printf("= endpoint: %d\n", urb->endpoint);
114 	printf("= direction: %d\n", urb->direction);
115 	printf("= status: %d\n", urb->status);
116 	printf("= error_count: %d\n", urb->error_count);
117 	printf("= size: %d\n", urb->size);
118 	printf("= actual_length: %d\n", urb->actual_length);
119 	printf("= interval %d\n", urb->interval);
120 	printf("= transfer_flags %x\n", urb->transfer_flags);
121 	printf("= urb_id = %d\n", urb->urb_id);
122 	printf("= urb_size = 0x%x\n", urb->urb_size);
123 	printf("= setup_packet: \n");
124 	printf("=   bRequestType: 0x%x \n",
125 	    ((struct usb_ctrlrequest *)urb->setup_packet)->bRequestType);
126 	printf("=   bRequest 0x%x \n",
127 	    ((struct usb_ctrlrequest *)urb->setup_packet)->bRequest);
128 	printf("=   wValue: 0x%x \n",
129 	    ((struct usb_ctrlrequest *)urb->setup_packet)->wValue);
130 	printf("=   wIndex: 0x%x \n",
131 	    ((struct usb_ctrlrequest *)urb->setup_packet)->wIndex);
132 	printf("=   wLength: 0x%x \n",
133 	    ((struct usb_ctrlrequest *)urb->setup_packet)->wLength);
134 	printf("===============\n");
135 }
136 #else
137 #define dumb_urb(x)
138 #endif
139 
140 /** Submit a URB */
141 int usb_send_urb(struct usb_urb* urb);
142 
143 /** Cancels an URB */
144 int usb_cancle_urb(struct usb_urb* urb);
145 
146 /** Gets the USB device ID of an USB device **/
147 int usb_get_device_id(int dev_id, struct usb_device_id *usb_device_id);
148 
149 /* this initializes a session with the HCD */
150 int usb_init(char *name);
151 
152 /** This functions handles a message from the HCD */
153 int usb_handle_msg(struct usb_driver *ubd, message *msg);
154 
155 /** Lets device driver send HCD various information */
156 int usb_send_info(long, long);
157 
158 #endif /* _MINIX_USB_H */
159