Changeset a91fbb1 in mainline
- Timestamp:
- 2011-04-15T20:53:17Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2c2cbcf
- Parents:
- 27b85d9 (diff), 8595577b (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
- Files:
-
- 2 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
r27b85d9 ra91fbb1 147 147 data->ed->next); 148 148 size_t i = 0; 149 instance->transfered_size = instance->buffer_size; 149 150 for (; i < tds; ++i) { 150 151 assert(data->tds[i] != NULL); … … 156 157 } 157 158 instance->error = td_error(data->tds[i]); 158 /* FIXME: calculate real transfered size */159 instance->transfered_size = instance->buffer_size;160 159 if (instance->error != EOK) { 161 160 usb_log_debug("Batch(%p) found error TD(%d):%x.\n", … … 174 173 assert(hcd_ep); 175 174 hcd_ep->td = data->tds[i]; 175 if (i > 0) 176 instance->transfered_size -= td_remain_size(data->tds[i - 1]); 177 176 178 /* Clear possible ED HALT */ 177 179 data->ed->td_head &= ~ED_TDHEAD_HALTED_FLAG; … … 238 240 { 239 241 assert(instance); 240 instance->next_step = usb_transfer_batch_call_in_and_dispose; 242 /* We are data out, we are supposed to provide data */ 243 memcpy(instance->data_buffer, instance->buffer, instance->buffer_size); 244 instance->next_step = usb_transfer_batch_call_out_and_dispose; 241 245 batch_data(instance); 242 usb_log_debug("Batch(%p) BULK INinitialized.\n", instance);246 usb_log_debug("Batch(%p) BULK OUT initialized.\n", instance); 243 247 } 244 248 /*----------------------------------------------------------------------------*/ -
uspace/drv/ohci/hw_struct/transfer_descriptor.c
r27b85d9 ra91fbb1 52 52 instance->status |= togg[toggle] << TD_STATUS_T_SHIFT; 53 53 } 54 if (dir == USB_DIRECTION_IN) { 55 instance->status |= TD_STATUS_ROUND_FLAG; 56 } 54 57 if (buffer != NULL) { 55 58 assert(size != 0); -
uspace/drv/ohci/hw_struct/transfer_descriptor.h
r27b85d9 ra91fbb1 59 59 #define TD_STATUS_T_0 (0x2) 60 60 #define TD_STATUS_T_1 (0x3) 61 #define TD_STATUS_T_ED (0) 61 62 #define TD_STATUS_EC_MASK (0x3) /* error count */ 62 63 #define TD_STATUS_EC_SHIFT (26) … … 102 103 return cc_to_rc(cc); 103 104 } 105 106 static inline size_t td_remain_size(td_t *instance) 107 { 108 assert(instance); 109 if (instance->cbp == 0) 110 return 0; 111 return instance->be - instance->cbp + 1; 112 } 104 113 #endif 105 114 /** -
uspace/drv/ohci/root_hub.c
r27b85d9 ra91fbb1 198 198 static int process_ctrl_request(rh_t *instance, usb_transfer_batch_t *request); 199 199 200 200 static int process_interrupt(rh_t *instance, usb_transfer_batch_t * request, 201 void * change_buffer, size_t buffe_size); 202 203 static bool is_zeros(void * buffer, size_t size); 201 204 202 205 … … 213 216 // set port power mode to no-power-switching 214 217 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 215 218 instance->unfinished_interrupt_transfer = NULL; 216 219 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count); 217 220 return EOK; … … 233 236 usb_log_info("Root hub got CONTROL packet\n"); 234 237 opResult = process_ctrl_request(instance, request); 238 usb_transfer_batch_finish_error(request, opResult); 235 239 } else if (request->ep->transfer_type == USB_TRANSFER_INTERRUPT) { 236 240 usb_log_info("Root hub got INTERRUPT packet\n"); 237 241 void * buffer; 242 size_t buffer_size; 238 243 create_interrupt_mask(instance, &buffer, 239 &(request->transfered_size)); 240 memcpy(request->data_buffer, buffer, 241 request->transfered_size); 244 &buffer_size); 245 if(is_zeros(buffer,buffer_size)){ 246 usb_log_debug("no changes.."); 247 instance->unfinished_interrupt_transfer= 248 request; 249 //will be finished later 250 }else{ 251 usb_log_debug("processing changes.."); 252 process_interrupt(instance, request, 253 buffer, buffer_size); 254 } 255 free(buffer); 242 256 opResult = EOK; 243 257 } else { 244 258 opResult = EINVAL; 245 }246 usb_transfer_batch_finish_error(request, opResult);259 usb_transfer_batch_finish_error(request, opResult); 260 } 247 261 return EOK; 248 262 } … … 252 266 253 267 void rh_interrupt(rh_t *instance) { 254 usb_log_info("Whoa whoa wait, I`m not supposed to receive any " 255 "interrupts, am I?\n"); 256 /* TODO: implement? */ 268 //usb_log_info("Whoa whoa wait, I`m not supposed to receive any " 269 // "interrupts, am I?\n"); 270 if(!instance->unfinished_interrupt_transfer){ 271 return; 272 } 273 size_t size; 274 void * buffer; 275 create_interrupt_mask(instance, &buffer, 276 &size); 277 process_interrupt(instance,instance->unfinished_interrupt_transfer, 278 buffer,size); 279 free(buffer); 257 280 } 258 281 /*----------------------------------------------------------------------------*/ … … 859 882 return opResult; 860 883 } 884 /*----------------------------------------------------------------------------*/ 885 886 /** 887 * process hanging interrupt request 888 * 889 * If an interrupt transfer has been received and there was no change, 890 * the driver stores the transfer information and waits for change to occcur. 891 * This routine is called when that happens and it finalizes the interrupt 892 * transfer. 893 * 894 * @param instance hub instance 895 * @param request batch request to be processed 896 * @param change_buffer chages on hub 897 * @param buffer_size size of change buffer 898 * 899 * @return 900 */ 901 static int process_interrupt(rh_t *instance, usb_transfer_batch_t * request, 902 void * change_buffer, size_t buffe_size){ 903 create_interrupt_mask(instance, &change_buffer, 904 &(request->transfered_size)); 905 memcpy(request->data_buffer, change_buffer,request->transfered_size); 906 instance->unfinished_interrupt_transfer = NULL; 907 usb_transfer_batch_finish_error(request, EOK); 908 return EOK; 909 } 910 911 /*----------------------------------------------------------------------------*/ 912 913 /** 914 * return whether the buffer is full of zeros 915 * 916 * Convenience function. 917 * @param buffer 918 * @param size 919 * @return 920 */ 921 static bool is_zeros(void * buffer, size_t size){ 922 if(!buffer) return true; 923 if(!size) return true; 924 size_t i; 925 for(i=0;i<size;++i){ 926 if(((char*)buffer)[i]) 927 return false; 928 } 929 return true; 930 } 861 931 862 932 /** -
uspace/drv/ohci/root_hub.h
r27b85d9 ra91fbb1 54 54 /** hubs descriptors */ 55 55 usb_device_descriptors_t descriptors; 56 /** interrupt transfer waiting for an actual interrupt to occur */ 57 usb_transfer_batch_t * unfinished_interrupt_transfer; 56 58 } rh_t; 57 59 -
uspace/drv/usbhid/Makefile
r27b85d9 ra91fbb1 46 46 generic/hiddev.c \ 47 47 mouse/mousedev.c \ 48 lgtch-ultrax/lgtch-ultrax.c \ 48 49 $(STOLEN_LAYOUT_SOURCES) 49 50 -
uspace/drv/usbhid/kbd/kbddev.c
r27b85d9 ra91fbb1 176 176 177 177 /*----------------------------------------------------------------------------*/ 178 179 static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count, 180 uint8_t report_id, void *arg); 181 182 static const usb_hid_report_in_callbacks_t usb_kbd_parser_callbacks = { 183 .keyboard = usb_kbd_process_keycodes 184 }; 185 186 /*----------------------------------------------------------------------------*/ 178 187 /* Keyboard layouts */ 179 188 /*----------------------------------------------------------------------------*/ … … 630 639 { 631 640 assert(hid_dev->parser != NULL); 632 633 usb_hid_report_in_callbacks_t *callbacks =634 (usb_hid_report_in_callbacks_t *)malloc(635 sizeof(usb_hid_report_in_callbacks_t));636 637 callbacks->keyboard = usb_kbd_process_keycodes;638 641 639 642 usb_log_debug("Calling usb_hid_parse_report() with " … … 644 647 usb_hid_report_path_t *path = usb_hid_report_path(); 645 648 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0); 646 usb_hid_report_path_set_report_id(path, 0);649 //usb_hid_report_path_set_report_id(path, 0); 647 650 648 651 int rc = usb_hid_parse_report(hid_dev->parser, buffer, 649 652 actual_size, path, 650 653 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 651 callbacks, hid_dev);654 &usb_kbd_parser_callbacks, hid_dev); 652 655 653 656 usb_hid_report_path_free(path); -
uspace/drv/usbhid/main.c
r27b85d9 ra91fbb1 75 75 static int usb_hid_try_add_device(usb_device_t *dev) 76 76 { 77 assert(dev != NULL); 78 77 79 /* 78 80 * Initialize device (get and process descriptors, get address, etc.) … … 178 180 usb_log_debug("usb_hid_add_device()\n"); 179 181 182 if (dev == NULL) { 183 usb_log_warning("Wrong parameter given for add_device().\n"); 184 return EINVAL; 185 } 186 180 187 if (dev->interface_no < 0) { 181 188 usb_log_warning("Device is not a supported HID device.\n"); -
uspace/drv/usbhid/mouse/mousedev.c
r27b85d9 ra91fbb1 157 157 static void usb_mouse_free(usb_mouse_t **mouse_dev) 158 158 { 159 if (mouse_dev == NULL || *mouse_dev == NULL) { 160 return; 161 } 159 assert(mouse_dev != NULL && *mouse_dev != NULL); 162 160 163 161 // hangup phone to the console 164 async_hangup((*mouse_dev)->console_phone); 162 if ((*mouse_dev)->console_phone >= 0) { 163 async_hangup((*mouse_dev)->console_phone); 164 } 165 165 166 166 free(*mouse_dev); -
uspace/drv/usbhid/subdrivers.c
r27b85d9 ra91fbb1 37 37 #include "usb/classes/hidut.h" 38 38 39 static usb_hid_subdriver_usage_t path_kbd[] = {{USB_HIDUT_PAGE_KEYBOARD, 0}}; 39 #include "lgtch-ultrax/lgtch-ultrax.h" 40 41 static usb_hid_subdriver_usage_t path_kbd[] = { 42 {USB_HIDUT_PAGE_KEYBOARD, 0}, 43 {0, 0} 44 }; 45 46 static usb_hid_subdriver_usage_t lgtch_path[] = { 47 {0xc, 0}, 48 {0, 0} 49 }; 40 50 41 51 const usb_hid_subdriver_mapping_t usb_hid_subdrivers[] = { 42 52 { 43 53 path_kbd, 54 -1, 55 USB_HID_PATH_COMPARE_END 56 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 57 0, 58 0, 59 { 60 .init = usb_kbd_init, 61 .deinit = usb_kbd_deinit, 62 .poll = usb_kbd_polling_callback, 63 .poll_end = NULL 64 }, 65 66 }, 67 { 68 lgtch_path, 44 69 1, 45 70 USB_HID_PATH_COMPARE_END 46 71 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 47 NULL,48 NULL,72 0x046d, 73 0xc30e, 49 74 { 50 usb_kbd_init, 51 usb_kbd_deinit, 52 usb_kbd_polling_callback, 53 NULL 54 }, 55 75 .init = NULL, 76 .deinit = NULL, 77 .poll = usb_lgtch_polling_callback, 78 .poll_end = NULL 79 } 56 80 }, 57 {NULL, 0, 0, NULL, NULL, {NULL, NULL, NULL, NULL}}81 {NULL, -1, 0, 0, 0, {NULL, NULL, NULL, NULL}} 58 82 }; 59 83 -
uspace/drv/usbhid/subdrivers.h
r27b85d9 ra91fbb1 54 54 typedef struct usb_hid_subdriver_mapping { 55 55 const usb_hid_subdriver_usage_t *usage_path; 56 int path_size;56 int report_id; 57 57 int compare; 58 const char *vendor_id;59 const char *product_id;58 uint16_t vendor_id; 59 uint16_t product_id; 60 60 usb_hid_subdriver_t subdriver; 61 61 } usb_hid_subdriver_mapping_t; -
uspace/drv/usbhid/usbhid.c
r27b85d9 ra91fbb1 67 67 static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev) 68 68 { 69 assert(hid_dev ->subdriver_count == 0);69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 70 70 71 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 97 97 static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev) 98 98 { 99 assert(hid_dev ->subdriver_count == 0);99 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 100 100 101 101 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 127 127 static int usb_hid_set_generic_hid_subdriver(usb_hid_dev_t *hid_dev) 128 128 { 129 assert(hid_dev ->subdriver_count == 0);129 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 130 130 131 131 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 164 164 165 165 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 166 const usb_hid_subdriver_ usage_t *path, int path_size, int compare)166 const usb_hid_subdriver_mapping_t *mapping) 167 167 { 168 168 assert(hid_dev != NULL); 169 assert( path!= NULL);169 assert(mapping != NULL); 170 170 171 171 usb_hid_report_path_t *usage_path = usb_hid_report_path(); … … 174 174 return false; 175 175 } 176 int i; 177 for (i = 0; i < path_size; ++i) { 176 int i = 0; 177 while (mapping->usage_path[i].usage != 0 178 || mapping->usage_path[i].usage_page != 0) { 178 179 if (usb_hid_report_path_append_item(usage_path, 179 path[i].usage_page, path[i].usage) != EOK) { 180 mapping->usage_path[i].usage_page, 181 mapping->usage_path[i].usage) != EOK) { 180 182 usb_log_debug("Failed to append to usage path.\n"); 181 183 usb_hid_report_path_free(usage_path); 182 184 return false; 183 185 } 186 ++i; 187 } 188 189 if (mapping->report_id >= 0) { 190 usb_hid_report_path_set_report_id(usage_path, 191 mapping->report_id); 184 192 } 185 193 186 194 assert(hid_dev->parser != NULL); 187 195 188 usb_log_debug("Compare flags: %d\n", compare);196 usb_log_debug("Compare flags: %d\n", mapping->compare); 189 197 size_t size = usb_hid_report_input_length(hid_dev->parser, usage_path, 190 compare);198 mapping->compare); 191 199 usb_log_debug("Size of the input report: %d\n", size); 192 200 … … 231 239 static int usb_hid_find_subdrivers(usb_hid_dev_t *hid_dev) 232 240 { 241 assert(hid_dev != NULL); 242 233 243 const usb_hid_subdriver_t *subdrivers[USB_HID_MAX_SUBDRIVERS]; 234 244 235 245 int i = 0, count = 0; 236 246 const usb_hid_subdriver_mapping_t *mapping = &usb_hid_subdrivers[i]; 247 248 bool ids_matched; 249 bool matched; 237 250 238 251 while (count < USB_HID_MAX_SUBDRIVERS && 239 252 (mapping->usage_path != NULL 240 || mapping->vendor_id != NULL 241 || mapping->product_id != NULL)) { 253 || mapping->vendor_id != 0 || mapping->product_id != 0)) { 242 254 // check the vendor & product ID 243 if (mapping->vendor_id != NULL && mapping->product_id == NULL) {244 usb_log_warning("Missing Product ID for Vendor ID % s\n",255 if (mapping->vendor_id != 0 && mapping->product_id == 0) { 256 usb_log_warning("Missing Product ID for Vendor ID %u\n", 245 257 mapping->vendor_id); 246 258 return EINVAL; 247 259 } 248 if (mapping->product_id != NULL && mapping->vendor_id == NULL) {249 usb_log_warning("Missing Vendor ID for Product ID % s\n",260 if (mapping->product_id != 0 && mapping->vendor_id == 0) { 261 usb_log_warning("Missing Vendor ID for Product ID %u\n", 250 262 mapping->product_id); 251 263 return EINVAL; 252 264 } 253 265 254 if (mapping->vendor_id != NULL) { 255 assert(mapping->product_id != NULL); 256 usb_log_debug("Comparing device against vendor ID %s" 257 " and product ID %s.\n", mapping->vendor_id, 266 ids_matched = false; 267 matched = false; 268 269 if (mapping->vendor_id != 0) { 270 assert(mapping->product_id != 0); 271 usb_log_debug("Comparing device against vendor ID %u" 272 " and product ID %u.\n", mapping->vendor_id, 258 273 mapping->product_id); 259 274 if (usb_hid_ids_match(hid_dev, mapping)) { 260 usb_log_debug("Matched.\n"); 261 subdrivers[count++] = &mapping->subdriver; 262 // skip the checking of usage path 263 goto next; 275 usb_log_debug("IDs matched.\n"); 276 ids_matched = true; 264 277 } 265 278 } … … 267 280 if (mapping->usage_path != NULL) { 268 281 usb_log_debug("Comparing device against usage path.\n"); 269 if (usb_hid_path_matches(hid_dev, 270 mapping->usage_path, mapping->path_size, 271 mapping->compare)) { 272 subdrivers[count++] = &mapping->subdriver; 273 } else { 274 usb_log_debug("Not matched.\n"); 282 if (usb_hid_path_matches(hid_dev, mapping)) { 283 // does not matter if IDs were matched 284 matched = true; 275 285 } 276 } 277 next: 286 } else { 287 // matched only if IDs were matched and there is no path 288 matched = ids_matched; 289 } 290 291 if (matched) { 292 subdrivers[count++] = &mapping->subdriver; 293 } 294 278 295 mapping = &usb_hid_subdrivers[++i]; 279 296 } … … 287 304 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, usb_device_t *dev) 288 305 { 306 assert(hid_dev != NULL && dev != NULL); 307 289 308 int rc = EOK; 290 309 … … 360 379 rc = usb_hid_check_pipes(hid_dev, dev); 361 380 if (rc != EOK) { 362 usb_hid_free(&hid_dev);381 //usb_hid_free(&hid_dev); 363 382 return rc; 364 383 } … … 368 387 if (rc != EOK) { 369 388 usb_log_error("Failed to initialize report parser.\n"); 370 usb_hid_free(&hid_dev);389 //usb_hid_free(&hid_dev); 371 390 return rc; 372 391 } … … 386 405 " device.\n"); 387 406 fallback = true; 407 assert(hid_dev->subdrivers == NULL); 408 assert(hid_dev->subdriver_count == 0); 388 409 } 389 410 } else { … … 426 447 usb_log_error("No subdriver for handling this device could be" 427 448 " initialized: %s.\n", str_error(rc)); 428 usb_hid_free(&hid_dev); 449 usb_log_debug("Subdriver count: %d\n", 450 hid_dev->subdriver_count); 451 //usb_hid_free(&hid_dev); 429 452 } else { 430 453 bool ok = false; … … 550 573 } 551 574 575 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 576 (*hid_dev)->subdrivers, (*hid_dev)->subdriver_count); 577 552 578 assert((*hid_dev)->subdrivers != NULL 553 579 || (*hid_dev)->subdriver_count == 0); -
uspace/drv/usbhub/usbhub.c
r27b85d9 ra91fbb1 105 105 } 106 106 107 usb_pipe_start_session(hub_info->control_pipe);107 //usb_pipe_start_session(hub_info->control_pipe); 108 108 //set hub configuration 109 109 opResult = usb_hub_set_configuration(hub_info); … … 122 122 return opResult; 123 123 } 124 usb_pipe_end_session(hub_info->control_pipe);125 126 /// \TODO what is this? 127 usb_log_debug("Creating `hub' function.\n");124 //usb_pipe_end_session(hub_info->control_pipe); 125 126 127 usb_log_debug("Creating 'hub' function in DDF.\n"); 128 128 ddf_fun_t *hub_fun = ddf_fun_create(hub_info->usb_device->ddf_dev, 129 129 fun_exposed, "hub"); … … 153 153 bool hub_port_changes_callback(usb_device_t *dev, 154 154 uint8_t *change_bitmap, size_t change_bitmap_size, void *arg) { 155 usb_log_debug("hub_port_changes_callback\n"); 155 156 usb_hub_info_t *hub = (usb_hub_info_t *) arg; 156 157 … … 217 218 // get hub descriptor 218 219 usb_log_debug("creating serialized descriptor\n"); 219 void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE); 220 //void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE); 221 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 220 222 usb_hub_descriptor_t * descriptor; 221 223 int opResult; … … 235 237 } 236 238 usb_log_debug2("deserializing descriptor\n"); 237 descriptor = usb_deserialize_hub_desriptor(serialized_descriptor); 239 descriptor = usb_create_deserialized_hub_desriptor( 240 serialized_descriptor); 238 241 if (descriptor == NULL) { 239 242 usb_log_warning("could not deserialize descriptor \n"); 240 return opResult;243 return ENOMEM; 241 244 } 242 245 usb_log_debug("setting port count to %d\n", descriptor->ports_count); 243 246 hub_info->port_count = descriptor->ports_count; 244 247 /// \TODO this is not semantically correct 248 bool is_power_switched = 249 ((descriptor->hub_characteristics & 1) ==0); 250 bool has_individual_port_powering = 251 ((descriptor->hub_characteristics & 1) !=0); 245 252 hub_info->ports = malloc( 246 253 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); … … 249 256 usb_hub_port_init(&hub_info->ports[port]); 250 257 } 251 for (port = 0; port < hub_info->port_count; port++) { 252 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 253 port+1, USB_HUB_FEATURE_PORT_POWER); 254 if (opResult != EOK) { 255 usb_log_error("cannot power on port %d; %d\n", 256 port+1, opResult); 257 } 258 if(is_power_switched){ 259 usb_log_debug("is_power_switched\n"); 260 if(has_individual_port_powering){ 261 usb_log_debug("has_individual_port_powering\n"); 262 for (port = 0; port < hub_info->port_count; port++) { 263 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 264 port+1, USB_HUB_FEATURE_PORT_POWER); 265 if (opResult != EOK) { 266 usb_log_error("cannot power on port %d; %d\n", 267 port+1, opResult); 268 } 269 } 270 }else{ 271 usb_log_debug("!has_individual_port_powering\n"); 272 opResult = usb_hub_set_feature(hub_info->control_pipe, 273 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 274 if (opResult != EOK) { 275 usb_log_error("cannot power hub; %d\n", 276 opResult); 277 } 278 } 279 }else{ 280 usb_log_debug("!is_power_switched\n"); 258 281 } 259 282 usb_log_debug2("freeing data\n"); 260 free(serialized_descriptor);261 free(descriptor->devices_removable);283 //free(serialized_descriptor); 284 //free(descriptor->devices_removable); 262 285 free(descriptor); 263 286 return EOK; … … 321 344 * auto destruction, this could work better. 322 345 */ 323 int rc = usb_ pipe_start_session(hub_info->control_pipe);346 int rc = usb_hc_connection_open(&hub_info->connection); 324 347 if (rc != EOK) { 325 usb_log_error("Failed to start session on control pipe: %s.\n", 326 str_error(rc)); 327 return rc; 328 } 329 rc = usb_hc_connection_open(&hub_info->connection); 330 if (rc != EOK) { 331 usb_pipe_end_session(hub_info->control_pipe); 348 //usb_pipe_end_session(hub_info->control_pipe); 332 349 usb_log_error("Failed to open connection to HC: %s.\n", 333 350 str_error(rc)); -
uspace/drv/usbhub/usbhub_private.h
r27b85d9 ra91fbb1 113 113 114 114 usb_device_request_setup_packet_t clear_request = { 115 .request_type = USB_HUB_REQ_TYPE_ CLEAR_PORT_FEATURE,115 .request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE, 116 116 .request = USB_DEVREQ_SET_FEATURE, 117 117 .length = 0, … … 166 166 } 167 167 168 /**169 * create uint8_t array with serialized descriptor170 *171 * @param descriptor172 * @return newly created serializd descriptor pointer173 */174 void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor);175 168 176 /** 177 * create deserialized desriptor structure out of serialized descriptor 178 * 179 * The serialized descriptor must be proper usb hub descriptor,180 * otherwise an eerror might occur. 181 * 182 * @param sdescriptor serialized descriptor183 * @return newly created deserialized descriptor pointer 184 */ 185 usb_hub_descriptor_t * usb_deserialize_hub_desriptor(void * sdescriptor);169 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor); 170 171 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor, 172 void * serialized_descriptor); 173 174 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 175 void * serialized_descriptor); 176 177 void usb_deserialize_hub_desriptor(void * serialized_descriptor, 178 usb_hub_descriptor_t * descriptor); 186 179 187 180 -
uspace/drv/usbhub/utils.c
r27b85d9 ra91fbb1 56 56 //hub descriptor utils 57 57 58 void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor) { 58 /** 59 * create uint8_t array with serialized descriptor 60 * 61 * @param descriptor 62 * @return newly created serializd descriptor pointer 63 */ 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) { 59 65 //base size 60 66 size_t size = 7; … … 64 70 uint8_t * result = malloc(size); 65 71 //size 66 result[0] = size; 72 if(result) 73 usb_serialize_hub_descriptor(descriptor,result); 74 return result; 75 } 76 77 /** 78 * serialize descriptor into given buffer 79 * 80 * The buffer size is not checked. 81 * @param descriptor 82 * @param serialized_descriptor 83 */ 84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor, 85 void * serialized_descriptor) { 86 //base size 87 uint8_t * sdescriptor = serialized_descriptor; 88 size_t size = 7; 89 //variable size according to port count 90 size_t var_size = (descriptor->ports_count+7)/8; 91 size += 2 * var_size; 92 //size 93 sdescriptor[0] = size; 67 94 //descriptor type 68 result[1] = USB_DESCTYPE_HUB;69 result[2] = descriptor->ports_count;95 sdescriptor[1] = USB_DESCTYPE_HUB; 96 sdescriptor[2] = descriptor->ports_count; 70 97 /// @fixme handling of endianness?? 71 result[3] = descriptor->hub_characteristics / 256;72 result[4] = descriptor->hub_characteristics % 256;73 result[5] = descriptor->pwr_on_2_good_time;74 result[6] = descriptor->current_requirement;98 sdescriptor[3] = descriptor->hub_characteristics / 256; 99 sdescriptor[4] = descriptor->hub_characteristics % 256; 100 sdescriptor[5] = descriptor->pwr_on_2_good_time; 101 sdescriptor[6] = descriptor->current_requirement; 75 102 76 103 size_t i; 77 104 for (i = 0; i < var_size; ++i) { 78 result[7 + i] = descriptor->devices_removable[i];105 sdescriptor[7 + i] = descriptor->devices_removable[i]; 79 106 } 80 107 for (i = 0; i < var_size; ++i) { 81 result[7 + var_size + i] = 255;108 sdescriptor[7 + var_size + i] = 255; 82 109 } 83 return result;84 110 } 85 111 86 usb_hub_descriptor_t * usb_deserialize_hub_desriptor( 112 113 /** 114 * create deserialized desriptor structure out of serialized descriptor 115 * 116 * The serialized descriptor must be proper usb hub descriptor, 117 * otherwise an eerror might occur. 118 * 119 * @param sdescriptor serialized descriptor 120 * @return newly created deserialized descriptor pointer 121 */ 122 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 87 123 void * serialized_descriptor) { 88 124 uint8_t * sdescriptor = serialized_descriptor; … … 95 131 96 132 usb_hub_descriptor_t * result = malloc(sizeof(usb_hub_descriptor_t)); 97 133 if(result) 134 usb_deserialize_hub_desriptor(serialized_descriptor,result); 135 return result; 136 } 98 137 99 result->ports_count = sdescriptor[2]; 138 /** 139 * deserialize descriptor into given pointer 140 * 141 * @param serialized_descriptor 142 * @param descriptor 143 * @return 144 */ 145 void usb_deserialize_hub_desriptor( 146 void * serialized_descriptor, usb_hub_descriptor_t * descriptor) { 147 uint8_t * sdescriptor = serialized_descriptor; 148 descriptor->ports_count = sdescriptor[2]; 100 149 /// @fixme handling of endianness?? 101 result->hub_characteristics = sdescriptor[4] + 256 * sdescriptor[3];102 result->pwr_on_2_good_time = sdescriptor[5];103 result->current_requirement = sdescriptor[6];104 size_t var_size = ( result->ports_count+7) / 8;105 result->devices_removable = (uint8_t*) malloc(var_size);150 descriptor->hub_characteristics = sdescriptor[4] + 256 * sdescriptor[3]; 151 descriptor->pwr_on_2_good_time = sdescriptor[5]; 152 descriptor->current_requirement = sdescriptor[6]; 153 size_t var_size = (descriptor->ports_count+7) / 8; 154 //descriptor->devices_removable = (uint8_t*) malloc(var_size); 106 155 107 156 size_t i; 108 157 for (i = 0; i < var_size; ++i) { 109 result->devices_removable[i] = sdescriptor[7 + i];158 descriptor->devices_removable[i] = sdescriptor[7 + i]; 110 159 } 111 return result;112 160 } 113 114 115 161 116 162 /** -
uspace/lib/usb/include/usb/classes/hub.h
r27b85d9 ra91fbb1 152 152 maximum of 255 ports). 153 153 */ 154 uint8_t * devices_removable;154 uint8_t devices_removable[32]; 155 155 156 156 /** -
uspace/lib/usb/src/hidreport.c
r27b85d9 ra91fbb1 119 119 uint16_t length = hid_desc->report_desc_info.length; 120 120 size_t actual_size = 0; 121 122 /*123 * Start session for the control transfer.124 */125 int sess_rc = usb_pipe_start_session(&dev->ctrl_pipe);126 if (sess_rc != EOK) {127 usb_log_warning("Failed to start a session: %s.\n",128 str_error(sess_rc));129 return sess_rc;130 }131 121 132 122 /* … … 162 152 "%u)\n", actual_size, length); 163 153 return EINVAL; 164 }165 166 /*167 * End session for the control transfer.168 */169 sess_rc = usb_pipe_end_session(&dev->ctrl_pipe);170 if (sess_rc != EOK) {171 usb_log_warning("Failed to end a session: %s.\n",172 str_error(sess_rc));173 free(*report_desc);174 *report_desc = NULL;175 return sess_rc;176 154 } 177 155 -
uspace/lib/usb/src/hidreq.c
r27b85d9 ra91fbb1 56 56 * @retval EOK if successful. 57 57 * @retval EINVAL if no HID device is given. 58 * @return Other value inherited from one of functions 59 * usb_pipe_start_session(), usb_pipe_end_session(), 60 * usb_control_request_set(). 58 * @return Other value inherited from function usb_control_request_set(). 61 59 */ 62 60 int usbhid_req_set_report(usb_pipe_t *ctrl_pipe, int iface_no, … … 79 77 */ 80 78 81 int rc, sess_rc; 82 83 sess_rc = usb_pipe_start_session(ctrl_pipe); 84 if (sess_rc != EOK) { 85 usb_log_warning("Failed to start a session: %s.\n", 86 str_error(sess_rc)); 87 return sess_rc; 88 } 79 int rc; 89 80 90 81 uint16_t value = 0; … … 97 88 USB_HIDREQ_SET_REPORT, value, iface_no, buffer, buf_size); 98 89 99 sess_rc = usb_pipe_end_session(ctrl_pipe); 100 101 if (rc != EOK) { 102 usb_log_warning("Error sending output report to the keyboard: " 103 "%s.\n", str_error(rc)); 104 return rc; 105 } 106 107 if (sess_rc != EOK) { 108 usb_log_warning("Error closing session: %s.\n", 109 str_error(sess_rc)); 110 return sess_rc; 90 if (rc != EOK) { 91 usb_log_warning("Error sending output report to the keyboard: " 92 "%s.\n", str_error(rc)); 93 return rc; 111 94 } 112 95 … … 123 106 * @retval EOK if successful. 124 107 * @retval EINVAL if no HID device is given. 125 * @return Other value inherited from one of functions 126 * usb_pipe_start_session(), usb_pipe_end_session(), 127 * usb_control_request_set(). 108 * @return Other value inherited from function usb_control_request_set(). 128 109 */ 129 110 int usbhid_req_set_protocol(usb_pipe_t *ctrl_pipe, int iface_no, … … 146 127 */ 147 128 148 int rc, sess_rc; 149 150 sess_rc = usb_pipe_start_session(ctrl_pipe); 151 if (sess_rc != EOK) { 152 usb_log_warning("Failed to start a session: %s.\n", 153 str_error(sess_rc)); 154 return sess_rc; 155 } 129 int rc; 156 130 157 131 usb_log_debug("Sending Set_Protocol request to the device (" … … 162 136 USB_HIDREQ_SET_PROTOCOL, protocol, iface_no, NULL, 0); 163 137 164 sess_rc = usb_pipe_end_session(ctrl_pipe); 165 166 if (rc != EOK) { 167 usb_log_warning("Error sending output report to the keyboard: " 168 "%s.\n", str_error(rc)); 169 return rc; 170 } 171 172 if (sess_rc != EOK) { 173 usb_log_warning("Error closing session: %s.\n", 174 str_error(sess_rc)); 175 return sess_rc; 138 if (rc != EOK) { 139 usb_log_warning("Error sending output report to the keyboard: " 140 "%s.\n", str_error(rc)); 141 return rc; 176 142 } 177 143 … … 189 155 * @retval EOK if successful. 190 156 * @retval EINVAL if no HID device is given. 191 * @return Other value inherited from one of functions 192 * usb_pipe_start_session(), usb_pipe_end_session(), 193 * usb_control_request_set(). 157 * @return Other value inherited from function usb_control_request_set(). 194 158 */ 195 159 int usbhid_req_set_idle(usb_pipe_t *ctrl_pipe, int iface_no, uint8_t duration) … … 211 175 */ 212 176 213 int rc, sess_rc; 214 215 sess_rc = usb_pipe_start_session(ctrl_pipe); 216 if (sess_rc != EOK) { 217 usb_log_warning("Failed to start a session: %s.\n", 218 str_error(sess_rc)); 219 return sess_rc; 220 } 177 int rc; 221 178 222 179 usb_log_debug("Sending Set_Idle request to the device (" … … 229 186 USB_HIDREQ_SET_IDLE, value, iface_no, NULL, 0); 230 187 231 sess_rc = usb_pipe_end_session(ctrl_pipe); 232 233 if (rc != EOK) { 234 usb_log_warning("Error sending output report to the keyboard: " 235 "%s.\n", str_error(rc)); 236 return rc; 237 } 238 239 if (sess_rc != EOK) { 240 usb_log_warning("Error closing session: %s.\n", 241 str_error(sess_rc)); 242 return sess_rc; 188 if (rc != EOK) { 189 usb_log_warning("Error sending output report to the keyboard: " 190 "%s.\n", str_error(rc)); 191 return rc; 243 192 } 244 193 … … 259 208 * @retval EOK if successful. 260 209 * @retval EINVAL if no HID device is given. 261 * @return Other value inherited from one of functions 262 * usb_pipe_start_session(), usb_pipe_end_session(), 263 * usb_control_request_set(). 210 * @return Other value inherited from function usb_control_request_set(). 264 211 */ 265 212 int usbhid_req_get_report(usb_pipe_t *ctrl_pipe, int iface_no, … … 283 230 */ 284 231 285 int rc, sess_rc; 286 287 sess_rc = usb_pipe_start_session(ctrl_pipe); 288 if (sess_rc != EOK) { 289 usb_log_warning("Failed to start a session: %s.\n", 290 str_error(sess_rc)); 291 return sess_rc; 292 } 232 int rc; 293 233 294 234 uint16_t value = 0; … … 302 242 actual_size); 303 243 304 sess_rc = usb_pipe_end_session(ctrl_pipe); 305 306 if (rc != EOK) { 307 usb_log_warning("Error sending output report to the keyboard: " 308 "%s.\n", str_error(rc)); 309 return rc; 310 } 311 312 if (sess_rc != EOK) { 313 usb_log_warning("Error closing session: %s.\n", 314 str_error(sess_rc)); 315 return sess_rc; 244 if (rc != EOK) { 245 usb_log_warning("Error sending output report to the keyboard: " 246 "%s.\n", str_error(rc)); 247 return rc; 316 248 } 317 249 … … 328 260 * @retval EOK if successful. 329 261 * @retval EINVAL if no HID device is given. 330 * @return Other value inherited from one of functions 331 * usb_pipe_start_session(), usb_pipe_end_session(), 332 * usb_control_request_set(). 262 * @return Other value inherited from function usb_control_request_set(). 333 263 */ 334 264 int usbhid_req_get_protocol(usb_pipe_t *ctrl_pipe, int iface_no, … … 351 281 */ 352 282 353 int rc, sess_rc; 354 355 sess_rc = usb_pipe_start_session(ctrl_pipe); 356 if (sess_rc != EOK) { 357 usb_log_warning("Failed to start a session: %s.\n", 358 str_error(sess_rc)); 359 return sess_rc; 360 } 283 int rc; 361 284 362 285 usb_log_debug("Sending Get_Protocol request to the device (" … … 370 293 USB_HIDREQ_GET_PROTOCOL, 0, iface_no, buffer, 1, &actual_size); 371 294 372 sess_rc = usb_pipe_end_session(ctrl_pipe); 373 374 if (rc != EOK) { 375 usb_log_warning("Error sending output report to the keyboard: " 376 "%s.\n", str_error(rc)); 377 return rc; 378 } 379 380 if (sess_rc != EOK) { 381 usb_log_warning("Error closing session: %s.\n", 382 str_error(sess_rc)); 383 return sess_rc; 295 if (rc != EOK) { 296 usb_log_warning("Error sending output report to the keyboard: " 297 "%s.\n", str_error(rc)); 298 return rc; 384 299 } 385 300 … … 427 342 */ 428 343 429 int rc, sess_rc; 430 431 sess_rc = usb_pipe_start_session(ctrl_pipe); 432 if (sess_rc != EOK) { 433 usb_log_warning("Failed to start a session: %s.\n", 434 str_error(sess_rc)); 435 return sess_rc; 436 } 344 int rc; 437 345 438 346 usb_log_debug("Sending Get_Idle request to the device (" … … 448 356 &actual_size); 449 357 450 sess_rc = usb_pipe_end_session(ctrl_pipe); 451 452 if (rc != EOK) { 453 usb_log_warning("Error sending output report to the keyboard: " 454 "%s.\n", str_error(rc)); 455 return rc; 456 } 457 458 if (sess_rc != EOK) { 459 usb_log_warning("Error closing session: %s.\n", 460 str_error(sess_rc)); 461 return sess_rc; 358 if (rc != EOK) { 359 usb_log_warning("Error sending output report to the keyboard: " 360 "%s.\n", str_error(rc)); 361 return rc; 462 362 } 463 363
Note:
See TracChangeset
for help on using the changeset viewer.