source: mainline/uspace/drv/usbhub/utils.c@ 39c3d95d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 39c3d95d was 39c3d95d, checked in by Matus Dekanek <smekideki@…>, 15 years ago

a few fixes for usb hub driver

  • Property mode set to 100644
File size: 20.6 KB
Line 
1/*
2 * Copyright (c) 2010 Matus Dekanek
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libusb usb
30 * @{
31 */
32/** @file
33 * @brief Hub driver.
34 */
35#include <driver.h>
36#include <bool.h>
37#include <errno.h>
38
39#include <usbhc_iface.h>
40#include <usb/usbdrv.h>
41#include <usb/descriptor.h>
42#include <usb/devreq.h>
43#include <usb/classes/hub.h>
44
45#include "usbhub.h"
46#include "usbhub_private.h"
47#include "port_status.h"
48
49
50size_t USB_HUB_MAX_DESCRIPTOR_SIZE = 71;
51
52//*********************************************
53//
54// various utils
55//
56//*********************************************
57
58//hub descriptor utils
59
60void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor) {
61 //base size
62 size_t size = 7;
63 //variable size according to port count
64 size_t var_size = descriptor->ports_count / 8 + ((descriptor->ports_count % 8 > 0) ? 1 : 0);
65 size += 2 * var_size;
66 uint8_t * result = (uint8_t*) malloc(size);
67 //size
68 result[0] = size;
69 //descriptor type
70 result[1] = USB_DESCTYPE_HUB;
71 result[2] = descriptor->ports_count;
72 /// @fixme handling of endianness??
73 result[3] = descriptor->hub_characteristics / 256;
74 result[4] = descriptor->hub_characteristics % 256;
75 result[5] = descriptor->pwr_on_2_good_time;
76 result[6] = descriptor->current_requirement;
77
78 size_t i;
79 for (i = 0; i < var_size; ++i) {
80 result[7 + i] = descriptor->devices_removable[i];
81 }
82 for (i = 0; i < var_size; ++i) {
83 result[7 + var_size + i] = 255;
84 }
85 return result;
86}
87
88usb_hub_descriptor_t * usb_deserialize_hub_desriptor(void * serialized_descriptor) {
89 uint8_t * sdescriptor = (uint8_t*) serialized_descriptor;
90
91 if (sdescriptor[1] != USB_DESCTYPE_HUB) {
92 printf("[usb_hub] wrong descriptor %x\n",sdescriptor[1]);
93 return NULL;
94 }
95
96 usb_hub_descriptor_t * result = usb_new(usb_hub_descriptor_t);
97
98
99 result->ports_count = sdescriptor[2];
100 /// @fixme handling of endianness??
101 result->hub_characteristics = sdescriptor[4] + 256 * sdescriptor[3];
102 result->pwr_on_2_good_time = sdescriptor[5];
103 result->current_requirement = sdescriptor[6];
104 size_t var_size = result->ports_count / 8 + ((result->ports_count % 8 > 0) ? 1 : 0);
105 result->devices_removable = (uint8_t*) malloc(var_size);
106 //printf("[usb_hub] getting removable devices data \n");
107 size_t i;
108 for (i = 0; i < var_size; ++i) {
109 result->devices_removable[i] = sdescriptor[7 + i];
110 }
111 return result;
112}
113
114//control transactions
115
116int usb_drv_sync_control_read(
117 int phone, usb_target_t target,
118 usb_device_request_setup_packet_t * request,
119 void * rcvd_buffer, size_t rcvd_size, size_t * actual_size
120 ) {
121 usb_handle_t handle;
122 int opResult;
123 //setup
124 opResult = usb_drv_async_control_read_setup(phone, target,
125 request, sizeof (usb_device_request_setup_packet_t),
126 &handle);
127 if (opResult != EOK) {
128 return opResult;
129 }
130 opResult = usb_drv_async_wait_for(handle);
131 if (opResult != EOK) {
132 return opResult;
133 }
134 //read
135 opResult = usb_drv_async_control_read_data(phone, target,
136 rcvd_buffer, rcvd_size, actual_size,
137 &handle);
138 if (opResult != EOK) {
139 return opResult;
140 }
141 opResult = usb_drv_async_wait_for(handle);
142 if (opResult != EOK) {
143 return opResult;
144 }
145 //finalize
146 opResult = usb_drv_async_control_read_status(phone, target,
147 &handle);
148 if (opResult != EOK) {
149 return opResult;
150 }
151 opResult = usb_drv_async_wait_for(handle);
152 if (opResult != EOK) {
153 return opResult;
154 }
155 return EOK;
156}
157
158int usb_drv_sync_control_write(
159 int phone, usb_target_t target,
160 usb_device_request_setup_packet_t * request,
161 void * sent_buffer, size_t sent_size
162 ) {
163 usb_handle_t handle;
164 int opResult;
165 //setup
166 opResult = usb_drv_async_control_write_setup(phone, target,
167 request, sizeof (usb_device_request_setup_packet_t),
168 &handle);
169 if (opResult != EOK) {
170 return opResult;
171 }
172 opResult = usb_drv_async_wait_for(handle);
173 if (opResult != EOK) {
174 return opResult;
175 }
176 //write
177 opResult = usb_drv_async_control_write_data(phone, target,
178 sent_buffer, sent_size,
179 &handle);
180 if (opResult != EOK) {
181 return opResult;
182 }
183 opResult = usb_drv_async_wait_for(handle);
184 if (opResult != EOK) {
185 return opResult;
186 }
187 //finalize
188 opResult = usb_drv_async_control_write_status(phone, target,
189 &handle);
190 if (opResult != EOK) {
191 return opResult;
192 }
193 opResult = usb_drv_async_wait_for(handle);
194 if (opResult != EOK) {
195 return opResult;
196 }
197 return EOK;
198}
199
200//list implementation
201
202usb_general_list_t * usb_lst_create(void) {
203 usb_general_list_t* result = usb_new(usb_general_list_t);
204 usb_lst_init(result);
205 return result;
206}
207
208void usb_lst_init(usb_general_list_t * lst) {
209 lst->prev = lst;
210 lst->next = lst;
211 lst->data = NULL;
212}
213
214void usb_lst_prepend(usb_general_list_t* item, void* data) {
215 usb_general_list_t* appended = usb_new(usb_general_list_t);
216 appended->data = data;
217 appended->next = item;
218 appended->prev = item->prev;
219 item->prev->next = appended;
220 item->prev = appended;
221}
222
223void usb_lst_append(usb_general_list_t* item, void* data) {
224 usb_general_list_t* appended = usb_new(usb_general_list_t);
225 appended->data = data;
226 appended->next = item->next;
227 appended->prev = item;
228 item->next->prev = appended;
229 item->next = appended;
230}
231
232void usb_lst_remove(usb_general_list_t* item) {
233 item->next->prev = item->prev;
234 item->prev->next = item->next;
235}
236
237static void usb_hub_test_port_status(void) {
238 printf("[usb_hub] -------------port status test---------\n");
239 usb_port_status_t status = 0;
240
241 //printf("original status %d (should be 0)\n",(uint32_t)status);
242 usb_port_set_bit(&status, 1, 1);
243 //printf("%d =?= 2\n",(uint32_t)status);
244 if (status != 2) {
245 printf("[usb_port_status] test failed: wrong set of bit 1\n");
246 return;
247 }
248 usb_port_set_bit(&status, 3, 1);
249 if (status != 10) {
250 printf("[usb_port_status] test failed: wrong set of bit 3\n");
251 return;
252 }
253
254 usb_port_set_bit(&status, 15, 1);
255 if (status != 10 + (1 << 15)) {
256 printf("[usb_port_status] test failed: wrong set of bit 15\n");
257 return;
258 }
259 usb_port_set_bit(&status, 1, 0);
260 if (status != 8 + (1 << 15)) {
261 printf("[usb_port_status] test failed: wrong unset of bit 1\n");
262 return;
263 }
264 int i;
265 for (i = 0; i < 32; ++i) {
266 if (i == 3 || i == 15) {
267 if (!usb_port_get_bit(&status, i)) {
268 printf("[usb_port_status] test failed: wrong bit at %d\n", i);
269 }
270 } else {
271 if (usb_port_get_bit(&status, i)) {
272 printf("[usb_port_status] test failed: wrong bit at %d\n", i);
273 }
274 }
275 }
276
277 printf("test ok\n");
278
279
280 //printf("%d =?= 10\n",(uint32_t)status);
281
282 //printf("this should be 0: %d \n",usb_port_get_bit(&status,0));
283 //printf("this should be 1: %d \n",usb_port_get_bit(&status,1));
284 //printf("this should be 0: %d \n",usb_port_get_bit(&status,2));
285 //printf("this should be 1: %d \n",usb_port_get_bit(&status,3));
286 //printf("this should be 0: %d \n",usb_port_get_bit(&status,4));
287
288
289
290
291}
292
293//*********************************************
294//
295// hub driver code, initialization
296//
297//*********************************************
298
299usb_hub_info_t * usb_create_hub_info(device_t * device, int hc) {
300 usb_hub_info_t* result = usb_new(usb_hub_info_t);
301 //result->device = device;
302 result->port_count = -1;
303 /// \TODO is this correct? is the device stored?
304 result->device = device;
305
306
307 //printf("[usb_hub] phone to hc = %d\n", hc);
308 if (hc < 0) {
309 return result;
310 }
311 //get some hub info
312 usb_address_t addr = usb_drv_get_my_address(hc, device);
313 printf("[usb_hub] addres of newly created hub = %d\n", addr);
314 /*if(addr<0){
315 //return result;
316
317 }*/
318
319 result->usb_device = usb_new(usb_hcd_attached_device_info_t);
320 result->usb_device->address = addr;
321
322 // get hub descriptor
323 usb_target_t target;
324 target.address = addr;
325 target.endpoint = 0;
326 usb_device_request_setup_packet_t request;
327 //printf("[usb_hub] creating descriptor request\n");
328 usb_hub_set_descriptor_request(&request);
329
330 //printf("[usb_hub] creating serialized descriptor\n");
331 void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
332 usb_hub_descriptor_t * descriptor;
333 size_t received_size;
334 int opResult;
335 //printf("[usb_hub] starting control transaction\n");
336 opResult = usb_drv_sync_control_read(
337 hc, target, &request, serialized_descriptor,
338 USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size);
339 if (opResult != EOK) {
340 printf("[usb_hub] failed when receiving hub descriptor, badcode = %d\n",opResult);
341 ///\TODO memory leak will occur here!
342 return result;
343 }
344 //printf("[usb_hub] deserializing descriptor\n");
345 descriptor = usb_deserialize_hub_desriptor(serialized_descriptor);
346 if(descriptor==NULL){
347 printf("[usb_hub] could not deserialize descriptor \n");
348 result->port_count = 1;///\TODO this code is only for debug!!!
349 return result;
350 }
351 //printf("[usb_hub] setting port count to %d\n",descriptor->ports_count);
352 result->port_count = descriptor->ports_count;
353 result->attached_devs = (usb_hub_attached_device_t*)
354 malloc(result->port_count * sizeof(usb_hub_attached_device_t));
355 int i;
356 for(i=0;i<result->port_count;++i){
357 result->attached_devs[i].devman_handle=0;
358 result->attached_devs[i].address=0;
359 }
360 //printf("[usb_hub] freeing data\n");
361 free(serialized_descriptor);
362 free(descriptor->devices_removable);
363 free(descriptor);
364
365 //finish
366
367 printf("[usb_hub] hub info created\n");
368
369 return result;
370}
371
372int usb_add_hub_device(device_t *dev) {
373 printf(NAME ": add_hub_device(handle=%d)\n", (int) dev->handle);
374 printf("[usb_hub] hub device\n");
375
376 /*
377 * We are some (probably deeply nested) hub.
378 * Thus, assign our own operations and explore already
379 * connected devices.
380 */
381
382 //create the hub structure
383 //get hc connection
384 /// \TODO correct params
385 int hc = usb_drv_hc_connect(dev, 0);
386
387 usb_hub_info_t * hub_info = usb_create_hub_info(dev, hc);
388 int port;
389 int opResult;
390 usb_device_request_setup_packet_t request;
391 usb_target_t target;
392 target.address = hub_info->usb_device->address;
393 target.endpoint = 0;
394
395 //get configuration descriptor
396 // this is not fully correct - there are more configurations
397 // and all should be checked
398 usb_standard_device_descriptor_t std_descriptor;
399 opResult = usb_drv_req_get_device_descriptor(hc, target.address,
400 &std_descriptor);
401 if(opResult!=EOK){
402 printf("[usb_hub] could not get device descriptor, %d\n",opResult);
403 return 1;///\TODO some proper error code needed
404 }
405 printf("[usb_hub] hub has %d configurations\n",std_descriptor.configuration_count);
406 if(std_descriptor.configuration_count<1){
407 printf("[usb_hub] THERE ARE NO CONFIGURATIONS AVAILABLE\n");
408 }
409 usb_standard_configuration_descriptor_t config_descriptor;
410 opResult = usb_drv_req_get_bare_configuration_descriptor(hc,
411 target.address, 0,
412 &config_descriptor);
413 if(opResult!=EOK){
414 printf("[usb_hub] could not get configuration descriptor, %d\n",opResult);
415 return 1;///\TODO some proper error code needed
416 }
417 //set configuration
418 request.request_type = 0;
419 request.request = USB_DEVREQ_SET_CONFIGURATION;
420 request.index=0;
421 request.length=0;
422 request.value_high=0;
423 request.value_low = config_descriptor.configuration_number;
424 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0);
425 if (opResult != EOK) {
426 printf("[usb_hub]something went wrong when setting hub`s configuration, %d\n", opResult);
427 }
428
429
430 for (port = 0; port < hub_info->port_count; ++port) {
431 usb_hub_set_power_port_request(&request, port);
432 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0);
433 if (opResult != EOK) {
434 printf("[usb_hub]something went wrong when setting hub`s %dth port\n", port);
435 }
436 }
437 //ports powered, hub seems to be enabled
438
439
440 ipc_hangup(hc);
441
442 //add the hub to list
443 usb_lst_append(&usb_hub_list, hub_info);
444 printf("[usb_hub] hub info added to list\n");
445 //(void)hub_info;
446 usb_hub_check_hub_changes();
447
448 /// \TODO start the check loop, if not already started...
449
450 //this is just a test for port status bitmap type
451 usb_hub_test_port_status();
452
453 printf("[usb_hub] hub dev added\n");
454 printf("\taddress %d, has %d ports \n",
455 hub_info->usb_device->address,
456 hub_info->port_count);
457 printf("\tused configuration %d\n",config_descriptor.configuration_number);
458
459 return EOK;
460 //return ENOTSUP;
461}
462
463//*********************************************
464//
465// hub driver code, main loop
466//
467//*********************************************
468
469/**
470 * reset the port with new device and reserve the default address
471 * @param hc
472 * @param port
473 * @param target
474 */
475static void usb_hub_init_add_device(int hc, uint16_t port, usb_target_t target) {
476 usb_device_request_setup_packet_t request;
477 int opResult;
478 printf("[usb_hub] some connection changed\n");
479 //get default address
480 opResult = usb_drv_reserve_default_address(hc);
481 if (opResult != EOK) {
482 printf("[usb_hub] cannot assign default address, it is probably used\n");
483 return;
484 }
485 //reset port
486 usb_hub_set_reset_port_request(&request, port);
487 opResult = usb_drv_sync_control_write(
488 hc, target,
489 &request,
490 NULL, 0
491 );
492 if (opResult != EOK) {
493 //continue;
494 printf("[usb_hub] something went wrong when reseting a port\n");
495 }
496}
497
498/**
499 * finalize adding new device after port reset
500 * @param hc
501 * @param port
502 * @param target
503 */
504static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
505 int hc, uint16_t port, usb_target_t target) {
506
507 usb_device_request_setup_packet_t request;
508 int opResult;
509 printf("[usb_hub] finalizing add device\n");
510 usb_address_t new_device_address =
511 usb_drv_request_address(hc);
512 usb_hub_set_set_address_request
513 (&request, new_device_address);
514 opResult = usb_drv_sync_control_write(
515 hc, target,
516 &request,
517 NULL, 0
518 );
519 if (opResult != EOK) {
520 printf("[usb_hub] could not set address for new device\n");
521 //will retry later...
522 return;
523 }
524
525 usb_drv_release_default_address(hc);
526
527 devman_handle_t child_handle;
528 opResult = usb_drv_register_child_in_devman(hc, hub->device,
529 new_device_address, &child_handle);
530 if (opResult != EOK) {
531 printf("[usb_hub] could not start driver for new device \n");
532 return;
533 }
534 hub->attached_devs[port].devman_handle = child_handle;
535 hub->attached_devs[port].address = new_device_address;
536
537 opResult = usb_drv_bind_address(hc, new_device_address, child_handle);
538 if (opResult != EOK) {
539 printf("[usb_hub] could not assign address of device in hcd \n");
540 return;
541 }
542
543}
544
545/**
546 * unregister device address in hc, close the port
547 * @param hc
548 * @param port
549 * @param target
550 */
551static void usb_hub_removed_device(
552 usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) {
553 //usb_device_request_setup_packet_t request;
554 int opResult;
555 //disable port
556 /*usb_hub_set_disable_port_request(&request, port);
557 opResult = usb_drv_sync_control_write(
558 hc, target,
559 &request,
560 NULL, 0
561 );
562 if (opResult != EOK) {
563 //continue;
564 printf("[usb_hub] something went wrong when disabling a port\n");
565 }*/
566 /// \TODO remove device
567
568 hub->attached_devs[port].devman_handle=0;
569 //close address
570 if(hub->attached_devs[port].address!=0){
571 opResult = usb_drv_release_address(hc,hub->attached_devs[port].address);
572 if(opResult != EOK) {
573 printf("[usb_hub] could not release address of removed device: %d\n",opResult);
574 }
575 hub->attached_devs[port].address = 0;
576 }else{
577 printf("[usb_hub] this is strange, disconnected device had no address\n");
578 //device was disconnected before it`s port was reset - return default address
579 usb_drv_release_default_address(hc);
580 }
581}
582
583/**
584 * process interrupts on given hub port
585 * @param hc
586 * @param port
587 * @param target
588 */
589static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc,
590 uint16_t port, usb_address_t address) {
591 printf("[usb_hub] interrupt at port %d\n", port);
592 //determine type of change
593 usb_target_t target;
594 target.address=address;
595 target.endpoint=0;
596 usb_port_status_t status;
597 size_t rcvd_size;
598 usb_device_request_setup_packet_t request;
599 int opResult;
600 usb_hub_set_port_status_request(&request, port);
601 //endpoint 0
602
603 opResult = usb_drv_sync_control_read(
604 hc, target,
605 &request,
606 &status, 4, &rcvd_size
607 );
608 if (opResult != EOK) {
609 printf("[usb_hub] ERROR: could not get port status\n");
610 return;
611 }
612 if (rcvd_size != sizeof (usb_port_status_t)) {
613 printf("[usb_hub] ERROR: received status has incorrect size\n");
614 return;
615 }
616 //something connected/disconnected
617 if (usb_port_connect_change(&status)) {
618 if (usb_port_dev_connected(&status)) {
619 printf("[usb_hub] some connection changed\n");
620 usb_hub_init_add_device(hc, port, target);
621 } else {
622 usb_hub_removed_device(hub, hc, port, target);
623 }
624 }
625 //port reset
626 if (usb_port_reset_completed(&status)) {
627 printf("[usb_hub] finalizing add device\n");
628 if (usb_port_enabled(&status)) {
629 usb_hub_finalize_add_device(hub, hc, port, target);
630 } else {
631 printf("[usb_hub] ERROR: port reset, but port still not enabled\n");
632 }
633 }
634
635 usb_port_set_connect_change(&status, false);
636 usb_port_set_reset(&status, false);
637 usb_port_set_reset_completed(&status, false);
638 usb_port_set_dev_connected(&status, false);
639 if (status) {
640 printf("[usb_hub]there was some unsupported change on port\n");
641 }
642 /// \TODO handle other changes
643 /// \TODO debug log for various situations
644
645
646
647 /*
648 //configure device
649 usb_drv_reserve_default_address(hc);
650
651 usb_address_t new_device_address = usb_drv_request_address(hc);
652
653
654 usb_drv_release_default_address(hc);
655 * */
656}
657
658/** Check changes on all known hubs.
659 */
660void usb_hub_check_hub_changes(void) {
661 /*
662 * Iterate through all hubs.
663 */
664 usb_general_list_t * lst_item;
665 for (lst_item = usb_hub_list.next;
666 lst_item != &usb_hub_list;
667 lst_item = lst_item->next) {
668 printf("[usb_hub] checking hub changes\n");
669 usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data);
670 /*
671 * Check status change pipe of this hub.
672 */
673
674 usb_target_t target;
675 target.address = hub_info->usb_device->address;
676 target.endpoint = 1;/// \TODO get from endpoint descriptor
677
678 size_t port_count = hub_info->port_count;
679
680 /*
681 * Connect to respective HC.
682 */
683 int hc = usb_drv_hc_connect(hub_info->device, 0);
684 if (hc < 0) {
685 continue;
686 }
687
688 // FIXME: count properly
689 size_t byte_length = (port_count / 8) + 1;
690
691 void *change_bitmap = malloc(byte_length);
692 size_t actual_size;
693 usb_handle_t handle;
694
695 /*
696 * Send the request.
697 */
698 int opResult = usb_drv_async_interrupt_in(hc, target,
699 change_bitmap, byte_length, &actual_size,
700 &handle);
701
702 usb_drv_async_wait_for(handle);
703
704 if (opResult != EOK) {
705 printf("[usb_hub] something went wrong while getting status of hub\n");
706 continue;
707 }
708 unsigned int port;
709 for (port = 0; port < port_count; ++port) {
710 bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2;
711 if (interrupt) {
712 usb_hub_process_interrupt(
713 hub_info, hc, port, hub_info->usb_device->address);
714 }
715 }
716
717
718 /*
719 * TODO: handle the changes.
720 */
721
722 /*
723 * WARNING: sample code, will not work out of the box.
724 * And does not contain code for checking for errors.
725 */
726#if 0
727 /*
728 * Before opening the port, we must acquire the default
729 * address.
730 */
731 usb_drv_reserve_default_address(hc);
732
733 usb_address_t new_device_address = usb_drv_request_address(hc);
734
735 // TODO: open the port
736
737 // TODO: send request for setting address to new_device_address
738
739 /*
740 * Once new address is set, we can release the default
741 * address.
742 */
743 usb_drv_release_default_address(hc);
744
745 /*
746 * Obtain descriptors and create match ids for devman.
747 */
748
749 // TODO: get device descriptors
750
751 // TODO: create match ids
752
753 // TODO: add child device
754
755 // child_device_register sets the device handle
756 // TODO: store it here
757 devman_handle_t new_device_handle = 0;
758
759 /*
760 * Inform the HC that the new device has devman handle
761 * assigned.
762 */
763 usb_drv_bind_address(hc, new_device_address, new_device_handle);
764
765 /*
766 * That's all.
767 */
768#endif
769
770
771 /*
772 * Hang-up the HC-connected phone.
773 */
774 ipc_hangup(hc);
775 }
776}
777
778/**
779 * @}
780 */
Note: See TracBrowser for help on using the repository browser.