Changeset 0cd8089 in mainline for uspace/lib/usbhost/src/usb_device_manager.c
- Timestamp:
- 2011-10-31T14:59:04Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 67f55e7b
- Parents:
- 5e07cbc0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/usb_device_manager.c
r5e07cbc0 r0cd8089 38 38 #include <usb/host/usb_device_manager.h> 39 39 40 /** Get a free USB address 41 * 42 * @param[in] instance Device manager structure to use. 43 * @param[in] speed Speed of the device requiring address. 44 * @return Free address, or error code. 45 */ 46 static usb_address_t usb_device_manager_get_free_address( 47 usb_device_manager_t *instance) 48 { 49 50 usb_address_t new_address = instance->last_address; 51 do { 52 new_address = (new_address + 1) % USB_ADDRESS_COUNT; 53 if (new_address == USB_ADDRESS_DEFAULT) 54 new_address = 1; 55 if (new_address == instance->last_address) { 56 return ENOSPC; 57 } 58 } while (instance->devices[new_address].occupied); 59 60 assert(new_address != USB_ADDRESS_DEFAULT); 61 instance->last_address = new_address; 62 63 return new_address; 64 } 65 /*----------------------------------------------------------------------------*/ 40 66 /** Initialize device manager structure. 41 67 * … … 54 80 instance->devices[i].speed = USB_SPEED_MAX; 55 81 } 56 // TODO: is this hack enough?57 // (it is needed to allow smooth registration at default address)58 instance->devices[0].occupied = true;59 82 instance->last_address = 0; 60 83 instance->max_speed = max_speed; … … 62 85 } 63 86 /*----------------------------------------------------------------------------*/ 64 /** Get a free USB address 65 * 66 * @param[in] instance Device manager structure to use. 67 * @param[in] speed Speed of the device requiring address. 68 * @return Free address, or error code. 69 */ 70 usb_address_t usb_device_manager_get_free_address( 71 usb_device_manager_t *instance, usb_speed_t speed) 72 { 73 assert(instance); 87 /** Request USB address. 88 * @param instance usb_device_manager 89 * @param address Pointer to requested address value, place to store new address 90 * @parma strict Fail if the requested address is not available. 91 * @return Error code. 92 * @note Default address is only available in strict mode. 93 */ 94 int usb_device_manager_request_address(usb_device_manager_t *instance, 95 usb_address_t *address, bool strict, usb_speed_t speed) 96 { 97 assert(instance); 98 assert(address); 74 99 if (speed > instance->max_speed) 75 100 return ENOTSUP; 76 fibril_mutex_lock(&instance->guard); 77 78 usb_address_t new_address = instance->last_address; 79 do { 80 ++new_address; 81 if (new_address > USB11_ADDRESS_MAX) 82 new_address = 1; // NOTE it should be safe to put 0 here 83 // TODO Use mod 84 if (new_address == instance->last_address) { 101 102 if ((*address) < 0 || (*address) >= USB_ADDRESS_COUNT) 103 return EINVAL; 104 105 fibril_mutex_lock(&instance->guard); 106 /* Only grant default address to strict requests */ 107 if (( (*address) == USB_ADDRESS_DEFAULT) && !strict) { 108 *address = instance->last_address; 109 } 110 111 if (instance->devices[*address].occupied) { 112 if (strict) { 85 113 fibril_mutex_unlock(&instance->guard); 86 return ENO SPC;114 return ENOENT; 87 115 } 88 } while (instance->devices[new_address].occupied); 89 90 assert(new_address != USB_ADDRESS_DEFAULT); 91 assert(instance->devices[new_address].occupied == false); 92 assert(instance->devices[new_address].handle == 0); 93 94 instance->devices[new_address].occupied = true; 95 instance->devices[new_address].speed = speed; 96 instance->last_address = new_address; 97 98 fibril_mutex_unlock(&instance->guard); 99 return new_address; 116 *address = usb_device_manager_get_free_address(instance); 117 } 118 assert(instance->devices[*address].occupied == false); 119 assert(instance->devices[*address].handle == 0); 120 121 instance->devices[*address].occupied = true; 122 instance->devices[*address].speed = speed; 123 124 fibril_mutex_unlock(&instance->guard); 125 return EOK; 100 126 } 101 127 /*----------------------------------------------------------------------------*/ … … 107 133 * @return Error code. 108 134 */ 109 int usb_device_manager_bind (usb_device_manager_t *instance,135 int usb_device_manager_bind_address(usb_device_manager_t *instance, 110 136 usb_address_t address, devman_handle_t handle) 111 137 { … … 137 163 * @return Error code. 138 164 */ 139 int usb_device_manager_release (165 int usb_device_manager_release_address( 140 166 usb_device_manager_t *instance, usb_address_t address) 141 167 {
Note:
See TracChangeset
for help on using the changeset viewer.