Changeset 2c5cefa in mainline for uspace/lib


Ignore:
Timestamp:
2010-12-09T14:25:39Z (15 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
99ea659c
Parents:
f5e39475
Message:

Add retrieval of configuration descriptor

The `usbinfo' app displays configuration descriptor as well.

Location:
uspace/lib/usb
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/include/usb/devreq.h

    rf5e39475 r2c5cefa  
    3838#include <ipc/ipc.h>
    3939#include <async.h>
     40#include <usb/usb.h>
     41#include <usb/descriptor.h>
    4042
    4143/** Standard device request. */
     
    8385} __attribute__ ((packed)) usb_device_request_setup_packet_t;
    8486
     87int usb_drv_req_set_address(int, usb_address_t, usb_address_t);
     88int usb_drv_req_get_device_descriptor(int, usb_address_t,
     89    usb_standard_device_descriptor_t *);
     90int usb_drv_req_get_bare_configuration_descriptor(int, usb_address_t, int,
     91    usb_standard_configuration_descriptor_t *);
     92int usb_drv_req_get_full_configuration_descriptor(int, usb_address_t, int,
     93    void *, size_t, size_t *);
     94
     95
    8596#endif
    8697/**
  • uspace/lib/usb/include/usb/usbdrv.h

    rf5e39475 r2c5cefa  
    9595
    9696
    97 int usb_drv_req_set_address(int, usb_address_t, usb_address_t);
    98 int usb_drv_req_get_device_descriptor(int, usb_address_t,
    99     usb_standard_device_descriptor_t *);
    100 
    10197#endif
    10298/**
  • uspace/lib/usb/src/usbdrvreq.c

    rf5e39475 r2c5cefa  
    130130
    131131
     132/** Retrieve configuration descriptor of connected USB device.
     133 *
     134 * The function does not retrieve additional data binded with configuration
     135 * descriptor (such as its interface and endpoint descriptors) - use
     136 * usb_drv_req_get_full_configuration_descriptor() instead.
     137 *
     138 * @param[in] phone Open phone to HC driver.
     139 * @param[in] address Device USB address.
     140 * @param[in] index Configuration descriptor index.
     141 * @param[out] descriptor Storage for the configuration descriptor.
     142 * @return Error code.
     143 * @retval EBADMEM @p descriptor is NULL.
     144 */
     145int usb_drv_req_get_bare_configuration_descriptor(int phone,
     146    usb_address_t address, int index,
     147    usb_standard_configuration_descriptor_t *descriptor)
     148{
     149        if (descriptor == NULL) {
     150                return EBADMEM;
     151        }
     152
     153        /* Prepare the target. */
     154        usb_target_t target = {
     155                .address = address,
     156                .endpoint = 0
     157        };
     158
     159        /* Prepare the setup packet. */
     160        usb_device_request_setup_packet_t setup_packet = {
     161                .request_type = 128,
     162                .request = USB_DEVREQ_GET_DESCRIPTOR,
     163                .index = 0,
     164                .length = sizeof(usb_standard_device_descriptor_t)
     165        };
     166        setup_packet.value_high = USB_DESCTYPE_CONFIGURATION;
     167        setup_packet.value_low = index;
     168
     169        /* Prepare local descriptor. */
     170        size_t actually_transferred = 0;
     171        usb_standard_configuration_descriptor_t descriptor_tmp;
     172
     173        /* Perform the control read transaction. */
     174        int rc = usb_drv_psync_control_read(phone, target,
     175            &setup_packet, sizeof(setup_packet),
     176            &descriptor_tmp, sizeof(descriptor_tmp), &actually_transferred);
     177
     178        if (rc != EOK) {
     179                return rc;
     180        }
     181
     182        /* Verify that all data has been transferred. */
     183        if (actually_transferred < sizeof(descriptor_tmp)) {
     184                return ELIMIT;
     185        }
     186
     187        /* Everything is okay, copy the descriptor. */
     188        memcpy(descriptor, &descriptor_tmp,
     189            sizeof(descriptor_tmp));
     190
     191        return EOK;
     192}
     193
     194/** Retrieve full configuration descriptor of connected USB device.
     195 *
     196 * @warning The @p buffer might be touched (i.e. its contents changed)
     197 * even when error occurres.
     198 *
     199 * @param[in] phone Open phone to HC driver.
     200 * @param[in] address Device USB address.
     201 * @param[in] index Configuration descriptor index.
     202 * @param[out] buffer Buffer for the whole configuration descriptor.
     203 * @param[in] buffer_size Size of the prepared @p buffer.
     204 * @param[out] actual_buffer_size Bytes actually transfered.
     205 * @return Error code.
     206 * @retval EBADMEM @p descriptor is NULL.
     207 */
     208int usb_drv_req_get_full_configuration_descriptor(int phone,
     209    usb_address_t address, int index,
     210    void *buffer, size_t buffer_size, size_t *actual_buffer_size)
     211{
     212        if (buffer == NULL) {
     213                return EBADMEM;
     214        }
     215
     216        /* Prepare the target. */
     217        usb_target_t target = {
     218                .address = address,
     219                .endpoint = 0
     220        };
     221
     222        /* Prepare the setup packet. */
     223        usb_device_request_setup_packet_t setup_packet = {
     224                .request_type = 128,
     225                .request = USB_DEVREQ_GET_DESCRIPTOR,
     226                .index = 0,
     227                .length = sizeof(usb_standard_device_descriptor_t)
     228        };
     229        setup_packet.value_high = USB_DESCTYPE_CONFIGURATION;
     230        setup_packet.value_low = index;
     231
     232        /* Perform the control read transaction. */
     233        int rc = usb_drv_psync_control_read(phone, target,
     234            &setup_packet, sizeof(setup_packet),
     235            buffer, buffer_size, actual_buffer_size);
     236
     237        return rc;
     238}
     239
    132240
    133241/**
Note: See TracChangeset for help on using the changeset viewer.