[U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once

Jim Lin jilin at nvidia.com
Tue Aug 14 06:22:07 CEST 2012


>-----Original Message-----
>From: Marek Vasut [mailto:marex at denx.de] 
>Sent: Sunday, August 12, 2012 7:47 AM
>To: Jim Lin
>Cc: u-boot at 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 at 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


More information about the U-Boot mailing list