mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 22:14:54 +00:00
usb: add support for multiple usb controllers
Allows to initialize more than one USB controller at once. v2: print message when controller stop fails Signed-off-by: Lucas Stach <dev@lynxeye.de> Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
676ae068d9
commit
93c2582fea
4 changed files with 70 additions and 56 deletions
|
@ -381,8 +381,7 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
bootstage_mark_name(BOOTSTAGE_ID_USB_START, "usb_start");
|
bootstage_mark_name(BOOTSTAGE_ID_USB_START, "usb_start");
|
||||||
usb_stop();
|
usb_stop();
|
||||||
printf("(Re)start USB...\n");
|
printf("(Re)start USB...\n");
|
||||||
i = usb_init();
|
if (usb_init() >= 0) {
|
||||||
if (i >= 0) {
|
|
||||||
#ifdef CONFIG_USB_STORAGE
|
#ifdef CONFIG_USB_STORAGE
|
||||||
/* try to recognize storage devices immediately */
|
/* try to recognize storage devices immediately */
|
||||||
usb_stor_curr_dev = usb_stor_scan(1);
|
usb_stor_curr_dev = usb_stor_scan(1);
|
||||||
|
@ -390,6 +389,9 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
#ifdef CONFIG_USB_HOST_ETHER
|
#ifdef CONFIG_USB_HOST_ETHER
|
||||||
/* try to recognize ethernet devices immediately */
|
/* try to recognize ethernet devices immediately */
|
||||||
usb_ether_curr_dev = usb_host_eth_scan(1);
|
usb_ether_curr_dev = usb_host_eth_scan(1);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_USB_KEYBOARD
|
||||||
|
drv_usb_kbd_init();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -417,8 +419,14 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (strncmp(argv[1], "tree", 4) == 0) {
|
if (strncmp(argv[1], "tree", 4) == 0) {
|
||||||
printf("\nDevice Tree:\n");
|
puts("USB device tree:\n");
|
||||||
usb_show_tree(usb_get_dev_index(0));
|
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);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strncmp(argv[1], "inf", 3) == 0) {
|
if (strncmp(argv[1], "inf", 3) == 0) {
|
||||||
|
|
106
common/usb.c
106
common/usb.c
|
@ -72,45 +72,72 @@
|
||||||
|
|
||||||
static struct usb_device usb_dev[USB_MAX_DEVICE];
|
static struct usb_device usb_dev[USB_MAX_DEVICE];
|
||||||
static int dev_index;
|
static int dev_index;
|
||||||
static int running;
|
|
||||||
static int asynch_allowed;
|
static int asynch_allowed;
|
||||||
|
|
||||||
char usb_started; /* flag for the started/stopped USB status */
|
char usb_started; /* flag for the started/stopped USB status */
|
||||||
void *ctrl; /* goes away in a following commit, but don't break bisect */
|
|
||||||
|
|
||||||
/**********************************************************************
|
#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
|
||||||
* some forward declerations...
|
#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
|
||||||
*/
|
#endif
|
||||||
static void usb_scan_devices(void);
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Init USB Device
|
* Init USB Device
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int usb_init(void)
|
int usb_init(void)
|
||||||
{
|
{
|
||||||
int result;
|
void *ctrl;
|
||||||
|
struct usb_device *dev;
|
||||||
|
int i, start_index = 0;
|
||||||
|
|
||||||
running = 0;
|
|
||||||
dev_index = 0;
|
dev_index = 0;
|
||||||
asynch_allowed = 1;
|
asynch_allowed = 1;
|
||||||
usb_hub_reset();
|
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 */
|
/* init low_level USB */
|
||||||
printf("USB: ");
|
for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
|
||||||
result = usb_lowlevel_init(0, &ctrl);
|
/* init low_level USB */
|
||||||
/* if lowlevel init is OK, scan the bus for devices
|
printf("USB%d: ", i);
|
||||||
* i.e. search HUBs and configure them */
|
if (usb_lowlevel_init(i, &ctrl)) {
|
||||||
if (result == 0) {
|
puts("lowlevel init failed\n");
|
||||||
printf("scanning bus for devices... ");
|
continue;
|
||||||
running = 1;
|
}
|
||||||
usb_scan_devices();
|
/*
|
||||||
|
* lowlevel init is OK, now scan the bus for devices
|
||||||
|
* i.e. search HUBs and configure them
|
||||||
|
*/
|
||||||
|
start_index = dev_index;
|
||||||
|
printf("scanning bus %d for devices... ", i);
|
||||||
|
dev = usb_alloc_new_device(ctrl);
|
||||||
|
/*
|
||||||
|
* device 0 is always present
|
||||||
|
* (root hub, so let it analyze)
|
||||||
|
*/
|
||||||
|
if (dev)
|
||||||
|
usb_new_device(dev);
|
||||||
|
|
||||||
|
if (start_index == dev_index)
|
||||||
|
puts("No USB Device found\n");
|
||||||
|
else
|
||||||
|
printf("%d USB Device(s) found\n",
|
||||||
|
dev_index - start_index);
|
||||||
|
|
||||||
usb_started = 1;
|
usb_started = 1;
|
||||||
return 0;
|
}
|
||||||
} else {
|
|
||||||
printf("Error, couldn't init Lowlevel part\n");
|
USB_PRINTF("scan end\n");
|
||||||
usb_started = 0;
|
/* if we were not able to find at least one working bus, bail out */
|
||||||
|
if (!usb_started) {
|
||||||
|
puts("USB error: all controllers failed lowlevel init\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -118,15 +145,20 @@ int usb_init(void)
|
||||||
*/
|
*/
|
||||||
int usb_stop(void)
|
int usb_stop(void)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int i;
|
||||||
|
|
||||||
if (usb_started) {
|
if (usb_started) {
|
||||||
asynch_allowed = 1;
|
asynch_allowed = 1;
|
||||||
usb_started = 0;
|
usb_started = 0;
|
||||||
usb_hub_reset();
|
usb_hub_reset();
|
||||||
res = usb_lowlevel_stop(0);
|
|
||||||
|
for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
|
||||||
|
if (usb_lowlevel_stop(i))
|
||||||
|
printf("failed to stop USB controller %d\n", i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -751,7 +783,6 @@ struct usb_device *usb_get_dev_index(int index)
|
||||||
return &usb_dev[index];
|
return &usb_dev[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* returns a pointer of a new device structure or NULL, if
|
/* returns a pointer of a new device structure or NULL, if
|
||||||
* no device struct is available
|
* no device struct is available
|
||||||
*/
|
*/
|
||||||
|
@ -947,29 +978,4 @@ int usb_new_device(struct usb_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build device Tree */
|
|
||||||
static void usb_scan_devices(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct usb_device *dev;
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
dev_index = 0;
|
|
||||||
/* device 0 is always present (root hub, so let it analyze) */
|
|
||||||
dev = usb_alloc_new_device(ctrl);
|
|
||||||
if (usb_new_device(dev))
|
|
||||||
printf("No USB Device found\n");
|
|
||||||
else
|
|
||||||
printf("%d USB Device(s) found\n", dev_index);
|
|
||||||
/* insert "driver" if possible */
|
|
||||||
#ifdef CONFIG_USB_KEYBOARD
|
|
||||||
drv_usb_kbd_init();
|
|
||||||
#endif
|
|
||||||
USB_PRINTF("scan end\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -244,7 +244,7 @@ int usb_stor_scan(int mode)
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
|
|
||||||
if (mode == 1)
|
if (mode == 1)
|
||||||
printf(" scanning bus for storage devices... ");
|
printf(" scanning usb for storage devices... ");
|
||||||
|
|
||||||
usb_disable_asynch(1); /* asynch transfer not allowed */
|
usb_disable_asynch(1); /* asynch transfer not allowed */
|
||||||
|
|
||||||
|
|
|
@ -123,7 +123,7 @@ int usb_host_eth_scan(int mode)
|
||||||
|
|
||||||
|
|
||||||
if (mode == 1)
|
if (mode == 1)
|
||||||
printf(" scanning bus for ethernet devices... ");
|
printf(" scanning usb for ethernet devices... ");
|
||||||
|
|
||||||
old_async = usb_disable_asynch(1); /* asynch transfer not allowed */
|
old_async = usb_disable_asynch(1); /* asynch transfer not allowed */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue