source: mainline/uspace/app/usbinfo/info.c@ 46d12fb

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 46d12fb was b8e2f93, checked in by Vojtech Horky <vojtechhorky@…>, 14 years ago

usbinfo prints language name instead of code

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/*
2 * Copyright (c) 2011 Vojtech Horky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup usbinfo
30 * @{
31 */
32/**
33 * @file
34 * Dumping of generic device properties.
35 */
36#include <stdio.h>
37#include <str_error.h>
38#include <errno.h>
39#include <usb/pipes.h>
40#include <usb/recognise.h>
41#include <usb/request.h>
42#include <usb/classes/classes.h>
43#include <usb/classes/hid.h>
44#include "usbinfo.h"
45
46void dump_short_device_identification(usbinfo_device_t *dev)
47{
48 printf("%sDevice 0x%04x by vendor 0x%04x\n", get_indent(0),
49 (int) dev->device_descriptor.product_id,
50 (int) dev->device_descriptor.vendor_id);
51}
52
53static void dump_match_ids_from_interface(uint8_t *descriptor, size_t depth,
54 void *arg)
55{
56 if (depth != 1) {
57 return;
58 }
59 size_t descr_size = descriptor[0];
60 if (descr_size < sizeof(usb_standard_interface_descriptor_t)) {
61 return;
62 }
63 int descr_type = descriptor[1];
64 if (descr_type != USB_DESCTYPE_INTERFACE) {
65 return;
66 }
67
68 usbinfo_device_t *dev = (usbinfo_device_t *) arg;
69
70 usb_standard_interface_descriptor_t *iface
71 = (usb_standard_interface_descriptor_t *) descriptor;
72
73 printf("%sInterface #%d match ids (%s, 0x%02x, 0x%02x)\n",
74 get_indent(0),
75 (int) iface->interface_number,
76 usb_str_class(iface->interface_class),
77 (int) iface->interface_subclass,
78 (int) iface->interface_protocol);
79
80 match_id_list_t matches;
81 init_match_ids(&matches);
82 usb_device_create_match_ids_from_interface(&dev->device_descriptor,
83 iface, &matches);
84 dump_match_ids(&matches, get_indent(1));
85 clean_match_ids(&matches);
86}
87
88void dump_device_match_ids(usbinfo_device_t *dev)
89{
90 match_id_list_t matches;
91 init_match_ids(&matches);
92 usb_device_create_match_ids_from_device_descriptor(
93 &dev->device_descriptor, &matches);
94 printf("%sDevice match ids (0x%04x by 0x%04x, %s)\n", get_indent(0),
95 (int) dev->device_descriptor.product_id,
96 (int) dev->device_descriptor.vendor_id,
97 usb_str_class(dev->device_descriptor.device_class));
98 dump_match_ids(&matches, get_indent(1));
99 clean_match_ids(&matches);
100
101 usb_dp_walk_simple(dev->full_configuration_descriptor,
102 dev->full_configuration_descriptor_size,
103 usb_dp_standard_descriptor_nesting,
104 dump_match_ids_from_interface,
105 dev);
106}
107
108static void dump_descriptor_tree_brief_device(const char *prefix,
109 usb_standard_device_descriptor_t *descriptor)
110{
111 printf("%sDevice (0x%04x by 0x%04x, %s)\n", prefix,
112 (int) descriptor->product_id,
113 (int) descriptor->vendor_id,
114 usb_str_class(descriptor->device_class));
115}
116
117static void dump_descriptor_tree_brief_configuration(const char *prefix,
118 usb_standard_configuration_descriptor_t *descriptor)
119{
120 printf("%sConfiguration #%d\n", prefix,
121 (int) descriptor->configuration_number);
122}
123
124static void dump_descriptor_tree_brief_interface(const char *prefix,
125 usb_standard_interface_descriptor_t *descriptor)
126{
127 printf("%sInterface #%d (%s, 0x%02x, 0x%02x)\n", prefix,
128 (int) descriptor->interface_number,
129 usb_str_class(descriptor->interface_class),
130 (int) descriptor->interface_subclass,
131 (int) descriptor->interface_protocol);
132}
133
134static void dump_descriptor_tree_brief_endpoint(const char *prefix,
135 usb_standard_endpoint_descriptor_t *descriptor)
136{
137 usb_endpoint_t endpoint_no = descriptor->endpoint_address & 0xF;
138 usb_transfer_type_t transfer = descriptor->attributes & 0x3;
139 usb_direction_t direction = descriptor->endpoint_address & 0x80
140 ? USB_DIRECTION_IN : USB_DIRECTION_OUT;
141 printf("%sEndpoint #%d (%s %s, %zu)\n", prefix,
142 endpoint_no, usb_str_transfer_type(transfer),
143 direction == USB_DIRECTION_IN ? "in" : "out",
144 (size_t) descriptor->max_packet_size);
145}
146
147static void dump_descriptor_tree_brief_hid(const char *prefix,
148 usb_standard_hid_descriptor_t *descriptor)
149{
150 printf("%sHID (country %d, %d descriptors)\n", prefix,
151 (int) descriptor->country_code,
152 (int) descriptor->class_desc_count);
153}
154
155
156static void dump_descriptor_tree_brief_callback(uint8_t *descriptor,
157 size_t depth, void *arg)
158{
159 const char *indent = get_indent(depth + 1);
160
161 int descr_type = -1;
162 size_t descr_size = descriptor[0];
163 if (descr_size > 0) {
164 descr_type = descriptor[1];
165 }
166
167 switch (descr_type) {
168
169#define _BRANCH(type_enum, descriptor_type, callback) \
170 case type_enum: \
171 if (descr_size >= sizeof(descriptor_type)) { \
172 callback(indent, (descriptor_type *) descriptor); \
173 } else { \
174 descr_type = -1; \
175 } \
176 break;
177
178 _BRANCH(USB_DESCTYPE_DEVICE,
179 usb_standard_device_descriptor_t,
180 dump_descriptor_tree_brief_device);
181 _BRANCH(USB_DESCTYPE_CONFIGURATION,
182 usb_standard_configuration_descriptor_t,
183 dump_descriptor_tree_brief_configuration);
184 _BRANCH(USB_DESCTYPE_INTERFACE,
185 usb_standard_interface_descriptor_t,
186 dump_descriptor_tree_brief_interface);
187 _BRANCH(USB_DESCTYPE_ENDPOINT,
188 usb_standard_endpoint_descriptor_t,
189 dump_descriptor_tree_brief_endpoint);
190 _BRANCH(USB_DESCTYPE_HID,
191 usb_standard_hid_descriptor_t,
192 dump_descriptor_tree_brief_hid);
193
194 default:
195 break;
196 }
197
198 if (descr_type == -1) {
199 printf("%sInvalid descriptor.\n", indent);
200 }
201}
202
203void dump_descriptor_tree_brief(usbinfo_device_t *dev)
204{
205 dump_descriptor_tree_brief_callback((uint8_t *)&dev->device_descriptor,
206 (size_t) -1, NULL);
207 usb_dp_walk_simple(dev->full_configuration_descriptor,
208 dev->full_configuration_descriptor_size,
209 usb_dp_standard_descriptor_nesting,
210 dump_descriptor_tree_brief_callback,
211 NULL);
212}
213
214void dump_strings(usbinfo_device_t *dev)
215{
216 /* Get supported languages. */
217 l18_win_locales_t *langs;
218 size_t langs_count;
219 int rc = usb_request_get_supported_languages(&dev->ctrl_pipe,
220 &langs, &langs_count);
221 if (rc != EOK) {
222 fprintf(stderr,
223 NAME ": failed to get list of supported languages: %s.\n",
224 str_error(rc));
225 return;
226 }
227
228 printf("%sString languages (%zu):", get_indent(0), langs_count);
229 size_t i;
230 for (i = 0; i < langs_count; i++) {
231 printf(" 0x%04x", (int) langs[i]);
232 }
233 printf(".\n");
234
235 /* Get all strings and dump them. */
236 for (i = 0; i < langs_count; i++) {
237 l18_win_locales_t lang = langs[i];
238
239 printf("%sStrings in %s:\n", get_indent(0),
240 str_l18_win_locale(lang));
241 /*
242 * Try only the first 15 strings
243 * (typically, device will not have much more anyway).
244 */
245 size_t idx;
246 for (idx = 1; idx < 0x0F; idx++) {
247 char *string;
248 rc = usb_request_get_string(&dev->ctrl_pipe, idx, lang,
249 &string);
250 if (rc != EOK) {
251 continue;
252 }
253 printf("%sString #%zu: \"%s\"\n", get_indent(1),
254 idx, string);
255 free(string);
256 }
257 }
258}
259
260/** @}
261 */
Note: See TracBrowser for help on using the repository browser.