Changes in / [dcaf819:6bf9bc4] in mainline
- Location:
- uspace
- Files:
-
- 2 added
- 7 deleted
- 17 edited
-
drv/ohci/batch.c (modified) (1 diff)
-
drv/ohci/hc.c (modified) (1 diff)
-
drv/ohci/hc.h (modified) (2 diffs)
-
drv/ohci/hw_struct/endpoint_descriptor.h (deleted)
-
drv/ohci/hw_struct/iso_transfer_descriptor.h (deleted)
-
drv/ohci/hw_struct/transfer_descriptor.h (deleted)
-
drv/ohci/iface.c (modified) (2 diffs)
-
drv/uhci-hcd/batch.c (modified) (8 diffs)
-
drv/uhci-hcd/batch.h (modified) (2 diffs)
-
drv/uhci-hcd/hc.c (modified) (7 diffs)
-
drv/uhci-hcd/hc.h (modified) (2 diffs)
-
drv/uhci-hcd/hw_struct/queue_head.h (modified) (1 diff)
-
drv/uhci-hcd/iface.c (modified) (12 diffs)
-
drv/uhci-hcd/transfer_list.h (modified) (1 diff)
-
drv/uhci-hcd/utils/malloc32.h (modified) (1 diff)
-
lib/usb/Makefile (modified) (1 diff)
-
lib/usb/include/usb/host/bandwidth.h (added)
-
lib/usb/include/usb/host/batch.h (modified) (3 diffs)
-
lib/usb/include/usb/host/device_keeper.h (modified) (3 diffs)
-
lib/usb/include/usb/host/endpoint.h (deleted)
-
lib/usb/include/usb/host/usb_endpoint_manager.h (deleted)
-
lib/usb/src/host/bandwidth.c (added)
-
lib/usb/src/host/batch.c (modified) (2 diffs)
-
lib/usb/src/host/device_keeper.c (modified) (12 diffs)
-
lib/usb/src/host/endpoint.c (deleted)
-
lib/usb/src/host/usb_endpoint_manager.c (deleted)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
rdcaf819 r6bf9bc4 73 73 CHECK_NULL_DISPOSE_RETURN(instance, 74 74 "Failed to allocate batch instance.\n"); 75 usb_transfer_batch_init(instance, target, transfer_type, speed, 76 max_packet_size, buffer, NULL, buffer_size, NULL, setup_size,77 func_ in, func_out, arg, fun, NULL, NULL);75 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 76 buffer, NULL, buffer_size, NULL, setup_size, func_in, 77 func_out, arg, fun, NULL); 78 78 79 79 if (buffer_size > 0) { -
uspace/drv/ohci/hc.c
rdcaf819 r6bf9bc4 92 92 instance->ddf_instance = fun; 93 93 usb_device_keeper_init(&instance->manager); 94 ret = usb_endpoint_manager_init(&instance->ep_manager,95 BANDWIDTH_AVAILABLE_USB11);96 CHECK_RET_RETURN(ret, "Failed to initialize endpoint manager: %s.\n",94 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11, 95 bandwidth_count_usb11); 96 CHECK_RET_RETURN(ret, "Failed to initialize bandwidth allocator: %s.\n", 97 97 ret, str_error(ret)); 98 98 -
uspace/drv/ohci/hc.h
rdcaf819 r6bf9bc4 42 42 #include <usb/usb.h> 43 43 #include <usb/host/device_keeper.h> 44 #include <usb/host/ usb_endpoint_manager.h>44 #include <usb/host/bandwidth.h> 45 45 #include <usbhc_iface.h> 46 46 … … 55 55 ddf_fun_t *ddf_instance; 56 56 usb_device_keeper_t manager; 57 usb_endpoint_manager_t ep_manager;57 bandwidth_t bandwidth; 58 58 fid_t interrupt_emulator; 59 59 } hc_t; -
uspace/drv/ohci/iface.c
rdcaf819 r6bf9bc4 162 162 address, endpoint, usb_str_transfer_type(transfer_type), 163 163 usb_str_speed(speed), direction, size, max_packet_size, interval); 164 // TODO use real endpoint here! 165 return usb_endpoint_manager_register_ep(&hc->ep_manager, 166 address, endpoint, direction, NULL, 0); 164 return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction, 165 speed, transfer_type, max_packet_size, size, interval); 167 166 } 168 167 /*----------------------------------------------------------------------------*/ … … 184 183 usb_log_debug("Unregister endpoint %d:%d %d.\n", 185 184 address, endpoint, direction); 186 return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address, 187 endpoint, direction); 185 return bandwidth_release(&hc->bandwidth, address, endpoint, direction); 186 187 return ENOTSUP; 188 188 } 189 189 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/batch.c
rdcaf819 r6bf9bc4 49 49 td_t *tds; 50 50 size_t transfers; 51 usb_device_keeper_t *manager; 51 52 } uhci_batch_t; 52 53 … … 72 73 * @param[in] func_out function to call on outbound transaction completion 73 74 * @param[in] arg additional parameter to func_in or func_out 74 * @param[in] ep Pointer to endpointtoggle management structure.75 * @param[in] manager Pointer to toggle management structure. 75 76 * @return Valid pointer if all substructures were successfully created, 76 77 * NULL otherwise. … … 85 86 char* setup_buffer, size_t setup_size, 86 87 usbhc_iface_transfer_in_callback_t func_in, 87 usbhc_iface_transfer_out_callback_t func_out, void *arg, endpoint_t *ep 88 usbhc_iface_transfer_out_callback_t func_out, void *arg, 89 usb_device_keeper_t *manager 88 90 ) 89 91 { … … 103 105 CHECK_NULL_DISPOSE_RETURN(instance, 104 106 "Failed to allocate batch instance.\n"); 105 usb_transfer_batch_init(instance, target, 106 transfer_type, speed, max_packet_size, 107 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 107 108 buffer, NULL, buffer_size, NULL, setup_size, func_in, 108 func_out, arg, fun, ep,NULL);109 func_out, arg, fun, NULL); 109 110 110 111 … … 113 114 "Failed to allocate batch instance.\n"); 114 115 bzero(data, sizeof(uhci_batch_t)); 116 data->manager = manager; 115 117 instance->private_data = data; 116 118 … … 178 180 instance, i, data->tds[i].status); 179 181 td_print_status(&data->tds[i]); 180 if (instance->ep != NULL) 181 endpoint_toggle_set(instance->ep, 182 td_toggle(&data->tds[i])); 182 183 usb_device_keeper_set_toggle(data->manager, 184 instance->target, instance->direction, 185 td_toggle(&data->tds[i])); 183 186 if (i > 0) 184 187 goto substract_ret; … … 307 310 308 311 const bool low_speed = instance->speed == USB_SPEED_LOW; 309 int toggle = endpoint_toggle_get(instance->ep); 312 int toggle = usb_device_keeper_get_toggle( 313 data->manager, instance->target, instance->direction); 310 314 assert(toggle == 0 || toggle == 1); 311 315 … … 338 342 } 339 343 td_set_ioc(&data->tds[transfer - 1]); 340 endpoint_toggle_set(instance->ep, toggle); 344 usb_device_keeper_set_toggle(data->manager, instance->target, 345 instance->direction, toggle); 341 346 } 342 347 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/batch.h
rdcaf819 r6bf9bc4 35 35 #define DRV_UHCI_BATCH_H 36 36 37 #include <adt/list.h> 38 37 39 #include <usbhc_iface.h> 38 40 #include <usb/usb.h> 39 41 #include <usb/host/device_keeper.h> 40 #include <usb/host/endpoint.h>41 42 #include <usb/host/batch.h> 42 43 … … 56 57 usbhc_iface_transfer_out_callback_t func_out, 57 58 void *arg, 58 endpoint_t *ep59 usb_device_keeper_t *manager 59 60 ); 60 61 -
uspace/drv/uhci-hcd/hc.c
rdcaf819 r6bf9bc4 66 66 static int hc_interrupt_emulator(void *arg); 67 67 static int hc_debug_checker(void *arg); 68 #if 0 68 69 69 static bool usb_is_allowed( 70 70 bool low_speed, usb_transfer_type_t transfer, size_t size); 71 #endif72 71 /*----------------------------------------------------------------------------*/ 73 72 /** Initialize UHCI hcd driver structure … … 240 239 usb_log_debug("Initialized device manager.\n"); 241 240 242 ret = 243 usb_endpoint_manager_init(&instance->ep_manager, 244 BANDWIDTH_AVAILABLE_USB11); 241 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11, 242 bandwidth_count_usb11); 245 243 assert(ret == EOK); 246 244 … … 328 326 assert(instance); 329 327 assert(batch); 328 const int low_speed = (batch->speed == USB_SPEED_LOW); 329 if (!usb_is_allowed( 330 low_speed, batch->transfer_type, batch->max_packet_size)) { 331 usb_log_error("Invalid USB transfer specified %s %d %zu.\n", 332 usb_str_speed(batch->speed), batch->transfer_type, 333 batch->max_packet_size); 334 return ENOTSUP; 335 } 336 /* Check available bandwidth */ 337 if (batch->transfer_type == USB_TRANSFER_INTERRUPT || 338 batch->transfer_type == USB_TRANSFER_ISOCHRONOUS) { 339 size_t bw = bandwidth_count_usb11(batch->speed, 340 batch->transfer_type, batch->buffer_size, 341 batch->max_packet_size); 342 int ret = 343 bandwidth_use(&instance->bandwidth, batch->target.address, 344 batch->target.endpoint, batch->direction, bw); 345 if (ret != EOK) { 346 usb_log_error("Failed(%d) to use reserved bw: %s.\n", 347 ret, str_error(ret)); 348 return ret; 349 } 350 } 330 351 331 352 transfer_list_t *list = … … 381 402 case USB_TRANSFER_INTERRUPT: 382 403 case USB_TRANSFER_ISOCHRONOUS: { 383 /*384 404 int ret = bandwidth_free(&instance->bandwidth, 385 405 batch->target.address, … … 390 410 "reserved bw: %s.\n", ret, 391 411 str_error(ret)); 392 */393 412 } 394 413 default: … … 514 533 * @return True if transaction is allowed by USB specs, false otherwise 515 534 */ 516 #if 0517 535 bool usb_is_allowed( 518 536 bool low_speed, usb_transfer_type_t transfer, size_t size) … … 532 550 return false; 533 551 } 534 #endif535 552 /** 536 553 * @} -
uspace/drv/uhci-hcd/hc.h
rdcaf819 r6bf9bc4 43 43 #include <usbhc_iface.h> 44 44 #include <usb/host/device_keeper.h> 45 #include <usb/host/ usb_endpoint_manager.h>45 #include <usb/host/bandwidth.h> 46 46 47 47 #include "batch.h" … … 85 85 typedef struct hc { 86 86 usb_device_keeper_t manager; 87 usb_endpoint_manager_t ep_manager;87 bandwidth_t bandwidth; 88 88 89 89 regs_t *registers; -
uspace/drv/uhci-hcd/hw_struct/queue_head.h
rdcaf819 r6bf9bc4 39 39 40 40 #include "link_pointer.h" 41 #include "utils/malloc32.h" 41 42 42 43 typedef struct queue_head { -
uspace/drv/uhci-hcd/iface.c
rdcaf819 r6bf9bc4 36 36 37 37 #include <usb/debug.h> 38 #include <usb/host/endpoint.h>39 38 40 39 #include "iface.h" … … 55 54 usb_device_keeper_reserve_default_address(&hc->manager, speed); 56 55 return EOK; 57 #if 058 endpoint_t *ep = malloc(sizeof(endpoint_t));59 if (ep == NULL)60 return ENOMEM;61 const size_t max_packet_size = speed == USB_SPEED_LOW ? 8 : 64;62 endpoint_init(ep, USB_TRANSFER_CONTROL, speed, max_packet_size);63 int ret;64 try_retgister:65 ret = usb_endpoint_manager_register_ep(&hc->ep_manager,66 USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH, ep, endpoint_destroy, 0);67 if (ret == EEXISTS) {68 async_usleep(1000);69 goto try_retgister;70 }71 if (ret != EOK) {72 endpoint_destroy(ep);73 }74 return ret;75 #endif76 56 } 77 57 /*----------------------------------------------------------------------------*/ … … 87 67 assert(hc); 88 68 usb_log_debug("Default address release.\n"); 89 // return usb_endpoint_manager_unregister_ep(&hc->ep_manager,90 // USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH);91 69 usb_device_keeper_release_default_address(&hc->manager); 92 70 return EOK; … … 159 137 const usb_speed_t speed = 160 138 usb_device_keeper_get_speed(&hc->manager, address); 161 const size_t size = 162 (transfer_type == USB_TRANSFER_INTERRUPT 163 || transfer_type == USB_TRANSFER_ISOCHRONOUS) ? 164 max_packet_size : 0; 165 int ret; 166 167 endpoint_t *ep = malloc(sizeof(endpoint_t)); 168 if (ep == NULL) 169 return ENOMEM; 170 ret = endpoint_init(ep, transfer_type, speed, max_packet_size); 171 if (ret != EOK) { 172 free(ep); 173 return ret; 174 } 139 size_t size = max_packet_size; 175 140 176 141 usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n", 177 142 address, endpoint, usb_str_transfer_type(transfer_type), 178 143 usb_str_speed(speed), direction, size, max_packet_size, interval); 179 180 ret = usb_endpoint_manager_register_ep(&hc->ep_manager, 181 address, endpoint, direction, ep, size); 182 if (ret != EOK) { 183 endpoint_destroy(ep); 184 } else { 185 usb_device_keeper_add_ep(&hc->manager, address, ep); 186 } 187 return ret; 144 return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction, 145 speed, transfer_type, max_packet_size, size, interval); 188 146 } 189 147 /*----------------------------------------------------------------------------*/ … … 196 154 usb_log_debug("Unregister endpoint %d:%d %d.\n", 197 155 address, endpoint, direction); 198 return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address, 199 endpoint, direction); 156 return bandwidth_release(&hc->bandwidth, address, endpoint, direction); 200 157 } 201 158 /*----------------------------------------------------------------------------*/ … … 218 175 hc_t *hc = fun_to_hc(fun); 219 176 assert(hc); 177 usb_speed_t speed = 178 usb_device_keeper_get_speed(&hc->manager, target.address); 220 179 221 180 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 222 181 target.address, target.endpoint, size, max_packet_size); 223 182 224 size_t res_bw; 225 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 226 target.address, target.endpoint, USB_DIRECTION_OUT, &res_bw); 227 if (ep == NULL) { 228 usb_log_error("Endpoint(%d:%d) not registered for INT OUT.\n", 229 target.address, target.endpoint); 230 return ENOENT; 231 } 232 const size_t bw = bandwidth_count_usb11(ep->speed, ep->transfer_type, 233 size, ep->max_packet_size); 234 if (res_bw < bw) 235 { 236 usb_log_error("Endpoint(%d:%d) INT IN needs %zu bw " 237 "but only %zu is reserved.\n", 238 target.address, target.endpoint, bw, res_bw); 239 return ENOENT; 240 } 241 assert(ep->speed == 242 usb_device_keeper_get_speed(&hc->manager, target.address)); 243 assert(ep->max_packet_size == max_packet_size); 244 assert(ep->transfer_type == USB_TRANSFER_INTERRUPT); 245 246 usb_transfer_batch_t *batch = 247 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 248 ep->speed, data, size, NULL, 0, NULL, callback, arg, ep); 183 usb_transfer_batch_t *batch = 184 batch_get(fun, target, USB_TRANSFER_INTERRUPT, max_packet_size, 185 speed, data, size, NULL, 0, NULL, callback, arg, &hc->manager); 249 186 if (!batch) 250 187 return ENOMEM; … … 275 212 hc_t *hc = fun_to_hc(fun); 276 213 assert(hc); 277 214 usb_speed_t speed = 215 usb_device_keeper_get_speed(&hc->manager, target.address); 278 216 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 279 217 target.address, target.endpoint, size, max_packet_size); 280 218 281 size_t res_bw; 282 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 283 target.address, target.endpoint, USB_DIRECTION_IN, &res_bw); 284 if (ep == NULL) { 285 usb_log_error("Endpoint(%d:%d) not registered for INT IN.\n", 286 target.address, target.endpoint); 287 return ENOENT; 288 } 289 const size_t bw = bandwidth_count_usb11(ep->speed, ep->transfer_type, 290 size, ep->max_packet_size); 291 if (res_bw < bw) 292 { 293 usb_log_error("Endpoint(%d:%d) INT IN needs %zu bw " 294 "but only %zu bw is reserved.\n", 295 target.address, target.endpoint, bw, res_bw); 296 return ENOENT; 297 } 298 299 assert(ep->speed == 300 usb_device_keeper_get_speed(&hc->manager, target.address)); 301 assert(ep->max_packet_size == max_packet_size); 302 assert(ep->transfer_type == USB_TRANSFER_INTERRUPT); 303 304 usb_transfer_batch_t *batch = 305 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 306 ep->speed, data, size, NULL, 0, callback, NULL, arg, ep); 219 usb_transfer_batch_t *batch = 220 batch_get(fun, target, USB_TRANSFER_INTERRUPT, max_packet_size, 221 speed, data, size, NULL, 0, callback, NULL, arg, &hc->manager); 307 222 if (!batch) 308 223 return ENOMEM; … … 333 248 hc_t *hc = fun_to_hc(fun); 334 249 assert(hc); 250 usb_speed_t speed = 251 usb_device_keeper_get_speed(&hc->manager, target.address); 335 252 336 253 usb_log_debug("Bulk OUT %d:%d %zu(%zu).\n", 337 254 target.address, target.endpoint, size, max_packet_size); 338 255 339 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 340 target.address, target.endpoint, USB_DIRECTION_OUT, NULL); 341 if (ep == NULL) { 342 usb_log_error("Endpoint(%d:%d) not registered for BULK OUT.\n", 343 target.address, target.endpoint); 344 return ENOENT; 345 } 346 assert(ep->speed == 347 usb_device_keeper_get_speed(&hc->manager, target.address)); 348 assert(ep->max_packet_size == max_packet_size); 349 assert(ep->transfer_type == USB_TRANSFER_BULK); 350 351 usb_transfer_batch_t *batch = 352 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 353 ep->speed, data, size, NULL, 0, NULL, callback, arg, ep); 256 usb_transfer_batch_t *batch = 257 batch_get(fun, target, USB_TRANSFER_BULK, max_packet_size, speed, 258 data, size, NULL, 0, NULL, callback, arg, &hc->manager); 354 259 if (!batch) 355 260 return ENOMEM; … … 380 285 hc_t *hc = fun_to_hc(fun); 381 286 assert(hc); 287 usb_speed_t speed = 288 usb_device_keeper_get_speed(&hc->manager, target.address); 382 289 usb_log_debug("Bulk IN %d:%d %zu(%zu).\n", 383 290 target.address, target.endpoint, size, max_packet_size); 384 291 385 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 386 target.address, target.endpoint, USB_DIRECTION_IN, NULL); 387 if (ep == NULL) { 388 usb_log_error("Endpoint(%d:%d) not registered for BULK IN.\n", 389 target.address, target.endpoint); 390 return ENOENT; 391 } 392 assert(ep->speed == 393 usb_device_keeper_get_speed(&hc->manager, target.address)); 394 assert(ep->max_packet_size == max_packet_size); 395 assert(ep->transfer_type == USB_TRANSFER_BULK); 396 397 usb_transfer_batch_t *batch = 398 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 399 ep->speed, data, size, NULL, 0, callback, NULL, arg, ep); 292 usb_transfer_batch_t *batch = 293 batch_get(fun, target, USB_TRANSFER_BULK, max_packet_size, speed, 294 data, size, NULL, 0, callback, NULL, arg, &hc->manager); 400 295 if (!batch) 401 296 return ENOMEM; … … 433 328 usb_log_debug("Control WRITE (%d) %d:%d %zu(%zu).\n", 434 329 speed, target.address, target.endpoint, size, max_packet_size); 435 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager,436 target.address, target.endpoint, USB_DIRECTION_BOTH, NULL);437 if (ep == NULL) {438 usb_log_warning("Endpoint(%d:%d) not registered for CONTROL.\n",439 target.address, target.endpoint);440 }441 330 442 331 if (setup_size != 8) … … 445 334 usb_transfer_batch_t *batch = 446 335 batch_get(fun, target, USB_TRANSFER_CONTROL, max_packet_size, speed, 447 data, size, setup_data, setup_size, NULL, callback, arg, ep); 336 data, size, setup_data, setup_size, NULL, callback, arg, 337 &hc->manager); 448 338 if (!batch) 449 339 return ENOMEM; … … 483 373 usb_log_debug("Control READ(%d) %d:%d %zu(%zu).\n", 484 374 speed, target.address, target.endpoint, size, max_packet_size); 485 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager,486 target.address, target.endpoint, USB_DIRECTION_BOTH, NULL);487 if (ep == NULL) {488 usb_log_warning("Endpoint(%d:%d) not registered for CONTROL.\n",489 target.address, target.endpoint);490 }491 375 usb_transfer_batch_t *batch = 492 376 batch_get(fun, target, USB_TRANSFER_CONTROL, max_packet_size, speed, 493 data, size, setup_data, setup_size, callback, NULL, arg, ep); 377 data, size, setup_data, setup_size, callback, NULL, arg, 378 &hc->manager); 494 379 if (!batch) 495 380 return ENOMEM; -
uspace/drv/uhci-hcd/transfer_list.h
rdcaf819 r6bf9bc4 39 39 #include "batch.h" 40 40 #include "hw_struct/queue_head.h" 41 #include "utils/malloc32.h"42 41 43 42 typedef struct transfer_list -
uspace/drv/uhci-hcd/utils/malloc32.h
rdcaf819 r6bf9bc4 36 36 37 37 #include <assert.h> 38 #include <errno.h>39 38 #include <malloc.h> 40 39 #include <mem.h> -
uspace/lib/usb/Makefile
rdcaf819 r6bf9bc4 54 54 src/host/device_keeper.c \ 55 55 src/host/batch.c \ 56 src/host/endpoint.c \ 57 src/host/usb_endpoint_manager.c 56 src/host/bandwidth.c 58 57 59 58 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usb/include/usb/host/batch.h
rdcaf819 r6bf9bc4 39 39 #include <usbhc_iface.h> 40 40 #include <usb/usb.h> 41 #include <usb/host/endpoint.h>42 41 43 42 typedef struct usb_transfer_batch usb_transfer_batch_t; … … 61 60 ddf_fun_t *fun; 62 61 void *arg; 63 endpoint_t *ep;64 62 void *private_data; 65 63 }; … … 80 78 void *arg, 81 79 ddf_fun_t *fun, 82 endpoint_t *ep,83 80 void *private_data 84 81 ); -
uspace/lib/usb/include/usb/host/device_keeper.h
rdcaf819 r6bf9bc4 40 40 #ifndef LIBUSB_HOST_DEVICE_KEEPER_H 41 41 #define LIBUSB_HOST_DEVICE_KEEPER_H 42 43 #include <adt/list.h>44 42 #include <devman.h> 45 43 #include <fibril_synch.h> 46 44 #include <usb/usb.h> 47 #include <usb/host/endpoint.h>48 45 49 46 /** Number of USB address for array dimensions. */ … … 54 51 usb_speed_t speed; 55 52 bool occupied; 56 link_t endpoints;57 53 uint16_t control_used; 54 uint16_t toggle_status[2]; 58 55 devman_handle_t handle; 59 56 }; … … 71 68 void usb_device_keeper_init(usb_device_keeper_t *instance); 72 69 73 void usb_device_keeper_add_ep( 74 usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep); 75 76 void usb_device_keeper_reserve_default_address( 77 usb_device_keeper_t *instance, usb_speed_t speed); 70 void usb_device_keeper_reserve_default_address(usb_device_keeper_t *instance, 71 usb_speed_t speed); 78 72 79 73 void usb_device_keeper_release_default_address(usb_device_keeper_t *instance); 80 74 81 75 void usb_device_keeper_reset_if_need(usb_device_keeper_t *instance, 82 usb_target_t target, const uint8_t *setup_data); 76 usb_target_t target, 77 const uint8_t *setup_data); 78 79 int usb_device_keeper_get_toggle(usb_device_keeper_t *instance, 80 usb_target_t target, usb_direction_t direction); 81 82 int usb_device_keeper_set_toggle(usb_device_keeper_t *instance, 83 usb_target_t target, usb_direction_t direction, bool toggle); 83 84 84 85 usb_address_t device_keeper_get_free_address(usb_device_keeper_t *instance, -
uspace/lib/usb/src/host/batch.c
rdcaf819 r6bf9bc4 54 54 void *arg, 55 55 ddf_fun_t *fun, 56 endpoint_t *ep,57 56 void *private_data 58 57 ) … … 78 77 instance->next_step = NULL; 79 78 instance->error = EOK; 80 instance->ep = ep; 79 81 80 } 82 81 /*----------------------------------------------------------------------------*/ -
uspace/lib/usb/src/host/device_keeper.c
rdcaf819 r6bf9bc4 56 56 instance->devices[i].control_used = 0; 57 57 instance->devices[i].handle = 0; 58 list_initialize(&instance->devices[i].endpoints); 59 } 60 } 61 /*----------------------------------------------------------------------------*/ 62 void usb_device_keeper_add_ep( 63 usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep) 64 { 65 assert(instance); 66 fibril_mutex_lock(&instance->guard); 67 assert(instance->devices[address].occupied); 68 list_append(&ep->same_device_eps, &instance->devices[address].endpoints); 69 fibril_mutex_unlock(&instance->guard); 58 instance->devices[i].toggle_status[0] = 0; 59 instance->devices[i].toggle_status[1] = 0; 60 } 70 61 } 71 62 /*----------------------------------------------------------------------------*/ … … 75 66 * @param[in] speed Speed of the device requesting default address. 76 67 */ 77 void usb_device_keeper_reserve_default_address( 78 usb_ device_keeper_t *instance, usb_speed_t speed)68 void usb_device_keeper_reserve_default_address(usb_device_keeper_t *instance, 69 usb_speed_t speed) 79 70 { 80 71 assert(instance); … … 110 101 * Really ugly one. 111 102 */ 112 void usb_device_keeper_reset_if_need( 113 usb_ device_keeper_t *instance, usb_target_t target, const uint8_t *data)103 void usb_device_keeper_reset_if_need(usb_device_keeper_t *instance, 104 usb_target_t target, const uint8_t *data) 114 105 { 115 106 assert(instance); … … 129 120 if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) { 130 121 /* endpoint number is < 16, thus first byte is enough */ 131 assert(!"NOT IMPLEMENTED!"); 122 instance->devices[target.address].toggle_status[0] &= 123 ~(1 << data[4]); 124 instance->devices[target.address].toggle_status[1] &= 125 ~(1 << data[4]); 132 126 } 133 127 break; … … 137 131 /* target must be device */ 138 132 if ((data[0] & 0xf) == 0) { 139 link_t *current = 140 instance->devices[target.address].endpoints.next; 141 while (current != 142 &instance->devices[target.address].endpoints) 143 { 144 endpoint_toggle_reset(current); 145 current = current->next; 146 } 133 instance->devices[target.address].toggle_status[0] = 0; 134 instance->devices[target.address].toggle_status[1] = 0; 147 135 } 148 136 break; 149 137 } 150 138 fibril_mutex_unlock(&instance->guard); 139 } 140 /*----------------------------------------------------------------------------*/ 141 /** Get current value of endpoint toggle. 142 * 143 * @param[in] instance Device keeper structure to use. 144 * @param[in] target Device and endpoint used. 145 * @return Error code 146 */ 147 int usb_device_keeper_get_toggle(usb_device_keeper_t *instance, 148 usb_target_t target, usb_direction_t direction) 149 { 150 assert(instance); 151 /* only control pipes are bi-directional and those do not need toggle */ 152 if (direction == USB_DIRECTION_BOTH) 153 return ENOENT; 154 int ret; 155 fibril_mutex_lock(&instance->guard); 156 if (target.endpoint > 15 || target.endpoint < 0 157 || target.address >= USB_ADDRESS_COUNT || target.address < 0 158 || !instance->devices[target.address].occupied) { 159 usb_log_error("Invalid data when asking for toggle value.\n"); 160 ret = EINVAL; 161 } else { 162 ret = (instance->devices[target.address].toggle_status[direction] 163 >> target.endpoint) & 1; 164 } 165 fibril_mutex_unlock(&instance->guard); 166 return ret; 167 } 168 /*----------------------------------------------------------------------------*/ 169 /** Set current value of endpoint toggle. 170 * 171 * @param[in] instance Device keeper structure to use. 172 * @param[in] target Device and endpoint used. 173 * @param[in] toggle Toggle value. 174 * @return Error code. 175 */ 176 int usb_device_keeper_set_toggle(usb_device_keeper_t *instance, 177 usb_target_t target, usb_direction_t direction, bool toggle) 178 { 179 assert(instance); 180 /* only control pipes are bi-directional and those do not need toggle */ 181 if (direction == USB_DIRECTION_BOTH) 182 return ENOENT; 183 int ret; 184 fibril_mutex_lock(&instance->guard); 185 if (target.endpoint > 15 || target.endpoint < 0 186 || target.address >= USB_ADDRESS_COUNT || target.address < 0 187 || !instance->devices[target.address].occupied) { 188 usb_log_error("Invalid data when setting toggle value.\n"); 189 ret = EINVAL; 190 } else { 191 if (toggle) { 192 instance->devices[target.address].toggle_status[direction] 193 |= (1 << target.endpoint); 194 } else { 195 instance->devices[target.address].toggle_status[direction] 196 &= ~(1 << target.endpoint); 197 } 198 ret = EOK; 199 } 200 fibril_mutex_unlock(&instance->guard); 201 return ret; 151 202 } 152 203 /*----------------------------------------------------------------------------*/ … … 157 208 * @return Free address, or error code. 158 209 */ 159 usb_address_t device_keeper_get_free_address( 160 usb_ device_keeper_t *instance, usb_speed_t speed)210 usb_address_t device_keeper_get_free_address(usb_device_keeper_t *instance, 211 usb_speed_t speed) 161 212 { 162 213 assert(instance); … … 178 229 instance->devices[new_address].occupied = true; 179 230 instance->devices[new_address].speed = speed; 231 instance->devices[new_address].toggle_status[0] = 0; 232 instance->devices[new_address].toggle_status[1] = 0; 180 233 instance->last_address = new_address; 181 234 fibril_mutex_unlock(&instance->guard); … … 206 259 * @param[in] address Device address 207 260 */ 208 void usb_device_keeper_release( 209 usb_ device_keeper_t *instance, usb_address_t address)261 void usb_device_keeper_release(usb_device_keeper_t *instance, 262 usb_address_t address) 210 263 { 211 264 assert(instance); … … 225 278 * @return USB Address, or error code. 226 279 */ 227 usb_address_t usb_device_keeper_find( 228 usb_device_keeper_t *instance,devman_handle_t handle)280 usb_address_t usb_device_keeper_find(usb_device_keeper_t *instance, 281 devman_handle_t handle) 229 282 { 230 283 assert(instance); … … 248 301 * @return USB speed. 249 302 */ 250 usb_speed_t usb_device_keeper_get_speed( 251 usb_ device_keeper_t *instance, usb_address_t address)303 usb_speed_t usb_device_keeper_get_speed(usb_device_keeper_t *instance, 304 usb_address_t address) 252 305 { 253 306 assert(instance); … … 257 310 } 258 311 /*----------------------------------------------------------------------------*/ 259 void usb_device_keeper_use_control( 260 usb_ device_keeper_t *instance, usb_target_t target)312 void usb_device_keeper_use_control(usb_device_keeper_t *instance, 313 usb_target_t target) 261 314 { 262 315 assert(instance); … … 270 323 } 271 324 /*----------------------------------------------------------------------------*/ 272 void usb_device_keeper_release_control( 273 usb_ device_keeper_t *instance, usb_target_t target)325 void usb_device_keeper_release_control(usb_device_keeper_t *instance, 326 usb_target_t target) 274 327 { 275 328 assert(instance);
Note:
See TracChangeset
for help on using the changeset viewer.
