Merge patch series "Add DFU and usb boot for TI am62x SK and beagleplay"

Martyn Welch <martyn.welch@collabora.com> says:

This series adds DFU support for TI AM62 SK and beagleplay boards.

I have picked this series up from Sjoerd due to time constraints.

Since the last revision:
* Removed dwc3 mode setting in favour of reinstating forced peripheral
  mode for usb0
* Use of config fragments for both r5 and a53 DFU configuration to
  reduce duplication
* Typographical improvements to documentation

We plan to also submit the dts changes to linux so that those can be
dropped again in the near future (hopefully)
This commit is contained in:
Tom Rini 2024-05-15 10:45:10 -06:00
commit 9c29afe0cc
13 changed files with 272 additions and 1 deletions

View File

@ -54,6 +54,15 @@
>;
};
&usbss0 {
bootph-all;
};
&usb0 {
dr_mode = "peripheral";
bootph-all;
};
#ifdef CONFIG_TARGET_AM625_A53_BEAGLEPLAY
#define SPL_NODTB "spl/u-boot-spl-nodtb.bin"

View File

@ -46,3 +46,12 @@
&cpsw_port2 {
status = "disabled";
};
&usbss0 {
bootph-all;
};
&usb0 {
dr_mode = "peripheral";
bootph-all;
};

View File

@ -1,5 +1,6 @@
#include <env/ti/ti_common.env>
#include <env/ti/mmc.env>
#include <env/ti/k3_dfu.env>
name_kern=Image
console=ttyS2,115200n8

View File

@ -1,5 +1,6 @@
#include <env/ti/ti_common.env>
#include <env/ti/mmc.env>
#include <env/ti/k3_dfu.env>
name_kern=Image
console=ttyS2,115200n8

View File

@ -0,0 +1,29 @@
CONFIG_SYS_MALLOC_LEN=0x2000000
CONFIG_SPL_ENV_SUPPORT=y
CONFIG_SPL_RAM_SUPPORT=y
CONFIG_SPL_RAM_DEVICE=y
CONFIG_SPL_USB_GADGET=y
CONFIG_SPL_DFU=y
CONFIG_CMD_DFU=y
CONFIG_CMD_USB=y
CONFIG_SYSCON=y
CONFIG_SPL_SYSCON=y
CONFIG_DFU_MMC=y
CONFIG_DFU_RAM=y
CONFIG_SYS_DFU_DATA_BUF_SIZE=0x5000
CONFIG_SYS_DFU_MAX_FILE_SIZE=0x800000
CONFIG_USB=y
CONFIG_DM_USB_GADGET=y
CONFIG_SPL_DM_USB_GADGET=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GENERIC=y
CONFIG_SPL_USB_DWC3_GENERIC=y
CONFIG_SPL_USB_DWC3_AM62=y
CONFIG_USB_DWC3_AM62=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
CONFIG_USB_GADGET_VENDOR_NUM=0x0451
CONFIG_USB_GADGET_PRODUCT_NUM=0x6165
CONFIG_USB_GADGET_DOWNLOAD=y

View File

@ -121,3 +121,5 @@ CONFIG_EXT4_WRITE=y
CONFIG_FS_FAT_MAX_CLUSTSIZE=16384
CONFIG_LZO=y
CONFIG_EFI_SET_TIME=y
#include <configs/am62x_a53_usbdfu.config>

View File

@ -68,6 +68,7 @@ CONFIG_SPL_OF_TRANSLATE=y
CONFIG_CLK=y
CONFIG_SPL_CLK=y
CONFIG_CLK_TI_SCI=y
CONFIG_DFU_SF=y
CONFIG_DMA_CHANNELS=y
CONFIG_TI_K3_NAVSS_UDMA=y
CONFIG_TI_SCI_PROTOCOL=y
@ -111,3 +112,5 @@ CONFIG_SPL_SYSRESET=y
CONFIG_SYSRESET_TI_SCI=y
CONFIG_FS_FAT_MAX_CLUSTSIZE=16384
CONFIG_EFI_SET_TIME=y
#include <configs/am62x_a53_usbdfu.config>

View File

@ -0,0 +1,28 @@
CONFIG_SPL_ENV_SUPPORT=y
CONFIG_SYSCON=y
CONFIG_SPL_SYSCON=y
CONFIG_SYS_DFU_DATA_BUF_SIZE=0x5000
CONFIG_MISC=y
CONFIG_USB=y
CONFIG_DM_USB_GADGET=y
CONFIG_SPL_DM_USB_GADGET=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GENERIC=y
CONFIG_SPL_USB_DWC3_GENERIC=y
CONFIG_SPL_USB_DWC3_AM62=y
CONFIG_USB_GADGET=y
CONFIG_SPL_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
CONFIG_USB_GADGET_VENDOR_NUM=0x0451
CONFIG_USB_GADGET_PRODUCT_NUM=0x6165
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_SPL_DFU=y
# CONFIG_SPL_MMC is not set
# CONFIG_SPL_FS_FAT is not set
# CONFIG_SPL_LIBDISK_SUPPORT is not set
# CONFIG_SPL_SPI is not set
# CONFIG_SPL_SYS_MALLOC is not set
# CONFIG_CMD_GPT is not set
# CONFIG_CMD_MMC is not set
# CONFIG_CMD_FAT is not set
# CONFIG_MMC_SDHCI is not set

View File

@ -268,7 +268,19 @@ for details.
- USB Device Firmware Upgrade (DFU) mode
To switch to SD card boot mode, hold the USR button while powering on
with Type-C power supply, then release when power LED lights up.
with a USB type C power supply, then release when power LED lights up.
DFU based boot
--------------
To boot the board over DFU, ensure there is no SD card inserted with a
bootloader. Hold the USR switch while plugging into the type C to boot into DFU
mode. After power-on the build artifacts needs to be uploaded one by one with a
tool like dfu-util.
.. include:: ../ti/am62x_sk.rst
:start-after: .. am62x_evm_rst_include_start_dfu_boot
:end-before: .. am62x_evm_rst_include_end_dfu_boot
Debugging U-Boot
----------------

View File

@ -105,6 +105,20 @@ Set the variables corresponding to this platform:
* 3.1 R5:
.. include:: ../ti/k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5
* 3.1.1 Alternative build of R5 for DFU boot:
As the SPL size can get too big when building with support for booting both
from local storage *and* DFU an extra config fragment should be used to enable
DFU support (and disable storage support)
.. prompt:: bash $
export UBOOT_CFG_CORTEXR="${UBOOT_CFG_CORTEXR} am62x_r5_usbdfu.config"
.. include:: ../ti/k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5
@ -251,6 +265,29 @@ https://www.ti.com/lit/pdf/spruiv7 under the `Boot Mode Pins` section.
For SW2 and SW1, the switch state in the "ON" position = 1.
DFU based boot
--------------
To boot the board over DFU, set the switches to DFU mode and connect to the
USB type C DRD port on the board. After power-on the build artifacts needs to be
uploaded one by one with a tool like dfu-util.
.. am62x_evm_rst_include_start_dfu_boot
The initial ROM will have a DFU alt named `bootloader` for the initial R5 spl
upload. The next stages as exposed by U-Boot have target alts matching the name
of the artifacts, for these a USB reset has to be done after each upload.
When using dfu-util the following commands can be used to boot to a U-Boot shell:
.. prompt:: bash $
dfu-util -a bootloader -D tiboot3.bin
dfu-util -R -a tispl -D tispl.bin
dfu-util -R -a u-boot.img -D u-boot.img
.. am62x_evm_rst_include_end_dfu_boot
Debugging U-Boot
----------------

View File

@ -37,6 +37,20 @@ config SPL_USB_DWC3_GENERIC
Select this for Xilinx ZynqMP and similar Platforms.
This wrapper supports Host and Peripheral operation modes.
config SPL_USB_DWC3_AM62
bool "TI AM62 USB wrapper"
depends on SPL_DM_USB && SPL_USB_DWC3_GENERIC && SPL_SYSCON
help
Select this for TI AM62 Platforms.
This wrapper supports Host and Peripheral operation modes.
config USB_DWC3_AM62
bool "TI AM62 USB wrapper"
depends on DM_USB && USB_DWC3_GENERIC && SYSCON
help
Select this for TI AM62 Platforms.
This wrapper supports Host and Peripheral operation modes.
config USB_DWC3_MESON_G12A
bool "Amlogic Meson G12A USB wrapper"
depends on DM_USB && USB_DWC3 && ARCH_MESON

View File

@ -6,6 +6,7 @@ dwc3-y := core.o
obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
obj-$(CONFIG_$(SPL_)USB_DWC3_AM62) += dwc3-am62.o
obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
obj-$(CONFIG_USB_DWC3_MESON_G12A) += dwc3-meson-g12a.o
obj-$(CONFIG_USB_DWC3_MESON_GXL) += dwc3-meson-gxl.o

View File

@ -0,0 +1,125 @@
// SPDX-License-Identifier: GPL-2.0
/*
* TI AM62 specific glue layer for DWC3
*/
#include <dm.h>
#include <dm/device_compat.h>
#include <regmap.h>
#include <syscon.h>
#include <asm/io.h>
#include "dwc3-generic.h"
#define USBSS_MODE_CONTROL 0x1c
#define USBSS_PHY_CONFIG 0x8
#define USBSS_PHY_VBUS_SEL_MASK GENMASK(2, 1)
#define USBSS_PHY_VBUS_SEL_SHIFT 1
#define USBSS_MODE_VALID BIT(0)
#define PHY_PLL_REFCLK_MASK GENMASK(3, 0)
static const int dwc3_ti_am62_rate_table[] = { /* in KHZ */
9600,
10000,
12000,
19200,
20000,
24000,
25000,
26000,
38400,
40000,
58000,
50000,
52000,
};
static void dwc3_ti_am62_glue_configure(struct udevice *dev, int index,
enum usb_dr_mode mode)
{
struct clk usb2_refclk;
int rate_code, i, ret;
unsigned long rate;
u32 reg;
void *usbss;
bool vbus_divider;
struct regmap *syscon;
struct ofnode_phandle_args args;
usbss = dev_remap_addr_index(dev, 0);
if (IS_ERR(usbss)) {
dev_err(dev, "can't map IOMEM resource\n");
return;
}
ret = clk_get_by_name(dev, "ref", &usb2_refclk);
if (ret) {
dev_err(dev, "can't get usb2_refclk\n");
return;
}
/* Calculate the rate code */
rate = clk_get_rate(&usb2_refclk);
rate /= 1000; /* To KHz */
for (i = 0; i < ARRAY_SIZE(dwc3_ti_am62_rate_table); i++) {
if (dwc3_ti_am62_rate_table[i] == rate)
break;
}
if (i == ARRAY_SIZE(dwc3_ti_am62_rate_table)) {
dev_err(dev, "unsupported usb2_refclk rate: %lu KHz\n", rate);
return;
}
rate_code = i;
/* Read the syscon property */
syscon = syscon_regmap_lookup_by_phandle(dev, "ti,syscon-phy-pll-refclk");
if (IS_ERR(syscon)) {
dev_err(dev, "unable to get ti,syscon-phy-pll-refclk regmap\n");
return;
}
ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "ti,syscon-phy-pll-refclk", NULL, 1,
0, &args);
if (ret)
return;
/* Program PHY PLL refclk by reading syscon property */
ret = regmap_update_bits(syscon, args.args[0], PHY_PLL_REFCLK_MASK, rate_code);
if (ret) {
dev_err(dev, "failed to set phy pll reference clock rate\n");
return;
}
/* VBUS divider select */
reg = readl(usbss + USBSS_PHY_CONFIG);
vbus_divider = dev_read_bool(dev, "ti,vbus-divider");
if (vbus_divider)
reg |= 1 << USBSS_PHY_VBUS_SEL_SHIFT;
writel(reg, usbss + USBSS_PHY_CONFIG);
/* Set mode valid */
reg = readl(usbss + USBSS_MODE_CONTROL);
reg |= USBSS_MODE_VALID;
writel(reg, usbss + USBSS_MODE_CONTROL);
}
struct dwc3_glue_ops ti_am62_ops = {
.glue_configure = dwc3_ti_am62_glue_configure,
};
static const struct udevice_id dwc3_am62_match[] = {
{ .compatible = "ti,am62-usb", .data = (ulong)&ti_am62_ops },
{ /* sentinel */ }
};
U_BOOT_DRIVER(dwc3_am62_wrapper) = {
.name = "dwc3-am62",
.id = UCLASS_SIMPLE_BUS,
.of_match = dwc3_am62_match,
.bind = dwc3_glue_bind,
.probe = dwc3_glue_probe,
.remove = dwc3_glue_remove,
.plat_auto = sizeof(struct dwc3_glue_data),
};