X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fusb.h;h=02a0ccdd77b370b4bd62d858a2c797e926fd03f2;hb=739760569fe27bdd708b762e0c651144ed5d0cc2;hp=dca512d394b8445c13d616699d099ca3c23107e7;hpb=6f43ba70d15e15a08c25b3d956c70addb6740737;p=u-boot diff --git a/include/usb.h b/include/usb.h index dca512d394..02a0ccdd77 100644 --- a/include/usb.h +++ b/include/usb.h @@ -96,7 +96,7 @@ enum { * (the hubs) have this as parent data. Hubs are children of controllers or * other hubs and there is always a single root hub for each controller. * Therefore struct usb_device can always be accessed with - * dev_get_parentdata(dev), where dev is a USB device. + * dev_get_parent_priv(dev), where dev is a USB device. * * Pointers exist for obtaining both the device (could be any uclass) and * controller (UCLASS_USB) from this structure. The controller does not have @@ -130,7 +130,7 @@ struct usb_device { int string_langid; /* language ID for strings */ int (*irq_handle)(struct usb_device *dev); unsigned long irq_status; - int irq_act_len; /* transfered bytes */ + int irq_act_len; /* transferred bytes */ void *privptr; /* * Child devices - if this is a hub device @@ -138,7 +138,7 @@ struct usb_device { */ unsigned long status; unsigned long int_pending; /* 1 bit per ep, used by int_queue */ - int act_len; /* transfered bytes */ + int act_len; /* transferred bytes */ int maxchild; /* Number of ports if hub */ int portnr; /* Port number, 1=first */ #ifndef CONFIG_DM_USB @@ -174,10 +174,10 @@ enum usb_init_type { int usb_lowlevel_init(int index, enum usb_init_type init, void **controller); int usb_lowlevel_stop(int index); -#if defined(CONFIG_MUSB_HOST) || defined(CONFIG_DM_USB) -int usb_reset_root_port(void); +#if defined(CONFIG_USB_MUSB_HOST) || defined(CONFIG_DM_USB) +int usb_reset_root_port(struct usb_device *dev); #else -#define usb_reset_root_port() +#define usb_reset_root_port(dev) #endif int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, @@ -187,7 +187,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, int transfer_len, int interval); -#if defined CONFIG_USB_EHCI || defined CONFIG_MUSB_HOST || defined(CONFIG_DM_USB) +#if defined CONFIG_USB_EHCI || defined CONFIG_USB_MUSB_HOST || defined(CONFIG_DM_USB) struct int_queue *create_int_queue(struct usb_device *dev, unsigned long pipe, int queuesize, int elementsize, void *buffer, int interval); int destroy_int_queue(struct usb_device *dev, struct int_queue *queue); @@ -227,8 +227,7 @@ int board_usb_cleanup(int index, enum usb_init_type init); #ifdef CONFIG_USB_STORAGE -#define USB_MAX_STOR_DEV 5 -block_dev_desc_t *usb_stor_get_dev(int index); +#define USB_MAX_STOR_DEV 7 int usb_stor_scan(int mode); int usb_stor_info(void); @@ -266,8 +265,9 @@ int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, int transfer_len, int interval); int usb_disable_asynch(int disable); int usb_maxpacket(struct usb_device *dev, unsigned long pipe); -int usb_get_configuration_no(struct usb_device *dev, unsigned char *buffer, - int cfgno); +int usb_get_configuration_no(struct usb_device *dev, int cfgno, + unsigned char *buffer, int length); +int usb_get_configuration_len(struct usb_device *dev, int cfgno); int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size); int usb_get_class_descriptor(struct usb_device *dev, int ifnum, @@ -493,15 +493,31 @@ struct usb_device_id { /** * struct usb_driver_entry - Matches a driver to its usb_device_ids - * @compatible: Compatible string - * @data: Data for this compatible string + * @driver: Driver to use + * @match: List of match records for this driver, terminated by {} */ struct usb_driver_entry { struct driver *driver; const struct usb_device_id *match; }; -#define USB_DEVICE(__name, __match) \ +#define USB_DEVICE_ID_MATCH_DEVICE \ + (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) + +/** + * USB_DEVICE - macro used to describe a specific usb device + * @vend: the 16 bit USB Vendor ID + * @prod: the 16 bit USB Product ID + * + * This macro is used to create a struct usb_device_id that matches a + * specific device. + */ +#define USB_DEVICE(vend, prod) \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ + .idVendor = (vend), \ + .idProduct = (prod) + +#define U_BOOT_USB_DEVICE(__name, __match) \ ll_entry_declare(struct usb_driver_entry, __name, usb_driver_entry) = {\ .driver = llsym(struct driver, __name, driver), \ .match = __match, \ @@ -539,6 +555,10 @@ struct usb_hub_descriptor { struct usb_hub_device { struct usb_device *pusb_dev; struct usb_hub_descriptor desc; + + ulong connect_timeout; /* Device connection timeout in ms */ + ulong query_delay; /* Device query delay in ms */ + int overcurrent_count[USB_MAXCHILDREN]; /* Over-current counter */ }; #ifdef CONFIG_DM_USB @@ -705,15 +725,16 @@ struct dm_usb_ops { * is read). This should be NULL for EHCI, which does not need this. */ int (*alloc_device)(struct udevice *bus, struct usb_device *udev); + + /** + * reset_root_port() - Reset usb root port + */ + int (*reset_root_port)(struct udevice *bus, struct usb_device *udev); }; #define usb_get_ops(dev) ((struct dm_usb_ops *)(dev)->driver->ops) #define usb_get_emul_ops(dev) ((struct dm_usb_ops *)(dev)->driver->ops) -#ifdef CONFIG_MUSB_HOST -int usb_reset_root_port(void); -#endif - /** * usb_get_dev_index() - look up a device index number * @@ -729,27 +750,19 @@ int usb_reset_root_port(void); */ struct usb_device *usb_get_dev_index(struct udevice *bus, int index); -/** - * usb_legacy_port_reset() - Legacy function to reset a hub port - * - * @hub: Hub device - * @portnr: Port number (1=first) - */ -int usb_legacy_port_reset(struct usb_device *hub, int portnr); - /** * usb_setup_device() - set up a device ready for use * * @dev: USB device pointer. This need not be a real device - it is * common for it to just be a local variable with its ->dev - * member (i.e. @dev->dev) set to the parent device + * member (i.e. @dev->dev) set to the parent device and + * dev->portnr set to the port number on the hub (1=first) * @do_read: true to read the device descriptor before an address is set * (should be false for XHCI buses, true otherwise) * @parent: Parent device (either UCLASS_USB or UCLASS_USB_HUB) - * @portnr: Port number on hub (1=first) or 0 for none * @return 0 if OK, -ve on error */ int usb_setup_device(struct usb_device *dev, bool do_read, - struct usb_device *parent, int portnr); + struct usb_device *parent); /** * usb_hub_scan() - Scan a hub and find its devices @@ -865,6 +878,18 @@ int legacy_hub_port_reset(struct usb_device *dev, int port, int hub_port_reset(struct udevice *dev, int port, unsigned short *portstat); +/* + * usb_find_usb2_hub_address_port() - Get hub address and port for TT setting + * + * Searches for the first HS hub above the given device. If a + * HS hub is found, the hub address and the port the device is + * connected to is return, as required for SPLIT transactions + * + * @param: udev full speed or low speed device + */ +void usb_find_usb2_hub_address_port(struct usb_device *udev, + uint8_t *hub_address, uint8_t *hub_port); + /** * usb_alloc_new_device() - Allocate a new device * @@ -928,6 +953,17 @@ int usb_emul_control(struct udevice *emul, struct usb_device *udev, int usb_emul_bulk(struct udevice *emul, struct usb_device *udev, unsigned long pipe, void *buffer, int length); +/** + * usb_emul_int() - Send an interrupt packet to an emulator + * + * @emul: Emulator device + * @udev: USB device (which the emulator is causing to appear) + * See struct dm_usb_ops for details on other parameters + * @return 0 if OK, -ve on error + */ +int usb_emul_int(struct udevice *emul, struct usb_device *udev, + unsigned long pipe, void *buffer, int length, int interval); + /** * usb_emul_find() - Find an emulator for a particular device * @@ -940,6 +976,16 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev, */ int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp); +/** + * usb_emul_find_for_dev() - Find an emulator for a particular device + * + * @bus: USB bus (controller) + * @dev: USB device to check + * @emulp: Returns pointer to emulator, or NULL if not found + * @return 0 if found, -ve on error + */ +int usb_emul_find_for_dev(struct udevice *dev, struct udevice **emulp); + /** * usb_emul_reset() - Reset all emulators ready for use * @@ -948,4 +994,12 @@ int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp); */ void usb_emul_reset(struct udevice *dev); +/** + * usb_show_tree() - show the USB device tree + * + * This shows a list of active USB devices along with basic information about + * each. + */ +void usb_show_tree(void); + #endif /*_USB_H_ */