[PATCH v2 0/2] AM62A DWC3: Add support for USB DFU boot in OTG mode
Siddharth Vadapalli
s-vadapalli at ti.com
Tue Dec 3 10:37:43 CET 2024
Hello,
This series adds support for USB DFU boot on TI's AM62A SoC which has
two instances of DWC3 USB Controllers namely USB0 and USB1. The USB0
instance of the USB Controller supports USB DFU boot:
ROM => tiboot3.bin => tispl.bin => u-boot.img
USB DFU Boot requires the USB Controller to be configured for Gadget
mode of operation. Since the USB0 instance of the DWC3 USB Controller
supports both Host and Gadget modes of operation via the Type-C interface
on the AM62A7-SK board, the device-tree specifies the "dr_mode" as "OTG".
The function dwc3_generic_probe() is invoked by either of:
1. dwc3_generic_peripheral_probe()
2. dwc3_generic_host_probe()
on the basis of the command executed by the user for either device or
host mode of operation respectively. Currently, dwc3_generic_probe()
sets the mode based on the device-tree rather than setting it on the
basis of the caller. While this might be correct when the mode is "host"
or "peripheral" in the device-tree, it is wrong when the mode is "otg"
in the device-tree. It is wrong because of two reasons:
1. There is no OTG state machine in U-Boot. Hence the role will never
switch to the correct one eventually among host or peripheral.
2. dr_mode = "otg" results in the "PRTCAPDIR" field of the "GCTL"
register of the USB Controller being set to 11b. According to the
datasheet of the Designware USB Dual Role Controller, "PRTCAPDIR"
should never be set to any value other than 01b (Host) and 10b (Device).
Quoting the datasheet:
"Programming this field with random data causes the controller
to keep toggling between the host mode and the device mode."
Therefore, in order to avoid programming 11b in "PRTCAPDIR", and, given
that the caller specifies the intended role, rather than simply using
the "dr_mode" property to set the role, set the role on the basis of the
caller (intended role) and the device-tree (platform support).
This could be extended further to utilize the USB ID pin to determine
the expected role, but that can be implemented as an incremental
feature.
v1:
https://patchwork.ozlabs.org/project/uboot/list/?series=434253&state=%2A&archive=both
Changes since v1:
- Rebased series on commit
acab6e78aca common: relocate fdt_blob in global_data for FDTSRC_EMBED case
of the master branch of U-Boot.
- Based on the feedback received on the v1 series, the device-tree
specified role is also taken into account in dwc3_generic_probe(), in
addition to the caller of dwc3_generic_probe().
In addition to the patches in this series, the following device-tree
changes will be required to test USB DFU on AM62A (bootph-all property
to be added to ensure that USB Controller is present at all stages
for DFU Boot):
https://gist.github.com/Siddharth-Vadapalli-at-TI/53ba02cb0ff4a09c47e920d08247065f
The above device-tree changes will be made to the Linux device-tree,
which shall ensure that the same shall be a part of U-Boot device-tree
eventually.
The USB DFU config fragments for AM62x have been used for enabling
USB DFU boot on AM62a as follows:
R5 => am62ax_evm_r5_defconfig + am62x_r5_usbdfu.config
A53 => am62ax_evm_a53_defconfig + am62x_a53_usbdfu.config
Logs validating USB DFU boot with this series on AM62A7-SK:
https://gist.github.com/Siddharth-Vadapalli-at-TI/13f9a539ef3297ab2822bc1bc1976a7f
Regards,
Siddharth.
Siddharth Vadapalli (2):
usb: dwc3-generic: set "mode" based on caller of dwc3_generic_probe()
board: ti: am62ax: env: include environment for DFU
board/ti/am62ax/am62ax.env | 1 +
drivers/usb/dwc3/dwc3-generic.c | 21 +++++++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)
--
2.43.0
More information about the U-Boot
mailing list