Changeset 9097c16a in mainline for uspace/drv
- Timestamp:
- 2011-02-04T13:14:14Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9e7cdf8
- Parents:
- 11797d5 (diff), ff244e6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv
- Files:
-
- 2 added
- 1 deleted
- 28 edited
- 11 moved
-
uhci/Makefile (modified) (1 diff)
-
uhci/main.c (modified) (2 diffs)
-
uhci/pci.c (added)
-
uhci/uhci.h (modified) (2 diffs)
-
usbhid/Makefile (moved) (moved from uspace/drv/usbkbd/Makefile ) (3 diffs)
-
usbhid/conv.c (moved) (moved from uspace/drv/usbkbd/conv.c ) (2 diffs)
-
usbhid/conv.h (moved) (moved from uspace/drv/usbkbd/conv.h ) (2 diffs)
-
usbhid/descdump.c (moved) (moved from uspace/drv/usbkbd/descdump.c ) (2 diffs)
-
usbhid/descdump.h (moved) (moved from uspace/drv/usbkbd/descdump.h ) (2 diffs)
-
usbhid/descparser.c (moved) (moved from uspace/drv/usbkbd/descparser.c ) (2 diffs)
-
usbhid/descparser.h (moved) (moved from uspace/drv/usbkbd/descparser.h ) (2 diffs)
-
usbhid/hid.h (moved) (moved from uspace/drv/vhc/debug.c ) (2 diffs)
-
usbhid/kbd.h (added)
-
usbhid/layout.h (moved) (moved from uspace/drv/usbkbd/layout.h ) (2 diffs)
-
usbhid/main.c (moved) (moved from uspace/drv/usbkbd/main.c ) (13 diffs)
-
usbhid/usbhid.ma (moved) (moved from uspace/drv/usbkbd/usbkbd.ma )
-
usbhub/main.c (modified) (4 diffs)
-
usbhub/port_status.h (modified) (2 diffs)
-
usbhub/usbhub.c (modified) (29 diffs)
-
usbhub/usbhub.h (modified) (1 diff)
-
usbhub/usbhub_private.h (modified) (3 diffs)
-
usbhub/usblist.c (modified) (1 diff)
-
usbhub/usblist.h (modified) (3 diffs)
-
usbhub/utils.c (modified) (1 diff)
-
usbkbd/kbd.h (deleted)
-
vhc/Makefile (modified) (1 diff)
-
vhc/conn.h (modified) (2 diffs)
-
vhc/conndev.c (modified) (4 diffs)
-
vhc/connhost.c (modified) (10 diffs)
-
vhc/devices.c (modified) (9 diffs)
-
vhc/devices.h (modified) (2 diffs)
-
vhc/hc.c (modified) (8 diffs)
-
vhc/hc.h (modified) (1 diff)
-
vhc/hcd.c (modified) (4 diffs)
-
vhc/hub.c (modified) (3 diffs)
-
vhc/hub.h (modified) (1 diff)
-
vhc/hub/hub.c (modified) (3 diffs)
-
vhc/hub/hub.h (modified) (3 diffs)
-
vhc/hub/virthub.c (modified) (3 diffs)
-
vhc/hub/virthub.h (modified) (2 diffs)
-
vhc/hub/virthubops.c (modified) (1 diff)
-
vhc/vhcd.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci/Makefile
r11797d5 r9097c16a 34 34 SOURCES = \ 35 35 main.c \ 36 pci.c \ 36 37 transfers.c 37 38 -
uspace/drv/uhci/main.c
r11797d5 r9097c16a 30 30 #include <usb/debug.h> 31 31 #include <errno.h> 32 #include <str_error.h> 32 33 #include <driver.h> 33 34 #include "uhci.h" … … 55 56 usb_dprintf(NAME, 1, "uhci_add_device() called\n"); 56 57 device->ops = &uhci_ops; 58 59 uintptr_t io_reg_base; 60 size_t io_reg_size; 61 int irq; 62 63 int rc = pci_get_my_registers(device, 64 &io_reg_base, &io_reg_size, &irq); 65 66 if (rc != EOK) { 67 fprintf(stderr, 68 NAME ": failed to get I/O registers addresses: %s.\n", 69 str_error(rc)); 70 return rc; 71 } 72 73 usb_dprintf(NAME, 2, "I/O regs at 0x%X (size %zu), IRQ %d.\n", 74 io_reg_base, io_reg_size, irq); 57 75 58 76 /* -
uspace/drv/uhci/uhci.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbuhci 30 30 * @{ 31 31 */ … … 42 42 usbhc_iface_t uhci_iface; 43 43 44 int pci_get_my_registers(device_t *, uintptr_t *, size_t *, int *); 45 44 46 #endif 45 47 /** -
uspace/drv/usbhid/Makefile
r11797d5 r9097c16a 1 1 # 2 # Copyright (c) 2010 Vojtech Horky2 # Copyright (c) 2010-2011 Vojtech Horky 3 3 # All rights reserved. 4 4 # … … 30 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 32 BINARY = usbkbd 33 SRV_KBD = $(USPACE_PREFIX)/srv/hid/kbd 32 BINARY = usbhid 33 34 STOLEN_LAYOUT_SOURCES = \ 35 layout/us_qwerty.c \ 36 layout/us_dvorak.c \ 37 layout/cz.c 34 38 35 39 SOURCES = \ … … 38 42 descdump.c \ 39 43 conv.c \ 40 us_qwerty.c \ 41 us_dvorak.c \ 42 cz.c 44 $(STOLEN_LAYOUT_SOURCES) 45 46 EXTRA_CLEAN = $(STOLEN_LAYOUT_SOURCES) 47 48 SRV_KBD = $(USPACE_PREFIX)/srv/hid/kbd 43 49 44 50 include $(USPACE_PREFIX)/Makefile.common 45 51 46 us_qwerty.c: 47 ln -snf $(SRV_KBD)/layout/$@ $@ 48 49 us_dvorak.c: 50 ln -snf $(SRV_KBD)/layout/$@ $@ 51 52 cz.c: 53 ln -snf $(SRV_KBD)/layout/$@ $@ 54 55 52 layout/%.c: $(SRV_KBD)/layout/%.c 53 ln -sfn ../$< $@ -
uspace/drv/usbhid/conv.c
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 /** @addtogroup drvusbhid 30 * @{ 31 */ 32 /** @file 33 * USB scancode parser. 34 */ 35 28 36 #include <io/keycode.h> 29 37 #include <stdint.h> … … 185 193 return key; 186 194 } 195 196 /** 197 * @} 198 */ -
uspace/drv/usbhid/conv.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbhid 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief USB Scancode parser.33 * USB scancode parser. 34 34 */ 35 35 … … 40 40 41 41 #endif 42 43 /** 44 * @} 45 */ -
uspace/drv/usbhid/descdump.c
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 /** @addtogroup drvusbhid 30 * @{ 31 */ 32 /** @file 33 * Descriptor dumping. 34 */ 35 28 36 #include <usb/classes/hid.h> 29 37 … … 143 151 dump_buffer("", d, size); 144 152 } 153 154 /** 155 * @} 156 */ 157 -
uspace/drv/usbhid/descdump.h
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 /** @addtogroup drvusbhid 30 * @{ 31 */ 32 /** @file 33 * Descriptor dumping. 34 */ 35 28 36 #ifndef USBHID_DESCDUMP_H_ 29 37 #define USBHID_DESCDUMP_H_ 30 38 31 #include <usb/classes/hid.h>39 #include "hid.h" 32 40 33 41 void dump_standard_configuration_descriptor( … … 50 58 51 59 #endif /* USBHID_DESCDUMP_H_ */ 60 61 /** 62 * @} 63 */ -
uspace/drv/usbhid/descparser.c
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 /** @addtogroup drvusbhid 30 * @{ 31 */ 32 /** @file 33 * Descriptor parser. 34 */ 35 28 36 #include <errno.h> 29 37 #include <stdint.h> … … 338 346 } 339 347 } 348 349 /** 350 * @} 351 */ -
uspace/drv/usbhid/descparser.h
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 /** @addtogroup drvusbhid 30 * @{ 31 */ 32 /** @file 33 * Descriptor parser. 34 */ 35 28 36 #ifndef USBHID_DESCPARSER_H_ 29 37 #define USBHID_DESCPARSER_H_ 30 38 31 #include <usb/classes/hid.h>39 #include "hid.h" 32 40 33 41 int usbkbd_parse_descriptors(const uint8_t *data, size_t size, … … 37 45 38 46 #endif 47 48 /** 49 * @} 50 */ -
uspace/drv/usbhid/hid.h
r11797d5 r9097c16a 1 1 /* 2 * Copyright (c) 201 0 Vojtech Horky2 * Copyright (c) 2011 Lubos Slovak 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbhid 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief Debugging support.33 * Common definitions. 34 34 */ 35 #include <stdio.h>36 #include <ipc/ipc.h>37 #include <usb/debug.h>38 35 39 #include "vhcd.h" 36 #ifndef USBHID_HID_H_ 37 #define USBHID_HID_H_ 40 38 41 42 /** Debug print informing of invalid call. 43 */ 44 void dprintf_inval_call(int level, ipc_call_t call, sysarg_t phone_hash) 45 { 46 dprintf(level, "phone%#x: invalid call [%u (%u, %u, %u, %u, %u)]", 47 phone_hash, 48 IPC_GET_IMETHOD(call), 49 IPC_GET_ARG1(call), IPC_GET_ARG2(call), IPC_GET_ARG3(call), 50 IPC_GET_ARG4(call), IPC_GET_ARG5(call)); 51 } 39 #include <usb/classes/hid.h> 40 #include <driver.h> 41 #include <usb/pipes.h> 52 42 53 43 /** 54 * @}44 * 55 45 */ 46 typedef struct { 47 usb_standard_interface_descriptor_t iface_desc; 48 usb_standard_endpoint_descriptor_t *endpoints; 49 usb_standard_hid_descriptor_t hid_desc; 50 uint8_t *report_desc; 51 //usb_standard_hid_class_descriptor_info_t *class_desc_info; 52 //uint8_t **class_descs; 53 } usb_hid_iface_t; 54 55 /** 56 * 57 */ 58 typedef struct { 59 usb_standard_configuration_descriptor_t config_descriptor; 60 usb_hid_iface_t *interfaces; 61 } usb_hid_configuration_t; 62 63 /** 64 * @brief USB/HID keyboard device type. 65 * 66 * Quite dummy right now. 67 */ 68 typedef struct { 69 device_t *device; 70 usb_hid_configuration_t *conf; 71 usb_address_t address; 72 usb_hid_report_parser_t *parser; 73 74 usb_device_connection_t wire; 75 usb_endpoint_pipe_t poll_pipe; 76 } usb_hid_dev_kbd_t; 77 78 // TODO: more configurations! 79 80 #endif -
uspace/drv/usbhid/layout.h
r11797d5 r9097c16a 1 1 /* 2 * Copyright (c) 2009 Jiri Svoboda 2 3 * Copyright (c) 2011 Lubos Slovak 3 4 * (copied from /uspace/srv/hid/kbd/include/layout.h) … … 28 29 */ 29 30 30 /** @addtogroup usb 31 * @brief 32 * @ingroup 31 /** @addtogroup drvusbhid 33 32 * @{ 34 33 */ 35 34 /** @file 35 * Keyboard layout. 36 36 */ 37 37 -
uspace/drv/usbhid/main.c
r11797d5 r9097c16a 1 1 /* 2 2 * Copyright (c) 2010 Vojtech Horky 3 * Copyright (c) 2011 Lubos Slovak 3 4 * All rights reserved. 4 5 * … … 26 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 */ 29 30 /** @addtogroup drvusbhid 31 * @{ 32 */ 33 /** 34 * @file 35 * Main routines of USB HID driver. 36 */ 37 28 38 #include <usb/usbdrv.h> 29 39 #include <driver.h> … … 33 43 #include <io/console.h> 34 44 #include <errno.h> 45 #include <str_error.h> 35 46 #include <fibril.h> 36 47 #include <usb/classes/hid.h> … … 39 50 #include <usb/descriptor.h> 40 51 #include <io/console.h> 52 #include "hid.h" 41 53 #include "descparser.h" 42 54 #include "descdump.h" … … 45 57 46 58 #define BUFFER_SIZE 32 47 #define NAME "usb kbd"59 #define NAME "usbhid" 48 60 49 61 #define GUESSED_POLL_ENDPOINT 1 … … 369 381 if (rc < 0) { 370 382 printf("Problem setting phone to HC.\n"); 371 free(kbd_dev); 372 return NULL; 383 goto error_leave; 373 384 } 374 385 … … 376 387 if (rc < 0) { 377 388 printf("Problem getting address of the device.\n"); 378 free(kbd_dev); 379 return NULL; 389 goto error_leave; 380 390 } 381 391 … … 387 397 // } 388 398 389 // default endpoint390 kbd_dev->poll_endpoint = GUESSED_POLL_ENDPOINT;391 392 399 /* 393 400 * will need all descriptors: … … 400 407 usbkbd_process_descriptors(kbd_dev); 401 408 409 410 411 /* 412 * Initialize the backing connection to the host controller. 413 */ 414 rc = usb_device_connection_initialize_from_device(&kbd_dev->wire, dev); 415 if (rc != EOK) { 416 printf("Problem initializing connection to device: %s.\n", 417 str_error(rc)); 418 goto error_leave; 419 } 420 421 /* 422 * Initialize device pipes. 423 */ 424 rc = usb_endpoint_pipe_initialize(&kbd_dev->poll_pipe, &kbd_dev->wire, 425 GUESSED_POLL_ENDPOINT, USB_TRANSFER_INTERRUPT, USB_DIRECTION_IN); 426 if (rc != EOK) { 427 printf("Failed to initialize interrupt in pipe: %s.\n", 428 str_error(rc)); 429 goto error_leave; 430 } 431 432 402 433 return kbd_dev; 434 435 error_leave: 436 free(kbd_dev); 437 return NULL; 403 438 } 404 439 … … 413 448 //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 414 449 // NULL); 415 printf("Calling usb_hid_boot_keyboard_input_report() with size % d\n",450 printf("Calling usb_hid_boot_keyboard_input_report() with size %zu\n", 416 451 actual_size); 417 452 //dump_buffer("bufffer: ", buffer, actual_size); … … 425 460 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 426 461 { 427 int rc; 428 usb_handle_t handle; 462 int rc, sess_rc; 429 463 uint8_t buffer[BUFFER_SIZE]; 430 464 size_t actual_size; 431 //usb_endpoint_t poll_endpoint = 1;432 433 // usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,434 // dev);435 // if (my_address < 0) {436 // return;437 // }438 439 usb_target_t poll_target = {440 .address = kbd_dev->address,441 .endpoint = kbd_dev->poll_endpoint442 };443 465 444 466 printf("Polling keyboard...\n"); … … 446 468 while (true) { 447 469 async_usleep(1000 * 1000 * 2); 448 rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone, 449 poll_target, buffer, BUFFER_SIZE, &actual_size, &handle); 470 471 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->poll_pipe); 472 if (sess_rc != EOK) { 473 printf("Failed to start a session: %s.\n", 474 str_error(sess_rc)); 475 continue; 476 } 477 478 rc = usb_endpoint_pipe_read(&kbd_dev->poll_pipe, buffer, 479 BUFFER_SIZE, &actual_size); 480 sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->poll_pipe); 450 481 451 482 if (rc != EOK) { 452 printf("Error in usb_drv_async_interrupt_in(): %d\n", rc); 483 printf("Error polling the keyboard: %s.\n", 484 str_error(rc)); 453 485 continue; 454 486 } 455 487 456 rc = usb_drv_async_wait_for(handle);457 if (rc != EOK) {458 printf("Error in usb_drv_async_wait_for(): %d\n", rc);488 if (sess_rc != EOK) { 489 printf("Error closing session: %s.\n", 490 str_error(sess_rc)); 459 491 continue; 460 492 } … … 557 589 return driver_main(&kbd_driver); 558 590 } 591 592 /** 593 * @} 594 */ -
uspace/drv/usbhub/main.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup drvusbhub 30 * @{ 31 */ 32 29 33 #include <driver.h> 30 34 #include <errno.h> … … 38 42 39 43 usb_general_list_t usb_hub_list; 40 f utex_t usb_hub_list_lock;44 fibril_mutex_t usb_hub_list_lock; 41 45 42 46 static driver_ops_t hub_driver_ops = { … … 60 64 int main(int argc, char *argv[]) 61 65 { 62 usb_dprintf_enable(NAME,1); 63 futex_initialize(&usb_hub_list_lock, 0); 66 usb_dprintf_enable(NAME, 0); 67 68 fibril_mutex_initialize(&usb_hub_list_lock); 69 fibril_mutex_lock(&usb_hub_list_lock); 64 70 usb_lst_init(&usb_hub_list); 65 futex_up(&usb_hub_list_lock); 71 fibril_mutex_unlock(&usb_hub_list_lock); 72 66 73 fid_t fid = fibril_create(usb_hub_control_loop, NULL); 67 74 if (fid == 0) { 68 dprintf(1, "failed to start fibril for HUB devices");69 //printf("%s: failed to start fibril for HUB devices\n", NAME);75 fprintf(stderr, NAME ": failed to start monitoring fibril," \ 76 " driver aborting.\n"); 70 77 return ENOMEM; 71 78 } … … 74 81 return driver_main(&hub_driver); 75 82 } 83 84 /** 85 * @} 86 */ 87 -
uspace/drv/usbhub/port_status.h
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusbhub 29 * @{ 30 */ 28 31 29 32 #ifndef PORT_STATUS_H … … 302 305 #endif /* PORT_STATUS_H */ 303 306 307 /** 308 * @} 309 */ -
uspace/drv/usbhub/usbhub.c
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup usb hub driver28 /** @addtogroup drvusbhub 29 29 * @{ 30 30 */ … … 76 76 //get some hub info 77 77 usb_address_t addr = usb_drv_get_my_address(hc, device); 78 dprintf(1, "[usb_hub]address of newly created hub = %d", addr);78 dprintf(1, "address of newly created hub = %d", addr); 79 79 /*if(addr<0){ 80 80 //return result; … … 100 100 101 101 if (opResult != EOK) { 102 dprintf(1, "[usb_hub]failed when receiving hub descriptor, badcode = %d",opResult);102 dprintf(1, "failed when receiving hub descriptor, badcode = %d",opResult); 103 103 free(serialized_descriptor); 104 104 return result; … … 107 107 descriptor = usb_deserialize_hub_desriptor(serialized_descriptor); 108 108 if(descriptor==NULL){ 109 dprintf(1, "[usb_hub]could not deserialize descriptor ");109 dprintf(1, "could not deserialize descriptor "); 110 110 result->port_count = 1;///\TODO this code is only for debug!!! 111 111 return result; … … 127 127 //finish 128 128 129 dprintf(1, "[usb_hub]hub info created");129 dprintf(1, "hub info created"); 130 130 131 131 return result; … … 134 134 int usb_add_hub_device(device_t *dev) { 135 135 dprintf(1, "add_hub_device(handle=%d)", (int) dev->handle); 136 dprintf(1, "[usb_hub]hub device");136 dprintf(1, "hub device"); 137 137 138 138 /* … … 162 162 usb_standard_device_descriptor_t std_descriptor; 163 163 opResult = usb_drv_req_get_device_descriptor(hc, target.address, 164 &std_descriptor);164 &std_descriptor); 165 165 if(opResult!=EOK){ 166 dprintf(1, "[usb_hub]could not get device descriptor, %d",opResult);166 dprintf(1, "could not get device descriptor, %d",opResult); 167 167 return opResult; 168 168 } 169 dprintf(1, "[usb_hub]hub has %d configurations",std_descriptor.configuration_count);169 dprintf(1, "hub has %d configurations",std_descriptor.configuration_count); 170 170 if(std_descriptor.configuration_count<1){ 171 dprintf(1, "[usb_hub]THERE ARE NO CONFIGURATIONS AVAILABLE");171 dprintf(1, "THERE ARE NO CONFIGURATIONS AVAILABLE"); 172 172 //shouldn`t I return? 173 173 } … … 178 178 &config_descriptor); 179 179 if(opResult!=EOK){ 180 dprintf(1, "[usb_hub]could not get configuration descriptor, %d",opResult);180 dprintf(1, "could not get configuration descriptor, %d",opResult); 181 181 return opResult; 182 182 } … … 186 186 187 187 if (opResult != EOK) { 188 dprintf(1, "[usb_hub]something went wrong when setting hub`s configuration, %d", opResult);188 dprintf(1, "something went wrong when setting hub`s configuration, %d", opResult); 189 189 } 190 190 … … 193 193 usb_hub_set_power_port_request(&request, port); 194 194 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0); 195 dprintf(1, "[usb_hub]powering port %d",port);195 dprintf(1, "powering port %d",port); 196 196 if (opResult != EOK) { 197 dprintf(1, "[usb_hub]something went wrong when setting hub`s %dth port", port);197 dprintf(1, "something went wrong when setting hub`s %dth port", port); 198 198 } 199 199 } … … 203 203 204 204 //add the hub to list 205 f utex_down(&usb_hub_list_lock);205 fibril_mutex_lock(&usb_hub_list_lock); 206 206 usb_lst_append(&usb_hub_list, hub_info); 207 f utex_up(&usb_hub_list_lock);208 209 dprintf(1, "[usb_hub]hub info added to list");207 fibril_mutex_unlock(&usb_hub_list_lock); 208 209 dprintf(1, "hub info added to list"); 210 210 //(void)hub_info; 211 211 usb_hub_check_hub_changes(); … … 213 213 214 214 215 dprintf(1, "[usb_hub]hub dev added");216 dprintf(1, "\taddress %d, has %d ports ",215 dprintf(1, "hub dev added"); 216 dprintf(1, "\taddress %d, has %d ports ", 217 217 hub_info->usb_device->address, 218 218 hub_info->port_count); 219 dprintf(1, "\tused configuration %d",config_descriptor.configuration_number);219 dprintf(1, "\tused configuration %d",config_descriptor.configuration_number); 220 220 221 221 return EOK; … … 238 238 inline static int usb_hub_release_default_address(int hc){ 239 239 int opResult; 240 dprintf(1, "[usb_hub]releasing default address");240 dprintf(1, "releasing default address"); 241 241 opResult = usb_drv_release_default_address(hc); 242 242 if (opResult != EOK) { 243 dprintf(1, "[usb_hub]failed to release default address");243 dprintf(1, "failed to release default address"); 244 244 } 245 245 return opResult; … … 255 255 usb_device_request_setup_packet_t request; 256 256 int opResult; 257 dprintf(1, "[usb_hub]some connection changed");257 dprintf(1, "some connection changed"); 258 258 //get default address 259 259 opResult = usb_drv_reserve_default_address(hc); 260 260 if (opResult != EOK) { 261 dprintf(1, "[usb_hub]cannot assign default address, it is probably used");261 dprintf(1, "cannot assign default address, it is probably used"); 262 262 return; 263 263 } … … 270 270 ); 271 271 if (opResult != EOK) { 272 dprintf(1, "[usb_hub]something went wrong when reseting a port");272 dprintf(1, "something went wrong when reseting a port"); 273 273 usb_hub_release_default_address(hc); 274 274 } … … 285 285 286 286 int opResult; 287 dprintf(1, "[usb_hub]finalizing add device");287 dprintf(1, "finalizing add device"); 288 288 opResult = usb_hub_clear_port_feature(hc, target.address, 289 289 port, USB_HUB_FEATURE_C_PORT_RESET); 290 290 if (opResult != EOK) { 291 dprintf(1, "[usb_hub]failed to clear port reset feature");291 dprintf(1, "failed to clear port reset feature"); 292 292 usb_hub_release_default_address(hc); 293 293 return; … … 297 297 usb_address_t new_device_address = usb_drv_request_address(hc); 298 298 if (new_device_address < 0) { 299 dprintf(1, "[usb_hub]failed to get free USB address");299 dprintf(1, "failed to get free USB address"); 300 300 opResult = new_device_address; 301 301 usb_hub_release_default_address(hc); 302 302 return; 303 303 } 304 dprintf(1, "[usb_hub]setting new address");304 dprintf(1, "setting new address"); 305 305 opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT, 306 306 new_device_address); 307 307 308 308 if (opResult != EOK) { 309 dprintf(1, "[usb_hub]could not set address for new device");309 dprintf(1, "could not set address for new device"); 310 310 usb_hub_release_default_address(hc); 311 311 return; … … 322 322 new_device_address, &child_handle); 323 323 if (opResult != EOK) { 324 dprintf(1, "[usb_hub]could not start driver for new device");324 dprintf(1, "could not start driver for new device"); 325 325 return; 326 326 } … … 330 330 opResult = usb_drv_bind_address(hc, new_device_address, child_handle); 331 331 if (opResult != EOK) { 332 dprintf(1, "[usb_hub]could not assign address of device in hcd");333 return; 334 } 335 dprintf(1, "[usb_hub]new device address %d, handle %zu",332 dprintf(1, "could not assign address of device in hcd"); 333 return; 334 } 335 dprintf(1, "new device address %d, handle %zu", 336 336 new_device_address, child_handle); 337 337 … … 358 358 opResult = usb_drv_release_address(hc,hub->attached_devs[port].address); 359 359 if(opResult != EOK) { 360 dprintf(1, 361 "[usb_hub] could not release address of removed device: %d" 362 ,opResult); 360 dprintf(1, "could not release address of " \ 361 "removed device: %d", opResult); 363 362 } 364 363 hub->attached_devs[port].address = 0; 365 364 }else{ 366 dprintf(1, 367 "[usb_hub] this is strange, disconnected device had no address"); 365 dprintf(1, "this is strange, disconnected device had no address"); 368 366 //device was disconnected before it`s port was reset - return default address 369 367 usb_drv_release_default_address(hc); … … 379 377 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, 380 378 uint16_t port, usb_address_t address) { 381 dprintf(1, "[usb_hub]interrupt at port %d", port);379 dprintf(1, "interrupt at port %d", port); 382 380 //determine type of change 383 381 usb_target_t target; … … 397 395 ); 398 396 if (opResult != EOK) { 399 dprintf(1, "[usb_hub]ERROR: could not get port status");397 dprintf(1, "ERROR: could not get port status"); 400 398 return; 401 399 } 402 400 if (rcvd_size != sizeof (usb_port_status_t)) { 403 dprintf(1, "[usb_hub]ERROR: received status has incorrect size");401 dprintf(1, "ERROR: received status has incorrect size"); 404 402 return; 405 403 } … … 410 408 // TODO: check opResult 411 409 if (usb_port_dev_connected(&status)) { 412 dprintf(1, "[usb_hub]some connection changed");410 dprintf(1, "some connection changed"); 413 411 usb_hub_init_add_device(hc, port, target); 414 412 } else { … … 418 416 //port reset 419 417 if (usb_port_reset_completed(&status)) { 420 dprintf(1, "[usb_hub]port reset complete");418 dprintf(1, "port reset complete"); 421 419 if (usb_port_enabled(&status)) { 422 420 usb_hub_finalize_add_device(hub, hc, port, target); 423 421 } else { 424 dprintf(1, "[usb_hub]ERROR: port reset, but port still not enabled");422 dprintf(1, "ERROR: port reset, but port still not enabled"); 425 423 } 426 424 } … … 431 429 usb_port_set_dev_connected(&status, false); 432 430 if (status>>16) { 433 dprintf(1, "[usb_hub]there was some unsupported change on port %d: %X",port,status);431 dprintf(1, "there was some unsupported change on port %d: %X",port,status); 434 432 435 433 } … … 447 445 */ 448 446 usb_general_list_t * lst_item; 449 f utex_down(&usb_hub_list_lock);447 fibril_mutex_lock(&usb_hub_list_lock); 450 448 for (lst_item = usb_hub_list.next; 451 449 lst_item != &usb_hub_list; 452 450 lst_item = lst_item->next) { 453 f utex_up(&usb_hub_list_lock);451 fibril_mutex_unlock(&usb_hub_list_lock); 454 452 usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data); 455 453 /* … … 460 458 target.address = hub_info->usb_device->address; 461 459 target.endpoint = 1;/// \TODO get from endpoint descriptor 462 /*dprintf(1,"[usb_hub]checking changes for hub at addr %d",463 target.address); */460 dprintf(1, "checking changes for hub at addr %d", 461 target.address); 464 462 465 463 size_t port_count = hub_info->port_count; … … 490 488 491 489 if (opResult != EOK) { 492 dprintf(1,"[usb_hub] something went wrong while getting status of hub"); 490 free(change_bitmap); 491 dprintf(1, "something went wrong while getting status of hub"); 493 492 continue; 494 493 } … … 505 504 506 505 ipc_hangup(hc); 507 f utex_down(&usb_hub_list_lock);508 } 509 f utex_up(&usb_hub_list_lock);506 fibril_mutex_lock(&usb_hub_list_lock); 507 } 508 fibril_mutex_unlock(&usb_hub_list_lock); 510 509 } 511 510 -
uspace/drv/usbhub/usbhub.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbhub 30 30 * @{ 31 31 */ -
uspace/drv/usbhub/usbhub_private.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbhub 30 30 * @{ 31 31 */ … … 43 43 #include <bool.h> 44 44 #include <driver.h> 45 #include <f utex.h>45 #include <fibril_synch.h> 46 46 47 47 #include <usb/usb.h> … … 82 82 83 83 /** Lock for hub list*/ 84 extern f utex_t usb_hub_list_lock;84 extern fibril_mutex_t usb_hub_list_lock; 85 85 86 86 -
uspace/drv/usbhub/usblist.c
r11797d5 r9097c16a 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup usb hub driver28 /** @addtogroup drvusbhub 29 29 * @{ 30 30 */ -
uspace/drv/usbhub/usblist.h
r11797d5 r9097c16a 27 27 */ 28 28 29 30 #ifndef USBLIST_H 31 #define USBLIST_H 32 /** @addtogroup usb hub driver 29 /** @addtogroup drvusbhub 33 30 * @{ 34 31 */ … … 40 37 * much simpler and more straight-forward semantics. 41 38 */ 39 #ifndef USBLIST_H 40 #define USBLIST_H 42 41 43 42 /** … … 78 77 } 79 78 80 79 #endif /* USBLIST_H */ 81 80 /** 82 81 * @} 83 82 */ 84 85 86 87 #endif /* USBLIST_H */88 -
uspace/drv/usbhub/utils.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup libusb usb29 /** @addtogroup drvusbhub 30 30 * @{ 31 31 */ -
uspace/drv/vhc/Makefile
r11797d5 r9097c16a 44 44 conndev.c \ 45 45 connhost.c \ 46 debug.c \47 46 devices.c \ 48 47 hc.c \ -
uspace/drv/vhc/conn.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 51 51 52 52 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *); 53 void on_client_close(device_t *); 53 54 54 55 -
uspace/drv/vhc/conndev.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 88 88 int callback = IPC_GET_ARG5(*icall); 89 89 virtdev_connection_t *dev 90 = virtdev_add_device(callback );90 = virtdev_add_device(callback, (sysarg_t)fibril_get_id()); 91 91 if (!dev) { 92 92 ipc_answer_0(icallid, EEXISTS); … … 99 99 int rc = get_device_name(callback, devname, DEVICE_NAME_MAXLENGTH); 100 100 101 dprintf(0, "virtual device connected (name: %s)", 102 rc == EOK ? devname : "<unknown>"); 103 104 /* FIXME: destroy the device when the client disconnects. */ 101 usb_log_info("New virtual device `%s' (id = %x).\n", 102 rc == EOK ? devname : "<unknown>", dev->id); 105 103 106 104 return; … … 110 108 } 111 109 110 /** Callback for DDF when client disconnects. 111 * 112 * @param d Device the client was connected to. 113 */ 114 void on_client_close(device_t *d) 115 { 116 /* 117 * Maybe a virtual device is being unplugged. 118 */ 119 virtdev_connection_t *dev = virtdev_find((sysarg_t)fibril_get_id()); 120 if (dev == NULL) { 121 return; 122 } 123 124 usb_log_info("Virtual device disconnected (id = %x).\n", dev->id); 125 virtdev_destroy_device(dev); 126 } 127 112 128 113 129 /** -
uspace/drv/vhc/connhost.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 42 42 #include "hc.h" 43 43 44 44 45 typedef struct { 45 46 usb_direction_t direction; … … 47 48 usbhc_iface_transfer_in_callback_t in_callback; 48 49 device_t *dev; 50 size_t reported_size; 49 51 void *arg; 50 52 } transfer_info_t; 51 53 54 typedef struct { 55 usb_direction_t direction; 56 usb_target_t target; 57 usbhc_iface_transfer_out_callback_t out_callback; 58 usbhc_iface_transfer_in_callback_t in_callback; 59 device_t *dev; 60 void *arg; 61 void *data_buffer; 62 size_t data_buffer_size; 63 } control_transfer_info_t; 64 52 65 static void universal_callback(void *buffer, size_t size, 53 66 usb_transaction_outcome_t outcome, void *arg) 54 67 { 55 68 transfer_info_t *transfer = (transfer_info_t *) arg; 69 70 if (transfer->reported_size != (size_t) -1) { 71 size = transfer->reported_size; 72 } 56 73 57 74 switch (transfer->direction) { … … 84 101 transfer->arg = arg; 85 102 transfer->dev = dev; 103 transfer->reported_size = (size_t) -1; 104 105 return transfer; 106 } 107 108 static void control_abort_prematurely(control_transfer_info_t *transfer, 109 size_t size, usb_transaction_outcome_t outcome) 110 { 111 switch (transfer->direction) { 112 case USB_DIRECTION_IN: 113 transfer->in_callback(transfer->dev, 114 outcome, size, 115 transfer->arg); 116 break; 117 case USB_DIRECTION_OUT: 118 transfer->out_callback(transfer->dev, 119 outcome, 120 transfer->arg); 121 break; 122 default: 123 assert(false && "unreachable"); 124 break; 125 } 126 } 127 128 static void control_callback_two(void *buffer, size_t size, 129 usb_transaction_outcome_t outcome, void *arg) 130 { 131 control_transfer_info_t *ctrl_transfer = (control_transfer_info_t *) arg; 132 133 if (outcome != USB_OUTCOME_OK) { 134 control_abort_prematurely(ctrl_transfer, outcome, size); 135 free(ctrl_transfer); 136 return; 137 } 138 139 transfer_info_t *transfer = create_transfer_info(ctrl_transfer->dev, 140 ctrl_transfer->direction, ctrl_transfer->arg); 141 transfer->out_callback = ctrl_transfer->out_callback; 142 transfer->in_callback = ctrl_transfer->in_callback; 143 transfer->reported_size = size; 144 145 switch (ctrl_transfer->direction) { 146 case USB_DIRECTION_IN: 147 hc_add_transaction_to_device(false, ctrl_transfer->target, 148 USB_TRANSFER_CONTROL, 149 NULL, 0, 150 universal_callback, transfer); 151 break; 152 case USB_DIRECTION_OUT: 153 hc_add_transaction_from_device(ctrl_transfer->target, 154 USB_TRANSFER_CONTROL, 155 NULL, 0, 156 universal_callback, transfer); 157 break; 158 default: 159 assert(false && "unreachable"); 160 break; 161 } 162 163 free(ctrl_transfer); 164 } 165 166 static void control_callback_one(void *buffer, size_t size, 167 usb_transaction_outcome_t outcome, void *arg) 168 { 169 control_transfer_info_t *transfer = (control_transfer_info_t *) arg; 170 171 if (outcome != USB_OUTCOME_OK) { 172 control_abort_prematurely(transfer, outcome, size); 173 free(transfer); 174 return; 175 } 176 177 switch (transfer->direction) { 178 case USB_DIRECTION_IN: 179 hc_add_transaction_from_device(transfer->target, 180 USB_TRANSFER_CONTROL, 181 transfer->data_buffer, transfer->data_buffer_size, 182 control_callback_two, transfer); 183 break; 184 case USB_DIRECTION_OUT: 185 hc_add_transaction_to_device(false, transfer->target, 186 USB_TRANSFER_CONTROL, 187 transfer->data_buffer, transfer->data_buffer_size, 188 control_callback_two, transfer); 189 break; 190 default: 191 assert(false && "unreachable"); 192 break; 193 } 194 } 195 196 static control_transfer_info_t *create_control_transfer_info(device_t *dev, 197 usb_direction_t direction, usb_target_t target, 198 void *data_buffer, size_t data_buffer_size, 199 void *arg) 200 { 201 control_transfer_info_t *transfer 202 = malloc(sizeof(control_transfer_info_t)); 203 204 transfer->direction = direction; 205 transfer->target = target; 206 transfer->in_callback = NULL; 207 transfer->out_callback = NULL; 208 transfer->arg = arg; 209 transfer->dev = dev; 210 transfer->data_buffer = data_buffer; 211 transfer->data_buffer_size = data_buffer_size; 86 212 87 213 return transfer; … … 93 219 usbhc_iface_transfer_out_callback_t callback, void *arg) 94 220 { 95 dprintf(3, "transfer OUT [%d.%d (%s); %zu]",221 usb_log_debug2("Transfer OUT [%d.%d (%s); %zu].\n", 96 222 target.address, target.endpoint, 97 223 usb_str_transfer_type(transfer_type), … … 113 239 usbhc_iface_transfer_out_callback_t callback, void *arg) 114 240 { 115 dprintf(3, "transfer SETUP [%d.%d (%s); %zu]",241 usb_log_debug2("Transfer SETUP [%d.%d (%s); %zu].\n", 116 242 target.address, target.endpoint, 117 243 usb_str_transfer_type(transfer_type), … … 133 259 usbhc_iface_transfer_in_callback_t callback, void *arg) 134 260 { 135 dprintf(3, "transfer IN [%d.%d (%s); %zu]",261 usb_log_debug2("Transfer IN [%d.%d (%s); %zu].\n", 136 262 target.address, target.endpoint, 137 263 usb_str_transfer_type(transfer_type), … … 193 319 } 194 320 321 static int control_write(device_t *dev, usb_target_t target, 322 void *setup_packet, size_t setup_packet_size, 323 void *data, size_t data_size, 324 usbhc_iface_transfer_out_callback_t callback, void *arg) 325 { 326 control_transfer_info_t *transfer 327 = create_control_transfer_info(dev, USB_DIRECTION_OUT, target, 328 data, data_size, arg); 329 transfer->out_callback = callback; 330 331 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 332 setup_packet, setup_packet_size, 333 control_callback_one, transfer); 334 335 return EOK; 336 } 337 195 338 static int control_read_setup(device_t *dev, usb_target_t target, 196 339 void *data, size_t size, … … 217 360 NULL, 0, 218 361 callback, arg); 362 } 363 364 static int control_read(device_t *dev, usb_target_t target, 365 void *setup_packet, size_t setup_packet_size, 366 void *data, size_t data_size, 367 usbhc_iface_transfer_in_callback_t callback, void *arg) 368 { 369 control_transfer_info_t *transfer 370 = create_control_transfer_info(dev, USB_DIRECTION_IN, target, 371 data, data_size, arg); 372 transfer->in_callback = callback; 373 374 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 375 setup_packet, setup_packet_size, 376 control_callback_one, transfer); 377 378 return EOK; 219 379 } 220 380 … … 290 450 .control_write_status = control_write_status, 291 451 452 .control_write = control_write, 453 292 454 .control_read_setup = control_read_setup, 293 455 .control_read_data = control_read_data, 294 .control_read_status = control_read_status 456 .control_read_status = control_read_status, 457 458 .control_read = control_read 295 459 }; 296 460 -
uspace/drv/vhc/devices.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 58 58 /** Create virtual device. 59 59 * 60 * @param address USB address.61 60 * @param phone Callback phone. 61 * @param id Device id. 62 62 * @return New device. 63 * @retval NULL Out of memory or address already occupied.64 */ 65 virtdev_connection_t *virtdev_add_device(int phone )63 * @retval NULL Out of memory. 64 */ 65 virtdev_connection_t *virtdev_add_device(int phone, sysarg_t id) 66 66 { 67 67 virtdev_connection_t *dev = (virtdev_connection_t *) 68 68 malloc(sizeof(virtdev_connection_t)); 69 if (dev == NULL) { 70 return NULL; 71 } 72 69 73 dev->phone = phone; 74 dev->id = id; 70 75 list_append(&dev->link, &devices); 71 76 … … 73 78 74 79 return dev; 80 } 81 82 /** Find virtual device by id. 83 * 84 * @param id Device id. 85 * @return Device with given id. 86 * @retval NULL No such device. 87 */ 88 virtdev_connection_t *virtdev_find(sysarg_t id) 89 { 90 link_t *pos; 91 list_foreach(pos, &devices) { 92 virtdev_connection_t *dev 93 = list_get_instance(pos, virtdev_connection_t, link); 94 if (dev->id == id) { 95 return dev; 96 } 97 } 98 99 return NULL; 75 100 } 76 101 … … 90 115 usb_transaction_outcome_t virtdev_send_to_all(transaction_t *transaction) 91 116 { 117 /* For easier debugging. */ 118 switch (transaction->type) { 119 case USBVIRT_TRANSACTION_SETUP: 120 case USBVIRT_TRANSACTION_OUT: 121 transaction->actual_len = transaction->len; 122 break; 123 case USBVIRT_TRANSACTION_IN: 124 transaction->actual_len = 0; 125 break; 126 default: 127 assert(false && "unreachable branch in switch()"); 128 } 129 usb_transaction_outcome_t outcome = USB_OUTCOME_BABBLE; 130 92 131 link_t *pos; 93 132 list_foreach(pos, &devices) { … … 141 180 rc = (int)answer_rc; 142 181 } 182 183 /* 184 * If at least one device was able to accept this 185 * transaction and process it, we can announce success. 186 */ 187 if (rc == EOK) { 188 outcome = USB_OUTCOME_OK; 189 } 143 190 } 144 191 … … 149 196 if (virtual_hub_device.address == transaction->target.address) { 150 197 size_t tmp; 151 dprintf(1, "sending `%s' transaction to hub",198 usb_log_debug2("Sending `%s' transaction to hub.\n", 152 199 usbvirt_str_transaction_type(transaction->type)); 153 200 switch (transaction->type) { … … 165 212 transaction->buffer, transaction->len, 166 213 &tmp); 167 if (tmp < transaction->len) { 168 transaction->len = tmp; 169 } 214 transaction->actual_len = tmp; 170 215 break; 171 216 … … 177 222 break; 178 223 } 179 dprintf(4, "transaction on hub processed...");224 outcome = USB_OUTCOME_OK; 180 225 } 181 226 … … 184 229 * real-life image. 185 230 */ 186 return USB_OUTCOME_OK;231 return outcome; 187 232 } 188 233 -
uspace/drv/vhc/devices.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 45 45 /** Phone used when sending data to device. */ 46 46 int phone; 47 /** Unique identification. */ 48 sysarg_t id; 47 49 /** Linked-list handle. */ 48 50 link_t link; 49 51 } virtdev_connection_t; 50 52 51 virtdev_connection_t *virtdev_add_device(int );52 virtdev_connection_t *virtdev_ get_mine(void);53 virtdev_connection_t *virtdev_add_device(int, sysarg_t); 54 virtdev_connection_t *virtdev_find(sysarg_t); 53 55 void virtdev_destroy_device(virtdev_connection_t *); 54 56 usb_transaction_outcome_t virtdev_send_to_all(transaction_t *); -
uspace/drv/vhc/hc.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 92 92 usb_transaction_outcome_t outcome) 93 93 { 94 dprintf(3, "transaction " TRANSACTION_FORMAT " done, outcome: %s",94 usb_log_debug2("Transaction " TRANSACTION_FORMAT " done: %s.\n", 95 95 TRANSACTION_PRINTF(*transaction), 96 96 usb_str_transaction_outcome(outcome)); … … 108 108 static unsigned int seed = 4573; 109 109 110 printf("%s: transaction processor ready.\n", NAME);110 usb_log_info("Transaction processor ready.\n"); 111 111 112 112 while (true) { … … 125 125 list_remove(first_transaction_link); 126 126 127 128 dprintf(0, "about to process " TRANSACTION_FORMAT " [%s]", 127 usb_log_debug("Processing " TRANSACTION_FORMAT " [%s].\n", 129 128 TRANSACTION_PRINTF(*transaction), ports); 130 129 131 dprintf(3, "processing transaction " TRANSACTION_FORMAT "",132 TRANSACTION_PRINTF(*transaction));133 134 130 usb_transaction_outcome_t outcome; 135 131 outcome = virtdev_send_to_all(transaction); … … 148 144 fid_t fid = fibril_create(hc_manager_fibril, NULL); 149 145 if (fid == 0) { 150 printf(NAME ": failed to start HC manager fibril\n");146 usb_log_fatal("Failed to start HC manager fibril.\n"); 151 147 return; 152 148 } … … 172 168 transaction->callback = callback; 173 169 transaction->callback_arg = arg; 174 175 dprintf(3, "creating transaction " TRANSACTION_FORMAT, 170 171 return transaction; 172 } 173 174 static void hc_add_transaction(transaction_t *transaction) 175 { 176 usb_log_debug("Adding transaction " TRANSACTION_FORMAT ".\n", 176 177 TRANSACTION_PRINTF(*transaction)); 177 178 return transaction; 178 list_append(&transaction->link, &transaction_list); 179 179 } 180 180 … … 190 190 target, transfer_type, 191 191 buffer, len, callback, arg); 192 list_append(&transaction->link, &transaction_list);192 hc_add_transaction(transaction); 193 193 } 194 194 … … 203 203 target, transfer_type, 204 204 buffer, len, callback, arg); 205 list_append(&transaction->link, &transaction_list);205 hc_add_transaction(transaction); 206 206 } 207 207 -
uspace/drv/vhc/hc.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ -
uspace/drv/vhc/hcd.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 69 69 .interfaces[USBHC_DEV_IFACE] = &vhc_iface, 70 70 .interfaces[USB_DEV_IFACE] = &hc_usb_iface, 71 .close = on_client_close, 71 72 .default_handler = default_connection_handler 72 73 }; … … 93 94 virtual_hub_device_init(dev); 94 95 95 printf("%s: virtual USB host controller ready.\n", NAME); 96 usb_log_info("Virtual USB host controller ready (id = %zu).\n", 97 (size_t) dev->handle); 96 98 97 99 return EOK; … … 116 118 sleep(5); 117 119 118 usb_ dprintf_enable(NAME, -1);120 usb_log_enable(USB_LOG_LEVEL_INFO, NAME); 119 121 120 122 printf(NAME ": virtual USB host controller driver.\n"); -
uspace/drv/vhc/hub.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 63 63 = fibril_create(hub_register_in_devman_fibril, hc_dev); 64 64 if (root_hub_registration == 0) { 65 printf(NAME ": failed to register root hub\n");65 usb_log_fatal("Failed to create hub registration fibril.\n"); 66 66 return; 67 67 } … … 79 79 device_t *hc_dev = (device_t *) arg; 80 80 81 int hc = usb_drv_hc_connect(hc_dev, hc_dev->handle, IPC_FLAG_BLOCKING);82 if (hc < 0){83 printf(NAME ": failed to register root hub\n");84 return hc;85 } 81 int hc; 82 do { 83 hc = usb_drv_hc_connect(hc_dev, hc_dev->handle, 84 IPC_FLAG_BLOCKING); 85 } while (hc < 0); 86 86 87 87 usb_drv_reserve_default_address(hc); -
uspace/drv/vhc/hub.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ -
uspace/drv/vhc/hub/hub.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 155 155 } 156 156 157 /** Disconnects a device from a hub. 158 * 159 * @param hub Hub the device was connected to. 160 * @param device Device to be disconnected. 161 * @return Error code. 162 */ 163 int hub_disconnect_device(hub_t *hub, void *device) 164 { 165 size_t index = hub_find_device(hub, device); 166 if (index == (size_t) -1) { 167 return ENOENT; 168 } 169 170 hub_port_t *port = &hub->ports[index]; 171 172 port->connected_device = NULL; 173 port->state = HUB_PORT_STATE_DISCONNECTED; 174 set_port_status_change(port, HUB_STATUS_C_PORT_CONNECTION); 175 176 return EOK; 177 } 178 157 179 /** Find port device is connected to. 158 180 * … … 173 195 } 174 196 175 return 0;197 return -1; 176 198 } 177 199 -
uspace/drv/vhc/hub/hub.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 38 38 #include <fibril_synch.h> 39 39 40 #ifndef HUB_PORT_COUNT 40 41 #define HUB_PORT_COUNT 2 42 #endif 41 43 #define BITS2BYTES(bits) (bits ? ((((bits)-1)>>3)+1) : 0) 42 44 … … 94 96 void hub_init(hub_t *); 95 97 size_t hub_connect_device(hub_t *, void *); 98 int hub_disconnect_device(hub_t *, void *); 96 99 size_t hub_find_device(hub_t *, void *); 97 100 void hub_acquire(hub_t *); -
uspace/drv/vhc/hub/virthub.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 164 164 dev->device_data = hub; 165 165 166 usbvirt_connect_local(dev); 167 168 return EOK; 166 int rc; 167 #ifdef STANDALONE_HUB 168 dev->name = "hub"; 169 rc = usbvirt_connect(dev); 170 #else 171 rc = usbvirt_connect_local(dev); 172 #endif 173 174 return rc; 169 175 } 170 176 … … 203 209 204 210 hub_acquire(hub); 205 /* TODO: implement. */211 hub_disconnect_device(hub, conn); 206 212 hub_release(hub); 207 213 -
uspace/drv/vhc/hub/virthub.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 37 37 38 38 #include <usbvirt/device.h> 39 #include "hub.h" 40 41 #ifdef STANDALONE_HUB 42 #define virtdev_connection_t int 43 #else 39 44 #include "../devices.h" 40 # include "hub.h"45 #endif 41 46 42 47 /** Endpoint number for status change pipe. */ -
uspace/drv/vhc/hub/virthubops.c
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ -
uspace/drv/vhc/vhcd.h
r11797d5 r9097c16a 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbvhc 30 30 * @{ 31 31 */ … … 45 45 #define DEVMAP_PATH_DEV NAMESPACE "/" NAME_DEV 46 46 47 #define dprintf(level, format, ...) \ 48 usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__)49 void dprintf_inval_call(int, ipc_call_t, sysarg_t);47 //#define dprintf(level, format, ...) 48 // usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__) 49 //void dprintf_inval_call(int, ipc_call_t, sysarg_t); 50 50 51 51 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
