Changeset 7a725b13 in mainline for uspace/app/usbinfo/dump.c


Ignore:
Timestamp:
2011-01-14T14:23:33Z (13 years ago)
Author:
Matus Dekanek <smekideki@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b65ca41d
Parents:
f40a1e2 (diff), 2f60e57d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge from usb/development

File:
1 edited

Legend:

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

    rf40a1e2 r7a725b13  
    4545
    4646#include "usbinfo.h"
     47#include <usb/dp.h>
    4748
    4849#define INDENT "  "
     
    125126}
    126127
     128static 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
     156static 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
     170static 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
     184static 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
     193static usb_dp_parser_t parser = {
     194        .nesting = descriptor_nesting
     195};
     196
     197void 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}
    127207
    128208/** @}
Note: See TracChangeset for help on using the changeset viewer.