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>
26 #include <grub/command.h>
28 static const char *usb_classes
[] =
32 "Communication Interface",
46 static const char *usb_endp_type
[] =
54 static const char *usb_devspeed
[] =
63 usb_print_str (const char *description
, grub_usb_device_t dev
, int idx
)
71 grub_usb_get_string (dev
, idx
, 0x0409, &name
);
72 grub_printf ("%s: `%s'\n", description
, name
);
77 usb_iterate (grub_usb_device_t dev
)
79 struct grub_usb_desc_device
*descdev
;
82 descdev
= &dev
->descdev
;
84 usb_print_str ("Product", dev
, descdev
->strprod
);
85 usb_print_str ("Vendor", dev
, descdev
->strvendor
);
86 usb_print_str ("Serial", dev
, descdev
->strserial
);
88 if (descdev
->class > 0 && descdev
->class <= 0x0E)
89 grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n",
90 descdev
->class, usb_classes
[descdev
->class],
91 descdev
->subclass
, descdev
->protocol
);
92 grub_printf ("USB version %d.%d, VendorID: 0x%02x, ProductID: 0x%02x, #conf: %d\n",
93 descdev
->usbrel
>> 8, (descdev
->usbrel
>> 4) & 0x0F,
94 descdev
->vendorid
, descdev
->prodid
, descdev
->configcnt
);
96 grub_printf ("%s speed device\n", usb_devspeed
[dev
->speed
]);
98 for (i
= 0; i
< descdev
->configcnt
; i
++)
100 struct grub_usb_desc_config
*config
;
102 config
= dev
->config
[i
].descconf
;
103 usb_print_str ("Configuration:", dev
, config
->strconfig
);
106 for (i
= 0; i
< dev
->config
[0].descconf
->numif
; i
++)
109 struct grub_usb_desc_if
*interf
;
110 interf
= dev
->config
[0].interf
[i
].descif
;
112 grub_printf ("Interface #%d: #Endpoints: %d ",
113 i
, interf
->endpointcnt
);
114 if (interf
->class > 0 && interf
->class <= 0x0E)
115 grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n",
116 interf
->class, usb_classes
[interf
->class],
117 interf
->subclass
, interf
->protocol
);
119 usb_print_str ("Interface", dev
, interf
->strif
);
121 for (j
= 0; j
< interf
->endpointcnt
; j
++)
123 struct grub_usb_desc_endp
*endp
;
124 endp
= &dev
->config
[0].interf
[i
].descendp
[j
];
126 grub_printf ("Endpoint #%d: %s, max packed size: %d, transfer type: %s, latency: %d\n",
127 endp
->endp_addr
& 15,
128 (endp
->endp_addr
& 128) ? "IN" : "OUT",
129 endp
->maxpacket
, usb_endp_type
[endp
->attrib
& 3],
140 grub_cmd_usbtest (grub_command_t cmd
__attribute__ ((unused
)),
141 int argc
__attribute__ ((unused
)),
142 char **args
__attribute__ ((unused
)))
144 grub_printf ("USB devices:\n\n");
145 grub_usb_iterate (usb_iterate
);
150 static grub_command_t cmd
;
152 GRUB_MOD_INIT(usbtest
)
154 cmd
= grub_register_command ("usb", grub_cmd_usbtest
,
155 0, "Test USB support");
158 GRUB_MOD_FINI(usbtest
)
160 grub_unregister_command (cmd
);