Changeset 399a13c in mainline
- Timestamp:
- 2011-05-30T13:50:33Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 17d1542
- Parents:
- a5fc431 (diff), 8971926 (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. - Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
ra5fc431 r399a13c 570 570 571 571 % USB release build (less logging) 572 ! CONFIG_USB_RELEASE_BUILD ( n/y)572 ! CONFIG_USB_RELEASE_BUILD (y/n) 573 573 574 574 % Start virtual USB host controller … … 576 576 577 577 % Polling UHCI & OHCI (no interrupts) 578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS ( y/n)578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS (n/y) 579 579 580 580 % Run devman in kconsole (not recommended) -
uspace/drv/ohci/root_hub.c
ra5fc431 r399a13c 57 57 .device_version = 0, 58 58 .length = sizeof (usb_standard_device_descriptor_t), 59 /// \TODO this value is guessed60 59 .max_packet_size = 8, 61 60 .vendor_id = 0x16db, … … 117 116 */ 118 117 static const uint32_t hub_clear_feature_by_writing_one_mask = 119 RHS_CLEAR_PORT_POWER;118 RHS_CLEAR_PORT_POWER; 120 119 121 120 /** … … 412 411 request->transfered_size = 4; 413 412 uint32_t data = instance->registers->rh_port_status[port - 1]; 414 memcpy(request->data_buffer, &data,4);413 memcpy(request->data_buffer, &data, 4); 415 414 #if 0 416 415 int i; … … 445 444 uint32_t data = mask & instance->registers->rh_status; 446 445 //uint32_buffer[0] = mask & instance->registers->rh_status; 447 memcpy(request->data_buffer, &data,4);446 memcpy(request->data_buffer, &data, 4); 448 447 449 448 return EOK; … … 468 467 469 468 usb_hub_bm_request_type_t request_type = request_packet->request_type; 470 if (buffer_size < 4 /*request_packet->length*/) {///\TODO469 if (buffer_size < 4) { 471 470 usb_log_warning("requested more data than buffer size\n"); 472 471 return EINVAL; … … 499 498 | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16)); 500 499 bzero(bitmap, instance->interrupt_mask_size); 501 if ((instance->registers->rh_status & mask) != 0) {500 if ((instance->registers->rh_status & mask) != 0) { 502 501 bitmap[0] = 1; 503 502 } … … 678 677 (instance->registers->rh_port_status[port - 1] | (1 << feature)) 679 678 & (~port_clear_feature_valid_mask); 680 /// \TODO any error?681 682 679 return EOK; 683 680 } … … 707 704 & (~port_clear_feature_valid_mask)) 708 705 | (1 << feature); 709 /// \TODO any error?710 706 711 707 return EOK; … … 925 921 * @return 926 922 */ 927 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) { 923 static int process_interrupt_mask_in_instance(rh_t *instance, 924 usb_transfer_batch_t * request) { 928 925 memcpy(request->data_buffer, instance->interrupt_buffer, 929 926 instance->interrupt_mask_size); … … 945 942 * @return 946 943 */ 947 static bool is_zeros(void * 944 static bool is_zeros(void *buffer, size_t size) { 948 945 if (!buffer) return true; 949 946 if (!size) return true; -
uspace/drv/uhci-rhd/port.h
ra5fc431 r399a13c 55 55 56 56 /** UHCI port structure */ 57 typedef struct uhci_port 58 { 57 typedef struct uhci_port { 59 58 const char *id_string; 60 59 port_status_t *address; … … 68 67 69 68 int uhci_port_init( 70 uhci_port_t *port, port_status_t *address, unsigned number,71 unsigned usec, ddf_dev_t *rh);69 uhci_port_t *port, port_status_t *address, unsigned number, 70 unsigned usec, ddf_dev_t *rh); 72 71 73 72 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/usbhid/generic/hiddev.c
ra5fc431 r399a13c 99 99 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data; 100 100 101 usb_log_debug2("hid_dev: %p, Max input report size (% d).\n",101 usb_log_debug2("hid_dev: %p, Max input report size (%zu).\n", 102 102 hid_dev, hid_dev->max_input_report_size); 103 103 … … 226 226 } 227 227 228 usb_log_debug("HID function created. Handle: % d\n", fun->handle);228 usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle); 229 229 230 230 return EOK; -
uspace/drv/usbhid/kbd/kbddev.c
ra5fc431 r399a13c 798 798 } 799 799 800 usb_log_debug("%s function created. Handle: % d\n", HID_KBD_FUN_NAME,801 fun->handle);800 usb_log_debug("%s function created. Handle: %" PRIun "\n", 801 HID_KBD_FUN_NAME, fun->handle); 802 802 803 803 usb_log_debug("Adding DDF function to class %s...\n", -
uspace/drv/usbhid/multimedia/multimedia.c
ra5fc431 r399a13c 211 211 } 212 212 213 usb_log_debug("%s function created. Handle: %d\n", NAME, fun->handle); 213 usb_log_debug("%s function created (jandle: %" PRIun ").\n", 214 NAME, fun->handle); 214 215 215 216 rc = ddf_fun_add_to_class(fun, "keyboard"); -
uspace/drv/usbhub/main.c
ra5fc431 r399a13c 87 87 88 88 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 89 89 90 90 return usb_driver_main(&usb_hub_driver); 91 91 } -
uspace/drv/usbhub/port_status.h
ra5fc431 r399a13c 64 64 */ 65 65 static inline void usb_hub_set_port_status_request( 66 usb_device_request_setup_packet_t * request, uint16_t port 67 ) { 66 usb_device_request_setup_packet_t *request, uint16_t port) { 68 67 request->index = port; 69 68 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS; … … 79 78 */ 80 79 static inline void usb_hub_set_hub_status_request( 81 usb_device_request_setup_packet_t * request 82 ) { 80 usb_device_request_setup_packet_t *request) { 83 81 request->index = 0; 84 82 request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS; … … 95 93 static inline usb_device_request_setup_packet_t * 96 94 usb_hub_create_port_status_request(uint16_t port) { 97 usb_device_request_setup_packet_t * 98 malloc(sizeof(usb_device_request_setup_packet_t));95 usb_device_request_setup_packet_t *result = 96 malloc(sizeof (usb_device_request_setup_packet_t)); 99 97 usb_hub_set_port_status_request(result, port); 100 98 return result; … … 108 106 */ 109 107 static inline void usb_hub_set_enable_port_feature_request( 110 usb_device_request_setup_packet_t * request, uint16_t port, 111 uint16_t feature_selector 112 ) { 108 usb_device_request_setup_packet_t *request, uint16_t port, 109 uint16_t feature_selector) { 113 110 request->index = port; 114 111 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 125 122 */ 126 123 static inline void usb_hub_set_disable_port_feature_request( 127 usb_device_request_setup_packet_t *request, uint16_t port,128 129 124 usb_device_request_setup_packet_t *request, uint16_t port, 125 uint16_t feature_selector 126 ) { 130 127 request->index = port; 131 128 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 141 138 */ 142 139 static inline void usb_hub_set_enable_port_request( 143 usb_device_request_setup_packet_t *request, uint16_t port144 140 usb_device_request_setup_packet_t *request, uint16_t port 141 ) { 145 142 request->index = port; 146 143 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 157 154 static inline usb_device_request_setup_packet_t * 158 155 usb_hub_create_enable_port_request(uint16_t port) { 159 usb_device_request_setup_packet_t * 160 malloc(sizeof(usb_device_request_setup_packet_t));156 usb_device_request_setup_packet_t *result = 157 malloc(sizeof (usb_device_request_setup_packet_t)); 161 158 usb_hub_set_enable_port_request(result, port); 162 159 return result; … … 169 166 */ 170 167 static inline void usb_hub_set_disable_port_request( 171 usb_device_request_setup_packet_t *request, uint16_t port172 168 usb_device_request_setup_packet_t *request, uint16_t port 169 ) { 173 170 request->index = port; 174 171 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 185 182 static inline usb_device_request_setup_packet_t * 186 183 usb_hub_create_disable_port_request(uint16_t port) { 187 usb_device_request_setup_packet_t * 188 malloc(sizeof(usb_device_request_setup_packet_t));184 usb_device_request_setup_packet_t *result = 185 malloc(sizeof (usb_device_request_setup_packet_t)); 189 186 usb_hub_set_disable_port_request(result, port); 190 187 return result; … … 197 194 */ 198 195 static inline void usb_hub_set_reset_port_request( 199 usb_device_request_setup_packet_t *request, uint16_t port200 196 usb_device_request_setup_packet_t *request, uint16_t port 197 ) { 201 198 request->index = port; 202 199 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 213 210 static inline usb_device_request_setup_packet_t * 214 211 usb_hub_create_reset_port_request(uint16_t port) { 215 usb_device_request_setup_packet_t * 216 malloc(sizeof(usb_device_request_setup_packet_t));212 usb_device_request_setup_packet_t *result = 213 malloc(sizeof (usb_device_request_setup_packet_t)); 217 214 usb_hub_set_reset_port_request(result, port); 218 215 return result; … … 225 222 */ 226 223 static inline void usb_hub_set_power_port_request( 227 usb_device_request_setup_packet_t *request, uint16_t port228 224 usb_device_request_setup_packet_t *request, uint16_t port 225 ) { 229 226 request->index = port; 230 227 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 240 237 */ 241 238 static inline void usb_hub_unset_power_port_request( 242 usb_device_request_setup_packet_t *request, uint16_t port243 239 usb_device_request_setup_packet_t *request, uint16_t port 240 ) { 244 241 request->index = port; 245 242 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 257 254 */ 258 255 static inline bool usb_port_is_status(usb_port_status_t status, int idx) { 259 return (status &(1 << idx))!=0;256 return (status & (1 << idx)) != 0; 260 257 } 261 258 … … 268 265 */ 269 266 static inline void usb_port_status_set_bit( 270 267 usb_port_status_t * status, int idx, bool value) { 271 268 (*status) = value ? 272 273 269 ((*status) | (1 << (idx))) : 270 ((*status)&(~(1 << (idx)))); 274 271 } 275 272 … … 282 279 */ 283 280 static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) { 284 return (status &(1 << idx))!=0;281 return (status & (1 << idx)) != 0; 285 282 } 286 283 … … 293 290 */ 294 291 static inline void usb_hub_status_set_bit( 295 usb_hub_status_t *status, int idx, bool value) {292 usb_hub_status_t *status, int idx, bool value) { 296 293 (*status) = value ? 297 ((*status) | (1 << (idx))) : 298 ((*status)&(~(1 << (idx)))); 299 } 300 301 302 #if 0 303 /** 304 * connection status geter for port status 305 * 306 * @param status 307 * @return true if there is something connected 308 */ 309 static inline bool usb_port_dev_connected(usb_port_status_t * status) { 310 return usb_port_get_bit(status, 0); 311 } 312 313 /** 314 * set device connected bit in port status 315 * 316 * @param status 317 * @param connected value of the bit 318 */ 319 static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) { 320 usb_port_set_bit(status, 0, connected); 321 } 322 323 //port enabled 324 325 /** 326 * port enabled getter for port status 327 * 328 * @param status 329 * @return true if the port is enabled 330 */ 331 static inline bool usb_port_enabled(usb_port_status_t * status) { 332 return usb_port_get_bit(status, 1); 333 } 334 335 /** 336 * set port enabled bit in port status 337 * 338 * @param status 339 * @param enabled value of the bit 340 */ 341 static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) { 342 usb_port_set_bit(status, 1, enabled); 343 } 344 345 //port suspended 346 /** 347 * port suspended getter for port status 348 * 349 * @param status 350 * @return true if port is suspended 351 */ 352 static inline bool usb_port_suspended(usb_port_status_t * status) { 353 return usb_port_get_bit(status, 2); 354 } 355 356 /** 357 * set port suspended bit in port status 358 * 359 * @param status 360 * @param suspended value of the bit 361 */ 362 static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) { 363 usb_port_set_bit(status, 2, suspended); 364 } 365 366 //over currect 367 /** 368 * over current condition indicator getter for port status 369 * 370 * @param status 371 * @return true if there is opver-current condition on the hub 372 */ 373 static inline bool usb_port_over_current(usb_port_status_t * status) { 374 return usb_port_get_bit(status, 3); 375 } 376 377 /** 378 * set over current indicator bit in port status 379 * 380 * @param status 381 * @param value value of the bit 382 */ 383 static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) { 384 usb_port_set_bit(status, 3, value); 385 } 386 387 //port reset 388 /** 389 * port reset indicator getter for port status 390 * 391 * @param status 392 * @return true if port is reset 393 */ 394 static inline bool usb_port_reset(usb_port_status_t * status) { 395 return usb_port_get_bit(status, 4); 396 } 397 398 /** 399 * set port reset bit in port status 400 * 401 * @param status 402 * @param value value of the bit 403 */ 404 static inline void usb_port_set_reset(usb_port_status_t * status, bool value) { 405 usb_port_set_bit(status, 4, value); 406 } 407 408 //powered 409 /** 410 * power state getter for port status 411 * 412 * @param status 413 * @return true if port is powered 414 */ 415 static inline bool usb_port_powered(usb_port_status_t * status) { 416 return usb_port_get_bit(status, 8); 417 } 418 419 /** 420 * set port powered bit in port status 421 * 422 * @param status 423 * @param powered value of the bit 424 */ 425 static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) { 426 usb_port_set_bit(status, 8, powered); 427 } 428 429 #endif 430 431 //low speed device attached 294 ((*status) | (1 << (idx))) : 295 ((*status)&(~(1 << (idx)))); 296 } 297 432 298 /** 433 299 * low speed device on the port indicator … … 446 312 * @param low_speed value of the bit 447 313 */ 448 static inline void usb_port_set_low_speed(usb_port_status_t * 314 static inline void usb_port_set_low_speed(usb_port_status_t *status, bool low_speed) { 449 315 usb_port_status_set_bit(status, 9, low_speed); 450 316 } 451 317 452 318 //high speed device attached 319 453 320 /** 454 321 * high speed device on the port indicator … … 467 334 * @param high_speed value of the bit 468 335 */ 469 static inline void usb_port_set_high_speed(usb_port_status_t * 336 static inline void usb_port_set_high_speed(usb_port_status_t *status, bool high_speed) { 470 337 usb_port_status_set_bit(status, 10, high_speed); 471 338 } … … 485 352 } 486 353 487 #if 0488 //connect change489 /**490 * port connect change indicator491 *492 * @param status493 * @return true if connection has changed494 */495 static inline bool usb_port_connect_change(usb_port_status_t * status) {496 return usb_port_get_bit(status, 16);497 }498 499 /**500 * set connection change bit in port status501 * @param status502 * @param change value of the bit503 */504 static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {505 usb_port_set_bit(status, 16, change);506 }507 508 //port enable change509 /**510 * port enable change for port status511 *512 * @param status513 * @return true if the port has been enabled/disabled514 */515 static inline bool usb_port_enabled_change(usb_port_status_t * status) {516 return usb_port_get_bit(status, 17);517 }518 519 /**520 * set port enable change bit in port status521 *522 * @param status523 * @param change value of the bit524 */525 static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {526 usb_port_set_bit(status, 17, change);527 }528 529 //suspend change530 /**531 * port suspend change for port status532 *533 * @param status534 * @return ture if suspend status has changed535 */536 static inline bool usb_port_suspend_change(usb_port_status_t * status) {537 return usb_port_get_bit(status, 18);538 }539 540 /**541 * set port suspend change bit in port status542 *543 * @param status544 * @param change value of the bit545 */546 static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {547 usb_port_set_bit(status, 18, change);548 }549 550 //over current change551 /**552 * over current change indicator553 *554 * @param status555 * @return true if over-current condition on port has changed556 */557 static inline bool usb_port_overcurrent_change(usb_port_status_t * status) {558 return usb_port_get_bit(status, 19);559 }560 561 /**562 * set port over current change bit in port status563 *564 * @param status565 * @param change value of the bit566 */567 static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {568 usb_port_set_bit(status, 19, change);569 }570 571 //reset change572 /**573 * port reset change indicator574 * @param status575 * @return true if port has been reset576 */577 static inline bool usb_port_reset_completed(usb_port_status_t * status) {578 return usb_port_get_bit(status, 20);579 }580 581 /**582 * set port reset completed bit in port status583 *584 * @param status585 * @param change value of the bit586 */587 static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {588 usb_port_set_bit(status, 20, completed);589 }590 591 //local power status592 /**593 * local power lost indicator for hub status594 *595 * @param status596 * @return true if hub is not powered597 */598 static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) {599 return usb_hub_get_bit(status, 0);600 }601 602 /**603 * set hub power lost bit in hub status604 *605 * @param status606 * @param change value of the bit607 */608 static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,609 bool power_lost) {610 usb_hub_set_bit(status, 0, power_lost);611 }612 613 //over current ocndition614 /**615 * hub over-current indicator616 *617 * @param status618 * @return true if over-current condition occurred on hub619 */620 static inline bool usb_hub_over_current(usb_hub_status_t * status) {621 return usb_hub_get_bit(status, 1);622 }623 624 /**625 * set hub over current bit in hub status626 *627 * @param status628 * @param change value of the bit629 */630 static inline void usb_hub_set_over_current(usb_port_status_t * status,631 bool over_current) {632 usb_hub_set_bit(status, 1, over_current);633 }634 635 //local power change636 /**637 * hub power change indicator638 *639 * @param status640 * @return true if local power status has been changed - power has been641 * dropped or re-established642 */643 static inline bool usb_hub_local_power_change(usb_hub_status_t * status) {644 return usb_hub_get_bit(status, 16);645 }646 647 /**648 * set hub power change bit in hub status649 *650 * @param status651 * @param change value of the bit652 */653 static inline void usb_hub_set_local_power_change(usb_port_status_t * status,654 bool change) {655 usb_hub_set_bit(status, 16, change);656 }657 658 //local power status659 /**660 * hub over-current condition change indicator661 *662 * @param status663 * @return true if over-current condition has changed664 */665 static inline bool usb_hub_over_current_change(usb_hub_status_t * status) {666 return usb_hub_get_bit(status, 17);667 }668 669 /**670 * set hub over current change bit in hub status671 *672 * @param status673 * @param change value of the bit674 */675 static inline void usb_hub_set_over_current_change(usb_port_status_t * status,676 bool change) {677 usb_hub_set_bit(status, 17, change);678 }679 #endif680 354 681 355 -
uspace/drv/usbhub/ports.c
ra5fc431 r399a13c 47 47 #include "port_status.h" 48 48 49 50 49 /** Information for fibril for device discovery. */ 51 50 struct add_device_phase1 { … … 65 64 * any function here and must be cleared by hand 66 65 */ 67 static const int non_handled_changes[] = 66 static const int non_handled_changes[] = { 68 67 USB_HUB_FEATURE_C_PORT_ENABLE, 69 68 USB_HUB_FEATURE_C_PORT_SUSPEND … … 71 70 72 71 static void usb_hub_removed_device( 73 usb_hub_info_t *hub, uint16_t port);74 75 static void usb_hub_port_reset_completed(usb_hub_info_t * 76 77 78 static void usb_hub_port_over_current(usb_hub_info_t * 79 72 usb_hub_info_t *hub, uint16_t port); 73 74 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 75 uint16_t port, uint32_t status); 76 77 static void usb_hub_port_over_current(usb_hub_info_t *hub, 78 uint16_t port, uint32_t status); 80 79 81 80 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 96 95 * @param port port number, starting from 1 97 96 */ 98 void usb_hub_process_interrupt(usb_hub_info_t * 99 100 usb_log_debug(" interrupt at port %zu\n", (size_t) port);97 void usb_hub_process_interrupt(usb_hub_info_t *hub, 98 uint16_t port) { 99 usb_log_debug("Interrupt at port %zu\n", (size_t) port); 101 100 //determine type of change 102 101 //usb_pipe_t *pipe = hub->control_pipe; … … 134 133 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 135 134 //check if it was not auto-resolved 136 usb_log_debug(" overcurrent change on port\n");135 usb_log_debug("Overcurrent change on port\n"); 137 136 usb_hub_port_over_current(hub, port, status); 138 137 } … … 141 140 usb_hub_port_reset_completed(hub, port, status); 142 141 } 143 usb_log_debug(" status x%x : %d\n ", status, status);142 usb_log_debug("Status x%x : %d\n ", status, status); 144 143 145 144 usb_port_status_set_bit( 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false); 147 146 usb_port_status_set_bit( 148 &status, USB_HUB_FEATURE_C_PORT_RESET, false);147 &status, USB_HUB_FEATURE_C_PORT_RESET, false); 149 148 usb_port_status_set_bit( 150 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);151 149 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false); 150 152 151 //clearing not yet handled changes 153 152 unsigned int feature_idx; 154 for(feature_idx = 0;feature_idx<non_handled_changes_count; 155 ++feature_idx){ 153 for (feature_idx = 0; 154 feature_idx < non_handled_changes_count; 155 ++feature_idx) { 156 156 unsigned int bit_idx = non_handled_changes[feature_idx]; 157 if (status & (1<<bit_idx)){157 if (status & (1 << bit_idx)) { 158 158 usb_log_info( 159 " there was not yet handled change on port %d: %d"159 "There was not yet handled change on port %d: %d" 160 160 ";clearing it\n", 161 port, bit_idx);161 port, bit_idx); 162 162 int opResult = usb_hub_clear_port_feature( 163 163 hub->control_pipe, … … 165 165 if (opResult != EOK) { 166 166 usb_log_warning( 167 " could not clear port flag %d: %d\n",168 bit_idx, opResult167 "Could not clear port flag %d: %s\n", 168 bit_idx, str_error(opResult) 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, false);172 &status, bit_idx, false); 173 173 } 174 174 } 175 if (status>>16){176 usb_log_info(" there is still some unhandled change %X\n",175 if (status >> 16) { 176 usb_log_info("There is still some unhandled change %X\n", 177 177 status); 178 178 } 179 179 } 180 181 180 182 181 /** … … 190 189 */ 191 190 static void usb_hub_removed_device( 192 usb_hub_info_t *hub, uint16_t port) {191 usb_hub_info_t *hub, uint16_t port) { 193 192 194 193 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 195 194 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 196 195 if (opResult != EOK) { 197 usb_log_warning(" could not clear port-change-connection flag\n");196 usb_log_warning("Could not clear port-change-connection flag\n"); 198 197 } 199 198 /** \TODO remove device from device manager - not yet implemented in … … 202 201 203 202 //close address 204 if(hub->ports[port].attached_device.address >= 0){ 205 /*uncomment this code to use it when DDF allows device removal 206 opResult = usb_hc_unregister_device( 207 &hub->connection, 208 hub->attached_devs[port].address); 209 if(opResult != EOK) { 210 dprintf(USB_LOG_LEVEL_WARNING, "could not release " 211 "address of " 212 "removed device: %d", opResult); 213 } 214 hub->attached_devs[port].address = 0; 215 hub->attached_devs[port].handle = 0; 216 */ 203 204 usb_hub_port_t *the_port = hub->ports + port; 205 206 fibril_mutex_lock(&hub->port_mutex); 207 208 if (the_port->attached_device.address >= 0) { 209 usb_log_warning("Device unplug on `%s' (port %zu): " \ 210 "not implemented.\n", hub->usb_device->ddf_dev->name, 211 (size_t) port); 212 the_port->attached_device.address = -1; 213 the_port->attached_device.handle = 0; 217 214 } else { 218 215 usb_log_warning("Device removed before being registered.\n"); … … 223 220 * port reset callback from new device wrapper. 224 221 */ 225 usb_hub_port_t *the_port = hub->ports + port;226 222 fibril_mutex_lock(&the_port->reset_mutex); 227 223 the_port->reset_completed = true; … … 230 226 fibril_mutex_unlock(&the_port->reset_mutex); 231 227 } 232 } 233 228 229 fibril_mutex_unlock(&hub->port_mutex); 230 } 234 231 235 232 /** … … 242 239 * @param status 243 240 */ 244 static void usb_hub_port_reset_completed(usb_hub_info_t * 245 uint16_t port, uint32_t status){241 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 242 uint16_t port, uint32_t status) { 246 243 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 247 244 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 275 272 * @param port port number, starting from 1 276 273 */ 277 static void usb_hub_port_over_current(usb_hub_info_t * 278 274 static void usb_hub_port_over_current(usb_hub_info_t *hub, 275 uint16_t port, uint32_t status) { 279 276 int opResult; 280 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){277 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) { 281 278 opResult = usb_hub_clear_port_feature(hub->control_pipe, 282 279 port, USB_HUB_FEATURE_PORT_POWER); 283 280 if (opResult != EOK) { 284 usb_log_error(" cannot power off port %d; %d\n",285 port, opResult);281 usb_log_error("Cannot power off port %d; %s\n", 282 port, str_error(opResult)); 286 283 } 287 } else{284 } else { 288 285 opResult = usb_hub_set_port_feature(hub->control_pipe, 289 286 port, USB_HUB_FEATURE_PORT_POWER); 290 287 if (opResult != EOK) { 291 usb_log_error(" cannot power on port %d; %d\n",292 port, opResult);288 usb_log_error("Cannot power on port %d; %s\n", 289 port, str_error(opResult)); 293 290 } 294 291 } … … 303 300 */ 304 301 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 305 usb_port_status_t *status) 306 { 302 usb_port_status_t *status) { 307 303 size_t recv_size; 308 304 usb_device_request_setup_packet_t request; … … 311 307 usb_hub_set_port_status_request(&request, port); 312 308 int rc = usb_pipe_control_read(ctrl_pipe, 313 &request, sizeof (usb_device_request_setup_packet_t),314 &status_tmp, sizeof (status_tmp), &recv_size);309 &request, sizeof (usb_device_request_setup_packet_t), 310 &status_tmp, sizeof (status_tmp), &recv_size); 315 311 if (rc != EOK) { 316 312 return rc; … … 337 333 * @return Error code. 338 334 */ 339 static int enable_port_callback(int port_no, void *arg) 340 { 335 static int enable_port_callback(int port_no, void *arg) { 341 336 usb_hub_info_t *hub = arg; 342 337 int rc; … … 346 341 usb_hub_set_reset_port_request(&request, port_no); 347 342 rc = usb_pipe_control_write(hub->control_pipe, 348 &request, sizeof (request), NULL, 0);343 &request, sizeof (request), NULL, 0); 349 344 if (rc != EOK) { 350 345 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 376 371 * @return 0 Always. 377 372 */ 378 static int add_device_phase1_worker_fibril(void *arg) 379 { 373 static int add_device_phase1_worker_fibril(void *arg) { 380 374 struct add_device_phase1 *data 381 375 = (struct add_device_phase1 *) arg; … … 396 390 } 397 391 392 fibril_mutex_lock(&data->hub->port_mutex); 398 393 data->hub->ports[data->port].attached_device.handle = child_handle; 399 394 data->hub->ports[data->port].attached_device.address = new_address; 395 fibril_mutex_unlock(&data->hub->port_mutex); 400 396 401 397 usb_log_info("Detected new device on `%s' (port %zu), " … … 407 403 free(arg); 408 404 405 fibril_mutex_lock(&data->hub->pending_ops_mutex); 406 assert(data->hub->pending_ops_count > 0); 407 data->hub->pending_ops_count--; 408 fibril_condvar_signal(&data->hub->pending_ops_cv); 409 fibril_mutex_unlock(&data->hub->pending_ops_mutex); 410 411 409 412 return EOK; 410 413 } 411 412 414 413 415 /** Start device adding when connection change is detected. … … 421 423 */ 422 424 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 423 usb_speed_t speed) 424 { 425 usb_speed_t speed) { 425 426 struct add_device_phase1 *data 426 = malloc(sizeof (struct add_device_phase1));427 = malloc(sizeof (struct add_device_phase1)); 427 428 if (data == NULL) { 428 429 return ENOMEM; … … 452 453 return ENOMEM; 453 454 } 455 fibril_mutex_lock(&hub->pending_ops_mutex); 456 hub->pending_ops_count++; 457 fibril_mutex_unlock(&hub->pending_ops_mutex); 454 458 fibril_add_ready(fibril); 455 459 -
uspace/drv/usbhub/ports.h
ra5fc431 r399a13c 70 70 71 71 72 void usb_hub_process_interrupt(usb_hub_info_t * 72 void usb_hub_process_interrupt(usb_hub_info_t *hub, 73 73 uint16_t port); 74 74 -
uspace/drv/usbhub/usbhub.c
ra5fc431 r399a13c 56 56 57 57 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 61 62 static int usb_hub_set_configuration(usb_hub_info_t * 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t * 65 66 static int usb_process_hub_over_current(usb_hub_info_t * 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev); 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info); 61 62 static int usb_hub_set_configuration(usb_hub_info_t *hub_info); 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info); 65 66 static int usb_process_hub_over_current(usb_hub_info_t *hub_info, 67 67 usb_hub_status_t status); 68 68 69 static int usb_process_hub_local_power_change(usb_hub_info_t * 69 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info, 70 70 usb_hub_status_t status); 71 71 72 static void usb_hub_process_global_interrupt(usb_hub_info_t * 73 74 static void usb_hub_polling_termin ted_callback(usb_device_t *device,75 bool was_error, void * 72 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info); 73 74 static void usb_hub_polling_terminated_callback(usb_device_t *device, 75 bool was_error, void *data); 76 76 77 77 … … 90 90 * @return error code 91 91 */ 92 int usb_hub_add_device(usb_device_t * 92 int usb_hub_add_device(usb_device_t *usb_dev) { 93 93 if (!usb_dev) return EINVAL; 94 usb_hub_info_t * 94 usb_hub_info_t *hub_info = usb_hub_info_create(usb_dev); 95 95 //create hc connection 96 96 usb_log_debug("Initializing USB wire abstraction.\n"); … … 99 99 hub_info->usb_device->ddf_dev); 100 100 if (opResult != EOK) { 101 usb_log_error(" could not initialize connection to device, "102 " errno %d\n",103 opResult);101 usb_log_error("Could not initialize connection to device, " 102 " %s\n", 103 str_error(opResult)); 104 104 free(hub_info); 105 105 return opResult; … … 109 109 opResult = usb_hub_set_configuration(hub_info); 110 110 if (opResult != EOK) { 111 usb_log_error(" could not set hub configuration, errno %d\n",112 opResult);111 usb_log_error("Could not set hub configuration, %s\n", 112 str_error(opResult)); 113 113 free(hub_info); 114 114 return opResult; … … 117 117 opResult = usb_hub_process_hub_specific_info(hub_info); 118 118 if (opResult != EOK) { 119 usb_log_error(" could process hub specific info, errno %d\n",120 opResult);119 usb_log_error("Could process hub specific info, %s\n", 120 str_error(opResult)); 121 121 free(hub_info); 122 122 return opResult; … … 135 135 136 136 opResult = usb_hub_start_hub_fibril(hub_info); 137 if (opResult!=EOK)137 if (opResult != EOK) 138 138 free(hub_info); 139 139 return opResult; 140 140 } 141 142 141 143 142 /** Callback for polling hub for changes. … … 193 192 * @return basic usb_hub_info_t structure 194 193 */ 195 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 196 usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t));194 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev) { 195 usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t)); 197 196 if (!result) return NULL; 198 197 result->usb_device = usb_dev; … … 200 199 result->control_pipe = &usb_dev->ctrl_pipe; 201 200 result->is_default_address_used = false; 201 202 result->ports = NULL; 203 result->port_count = (size_t) - 1; 204 fibril_mutex_initialize(&result->port_mutex); 205 206 fibril_mutex_initialize(&result->pending_ops_mutex); 207 fibril_condvar_initialize(&result->pending_ops_cv); 208 result->pending_ops_count = 0; 202 209 return result; 203 210 } … … 213 220 * @return error code 214 221 */ 215 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) { 216 223 // get hub descriptor 217 usb_log_debug(" creating serialized descriptor\n");224 usb_log_debug("Creating serialized descriptor\n"); 218 225 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 219 226 usb_hub_descriptor_t * descriptor; … … 227 234 228 235 if (opResult != EOK) { 229 usb_log_error(" failed when receiving hub descriptor, "230 " badcode = %d\n",231 opResult);236 usb_log_error("Failed when receiving hub descriptor, " 237 "%s\n", 238 str_error(opResult)); 232 239 free(serialized_descriptor); 233 240 return opResult; 234 241 } 235 usb_log_debug2(" deserializing descriptor\n");242 usb_log_debug2("Deserializing descriptor\n"); 236 243 descriptor = usb_create_deserialized_hub_desriptor( 237 244 serialized_descriptor); … … 242 249 usb_log_debug("setting port count to %d\n", descriptor->ports_count); 243 250 hub_info->port_count = descriptor->ports_count; 244 /// \TODO this is not semantically correct245 251 bool is_power_switched = 246 ((descriptor->hub_characteristics & 1) == 0);252 ((descriptor->hub_characteristics & 1) == 0); 247 253 bool has_individual_port_powering = 248 ((descriptor->hub_characteristics & 1) != 0);254 ((descriptor->hub_characteristics & 1) != 0); 249 255 hub_info->ports = malloc( 250 256 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); 251 if (!hub_info->ports){257 if (!hub_info->ports) { 252 258 return ENOMEM; 253 259 } … … 256 262 usb_hub_port_init(&hub_info->ports[port]); 257 263 } 258 if (is_power_switched){259 usb_log_debug(" is_power_switched\n");260 261 if (!has_individual_port_powering){262 usb_log_debug(" !has_individual_port_powering\n");264 if (is_power_switched) { 265 usb_log_debug("Hub power switched\n"); 266 267 if (!has_individual_port_powering) { 268 usb_log_debug("Has_global powering\n"); 263 269 opResult = usb_hub_set_feature(hub_info->control_pipe, 264 270 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 265 271 if (opResult != EOK) { 266 usb_log_error(" cannot power hub: %s\n",272 usb_log_error("Cannot power hub: %s\n", 267 273 str_error(opResult)); 268 274 } … … 270 276 271 277 for (port = 1; port <= hub_info->port_count; ++port) { 272 usb_log_debug("Powering port %zu.\n", port);278 usb_log_debug("Powering port %zu.\n", port); 273 279 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 274 280 port, USB_HUB_FEATURE_PORT_POWER); … … 278 284 } 279 285 } 280 281 } else{282 usb_log_debug(" !is_power_switched, not going to be powered\n");283 } 284 usb_log_debug2(" freeing data\n");286 287 } else { 288 usb_log_debug("Power not switched, not going to be powered\n"); 289 } 290 usb_log_debug2("Freeing data\n"); 285 291 free(descriptor); 286 292 return EOK; … … 295 301 * @return error code 296 302 */ 297 static int usb_hub_set_configuration(usb_hub_info_t * 303 static int usb_hub_set_configuration(usb_hub_info_t *hub_info) { 298 304 //device descriptor 299 305 usb_standard_device_descriptor_t *std_descriptor 300 306 = &hub_info->usb_device->descriptors.device; 301 usb_log_debug(" hub has %d configurations\n",307 usb_log_debug("Hub has %d configurations\n", 302 308 std_descriptor->configuration_count); 303 309 if (std_descriptor->configuration_count < 1) { 304 usb_log_error(" there are no configurations available\n");310 usb_log_error("There are no configurations available\n"); 305 311 return EINVAL; 306 312 } … … 320 326 return opResult; 321 327 } 322 usb_log_debug("\t used configuration %d\n",328 usb_log_debug("\tUsed configuration %d\n", 323 329 config_descriptor->configuration_number); 324 330 … … 335 341 * @return error code 336 342 */ 337 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){ 338 /* 339 * The processing will require opened control pipe and connection 340 * to the host controller. 341 * It is waste of resources but let's hope there will be less 342 * hubs than the phone limit. 343 * FIXME: with some proper locking over pipes and session 344 * auto destruction, this could work better. 345 */ 346 int rc = usb_hc_connection_open(&hub_info->connection); 347 if (rc != EOK) { 348 //usb_pipe_end_session(hub_info->control_pipe); 349 usb_log_error("Failed to open connection to HC: %s.\n", 350 str_error(rc)); 351 return rc; 352 } 343 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info) { 344 int rc; 353 345 354 346 rc = usb_device_auto_poll(hub_info->usb_device, 0, 355 347 hub_port_changes_callback, ((hub_info->port_count + 1) / 8) + 1, 356 usb_hub_polling_termin ted_callback, hub_info);348 usb_hub_polling_terminated_callback, hub_info); 357 349 if (rc != EOK) { 358 350 usb_log_error("Failed to create polling fibril: %s.\n", … … 373 365 //********************************************* 374 366 375 376 367 /** 377 368 * process hub over current change … … 382 373 * @return error code 383 374 */ 384 static int usb_process_hub_over_current(usb_hub_info_t * 375 static int usb_process_hub_over_current(usb_hub_info_t *hub_info, 385 376 usb_hub_status_t status) { 386 377 int opResult; 387 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)){378 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)) { 388 379 //poweroff all ports 389 380 unsigned int port; 390 for (port = 1;port <= hub_info->port_count;++port){381 for (port = 1; port <= hub_info->port_count; ++port) { 391 382 opResult = usb_hub_clear_port_feature( 392 hub_info->control_pipe, port,383 hub_info->control_pipe, port, 393 384 USB_HUB_FEATURE_PORT_POWER); 394 385 if (opResult != EOK) { 395 386 usb_log_warning( 396 " cannot power off port %d; %d\n",397 port, opResult);387 "Cannot power off port %d; %s\n", 388 port, str_error(opResult)); 398 389 } 399 390 } … … 401 392 //power all ports 402 393 unsigned int port; 403 for (port = 1;port <= hub_info->port_count;++port){394 for (port = 1; port <= hub_info->port_count; ++port) { 404 395 opResult = usb_hub_set_port_feature( 405 hub_info->control_pipe, port,396 hub_info->control_pipe, port, 406 397 USB_HUB_FEATURE_PORT_POWER); 407 398 if (opResult != EOK) { 408 399 usb_log_warning( 409 " cannot power off port %d; %d\n",410 port, opResult);400 "Cannot power off port %d; %s\n", 401 port, str_error(opResult)); 411 402 } 412 403 } … … 423 414 * @return error code 424 415 */ 425 static int usb_process_hub_local_power_change(usb_hub_info_t * 416 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info, 426 417 usb_hub_status_t status) { 427 418 int opResult = EOK; 428 419 opResult = usb_hub_clear_feature(hub_info->control_pipe, 429 420 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 430 431 usb_log_error(" cannnot clear hub power change flag: "432 "% d\n",433 opResult);421 if (opResult != EOK) { 422 usb_log_error("Cannnot clear hub power change flag: " 423 "%s\n", 424 str_error(opResult)); 434 425 } 435 426 return opResult; … … 443 434 * @param hub_info hub instance 444 435 */ 445 static void usb_hub_process_global_interrupt(usb_hub_info_t * 446 usb_log_debug(" global interrupt on a hub\n");436 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info) { 437 usb_log_debug("Global interrupt on a hub\n"); 447 438 usb_pipe_t *pipe = hub_info->control_pipe; 448 439 int opResult; … … 461 452 ); 462 453 if (opResult != EOK) { 463 usb_log_error("could not get hub status\n"); 454 usb_log_error("Could not get hub status: %s\n", 455 str_error(opResult)); 464 456 return; 465 457 } 466 458 if (rcvd_size != sizeof (usb_port_status_t)) { 467 usb_log_error(" received status has incorrect size\n");459 usb_log_error("Received status has incorrect size\n"); 468 460 return; 469 461 } 470 462 //port reset 471 463 if ( 472 usb_hub_is_status(status, 16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {464 usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) { 473 465 usb_process_hub_over_current(hub_info, status); 474 466 } 475 467 if ( 476 usb_hub_is_status(status, 16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {468 usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) { 477 469 usb_process_hub_local_power_change(hub_info, status); 478 470 } … … 487 479 * @param data pointer to usb_hub_info_t structure 488 480 */ 489 static void usb_hub_polling_terminted_callback(usb_device_t * device, 490 bool was_error, void * data){ 491 usb_hub_info_t * hub_info = data; 492 if(!hub_info) return; 493 free(hub_info->ports); 494 free(hub_info); 481 static void usb_hub_polling_terminated_callback(usb_device_t *device, 482 bool was_error, void *data) { 483 usb_hub_info_t * hub = data; 484 assert(hub); 485 486 fibril_mutex_lock(&hub->pending_ops_mutex); 487 488 /* The device is dead. However there might be some pending operations 489 * that we need to wait for. 490 * One of them is device adding in progress. 491 * The respective fibril is probably waiting for status change 492 * in port reset (port enable) callback. 493 * Such change would never come (otherwise we would not be here). 494 * Thus, we would flush all pending port resets. 495 */ 496 if (hub->pending_ops_count > 0) { 497 fibril_mutex_lock(&hub->port_mutex); 498 size_t port; 499 for (port = 0; port < hub->port_count; port++) { 500 usb_hub_port_t *the_port = hub->ports + port; 501 fibril_mutex_lock(&the_port->reset_mutex); 502 the_port->reset_completed = true; 503 the_port->reset_okay = false; 504 fibril_condvar_broadcast(&the_port->reset_cv); 505 fibril_mutex_unlock(&the_port->reset_mutex); 506 } 507 fibril_mutex_unlock(&hub->port_mutex); 508 } 509 /* And now wait for them. */ 510 while (hub->pending_ops_count > 0) { 511 fibril_condvar_wait(&hub->pending_ops_cv, 512 &hub->pending_ops_mutex); 513 } 514 fibril_mutex_unlock(&hub->pending_ops_mutex); 515 516 usb_device_destroy(hub->usb_device); 517 518 free(hub->ports); 519 free(hub); 495 520 } 496 521 -
uspace/drv/usbhub/usbhub.h
ra5fc431 r399a13c 51 51 #include "ports.h" 52 52 53 54 55 53 /** Information about attached hub. */ 56 struct usb_hub_info_t {54 struct usb_hub_info_t { 57 55 /** Number of ports. */ 58 56 size_t port_count; … … 60 58 /** attached device handles, for each port one */ 61 59 usb_hub_port_t *ports; 60 61 fibril_mutex_t port_mutex; 62 62 63 63 /** connection to hcd */ … … 89 89 /** generic usb device data*/ 90 90 usb_device_t * usb_device; 91 92 /** Number of pending operations on the mutex to prevent shooting 93 * ourselves in the foot. 94 * When the hub is disconnected but we are in the middle of some 95 * operation, we cannot destroy this structure right away because 96 * the pending operation might use it. 97 */ 98 size_t pending_ops_count; 99 /** Guard for pending_ops_count. */ 100 fibril_mutex_t pending_ops_mutex; 101 /** Condition variable for pending_ops_count. */ 102 fibril_condvar_t pending_ops_cv; 103 91 104 }; 92 105 93 //int usb_hub_control_loop(void * hub_info_param); 94 95 int usb_hub_add_device(usb_device_t * usb_dev); 106 int usb_hub_add_device(usb_device_t *usb_dev); 96 107 97 108 bool hub_port_changes_callback(usb_device_t *dev, -
uspace/drv/usbhub/usbhub_private.h
ra5fc431 r399a13c 65 65 */ 66 66 static inline void usb_hub_set_descriptor_request( 67 usb_device_request_setup_packet_t * request68 ){67 usb_device_request_setup_packet_t * request 68 ) { 69 69 request->index = 0; 70 70 request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR; … … 87 87 int port_index, 88 88 usb_hub_class_feature_t feature) { 89 89 90 90 usb_device_request_setup_packet_t clear_request = { 91 91 .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE, … … 96 96 clear_request.value = feature; 97 97 return usb_pipe_control_write(pipe, &clear_request, 98 sizeof (clear_request), NULL, 0);98 sizeof (clear_request), NULL, 0); 99 99 } 100 100 … … 120 120 clear_request.value = feature; 121 121 return usb_pipe_control_write(pipe, &clear_request, 122 sizeof (clear_request), NULL, 0);122 sizeof (clear_request), NULL, 0); 123 123 } 124 125 124 126 125 /** … … 142 141 clear_request.value = feature; 143 142 return usb_pipe_control_write(pipe, &clear_request, 144 sizeof (clear_request), NULL, 0);143 sizeof (clear_request), NULL, 0); 145 144 } 146 145 … … 163 162 clear_request.value = feature; 164 163 return usb_pipe_control_write(pipe, &clear_request, 165 sizeof (clear_request), NULL, 0);164 sizeof (clear_request), NULL, 0); 166 165 } 167 166 -
uspace/drv/usbhub/utils.c
ra5fc431 r399a13c 62 62 * @return newly created serializd descriptor pointer 63 63 */ 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t *descriptor) { 65 65 //base size 66 66 size_t size = 7; 67 67 //variable size according to port count 68 size_t var_size = (descriptor->ports_count +7)/8;68 size_t var_size = (descriptor->ports_count + 7) / 8; 69 69 size += 2 * var_size; 70 70 uint8_t * result = malloc(size); 71 71 //size 72 if (result)73 usb_serialize_hub_descriptor(descriptor, result);72 if (result) 73 usb_serialize_hub_descriptor(descriptor, result); 74 74 return result; 75 75 } … … 82 82 * @param serialized_descriptor 83 83 */ 84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * 84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t *descriptor, 85 85 void * serialized_descriptor) { 86 86 //base size … … 88 88 size_t size = 7; 89 89 //variable size according to port count 90 size_t var_size = (descriptor->ports_count +7)/8;90 size_t var_size = (descriptor->ports_count + 7) / 8; 91 91 size += 2 * var_size; 92 92 //size … … 110 110 } 111 111 112 113 112 /** 114 113 * create deserialized desriptor structure out of serialized descriptor … … 121 120 */ 122 121 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 123 void *serialized_descriptor) {122 void *serialized_descriptor) { 124 123 uint8_t * sdescriptor = serialized_descriptor; 125 124 … … 130 129 } 131 130 132 usb_hub_descriptor_t * result = malloc(sizeof (usb_hub_descriptor_t));133 if (result)134 usb_deserialize_hub_desriptor(serialized_descriptor, result);131 usb_hub_descriptor_t * result = malloc(sizeof (usb_hub_descriptor_t)); 132 if (result) 133 usb_deserialize_hub_desriptor(serialized_descriptor, result); 135 134 return result; 136 135 } … … 144 143 */ 145 144 void usb_deserialize_hub_desriptor( 146 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {145 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) { 147 146 uint8_t * sdescriptor = serialized_descriptor; 148 147 descriptor->ports_count = sdescriptor[2]; … … 151 150 descriptor->pwr_on_2_good_time = sdescriptor[5]; 152 151 descriptor->current_requirement = sdescriptor[6]; 153 size_t var_size = (descriptor->ports_count +7) / 8;152 size_t var_size = (descriptor->ports_count + 7) / 8; 154 153 //descriptor->devices_removable = (uint8_t*) malloc(var_size); 155 154 -
uspace/drv/usbmouse/init.c
ra5fc431 r399a13c 39 39 #include <usb/hid/hid.h> 40 40 #include <usb/dev/request.h> 41 #include <usb/hid/request.h> 41 42 #include <errno.h> 42 43 … … 126 127 127 128 /* Set the boot protocol. */ 128 rc = usb_control_request_set(&dev->ctrl_pipe, 129 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 130 USB_HIDREQ_SET_PROTOCOL, USB_HID_PROTOCOL_BOOT, dev->interface_no, 131 NULL, 0); 129 rc = usbhid_req_set_protocol(&dev->ctrl_pipe, dev->interface_no, 130 USB_HID_PROTOCOL_BOOT); 132 131 if (rc != EOK) { 133 132 goto leave; -
uspace/drv/usbmouse/mouse.c
ra5fc431 r399a13c 117 117 async_hangup(mouse->console_phone); 118 118 mouse->console_phone = -1; 119 120 usb_device_destroy(dev); 119 121 } 120 122 -
uspace/lib/drv/generic/driver.c
ra5fc431 r399a13c 405 405 /* The interface has not such method */ 406 406 printf("%s: driver_connection_gen error - " 407 "invalid interface method (%d).\n", 407 "invalid interface method " 408 "(index %" PRIun ").\n", 408 409 driver->name, iface_method_idx); 409 410 async_answer_0(callid, ENOTSUP); -
uspace/lib/drv/include/usbhc_iface.h
ra5fc431 r399a13c 212 212 /** USB host controller communication interface. */ 213 213 typedef struct { 214 int (*reserve_default_address)(ddf_fun_t *, usb_speed_t);215 int (*release_default_address)(ddf_fun_t *);216 214 int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *); 217 215 int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t); -
uspace/lib/usbdev/include/usb/dev/driver.h
ra5fc431 r399a13c 168 168 int usb_device_destroy_pipes(ddf_dev_t *, usb_endpoint_mapping_t *, size_t); 169 169 int usb_device_create(ddf_dev_t *, usb_endpoint_description_t **, usb_device_t **, const char **); 170 void usb_device_destroy(usb_device_t *); 170 171 171 172 size_t usb_interface_count_alternates(uint8_t *, size_t, uint8_t); -
uspace/lib/usbdev/src/devdrv.c
ra5fc431 r399a13c 533 533 } 534 534 535 /** Destroy instance of a USB device. 536 * 537 * @param dev Device to be destroyed. 538 */ 539 void usb_device_destroy(usb_device_t *dev) 540 { 541 if (dev == NULL) { 542 return; 543 } 544 545 /* Ignore errors and hope for the best. */ 546 usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count); 547 if (dev->descriptors.configuration != NULL) { 548 free(dev->descriptors.configuration); 549 } 550 551 if (dev->alternate_interfaces != NULL) { 552 if (dev->alternate_interfaces->alternatives != NULL) { 553 free(dev->alternate_interfaces->alternatives); 554 } 555 free(dev->alternate_interfaces); 556 } 557 558 free(dev); 559 } 560 535 561 /** 536 562 * @} -
uspace/lib/usbdev/src/hub.c
ra5fc431 r399a13c 331 331 goto leave_release_free_address; 332 332 } 333 334 usb_hc_connection_close(&hc_conn); 333 335 334 336 /* -
uspace/lib/usbhid/src/hiddescriptor.c
ra5fc431 r399a13c 187 187 188 188 field = malloc(sizeof(usb_hid_report_field_t)); 189 if(field == NULL) { 190 return ENOMEM; 191 } 192 189 193 memset(field, 0, sizeof(usb_hid_report_field_t)); 190 194 list_initialize(&field->link); … … 216 220 } 217 221 else { 218 usage = 222 usage = report_item->usages[ 219 223 report_item->usages_count- 1]; 220 224 } … … 241 245 242 246 field->size = report_item->size; 243 244 size_t offset_byte = (report_item->offset + (i * 245 report_item->size)) / 8; 246 247 size_t offset_bit = 8 - ((report_item->offset + (i * 248 report_item->size)) % 8) - report_item->size; 249 250 field->offset = 8 * offset_byte + offset_bit; 251 if(report_item->id != 0) { 247 248 if(report_item->type == USB_HID_REPORT_TYPE_INPUT) { 249 int offset = report_item->offset + report_item->size * i; 250 int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 - 251 offset - report_item->size; 252 if(field_offset < 0) { 253 field->offset = 0; 254 } 255 else { 256 field->offset = field_offset; 257 } 258 } 259 else { 260 field->offset = report_item->offset + (i * report_item->size); 261 } 262 263 264 if(report->use_report_ids != 0) { 252 265 field->offset += 8; 253 266 report->use_report_ids = 1; 254 267 } 268 255 269 field->item_flags = report_item->item_flags; 256 270 -
uspace/lib/usbhid/src/hidparser.c
ra5fc431 r399a13c 153 153 154 154 155 report_des = usb_hid_report_find_description(report, *report_id, type); 155 report_des = usb_hid_report_find_description(report, *report_id, 156 type); 157 156 158 if(report_des == NULL) { 157 159 return EINVAL; … … 167 169 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 168 170 169 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) 171 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){ 170 172 171 173 // array … … 174 176 175 177 item->usage = USB_HID_EXTENDED_USAGE( 176 item->usages[item->value - item->physical_minimum]); 177 178 item->usage_page = USB_HID_EXTENDED_USAGE_PAGE( 179 item->usages[item->value - item->physical_minimum]); 180 181 usb_hid_report_set_last_item (item->collection_path, 182 USB_HID_TAG_CLASS_GLOBAL, item->usage_page); 183 184 usb_hid_report_set_last_item (item->collection_path, 178 item->usages[ 179 item->value - item->physical_minimum]); 180 181 item->usage_page = 182 USB_HID_EXTENDED_USAGE_PAGE( 183 item->usages[ 184 item->value - item->physical_minimum]); 185 186 usb_hid_report_set_last_item ( 187 item->collection_path, 188 USB_HID_TAG_CLASS_GLOBAL, 189 item->usage_page); 190 191 usb_hid_report_set_last_item ( 192 item->collection_path, 185 193 USB_HID_TAG_CLASS_LOCAL, item->usage); 186 194 … … 188 196 else { 189 197 // variable item 190 item->value = usb_hid_translate_data(item, data); 191 } 198 item->value = usb_hid_translate_data(item, 199 data); 200 } 192 201 } 193 202 list_item = list_item->next; … … 213 222 214 223 int32_t value=0; 215 int32_t mask ;216 const uint8_t *foo ;224 int32_t mask=0; 225 const uint8_t *foo=0; 217 226 218 227 // now only shot tags are allowed … … 240 249 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { 241 250 242 part_size = ((offset+item->size)%8);251 part_size = 0; 243 252 244 253 size_t i=0; … … 246 255 if(i == (size_t)(offset/8)) { 247 256 // the higher one 257 part_size = 8 - (offset % 8); 248 258 foo = data + i; 249 259 mask = ((1 << (item->size-part_size))-1); 250 value = (*foo & mask) << part_size;260 value = (*foo & mask); 251 261 } 252 262 else if(i == ((offset+item->size-1)/8)){ 253 263 // the lower one 254 264 foo = data + i; 255 mask = ((1 << part_size)-1) << (8-part_size); 256 value += ((*foo & mask) >> (8-part_size)); 265 mask = ((1 << (item->size - part_size)) - 1) 266 << (8 - (item->size - part_size)); 267 268 value = (((*foo & mask) >> (8 - 269 (item->size - part_size))) << part_size ) 270 + value; 257 271 } 258 272 else { 259 value = value << 8;260 value += *(data + 1);273 value = (*(data + 1) << (part_size + 8)) + value; 274 part_size += 8; 261 275 } 262 276 } … … 375 389 report_item = list_get_instance(item, usb_hid_report_field_t, link); 376 390 377 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) { 378 379 // array 380 value = usb_hid_translate_data_reverse(report_item, 381 report_item->value); 382 383 offset = report_item->offset; 384 length = report_item->size; 385 } 386 else { 387 // variable item 388 value = usb_hid_translate_data_reverse(report_item, 389 report_item->value); 390 391 offset = report_item->offset; 392 length = report_item->size; 393 } 394 391 value = usb_hid_translate_data_reverse(report_item, 392 report_item->value); 393 394 offset = report_des->bit_length - report_item->offset - 1; 395 length = report_item->size; 396 395 397 usb_log_debug("\ttranslated value: %x\n", value); 396 398 … … 617 619 return report_des->report_id; 618 620 } 621 622 report_it = report_it->next; 619 623 } 620 624 -
uspace/srv/hid/console/console.c
ra5fc431 r399a13c 57 57 #include <io/style.h> 58 58 #include <io/screenbuffer.h> 59 #include <inttypes.h> 59 60 60 61 #include "console.h" … … 67 68 /** Interval for checking for new keyboard (1/4s). */ 68 69 #define HOTPLUG_WATCH_INTERVAL (1000 * 250) 70 71 /* Kernel defines 32 but does not export it. */ 72 #define MAX_IPC_OUTGOING_PHONES 128 73 /** To allow proper phone closing. */ 74 static ipc_callid_t driver_phones[MAX_IPC_OUTGOING_PHONES] = { 0 }; 69 75 70 76 /** Phone to the keyboard driver. */ … … 90 96 contents and related settings. */ 91 97 } console_t; 98 99 92 100 93 101 /** Array of data for virtual consoles */ … … 401 409 } 402 410 411 static void close_driver_phone(ipc_callid_t hash) 412 { 413 int i; 414 for (i = 0; i < MAX_IPC_OUTGOING_PHONES; i++) { 415 if (driver_phones[i] == hash) { 416 printf("Device %" PRIxn " gone.\n", hash); 417 driver_phones[i] = 0; 418 async_hangup(i); 419 return; 420 } 421 } 422 } 423 403 424 /** Handler for keyboard */ 404 425 static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) … … 415 436 case IPC_M_PHONE_HUNGUP: 416 437 /* TODO: Handle hangup */ 438 close_driver_phone(iid); 417 439 return; 418 440 case KBD_EVENT: … … 458 480 case IPC_M_PHONE_HUNGUP: 459 481 /* TODO: Handle hangup */ 482 close_driver_phone(iid); 460 483 return; 461 484 case MEVENT_BUTTON: … … 715 738 } 716 739 740 static int async_connect_to_me_hack(int phone, sysarg_t arg1, sysarg_t arg2, 741 sysarg_t arg3, async_client_conn_t client_receiver, ipc_callid_t *hash) 742 { 743 sysarg_t task_hash; 744 sysarg_t phone_hash; 745 int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3, 746 NULL, NULL, NULL, &task_hash, &phone_hash); 747 if (rc != EOK) 748 return rc; 749 750 if (client_receiver != NULL) 751 async_new_connection(task_hash, phone_hash, phone_hash, NULL, 752 client_receiver); 753 754 if (hash != NULL) { 755 *hash = phone_hash; 756 } 757 758 return EOK; 759 } 760 717 761 static int connect_keyboard_or_mouse(const char *devname, 718 762 async_client_conn_t handler, const char *path) … … 729 773 } 730 774 731 int rc = async_connect_to_me(phone, SERVICE_CONSOLE, 0, 0, handler); 775 ipc_callid_t hash; 776 int rc = async_connect_to_me_hack(phone, SERVICE_CONSOLE, 0, phone, 777 handler, &hash); 732 778 if (rc != EOK) { 733 779 printf(NAME ": " \ … … 737 783 } 738 784 739 printf(NAME ": found %s \"%s\".\n", devname, path); 785 driver_phones[phone] = hash; 786 787 printf(NAME ": found %s \"%s\" (%" PRIxn ").\n", devname, path, hash); 740 788 741 789 return phone;
Note:
See TracChangeset
for help on using the changeset viewer.