[U-Boot] [PATCH 0/3] rockchip: rv1108: support USB OTG and Host ports on evb-rv1108

This patch support USB OTG and Host ports on evb-rv1108 board. With this patch, we can use fastboot over USB and mount USB mass storage on OTG and Host ports.
William Wu (3): configs: rockchip: add USB configs for evb-rv1108 board ARM: dts: rockchip: add USB nodes for evb-rv1108 rockchip: evb-rv1108: add usb init function for dwc2 gadget
arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 +++++++++++++++++ board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ configs/evb-rv1108_defconfig | 22 ++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 5 files changed, 118 insertions(+)

This patch adds USB configs to support the USB OTG port(consist of DWC2 controller) and the USB Host port(consist of EHCI and OHCI controllers) on evb-rv1108 board, and also support fastboot over USB and USB mass storage.
Signed-off-by: William Wu william.wu@rock-chips.com --- configs/evb-rv1108_defconfig | 22 ++++++++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 2 files changed, 25 insertions(+)
diff --git a/configs/evb-rv1108_defconfig b/configs/evb-rv1108_defconfig index 3deea7c..496bfc8 100644 --- a/configs/evb-rv1108_defconfig +++ b/configs/evb-rv1108_defconfig @@ -6,8 +6,16 @@ CONFIG_DEFAULT_DEVICE_TREE="rv1108-evb" CONFIG_DEBUG_UART=y CONFIG_ENV_IS_NOWHERE=y # CONFIG_DISPLAY_CPUINFO is not set +CONFIG_FASTBOOT=y +CONFIG_USB_FUNCTION_FASTBOOT=y +CONFIG_CMD_FASTBOOT=y +CONFIG_FASTBOOT_BUF_ADDR=0x62000000 +CONFIG_FASTBOOT_BUF_SIZE=0x08000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=1 # CONFIG_CMD_IMLS is not set CONFIG_CMD_SF=y +CONFIG_CMD_USB=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y CONFIG_CMD_TIME=y @@ -27,10 +35,24 @@ CONFIG_ETH_DESIGNWARE=y CONFIG_GMAC_ROCKCHIP=y CONFIG_PINCTRL=y CONFIG_PINCTRL_ROCKCHIP_RV1108=y +CONFIG_DM_REGULATOR_FIXED=y CONFIG_BAUDRATE=1500000 # CONFIG_SPL_SERIAL_PRESENT is not set CONFIG_DEBUG_UART_BASE=0x10210000 CONFIG_DEBUG_UART_CLOCK=24000000 CONFIG_DEBUG_UART_SHIFT=2 CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC2=y +CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_G_DNL_MANUFACTURER="Rockchip" +CONFIG_G_DNL_VENDOR_NUM=0x2207 +CONFIG_G_DNL_PRODUCT_NUM=0x110a CONFIG_ERRNO_STR=y diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h index 2b63abc..f6fefaa 100644 --- a/include/configs/rv1108_common.h +++ b/include/configs/rv1108_common.h @@ -29,4 +29,7 @@ #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + 0x100000) #define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x2000000)
+/* rockchip ohci host driver */ +#define CONFIG_USB_OHCI_NEW +#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 1 #endif

On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch adds USB configs to support the USB OTG port(consist of DWC2 controller) and the USB Host port(consist of EHCI and OHCI controllers) on evb-rv1108 board, and also support fastboot over USB and USB mass storage.
Signed-off-by: William Wu william.wu@rock-chips.com
configs/evb-rv1108_defconfig | 22 ++++++++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 2 files changed, 25 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

This patch adds USB configs to support the USB OTG port(consist of DWC2 controller) and the USB Host port(consist of EHCI and OHCI controllers) on evb-rv1108 board, and also support fastboot over USB and USB mass storage.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org
configs/evb-rv1108_defconfig | 22 ++++++++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 2 files changed, 25 insertions(+)
Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com

This patch adds USB configs to support the USB OTG port(consist of DWC2 controller) and the USB Host port(consist of EHCI and OHCI controllers) on evb-rv1108 board, and also support fastboot over USB and USB mass storage.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
configs/evb-rv1108_defconfig | 22 ++++++++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 2 files changed, 25 insertions(+)
Reviewed-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com

This patch adds USB configs to support the USB OTG port(consist of DWC2 controller) and the USB Host port(consist of EHCI and OHCI controllers) on evb-rv1108 board, and also support fastboot over USB and USB mass storage.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com Reviewed-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
configs/evb-rv1108_defconfig | 22 ++++++++++++++++++++++ include/configs/rv1108_common.h | 3 +++ 2 files changed, 25 insertions(+)
Applied to u-boot-rockchip/next, thanks!

This patch adds USB OTG/EHCI/OHCI nodes for evb-rv1108 USB ports.
Signed-off-by: William Wu william.wu@rock-chips.com --- arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
diff --git a/arch/arm/dts/rv1108-evb.dts b/arch/arm/dts/rv1108-evb.dts index 0128dd8..2b221b6 100644 --- a/arch/arm/dts/rv1108-evb.dts +++ b/arch/arm/dts/rv1108-evb.dts @@ -20,6 +20,15 @@ chosen { stdout-path = "serial2:1500000n8"; }; + + vcc5v0_otg: vcc5v0-otg-drv { + compatible = "regulator-fixed"; + enable-active-high; + regulator-name = "vcc5v0_otg"; + gpio = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; };
&gmac { @@ -52,3 +61,16 @@ &uart2 { status = "okay"; }; + +&usb20_otg { + vbus-supply = <&vcc5v0_otg>; + status = "okay"; +}; + +&usb_host_ehci { + status = "okay"; +}; + +&usb_host_ohci { + status = "okay"; +}; diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi index 77ca24e..3153dfe 100644 --- a/arch/arm/dts/rv1108.dtsi +++ b/arch/arm/dts/rv1108.dtsi @@ -175,6 +175,30 @@ status = "disabled"; };
+ usb_host_ehci: usb@30140000 { + compatible = "generic-ehci"; + reg = <0x30140000 0x20000>; + interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + }; + + usb_host_ohci: usb@30160000 { + compatible = "generic-ohci"; + reg = <0x30160000 0x20000>; + interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + }; + + usb20_otg: usb@30180000 { + compatible = "rockchip,rv1108-usb", "rockchip,rk3288-usb", + "snps,dwc2"; + reg = <0x30180000 0x40000>; + interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>; + hnp-srp-disable; + dr_mode = "otg"; + status = "disabled"; + }; + sfc: sfc@301c0000 { compatible = "rockchip,sfc"; reg = <0x301c0000 0x200>;

On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch adds USB OTG/EHCI/OHCI nodes for evb-rv1108 USB ports.
Signed-off-by: William Wu william.wu@rock-chips.com
arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

This patch adds USB OTG/EHCI/OHCI nodes for evb-rv1108 USB ports.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org
arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com

This patch adds USB OTG/EHCI/OHCI nodes for evb-rv1108 USB ports.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
Reviewed-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com

This patch adds USB OTG/EHCI/OHCI nodes for evb-rv1108 USB ports.
Signed-off-by: William Wu william.wu@rock-chips.com Reviewed-by: Simon Glass sjg@chromium.org Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com Reviewed-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
arch/arm/dts/rv1108-evb.dts | 22 ++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+)
Applied to u-boot-rockchip/next, thanks!

This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com --- board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0; } + +#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h> + +static struct dwc2_plat_otg_data rv1108_otg_data = { + .rx_fifo_sz = 512, + .np_tx_fifo_sz = 16, + .tx_fifo_sz = 128, +}; + +int board_usb_init(int index, enum usb_init_type init) +{ + int node; + const char *mode; + bool matched = false; + const void *blob = gd->fdt_blob; + + /* find the usb_otg node */ + node = fdt_node_offset_by_compatible(blob, -1, + "rockchip,rv1108-usb"); + + while (node > 0) { + mode = fdt_getprop(blob, node, "dr_mode", NULL); + if (mode && strcmp(mode, "otg") == 0) { + matched = true; + break; + } + + node = fdt_node_offset_by_compatible(blob, node, + "rockchip,rv1108-usb"); + } + if (!matched) { + debug("Not found usb_otg device\n"); + return -ENODEV; + } + + rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg"); + + return dwc2_udc_probe(&rv1108_otg_data); +} + +int board_usb_cleanup(int index, enum usb_init_type init) +{ + return 0; +} +#endif

On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0;
}
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h>
+static struct dwc2_plat_otg_data rv1108_otg_data = {
.rx_fifo_sz = 512,
.np_tx_fifo_sz = 16,
.tx_fifo_sz = 128,
+};
+int board_usb_init(int index, enum usb_init_type init) +{
int node;
const char *mode;
bool matched = false;
const void *blob = gd->fdt_blob;
/* find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1,
"rockchip,rv1108-usb");
while (node > 0) {
mode = fdt_getprop(blob, node, "dr_mode", NULL);
if (mode && strcmp(mode, "otg") == 0) {
matched = true;
break;
}
node = fdt_node_offset_by_compatible(blob, node,
"rockchip,rv1108-usb");
}
if (!matched) {
debug("Not found usb_otg device\n");
return -ENODEV;
}
rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
return dwc2_udc_probe(&rv1108_otg_data);
These USB init things have been bothering me for a while. Do you think this could be changed into a driver that you could probe with device_probe()? Then much of the code in here would not be needed and it might be easier to tidy it up when we have proper driver-model support for USB device mode.
+}
+int board_usb_cleanup(int index, enum usb_init_type init) +{
return 0;
+}
+#endif
2.0.0
Regards, Simon

Dear Simon,
在 2017年08月14日 05:35, Simon Glass 写道:
On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0;
}
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h>
+static struct dwc2_plat_otg_data rv1108_otg_data = {
.rx_fifo_sz = 512,
.np_tx_fifo_sz = 16,
.tx_fifo_sz = 128,
+};
+int board_usb_init(int index, enum usb_init_type init) +{
int node;
const char *mode;
bool matched = false;
const void *blob = gd->fdt_blob;
/* find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1,
"rockchip,rv1108-usb");
while (node > 0) {
mode = fdt_getprop(blob, node, "dr_mode", NULL);
if (mode && strcmp(mode, "otg") == 0) {
matched = true;
break;
}
node = fdt_node_offset_by_compatible(blob, node,
"rockchip,rv1108-usb");
}
if (!matched) {
debug("Not found usb_otg device\n");
return -ENODEV;
}
rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
return dwc2_udc_probe(&rv1108_otg_data);
These USB init things have been bothering me for a while. Do you think this could be changed into a driver that you could probe with device_probe()? Then much of the code in here would not be needed and it might be easier to tidy it up when we have proper driver-model support for USB device mode.
Yes, on rockchip platforms, it did most of the same USB init things in different board special drivers. I think may be we can try to optimize the code in two different ways.
Method1. 1. Move the USB init things from board_usb_init(), just simply call dwc2_udc_probe(). 2. Create a new USB init function in drivers/usb/gadget/dwc2_udc_otg.c, and call it in dwc2_udc_probe(). 3. Use fdt (Flat Device Tree manipulation ) to parse the dts, and get the regs_phy, regs_otg and so on.
Method2. Just like your suggestion, use driver-model method to probe with device_probe, actually, I don't know much about the driver-model, as far as I know, we may need to do the following work: 1. Create a new uclass id for usb udc, and declare a new uclass_driver with UCLASS_DRIVER, and also need to create a new U-boot driver for dwc2 controller with U_BOOT_DRIVER. 2. How to call device_probe()? Maybe it's better to create a new driver (like drivers/usb/host/usb-uclass.c) in drivers/usb/gadget to match different usb gadget controllers, and wrap the device_probe() to a new function (like udc_pre_probe()), and then different udc driver can call it, e.g. dwc2_udc_probe() --> udc_pre_probe() --> device_probe()
In summary, method1 is easily to be done, but method2 is more generic.
I hope I haven't misunderstood your proposal, and hope to get your reply. Thank you!
+}
+int board_usb_cleanup(int index, enum usb_init_type init) +{
return 0;
+}
+#endif
2.0.0
Regards, Simon

Dear Simon,
在 2017年08月14日 18:05, wlf 写道:
Dear Simon,
在 2017年08月14日 05:35, Simon Glass 写道:
On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0;
}
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h>
+static struct dwc2_plat_otg_data rv1108_otg_data = {
.rx_fifo_sz = 512,
.np_tx_fifo_sz = 16,
.tx_fifo_sz = 128,
+};
+int board_usb_init(int index, enum usb_init_type init) +{
int node;
const char *mode;
bool matched = false;
const void *blob = gd->fdt_blob;
/* find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1,
- "rockchip,rv1108-usb");
while (node > 0) {
mode = fdt_getprop(blob, node, "dr_mode", NULL);
if (mode && strcmp(mode, "otg") == 0) {
matched = true;
break;
}
node = fdt_node_offset_by_compatible(blob, node,
- "rockchip,rv1108-usb");
}
if (!matched) {
debug("Not found usb_otg device\n");
return -ENODEV;
}
rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
return dwc2_udc_probe(&rv1108_otg_data);
These USB init things have been bothering me for a while. Do you think this could be changed into a driver that you could probe with device_probe()? Then much of the code in here would not be needed and it might be easier to tidy it up when we have proper driver-model support for USB device mode.
Yes, on rockchip platforms, it did most of the same USB init things in different board special drivers. I think may be we can try to optimize the code in two different ways.
Method1.
- Move the USB init things from board_usb_init(), just simply call
dwc2_udc_probe(). 2. Create a new USB init function in drivers/usb/gadget/dwc2_udc_otg.c, and call it in dwc2_udc_probe(). 3. Use fdt (Flat Device Tree manipulation ) to parse the dts, and get the regs_phy, regs_otg and so on.
Method2. Just like your suggestion, use driver-model method to probe with device_probe, actually, I don't know much about the driver-model, as far as I know, we may need to do the following work:
- Create a new uclass id for usb udc, and declare a new uclass_driver
with UCLASS_DRIVER, and also need to create a new U-boot driver for dwc2 controller with U_BOOT_DRIVER. 2. How to call device_probe()? Maybe it's better to create a new driver (like drivers/usb/host/usb-uclass.c) in drivers/usb/gadget to match different usb gadget controllers, and wrap the device_probe() to a new function (like udc_pre_probe()), and then different udc driver can call it, e.g. dwc2_udc_probe() --> udc_pre_probe() --> device_probe()
In summary, method1 is easily to be done, but method2 is more generic.
I hope I haven't misunderstood your proposal, and hope to get your reply. Thank you!
Do you have any idea about this USB init patch?
Thank you!
+}
+int board_usb_cleanup(int index, enum usb_init_type init) +{
return 0;
+}
+#endif
2.0.0
Regards, Simon

Hi,
On 14 August 2017 at 04:05, wlf wulf@rock-chips.com wrote:
Dear Simon,
在 2017年08月14日 05:35, Simon Glass 写道:
On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0;
}
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h>
+static struct dwc2_plat_otg_data rv1108_otg_data = {
.rx_fifo_sz = 512,
.np_tx_fifo_sz = 16,
.tx_fifo_sz = 128,
+};
+int board_usb_init(int index, enum usb_init_type init) +{
int node;
const char *mode;
bool matched = false;
const void *blob = gd->fdt_blob;
/* find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1,
"rockchip,rv1108-usb");
while (node > 0) {
mode = fdt_getprop(blob, node, "dr_mode", NULL);
if (mode && strcmp(mode, "otg") == 0) {
matched = true;
break;
}
node = fdt_node_offset_by_compatible(blob, node,
"rockchip,rv1108-usb");
}
if (!matched) {
debug("Not found usb_otg device\n");
return -ENODEV;
}
rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
return dwc2_udc_probe(&rv1108_otg_data);
These USB init things have been bothering me for a while. Do you think this could be changed into a driver that you could probe with device_probe()? Then much of the code in here would not be needed and it might be easier to tidy it up when we have proper driver-model support for USB device mode.
Yes, on rockchip platforms, it did most of the same USB init things in different board special drivers. I think may be we can try to optimize the code in two different ways.
Method1.
- Move the USB init things from board_usb_init(), just simply call
dwc2_udc_probe(). 2. Create a new USB init function in drivers/usb/gadget/dwc2_udc_otg.c, and call it in dwc2_udc_probe(). 3. Use fdt (Flat Device Tree manipulation ) to parse the dts, and get the regs_phy, regs_otg and so on.
Method2. Just like your suggestion, use driver-model method to probe with device_probe, actually, I don't know much about the driver-model, as far as I know, we may need to do the following work:
- Create a new uclass id for usb udc, and declare a new uclass_driver with
UCLASS_DRIVER, and also need to create a new U-boot driver for dwc2 controller with U_BOOT_DRIVER. 2. How to call device_probe()? Maybe it's better to create a new driver (like drivers/usb/host/usb-uclass.c) in drivers/usb/gadget to match different usb gadget controllers, and wrap the device_probe() to a new function (like udc_pre_probe()), and then different udc driver can call it, e.g. dwc2_udc_probe() --> udc_pre_probe() --> device_probe()
In summary, method1 is easily to be done, but method2 is more generic.
I hope I haven't misunderstood your proposal, and hope to get your reply. Thank you!
Yes I think method 2 is better.
You will have to call device_probe() as you say. I think what you suggest is reasonable, since something has to decide that the USB device mode should be started.
Regards, Simon

Dear Simon,
在 2017年09月09日 12:54, Simon Glass 写道:
Hi,
On 14 August 2017 at 04:05, wlf wulf@rock-chips.com wrote:
Dear Simon,
在 2017年08月14日 05:35, Simon Glass 写道:
On 8 August 2017 at 21:36, William Wu william.wu@rock-chips.com wrote:
This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/board/rockchip/evb_rv1108/evb_rv1108.c b/board/rockchip/evb_rv1108/evb_rv1108.c index fe37eac..8ca5ee6 100644 --- a/board/rockchip/evb_rv1108/evb_rv1108.c +++ b/board/rockchip/evb_rv1108/evb_rv1108.c @@ -50,3 +50,50 @@ int dram_init_banksize(void)
return 0;
}
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <usb.h> +#include <usb/dwc2_udc.h>
+static struct dwc2_plat_otg_data rv1108_otg_data = {
.rx_fifo_sz = 512,
.np_tx_fifo_sz = 16,
.tx_fifo_sz = 128,
+};
+int board_usb_init(int index, enum usb_init_type init) +{
int node;
const char *mode;
bool matched = false;
const void *blob = gd->fdt_blob;
/* find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1,
"rockchip,rv1108-usb");
while (node > 0) {
mode = fdt_getprop(blob, node, "dr_mode", NULL);
if (mode && strcmp(mode, "otg") == 0) {
matched = true;
break;
}
node = fdt_node_offset_by_compatible(blob, node,
"rockchip,rv1108-usb");
}
if (!matched) {
debug("Not found usb_otg device\n");
return -ENODEV;
}
rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
return dwc2_udc_probe(&rv1108_otg_data);
These USB init things have been bothering me for a while. Do you think this could be changed into a driver that you could probe with device_probe()? Then much of the code in here would not be needed and it might be easier to tidy it up when we have proper driver-model support for USB device mode.
Yes, on rockchip platforms, it did most of the same USB init things in different board special drivers. I think may be we can try to optimize the code in two different ways.
Method1.
- Move the USB init things from board_usb_init(), just simply call
dwc2_udc_probe(). 2. Create a new USB init function in drivers/usb/gadget/dwc2_udc_otg.c, and call it in dwc2_udc_probe(). 3. Use fdt (Flat Device Tree manipulation ) to parse the dts, and get the regs_phy, regs_otg and so on.
Method2. Just like your suggestion, use driver-model method to probe with device_probe, actually, I don't know much about the driver-model, as far as I know, we may need to do the following work:
- Create a new uclass id for usb udc, and declare a new uclass_driver with
UCLASS_DRIVER, and also need to create a new U-boot driver for dwc2 controller with U_BOOT_DRIVER. 2. How to call device_probe()? Maybe it's better to create a new driver (like drivers/usb/host/usb-uclass.c) in drivers/usb/gadget to match different usb gadget controllers, and wrap the device_probe() to a new function (like udc_pre_probe()), and then different udc driver can call it, e.g. dwc2_udc_probe() --> udc_pre_probe() --> device_probe()
In summary, method1 is easily to be done, but method2 is more generic.
I hope I haven't misunderstood your proposal, and hope to get your reply. Thank you!
Yes I think method 2 is better.
You will have to call device_probe() as you say. I think what you suggest is reasonable, since something has to decide that the USB device mode should be started.
Thanks for your reply. I will try to update a new patch according to method 2.
Regards, Simon

This patch implements board_usb_init() for dwc2 gadget, it generally called from do_fastboot to do dwc2 udc probe and support fastboot over USB.
Signed-off-by: William Wu william.wu@rock-chips.com
board/rockchip/evb_rv1108/evb_rv1108.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
Acked-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
participants (4)
-
Philipp Tomsich
-
Simon Glass
-
William Wu
-
wlf