xref: /minix/minix/drivers/usb/usbd/hcd/hcd_ddekit.c (revision 433d6423)
1 /*
2  * Implementation of DDEkit related calls/data
3  */
4 
5 #include <string.h>				/* memset */
6 
7 #include <ddekit/usb.h>
8 
9 #include <usb/hcd_ddekit.h>
10 #include <usb/hcd_interface.h>
11 #include <usb/usb_common.h>
12 
13 
14 /*===========================================================================*
15  *    Local declarations                                                     *
16  *===========================================================================*/
17 /*
18  * In this file "struct ddekit_usb_dev" equals "hcd_device_state"
19  * */
20 struct ddekit_usb_device_id;
21 struct ddekit_usb_urb;
22 struct ddekit_usb_dev;
23 
24 /* Translates DDEKit UBR to one used by HCD */
25 static void hcd_decode_urb(hcd_urb *, struct ddekit_usb_urb *);
26 static void hcd_encode_urb(hcd_urb *, struct ddekit_usb_urb *);
27 
28 
29 /*===========================================================================*
30  *    Global definitions                                                     *
31  *===========================================================================*/
32 ddekit_usb_completion_cb	completion_cb	= NULL;
33 ddekit_usb_connect_cb		connect_cb	= NULL;
34 ddekit_usb_disconnect_cb	disconnect_cb	= NULL;
35 
36 
37 /*===========================================================================*
38  *    Implementation for usb_server.c                                        *
39  *===========================================================================*/
40 
41 /*===========================================================================*
42  *    _ddekit_usb_get_manufacturer                                           *
43  *===========================================================================*/
44 char *
45 _ddekit_usb_get_manufacturer(struct ddekit_usb_dev * ddev)
46 {
47 	static const char mfg[] = "UNKNOWN";
48 	DEBUG_DUMP;
49 	/* TODO: UNUSED for argument won't work */
50 	((void)ddev);
51 	return (char *)mfg;
52 }
53 
54 
55 /*===========================================================================*
56  *    _ddekit_usb_get_product                                                *
57  *===========================================================================*/
58 char *
59 _ddekit_usb_get_product(struct ddekit_usb_dev * ddev)
60 {
61 	static const char prod[] = "UNKNOWN";
62 	DEBUG_DUMP;
63 	/* TODO: UNUSED for argument won't work */
64 	((void)ddev);
65 	return (char *)prod;
66 }
67 
68 
69 /*===========================================================================*
70  *    _ddekit_usb_get_serial                                                 *
71  *===========================================================================*/
72 char *
73 _ddekit_usb_get_serial(struct ddekit_usb_dev * ddev)
74 {
75 	static const char serial[] = "UNKNOWN";
76 	DEBUG_DUMP;
77 	/* TODO: UNUSED for argument won't work */
78 	((void)ddev);
79 	return (char *)serial;
80 }
81 
82 
83 /*===========================================================================*
84  *    _ddekit_usb_get_device_desc                                            *
85  *===========================================================================*/
86 struct usb_device_descriptor *
87 _ddekit_usb_get_device_desc(struct ddekit_usb_dev * ddev)
88 {
89 	hcd_device_state * dev;
90 
91 	DEBUG_DUMP;
92 
93 	dev = (hcd_device_state *)ddev;
94 
95 	return (struct usb_device_descriptor *)
96 		(&(dev->config_tree.descriptor));
97 }
98 
99 
100 /*===========================================================================*
101  *    _ddekit_usb_get_interface_desc                                         *
102  *===========================================================================*/
103 struct usb_interface_descriptor *
104 _ddekit_usb_get_interface_desc(struct ddekit_usb_dev * ddev, int inum)
105 {
106 	hcd_device_state * dev;
107 
108 	DEBUG_DUMP;
109 
110 	dev = (hcd_device_state *)ddev;
111 
112 	return (struct usb_interface_descriptor *)
113 		(&(dev->config_tree.interface[inum].descriptor));
114 }
115 
116 
117 /*===========================================================================*
118  *    Implementation for <ddekit/usb.h>                                      *
119  *===========================================================================*/
120 
121 /*===========================================================================*
122  *    ddekit_usb_dev_set_data                                                *
123  *===========================================================================*/
124 int
125 ddekit_usb_dev_set_data(struct ddekit_usb_dev * dev, void * data)
126 {
127 	hcd_device_state * hcd_dev;
128 
129 	DEBUG_DUMP;
130 
131 	hcd_dev = (hcd_device_state *)dev;
132 
133 	hcd_dev->data = data;
134 
135 	return EXIT_SUCCESS;
136 }
137 
138 
139 /*===========================================================================*
140  *    ddekit_usb_dev_get_data                                                *
141  *===========================================================================*/
142 void *
143 ddekit_usb_dev_get_data(struct ddekit_usb_dev * dev)
144 {
145 	hcd_device_state * hcd_dev;
146 
147 	DEBUG_DUMP;
148 
149 	hcd_dev = (hcd_device_state *)dev;
150 
151 	return hcd_dev->data;
152 }
153 
154 
155 /* TODO: This was in 'ddekit/usb.h' header file, but is not used anywhere */
156 #if 0
157 /*===========================================================================*
158  *    ddekit_usb_get_device_id                                               *
159  *===========================================================================*/
160 void
161 ddekit_usb_get_device_id(struct ddekit_usb_dev * dev,
162 			struct ddekit_usb_device_id * id)
163 {
164 	DEBUG_DUMP;
165 	/* TODO: UNUSED for argument won't work */
166 	((void)dev);
167 	((void)id);
168 	return;
169 }
170 #endif
171 
172 
173 /*===========================================================================*
174  *    ddekit_usb_submit_urb                                                  *
175  *===========================================================================*/
176 int
177 ddekit_usb_submit_urb(struct ddekit_usb_urb * d_urb)
178 {
179 	hcd_device_state * dev;
180 	hcd_driver_state * drv;
181 
182 	DEBUG_DUMP;
183 
184 	/* Retrieve info on device/driver state from DDEKit's USB */
185 	dev = (hcd_device_state *)(d_urb->dev);
186 	drv = (hcd_driver_state *)(dev->driver);
187 
188 	/* Check for latest URB completion */
189 	if (NULL == dev->urb.original_urb) {
190 
191 		/* Remember original URB */
192 		dev->urb.original_urb = (void *)d_urb;
193 
194 		/* TODO: If multiple URB's have to be queued, this code
195 		 * or DDEKit's must be altered accordingly */
196 		/* Turn DDEKit URB format to one that is easier to
197 		 * handle by HCD, also check if URB is valid */
198 		hcd_decode_urb(&(dev->urb), d_urb);
199 
200 		/* Start handling URB event */
201 		drv->current_event = HCD_EVENT_URB;
202 		hcd_handle_event(drv);
203 
204 		return EXIT_SUCCESS;
205 	}
206 
207 	/* Last URB must not have been completed */
208 	return EXIT_FAILURE;
209 }
210 
211 
212 /*===========================================================================*
213  *    ddekit_usb_cancle_urb                                                  *
214  *===========================================================================*/
215 int
216 ddekit_usb_cancle_urb(struct ddekit_usb_urb * d_urb)
217 {
218 	DEBUG_DUMP;
219 	/* TODO: UNUSED for argument won't work */
220 	((void)d_urb);
221 	return EXIT_SUCCESS;
222 }
223 
224 
225 /*===========================================================================*
226  *    ddekit_usb_init                                                        *
227  *===========================================================================*/
228 int
229 ddekit_usb_init(struct ddekit_usb_driver * drv,
230 		ddekit_usb_malloc_fn * _m,
231 		ddekit_usb_free_fn * _f)
232 {
233 	DEBUG_DUMP;
234 
235 	completion_cb	= drv->completion;
236 	connect_cb	= drv->connect;
237 	disconnect_cb	= drv->disconnect;
238 
239 	*_m		= malloc;
240 	*_f		= free;
241 
242 	return EXIT_SUCCESS;
243 }
244 
245 
246 /*===========================================================================*
247  *    hcd_connect_cb                                                         *
248  *===========================================================================*/
249 void
250 hcd_connect_cb(hcd_device_state * dev)
251 {
252 	unsigned int if_bitmask;
253 
254 	DEBUG_DUMP;
255 
256 	/* TODO: Magic numbers like in ddekit/devman */
257 	/* Each bit starting from 0, represents valid interface */
258 	if_bitmask = 0xFFFFFFFF >> (32 - dev->config_tree.num_interfaces);
259 
260 	USB_DBG("Interfaces %d, mask %08X",
261 		dev->config_tree.num_interfaces,
262 		if_bitmask);
263 
264 	connect_cb((struct ddekit_usb_dev *)dev, (int)if_bitmask);
265 }
266 
267 
268 /*===========================================================================*
269  *    hcd_disconnect_cb                                                      *
270  *===========================================================================*/
271 void
272 hcd_disconnect_cb(hcd_device_state * dev)
273 {
274 	DEBUG_DUMP;
275 
276 	disconnect_cb((struct ddekit_usb_dev *)dev);
277 }
278 
279 
280 /*===========================================================================*
281  *    hcd_completion_cb                                                      *
282  *===========================================================================*/
283 void
284 hcd_completion_cb(hcd_urb * urb)
285 {
286 	struct ddekit_usb_urb * d_urb;
287 
288 	DEBUG_DUMP;
289 
290 	/* Recollect original URB */
291 	d_urb = (struct ddekit_usb_urb *)urb->original_urb;
292 
293 	/* Turn HCD URB format to one handled by DDEKit */
294 	hcd_encode_urb(urb, d_urb);
295 
296 	completion_cb(d_urb->priv);
297 
298 	/* URB was handled, forget about it */
299 	urb->original_urb = NULL;
300 }
301 
302 
303 /*===========================================================================*
304  *    hcd_decode_urb                                                         *
305  *===========================================================================*/
306 static void
307 hcd_decode_urb(hcd_urb * urb, struct ddekit_usb_urb * dde_urb)
308 {
309 	DEBUG_DUMP;
310 
311 	/* No UBR error initially */
312 	urb->inout_status = EXIT_SUCCESS;
313 
314 	/* Check transfer direction */
315 	switch (dde_urb->direction) {
316 		case DDEKIT_USB_IN:
317 			urb->direction = HCD_DIRECTION_IN;
318 			break;
319 		case DDEKIT_USB_OUT:
320 			urb->direction = HCD_DIRECTION_OUT;
321 			break;
322 		default:
323 			USB_MSG("URB direction error");
324 			goto URB_ERROR;
325 	}
326 
327 	/* Check transfer type */
328 	switch (dde_urb->type) {
329 		case DDEKIT_USB_TRANSFER_ISO:
330 			urb->type = HCD_TRANSFER_ISOCHRONOUS;
331 			break;
332 		case DDEKIT_USB_TRANSFER_INT:
333 			urb->type = HCD_TRANSFER_INTERRUPT;
334 			break;
335 		case DDEKIT_USB_TRANSFER_CTL:
336 			urb->type = HCD_TRANSFER_CONTROL;
337 			break;
338 		case DDEKIT_USB_TRANSFER_BLK:
339 			urb->type = HCD_TRANSFER_BULK;
340 			break;
341 		default:
342 			USB_MSG("URB type error");
343 			goto URB_ERROR;
344 	}
345 
346 	/* Check transfer endpoint validity */
347 	if ((dde_urb->endpoint <= (int)HCD_LAST_EP) &&
348 		(dde_urb->endpoint >= (int)HCD_DEFAULT_EP))
349 		urb->endpoint = (hcd_reg1)dde_urb->endpoint;
350 	else {
351 		USB_MSG("URB endpoint error");
352 		goto URB_ERROR;
353 	}
354 
355 	/* Check transfer interval validity */
356 	if ((dde_urb->interval <= (int)HCD_HIGHEST_INTERVAL) &&
357 		(dde_urb->interval >= (int)HCD_LOWEST_INTERVAL))
358 		urb->interval = (hcd_reg1)dde_urb->interval;
359 	else {
360 		USB_MSG("URB interval error");
361 		goto URB_ERROR;
362 	}
363 
364 	/* TODO: Alignment of setup packet. Can DDE client guarantee that? */
365 	/* Transfer data assignment */
366 	urb->inout_data = (hcd_reg1 *)dde_urb->data;
367 	urb->in_setup = (hcd_ctrlrequest *)dde_urb->setup_packet;
368 
369 	/* TODO: Sane size check? */
370 	urb->in_size = (hcd_reg4)dde_urb->size;
371 
372 	/* Buffer validity check */
373 	if ((NULL == urb->inout_data) && (NULL == urb->in_setup)) {
374 		USB_MSG("URB buffer error");
375 		goto URB_ERROR;
376 	}
377 
378 	/* Remember device and check for NULL */
379 	if (NULL == (urb->target_device = (hcd_device_state *)dde_urb->dev)) {
380 		USB_MSG("URB device pointer error");
381 		goto URB_ERROR;
382 	}
383 
384 	/* Decoding completed */
385 	return;
386 
387 	URB_ERROR:
388 	urb->inout_status = EXIT_FAILURE;
389 }
390 
391 
392 /*===========================================================================*
393  *    hcd_encode_urb                                                         *
394  *===========================================================================*/
395 static void
396 hcd_encode_urb(hcd_urb * urb, struct ddekit_usb_urb * dde_urb)
397 {
398 	DEBUG_DUMP;
399 
400 	/* Rewrite output for DDEKit part */
401 	dde_urb->actual_length = urb->out_size;
402 	dde_urb->status = urb->inout_status;
403 }
404