[U-Boot] [PATCH v1 3/3] cmd: usb gadget: Add a command to bind a USB gadget driver to a UDC port
Lukasz Majewski
lukma at denx.de
Thu Jun 7 09:39:54 UTC 2018
Hi Jean-Jacques,
> Most of the time the UDC is bound to a driver when a dedicated
> command is executed, like 'dfu'. But the ethernet gadget driver must
> be bound by calling usb_ether_init() in the code otherwise the USB
> ethernet adapter is not visible to the ethernet core.
>
> In DM context, the platform code should not be used to bind UDC to a
> particular driver, so adding a new command to bind a USB device port
> to a driver.
>
> usage example:
> usbdev bind 0 usb_ether
> usbdev unbind 0
I would prefer a comment from Simon (so adding him to CC) - as it looks
to me that we shall try to use DM to avoid adding separate commands for
binding.
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot at ti.com>
>
> ---
>
> cmd/usb.c | 71
> +++++++++++++++++++++++++++++++++++++++++++-
> drivers/core/device-remove.c | 11 +------
> include/dm/device-internal.h | 15 ++++++++++ 3 files changed, 86
> insertions(+), 11 deletions(-)
>
> diff --git a/cmd/usb.c b/cmd/usb.c
> index 0ccb1b5..03245cb 100644
> --- a/cmd/usb.c
> +++ b/cmd/usb.c
> @@ -14,6 +14,8 @@
> #include <command.h>
> #include <console.h>
> #include <dm.h>
> +#include <dm/lists.h>
> +#include <dm/device-internal.h>
> #include <dm/uclass-internal.h>
> #include <memalign.h>
> #include <asm/byteorder.h>
> @@ -753,7 +755,6 @@ U_BOOT_CMD(
> #endif /* CONFIG_USB_STORAGE */
> );
>
> -
> #ifdef CONFIG_USB_STORAGE
> U_BOOT_CMD(
> usbboot, 3, 1, do_usbboot,
> @@ -761,3 +762,71 @@ U_BOOT_CMD(
> "loadAddr dev:part"
> );
> #endif /* CONFIG_USB_STORAGE */
> +
> +#ifdef CONFIG_DM_USB_DEV
> +int do_usbdev(cmd_tbl_t *cmdtp, int flag, int argc, char * const
> argv[]) +{
> + struct udevice *dev;
> + struct udevice *usb_dev;
> + int port;
> + int ret;
> + bool bind;
> + static const char * const supported_drivers[] = {
> +#ifdef CONFIG_USB_ETHER
> + "usb_ether",
> +#endif
> + };
> +
> + if (argc < 2)
> + return CMD_RET_USAGE;
> +
> + if ((strncmp(argv[1], "bind", 4) == 0) && (argc == 4)) {
> + port = simple_strtoul(argv[2], NULL, 10);
> + printf("Binding USB port %d to %s\n", port, argv[3]);
> + bind = true;
> + } else if ((strncmp(argv[1], "unbind", 6) == 0) && (argc ==
> 3)) {
> + port = simple_strtoul(argv[2], NULL, 10);
> + printf("Unbinding USB port %d\n", port);
> + bind = false;
> + } else if ((strncmp(argv[1], "list", 4) == 0) && (argc ==
> 2)) {
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(supported_drivers); i++)
> + printf("%s\n", supported_drivers[i]);
> +
> + return CMD_RET_SUCCESS;
> + } else {
> + return CMD_RET_USAGE;
> + }
> +
> + ret = uclass_find_device(UCLASS_USB_DEV_GENERIC, port,
> &usb_dev);
> + if (!usb_dev || ret) {
> + printf("Cannot find UDC %d\n", port);
> + return CMD_RET_FAILURE;
> + }
> +
> + if (bind) {
> + ret = device_bind_driver(usb_dev, argv[3], "gadget",
> &dev);
> + if (!dev || ret) {
> + printf("Unable to bind. err:%d\n", ret);
> + return CMD_RET_FAILURE;
> + }
> + } else {
> + ret = device_chld_unbind(usb_dev);
> + if (ret) {
> + printf("Unable to bind. err:%d\n", ret);
> + return CMD_RET_FAILURE;
> + }
> + }
> +
> + return CMD_RET_SUCCESS;
> +}
> +
> +U_BOOT_CMD(
> + usbdev, 4, 0, do_usbdev,
> + "USB gadget driver",
> + "bind dev# driver- bind the USB device port to a driver\n"
> + "unbind dev# - unbind the USB device port to a driver\n"
> + "list - display the list of available gadget drivers"
> +);
> +#endif /* CONFIG_DM_USB_DEV */
> diff --git a/drivers/core/device-remove.c
> b/drivers/core/device-remove.c index 1cf2278..b0b5ea3 100644
> --- a/drivers/core/device-remove.c
> +++ b/drivers/core/device-remove.c
> @@ -17,16 +17,7 @@
> #include <dm/uclass-internal.h>
> #include <dm/util.h>
>
> -/**
> - * device_chld_unbind() - Unbind all device's children from the
> device
> - *
> - * On error, the function continues to unbind all children, and
> reports the
> - * first error.
> - *
> - * @dev: The device that is to be stripped of its children
> - * @return 0 on success, -ve on error
> - */
> -static int device_chld_unbind(struct udevice *dev)
> +int device_chld_unbind(struct udevice *dev)
> {
> struct udevice *pos, *n;
> int ret, saved_ret = 0;
> diff --git a/include/dm/device-internal.h
> b/include/dm/device-internal.h index 5a4d50c..b4f44c8 100644
> --- a/include/dm/device-internal.h
> +++ b/include/dm/device-internal.h
> @@ -120,6 +120,21 @@ int device_unbind(struct udevice *dev);
> static inline int device_unbind(struct udevice *dev) { return 0; }
> #endif
>
> +/**
> + * device_chld_unbind() - Unbind all device's children from the
> device
> + *
> + * On error, the function continues to unbind all children, and
> reports the
> + * first error.
> + *
> + * @dev: The device that is to be stripped of its children
> + * @return 0 on success, -ve on error
> + */
> +#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
> +int device_chld_unbind(struct udevice *dev);
> +#else
> +static inline int device_chld_unbind(struct udevice *dev) { return
> 0; } +#endif
> +
> #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
> void device_free(struct udevice *dev);
> #else
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180607/ca93dfc6/attachment.sig>
More information about the U-Boot
mailing list