Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/usbinfo/info.c

    r206f71a rbf58895  
    4040#include <usb/recognise.h>
    4141#include <usb/request.h>
     42#include <usb/classes/classes.h>
    4243#include "usbinfo.h"
     44
     45void dump_short_device_identification(usbinfo_device_t *dev)
     46{
     47        printf("%sDevice 0x%04x by vendor 0x%04x\n", get_indent(0),
     48            (int) dev->device_descriptor.product_id,
     49            (int) dev->device_descriptor.vendor_id);
     50}
     51
     52void dump_device_match_ids(usbinfo_device_t *dev)
     53{
     54        match_id_list_t matches;
     55        init_match_ids(&matches);
     56        usb_device_create_match_ids_from_device_descriptor(
     57            &dev->device_descriptor, &matches);
     58        dump_match_ids(&matches, get_indent(0));
     59}
     60
     61static void dump_descriptor_tree_brief_device(const char *prefix,
     62    usb_standard_device_descriptor_t *descriptor)
     63{
     64        printf("%sDevice (0x%04x by 0x%04x, %s)\n", prefix,
     65            (int) descriptor->product_id,
     66            (int) descriptor->vendor_id,
     67            usb_str_class(descriptor->device_class));
     68}
     69
     70static void dump_descriptor_tree_brief_configuration(const char *prefix,
     71    usb_standard_configuration_descriptor_t *descriptor)
     72{
     73        printf("%sConfiguration #%d\n", prefix,
     74            (int) descriptor->configuration_number);
     75}
     76
     77static void dump_descriptor_tree_brief_interface(const char *prefix,
     78    usb_standard_interface_descriptor_t *descriptor)
     79{
     80        printf("%sInterface #%d (%s, 0x%02x, 0x%02x)\n", prefix,
     81            (int) descriptor->interface_number,
     82            usb_str_class(descriptor->interface_class),
     83            (int) descriptor->interface_subclass,
     84            (int) descriptor->interface_protocol);
     85}
     86
     87static void dump_descriptor_tree_brief_endpoint(const char *prefix,
     88    usb_standard_endpoint_descriptor_t *descriptor)
     89{
     90        usb_endpoint_t endpoint_no = descriptor->endpoint_address & 0xF;
     91        usb_transfer_type_t transfer = descriptor->attributes & 0x3;
     92        usb_direction_t direction = descriptor->endpoint_address & 0x80
     93            ? USB_DIRECTION_IN : USB_DIRECTION_OUT;
     94        printf("%sEndpoint #%d (%s %s, %zu)\n", prefix,
     95            endpoint_no, usb_str_transfer_type(transfer),
     96            direction == USB_DIRECTION_IN ? "in" : "out",
     97            (size_t) descriptor->max_packet_size);
     98}
     99
     100
     101static void dump_descriptor_tree_brief_callback(uint8_t *descriptor,
     102    size_t depth, void *arg)
     103{
     104        const char *indent = get_indent(depth + 1);
     105
     106        int descr_type = -1;
     107        size_t descr_size = descriptor[0];
     108        if (descr_size > 0) {
     109                descr_type = descriptor[1];
     110        }
     111
     112        switch (descr_type) {
     113
     114#define _BRANCH(type_enum, descriptor_type, callback) \
     115        case type_enum: \
     116                if (descr_size >= sizeof(descriptor_type)) { \
     117                        callback(indent, (descriptor_type *) descriptor); \
     118                } else { \
     119                        descr_type = -1; \
     120                } \
     121                break;
     122
     123                _BRANCH(USB_DESCTYPE_DEVICE,
     124                    usb_standard_device_descriptor_t,
     125                    dump_descriptor_tree_brief_device);
     126                _BRANCH(USB_DESCTYPE_CONFIGURATION,
     127                    usb_standard_configuration_descriptor_t,
     128                    dump_descriptor_tree_brief_configuration);
     129                _BRANCH(USB_DESCTYPE_INTERFACE,
     130                    usb_standard_interface_descriptor_t,
     131                    dump_descriptor_tree_brief_interface);
     132                _BRANCH(USB_DESCTYPE_ENDPOINT,
     133                    usb_standard_endpoint_descriptor_t,
     134                    dump_descriptor_tree_brief_endpoint);
     135
     136                default:
     137                        break;
     138        }
     139
     140        if (descr_type == -1) {
     141                printf("%sInvalid descriptor.\n", indent);
     142        }
     143}
     144
     145void dump_descriptor_tree_brief(usbinfo_device_t *dev)
     146{
     147        dump_descriptor_tree_brief_callback((uint8_t *)&dev->device_descriptor,
     148            (size_t) -1, NULL);
     149        usb_dp_walk_simple(dev->full_configuration_descriptor,
     150            dev->full_configuration_descriptor_size,
     151            usb_dp_standard_descriptor_nesting,
     152            dump_descriptor_tree_brief_callback,
     153            NULL);
     154}
    43155
    44156int dump_device(devman_handle_t hc_handle, usb_address_t address)
     
    92204                goto leave;
    93205        }
    94         dump_match_ids(&match_id_list);
     206        dump_match_ids(&match_id_list, get_indent(0));
    95207
    96208        /*
     
    106218        }
    107219        dump_usb_descriptor((uint8_t *)&device_descriptor, sizeof(device_descriptor));
     220
     221        rc = EOK;
     222        goto leave;
    108223
    109224        /*
Note: See TracChangeset for help on using the changeset viewer.