[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