Ignore:
File:
1 edited

Legend:

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

    r5ccb15c r03e02248  
    4545
    4646#include "usbinfo.h"
    47 #include <usb/dp.h>
    4847
    4948#define INDENT "  "
     
    126125}
    127126
    128 static void dump_tree_descriptor(uint8_t *descriptor, size_t depth)
    129 {
    130         if (descriptor == NULL) {
    131                 return;
    132         }
    133         while (depth > 0) {
    134                 printf("  ");
    135                 depth--;
    136         }
    137         int type = (int) *(descriptor + 1);
    138         const char *name = "unknown";
    139         switch (type) {
    140 #define _TYPE(descriptor_type) \
    141                 case USB_DESCTYPE_##descriptor_type: name = #descriptor_type; break
    142                 _TYPE(DEVICE);
    143                 _TYPE(CONFIGURATION);
    144                 _TYPE(STRING);
    145                 _TYPE(INTERFACE);
    146                 _TYPE(ENDPOINT);
    147                 _TYPE(HID);
    148                 _TYPE(HID_REPORT);
    149                 _TYPE(HID_PHYSICAL);
    150                 _TYPE(HUB);
    151 #undef _TYPE
    152         }
    153         printf("0x%02x (%s)\n", type, name);
    154 }
    155 
    156 static void dump_tree_internal(usb_dp_parser_t *parser, usb_dp_parser_data_t *data,
    157     uint8_t *root, size_t depth)
    158 {
    159         if (root == NULL) {
    160                 return;
    161         }
    162         dump_tree_descriptor(root, depth);
    163         uint8_t *child = usb_dp_get_nested_descriptor(parser, data, root);
    164         do {
    165                 dump_tree_internal(parser, data, child, depth + 1);
    166                 child = usb_dp_get_sibling_descriptor(parser, data, root, child);
    167         } while (child != NULL);
    168 }
    169 
    170 static void dump_tree(usb_dp_parser_t *parser, usb_dp_parser_data_t *data)
    171 {
    172         uint8_t *ptr = data->data;
    173         printf("Descriptor tree:\n");
    174         dump_tree_internal(parser, data, ptr, 1);
    175 }
    176 
    177 #define NESTING(parentname, childname) \
    178         { \
    179                 .child = USB_DESCTYPE_##childname, \
    180                 .parent = USB_DESCTYPE_##parentname, \
    181         }
    182 #define LAST_NESTING { -1, -1 }
    183 
    184 static usb_dp_descriptor_nesting_t descriptor_nesting[] = {
    185         NESTING(CONFIGURATION, INTERFACE),
    186         NESTING(INTERFACE, ENDPOINT),
    187         NESTING(INTERFACE, HUB),
    188         NESTING(INTERFACE, HID),
    189         NESTING(HID, HID_REPORT),
    190         LAST_NESTING
    191 };
    192 
    193 static usb_dp_parser_t parser = {
    194         .nesting = descriptor_nesting
    195 };
    196 
    197 void dump_descriptor_tree(uint8_t *descriptors, size_t length)
    198 {
    199         usb_dp_parser_data_t data = {
    200                 .data = descriptors,
    201                 .size = length,
    202                 .arg = NULL
    203         };
    204 
    205         dump_tree(&parser, &data);
    206 }
    207127
    208128/** @}
Note: See TracChangeset for help on using the changeset viewer.