
-----Original Message----- From: Marek Vasut [mailto:marex@denx.de] Sent: Sunday, August 12, 2012 7:47 AM To: Jim Lin Cc: u-boot@lists.denx.de; Wolfgang Denk; Tom Warren Subject: Re: [U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once
Dear Jim Lin,
Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.
New added definitions in header file are: CONFIG_USB_MULTI CONFIG_USB_MAX_CONTROLLER_COUNT
Signed-off-by: Jim Lin jilin@nvidia.com
Changes in v2:
- Renaming from CONFIG_USB_INIT_MULTI to CONFIG_USB_MULTI
- Define CONFIG_USB_MAX_CONTROLLER_COUNT as 1 if not defined
- Remove volatile from structure ehci_ctrl of ehci-hcd.c for a
checkpatch.pl warning
common/cmd_usb.c | 10 +++ common/usb.c | 98 +++++++++++++++++++++++++- common/usb_hub.c | 4 + drivers/usb/host/ehci-hcd.c | 167 +++++++++++++++++++++++++++++++----------- drivers/usb/host/ehci.h | 5 ++ include/usb.h | 12 +++ 6 files changed, 251 insertions(+), 45 deletions(-)
diff --git a/common/cmd_usb.c b/common/cmd_usb.c index a8e3ae5..8d3093b 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char
- const argv[]) } if (strncmp(argv[1], "tree", 4) == 0) { printf("\nDevice Tree:\n");
+#ifdef CONFIG_USB_MULTI
How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?
See the following code, if dev->parent is NULL, then current device is root hub, we show devices below it
for (i = 0; i < USB_MAX_DEVICE; i++) {
dev = usb_get_dev_index(i);
if (dev == NULL)
break;
if (dev->parent == NULL)
usb_show_tree(dev);
}
+#else usb_show_tree(usb_get_dev_index(0)); +#endif return 0; } if (strncmp(argv[1], "inf", 3) == 0) { diff --git a/common/usb.c b/common/usb.c index 1b40228..065c70c 100644 --- a/common/usb.c +++ b/common/usb.c @@ -77,6 +77,89 @@ static int asynch_allowed;
char usb_started; /* flag for the started/stopped USB status */
+#ifdef CONFIG_USB_MULTI +/******************************************************************** +***** ** + * Init USB Device
- */
+#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT #define +CONFIG_USB_MAX_CONTROLLER_COUNT 1 #endif
+int usb_init(void) +{
void *ctrl;
int i;
struct usb_device *dev;
running = 0;
dev_index = 0;
asynch_allowed = 1;
usb_hub_reset();
/* first make all devices unknown */
for (i = 0; i < USB_MAX_DEVICE; i++) {
memset(&usb_dev[i], 0, sizeof(struct usb_device));
usb_dev[i].devnum = -1;
}
/* init low_level USB */
printf("USB: ");
for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
/* init low_level USB */
ctrl = usb_lowlevel_init(i);
/*
* if lowlevel init is OK, scan the bus for devices
* i.e. search HUBs and configure them
*/
if (ctrl) {
running = 1;
printf("scanning bus for devices... ");
dev = usb_alloc_new_device(ctrl);
/*
* device 0 is always present
* (root hub, so let it analyze)
*/
if (dev)
usb_new_device(dev);
}
}
if (running) {
if (!dev_index)
printf("No USB Device found\n");
else
printf("%d USB Device(s) found\n", dev_index);
+#ifdef CONFIG_USB_KEYBOARD
drv_usb_kbd_init();
Will the keyboard driver survive this?
Yes I have tried it after doing the following. 1. Define CONFIG_USB_KEYBOARD, CONFIG_SYS_USB_EVENT_POLL, CONFIG_USB_MULTI, and CONFIG_USB_MAX_CONTROLLER_COUNT 3 in config header file like seaboard.h to compile 2. Install USB keyboard 3. Run "usb reset" in u-boot serial console 4. Run "coninfo" to see usbkbd appeared 5. Run "setenv stdin usbkbd" 6. Typing u-boot console command on USB keyboard
-- nvpublic