Ignore:
Timestamp:
2011-10-31T14:59:04Z (14 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
67f55e7b
Parents:
5e07cbc0
Message:

libusbhost: Change usb_device_manager interface.

Use request_address instead of get_free_address.
Explicit USB address can be requested.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/usb_device_manager.c

    r5e07cbc0 r0cd8089  
    3838#include <usb/host/usb_device_manager.h>
    3939
     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 */
     46static 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/*----------------------------------------------------------------------------*/
    4066/** Initialize device manager structure.
    4167 *
     
    5480                instance->devices[i].speed = USB_SPEED_MAX;
    5581        }
    56         // TODO: is this hack enough?
    57         // (it is needed to allow smooth registration at default address)
    58         instance->devices[0].occupied = true;
    5982        instance->last_address = 0;
    6083        instance->max_speed = max_speed;
     
    6285}
    6386/*----------------------------------------------------------------------------*/
    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 */
     94int 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);
    7499        if (speed > instance->max_speed)
    75100                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) {
    85113                        fibril_mutex_unlock(&instance->guard);
    86                         return ENOSPC;
     114                        return ENOENT;
    87115                }
    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;
    100126}
    101127/*----------------------------------------------------------------------------*/
     
    107133 * @return Error code.
    108134 */
    109 int usb_device_manager_bind(usb_device_manager_t *instance,
     135int usb_device_manager_bind_address(usb_device_manager_t *instance,
    110136    usb_address_t address, devman_handle_t handle)
    111137{
     
    137163 * @return Error code.
    138164 */
    139 int usb_device_manager_release(
     165int usb_device_manager_release_address(
    140166    usb_device_manager_t *instance, usb_address_t address)
    141167{
Note: See TracChangeset for help on using the changeset viewer.