1 /* usbtest.c - test module for USB */
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2008 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/types.h>
21 #include <grub/misc.h>
22 #include <grub/charset.h>
27 #include <grub/command.h>
28 #include <grub/i18n.h>
30 GRUB_MOD_LICENSE ("GPLv3+");
32 static const char *usb_classes
[] =
36 "Communication Interface",
50 static const char *usb_endp_type
[] =
58 static const char *usb_devspeed
[] =
67 grub_usb_get_string (grub_usb_device_t dev
, grub_uint8_t index
, int langid
,
70 struct grub_usb_desc_str descstr
;
71 struct grub_usb_desc_str
*descstrp
;
74 /* Only get the length. */
75 err
= grub_usb_control_msg (dev
, 1 << 7,
76 0x06, (3 << 8) | index
,
77 langid
, 1, (char *) &descstr
);
81 descstrp
= grub_malloc (descstr
.length
);
83 return GRUB_USB_ERR_INTERNAL
;
84 err
= grub_usb_control_msg (dev
, 1 << 7,
85 0x06, (3 << 8) | index
,
86 langid
, descstr
.length
, (char *) descstrp
);
88 if (descstrp
->length
== 0)
91 *string
= grub_strdup ("");
93 return GRUB_USB_ERR_INTERNAL
;
94 return GRUB_USB_ERR_NONE
;
97 *string
= grub_malloc (descstr
.length
* 2 + 1);
100 grub_free (descstrp
);
101 return GRUB_USB_ERR_INTERNAL
;
104 *grub_utf16_to_utf8 ((grub_uint8_t
*) *string
, descstrp
->str
,
105 descstrp
->length
/ 2 - 1) = 0;
106 grub_free (descstrp
);
108 return GRUB_USB_ERR_NONE
;
112 usb_print_str (const char *description
, grub_usb_device_t dev
, int idx
)
121 err
= grub_usb_get_string (dev
, idx
, 0x0409, &name
);
123 grub_printf ("Error %d retrieving %s\n", err
, description
);
126 grub_printf ("%s: `%s'\n", description
, name
);
132 usb_iterate (grub_usb_device_t dev
, void *data
__attribute__ ((unused
)))
134 struct grub_usb_desc_device
*descdev
;
137 descdev
= &dev
->descdev
;
139 usb_print_str ("Product", dev
, descdev
->strprod
);
140 usb_print_str ("Vendor", dev
, descdev
->strvendor
);
141 usb_print_str ("Serial", dev
, descdev
->strserial
);
143 grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n",
144 descdev
->class, descdev
->class < ARRAY_SIZE (usb_classes
)
145 ? usb_classes
[descdev
->class] : "Unknown",
146 descdev
->subclass
, descdev
->protocol
);
147 grub_printf ("USB version %d.%d, VendorID: 0x%02x, ProductID: 0x%02x, #conf: %d\n",
148 descdev
->usbrel
>> 8, (descdev
->usbrel
>> 4) & 0x0F,
149 descdev
->vendorid
, descdev
->prodid
, descdev
->configcnt
);
151 grub_printf ("%s speed device\n", usb_devspeed
[dev
->speed
]);
153 for (i
= 0; i
< descdev
->configcnt
; i
++)
155 struct grub_usb_desc_config
*config
;
157 config
= dev
->config
[i
].descconf
;
158 usb_print_str ("Configuration:", dev
, config
->strconfig
);
161 for (i
= 0; i
< dev
->config
[0].descconf
->numif
; i
++)
164 struct grub_usb_desc_if
*interf
;
165 interf
= dev
->config
[0].interf
[i
].descif
;
167 grub_printf ("Interface #%d: #Endpoints: %d ",
168 i
, interf
->endpointcnt
);
169 grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n",
170 interf
->class, interf
->class < ARRAY_SIZE (usb_classes
)
171 ? usb_classes
[interf
->class] : "Unknown",
172 interf
->subclass
, interf
->protocol
);
174 usb_print_str ("Interface", dev
, interf
->strif
);
176 for (j
= 0; j
< interf
->endpointcnt
; j
++)
178 struct grub_usb_desc_endp
*endp
;
179 endp
= &dev
->config
[0].interf
[i
].descendp
[j
];
181 grub_printf ("Endpoint #%d: %s, max packed size: %d, transfer type: %s, latency: %d\n",
182 endp
->endp_addr
& 15,
183 (endp
->endp_addr
& 128) ? "IN" : "OUT",
184 endp
->maxpacket
, usb_endp_type
[endp
->attrib
& 3],
195 grub_cmd_usbtest (grub_command_t cmd
__attribute__ ((unused
)),
196 int argc
__attribute__ ((unused
)),
197 char **args
__attribute__ ((unused
)))
199 grub_usb_poll_devices (1);
201 grub_printf ("USB devices:\n\n");
202 grub_usb_iterate (usb_iterate
, NULL
);
207 static grub_command_t cmd
;
209 GRUB_MOD_INIT(usbtest
)
211 cmd
= grub_register_command ("usb", grub_cmd_usbtest
,
212 0, N_("Test USB support."));
215 GRUB_MOD_FINI(usbtest
)
217 grub_unregister_command (cmd
);