Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/recognise.c

    r38648f0 r345ea18  
    3333 * @brief Functions for recognising kind of attached devices.
    3434 */
     35#include <sys/types.h>
    3536#include <usb_iface.h>
    3637#include <usb/usbdrv.h>
     38#include <usb/pipes.h>
     39#include <usb/recognise.h>
     40#include <usb/request.h>
    3741#include <usb/classes/classes.h>
    3842#include <stdio.h>
    3943#include <errno.h>
     44
     45static size_t device_name_index = 0;
     46static FIBRIL_MUTEX_INITIALIZE(device_name_index_mutex);
    4047
    4148/** Callback for getting host controller handle.
     
    6976};
    7077
    71 static device_ops_t child_ops = {
     78device_ops_t child_ops = {
    7279        .interfaces[USB_DEV_IFACE] = &usb_iface
    7380};
     
    154161                /* First, with release number. */
    155162                rc = usb_add_match_id(matches, 100,
    156                     "usb&vendor=%d&product=%d&release=" BCD_FMT,
     163                    "usb&vendor=0x%04x&product=0x%04x&release=" BCD_FMT,
    157164                    (int) device_descriptor->vendor_id,
    158165                    (int) device_descriptor->product_id,
     
    163170               
    164171                /* Next, without release number. */
    165                 rc = usb_add_match_id(matches, 90, "usb&vendor=%d&product=%d",
     172                rc = usb_add_match_id(matches, 90,
     173                    "usb&vendor=0x%04x&product=0x%04x",
    166174                    (int) device_descriptor->vendor_id,
    167175                    (int) device_descriptor->product_id);
     
    240248/** Add match ids based on configuration descriptor.
    241249 *
    242  * @param hc Open phone to host controller.
     250 * @param pipe Control pipe to the device.
    243251 * @param matches Match ids list to add matches to.
    244  * @param address USB address of the attached device.
    245252 * @param config_count Number of configurations the device has.
    246253 * @return Error code.
    247254 */
    248 static int usb_add_config_descriptor_match_ids(int hc,
    249     match_id_list_t *matches, usb_address_t address,
    250     int config_count)
     255static int usb_add_config_descriptor_match_ids(usb_endpoint_pipe_t *pipe,
     256    match_id_list_t *matches, int config_count)
    251257{
    252258        int final_rc = EOK;
     
    256262                int rc;
    257263                usb_standard_configuration_descriptor_t config_descriptor;
    258                 rc = usb_drv_req_get_bare_configuration_descriptor(hc,
    259                     address,  config_index, &config_descriptor);
     264                rc = usb_request_get_bare_configuration_descriptor(pipe,
     265                    config_index, &config_descriptor);
    260266                if (rc != EOK) {
    261267                        final_rc = rc;
     
    266272                void *full_config_descriptor
    267273                    = malloc(config_descriptor.total_length);
    268                 rc = usb_drv_req_get_full_configuration_descriptor(hc,
    269                     address, config_index,
     274                rc = usb_request_get_full_configuration_descriptor(pipe,
     275                    config_index,
    270276                    full_config_descriptor, config_descriptor.total_length,
    271277                    &full_config_descriptor_size);
     
    298304 * function exits with error.
    299305 *
    300  * @param hc Open phone to host controller.
     306 * @param ctrl_pipe Control pipe to given device (session must be already
     307 *      started).
    301308 * @param matches Initialized list of match ids.
    302  * @param address USB address of the attached device.
    303  * @return Error code.
    304  */
    305 int usb_drv_create_device_match_ids(int hc, match_id_list_t *matches,
    306     usb_address_t address)
     309 * @return Error code.
     310 */
     311int usb_device_create_match_ids(usb_endpoint_pipe_t *ctrl_pipe,
     312    match_id_list_t *matches)
    307313{
    308314        int rc;
    309        
    310315        /*
    311316         * Retrieve device descriptor and add matches from it.
     
    313318        usb_standard_device_descriptor_t device_descriptor;
    314319
    315         rc = usb_drv_req_get_device_descriptor(hc, address,
    316             &device_descriptor);
     320        rc = usb_request_get_device_descriptor(ctrl_pipe, &device_descriptor);
    317321        if (rc != EOK) {
    318322                return rc;
    319323        }
    320        
     324
    321325        rc = usb_drv_create_match_ids_from_device_descriptor(matches,
    322326            &device_descriptor);
     
    324328                return rc;
    325329        }
    326        
     330
    327331        /*
    328332         * Go through all configurations and add matches
    329333         * based on interface class.
    330334         */
    331         rc = usb_add_config_descriptor_match_ids(hc, matches,
    332             address, device_descriptor.configuration_count);
     335        rc = usb_add_config_descriptor_match_ids(ctrl_pipe, matches,
     336            device_descriptor.configuration_count);
    333337        if (rc != EOK) {
    334338                return rc;
     
    346350}
    347351
    348 
    349352/** Probe for device kind and register it in devman.
    350353 *
    351  * @param[in] hc Open phone to the host controller.
     354 * @param[in] address Address of the (unknown) attached device.
     355 * @param[in] hc_handle Handle of the host controller.
    352356 * @param[in] parent Parent device.
    353  * @param[in] address Address of the (unknown) attached device.
    354357 * @param[out] child_handle Handle of the child device.
    355358 * @return Error code.
    356359 */
    357 int usb_drv_register_child_in_devman(int hc, device_t *parent,
    358     usb_address_t address, devman_handle_t *child_handle)
    359 {
    360         static size_t device_name_index = 0;
    361         static FIBRIL_MUTEX_INITIALIZE(device_name_index_mutex);
    362 
     360int usb_device_register_child_in_devman(usb_address_t address,
     361    devman_handle_t hc_handle,
     362    device_t *parent, devman_handle_t *child_handle)
     363{
    363364        size_t this_device_name_index;
    364365
     
    368369        fibril_mutex_unlock(&device_name_index_mutex);
    369370
    370 
    371371        device_t *child = NULL;
    372372        char *child_name = NULL;
    373373        int rc;
     374        usb_device_connection_t dev_connection;
     375        usb_endpoint_pipe_t ctrl_pipe;
     376
     377        rc = usb_device_connection_initialize(&dev_connection, hc_handle, address);
     378        if (rc != EOK) {
     379                goto failure;
     380        }
     381
     382        rc = usb_endpoint_pipe_initialize_default_control(&ctrl_pipe,
     383            &dev_connection);
     384        if (rc != EOK) {
     385                goto failure;
     386        }
    374387
    375388        child = create_device();
     
    390403        child->name = child_name;
    391404        child->ops = &child_ops;
    392        
    393         rc = usb_drv_create_device_match_ids(hc, &child->match_ids, address);
     405
     406        rc = usb_endpoint_pipe_start_session(&ctrl_pipe);
     407        if (rc != EOK) {
     408                goto failure;
     409        }
     410
     411        rc = usb_device_create_match_ids(&ctrl_pipe, &child->match_ids);
     412        if (rc != EOK) {
     413                goto failure;
     414        }
     415
     416        rc = usb_endpoint_pipe_end_session(&ctrl_pipe);
    394417        if (rc != EOK) {
    395418                goto failure;
     
    404427                *child_handle = child->handle;
    405428        }
    406        
     429
    407430        return EOK;
    408431
     
    418441
    419442        return rc;
    420 
    421443}
    422444
Note: See TracChangeset for help on using the changeset viewer.