|
@@ -227,10 +227,13 @@ int usb_endpoint_described ( struct usb_endpoint *ep,
|
227
|
227
|
struct usb_configuration_descriptor *config,
|
228
|
228
|
struct usb_interface_descriptor *interface,
|
229
|
229
|
unsigned int type, unsigned int index ) {
|
|
230
|
+ struct usb_device *usb = ep->usb;
|
|
231
|
+ struct usb_port *port = usb->port;
|
230
|
232
|
struct usb_endpoint_descriptor *desc;
|
231
|
233
|
struct usb_endpoint_companion_descriptor *descx;
|
232
|
234
|
unsigned int sizes;
|
233
|
235
|
unsigned int burst;
|
|
236
|
+ unsigned int interval;
|
234
|
237
|
size_t mtu;
|
235
|
238
|
|
236
|
239
|
/* Locate endpoint descriptor */
|
|
@@ -246,9 +249,23 @@ int usb_endpoint_described ( struct usb_endpoint *ep,
|
246
|
249
|
mtu = USB_ENDPOINT_MTU ( sizes );
|
247
|
250
|
burst = ( descx ? descx->burst : USB_ENDPOINT_BURST ( sizes ) );
|
248
|
251
|
|
|
252
|
+ /* Calculate interval */
|
|
253
|
+ if ( type == USB_INTERRUPT ) {
|
|
254
|
+ if ( port->speed >= USB_SPEED_HIGH ) {
|
|
255
|
+ /* 2^(desc->interval-1) is a microframe count */
|
|
256
|
+ interval = ( 1 << ( desc->interval - 1 ) );
|
|
257
|
+ } else {
|
|
258
|
+ /* desc->interval is a (whole) frame count */
|
|
259
|
+ interval = ( desc->interval << 3 );
|
|
260
|
+ }
|
|
261
|
+ } else {
|
|
262
|
+ /* desc->interval is a microframe count */
|
|
263
|
+ interval = desc->interval;
|
|
264
|
+ }
|
|
265
|
+
|
249
|
266
|
/* Describe endpoint */
|
250
|
267
|
usb_endpoint_describe ( ep, desc->endpoint, desc->attributes,
|
251
|
|
- mtu, burst );
|
|
268
|
+ mtu, burst, interval );
|
252
|
269
|
return 0;
|
253
|
270
|
}
|
254
|
271
|
|
|
@@ -286,8 +303,9 @@ int usb_endpoint_open ( struct usb_endpoint *ep ) {
|
286
|
303
|
}
|
287
|
304
|
ep->open = 1;
|
288
|
305
|
|
289
|
|
- DBGC2 ( usb, "USB %s %s opened with MTU %zd (burst %d)\n", usb->name,
|
290
|
|
- usb_endpoint_name ( ep->address ), ep->mtu, ep->burst );
|
|
306
|
+ DBGC2 ( usb, "USB %s %s opened with MTU %zd, burst %d, interval %d\n",
|
|
307
|
+ usb->name, usb_endpoint_name ( ep->address ), ep->mtu,
|
|
308
|
+ ep->burst, ep->interval );
|
291
|
309
|
return 0;
|
292
|
310
|
|
293
|
311
|
ep->open = 0;
|
|
@@ -1147,7 +1165,8 @@ static int register_usb ( struct usb_device *usb ) {
|
1147
|
1165
|
/* Describe control endpoint */
|
1148
|
1166
|
mtu = USB_EP0_DEFAULT_MTU ( port->speed );
|
1149
|
1167
|
usb_endpoint_describe ( &usb->control, USB_EP0_ADDRESS,
|
1150
|
|
- USB_EP0_ATTRIBUTES, mtu, USB_EP0_BURST );
|
|
1168
|
+ USB_EP0_ATTRIBUTES, mtu, USB_EP0_BURST,
|
|
1169
|
+ USB_EP0_INTERVAL );
|
1151
|
1170
|
|
1152
|
1171
|
/* Open control endpoint */
|
1153
|
1172
|
if ( ( rc = usb_endpoint_open ( &usb->control ) ) != 0 )
|