mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 04:34:22 +08:00
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:
commit
9c29afe0cc
@ -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"
|
||||
|
@ -46,3 +46,12 @@
|
||||
&cpsw_port2 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&usbss0 {
|
||||
bootph-all;
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
dr_mode = "peripheral";
|
||||
bootph-all;
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
29
configs/am62x_a53_usbdfu.config
Normal file
29
configs/am62x_a53_usbdfu.config
Normal 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
|
@ -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>
|
||||
|
@ -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>
|
||||
|
28
configs/am62x_r5_usbdfu.config
Normal file
28
configs/am62x_r5_usbdfu.config
Normal 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
|
@ -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
|
||||
----------------
|
||||
|
@ -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
|
||||
----------------
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
125
drivers/usb/dwc3/dwc3-am62.c
Normal file
125
drivers/usb/dwc3/dwc3-am62.c
Normal 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),
|
||||
};
|
Loading…
Reference in New Issue
Block a user