[U-Boot] [RFC] Adding spl_usb code to common area

This patch series adds the support to initialize the USB host controller scan for a USB mass storage device and load a file.
Currently only FAT image load is supported but I left the RAW image loading code in the file to further develop this.
This work was derived from the spl_mmc.c code

Add the ability to load a u-boot off a USB mass storage device from the SPL
Signed-off-by: Dan Murphy dmurphy@ti.com --- common/Makefile | 2 + common/spl/Makefile | 2 + common/spl/spl.c | 5 ++ common/spl/spl_usb.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/spl.h | 7 ++ spl/Makefile | 2 + 6 files changed, 197 insertions(+) create mode 100644 common/spl/spl_usb.c
diff --git a/common/Makefile b/common/Makefile index 74404be..5b062c0 100644 --- a/common/Makefile +++ b/common/Makefile @@ -203,6 +203,8 @@ obj-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o obj-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o obj-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o +obj-$(CONFIG_SPL_USB_SUPPORT) += usb.o usb_hub.o +obj-$(CONFIG_USB_STORAGE) += usb_storage.o else obj-y += env_nowhere.o endif diff --git a/common/spl/Makefile b/common/spl/Makefile index 5c0637b..9261ea9 100644 --- a/common/spl/Makefile +++ b/common/spl/Makefile @@ -16,4 +16,6 @@ obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o obj-$(CONFIG_SPL_ONENAND_SUPPORT) += spl_onenand.o obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o +obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o + endif diff --git a/common/spl/spl.c b/common/spl/spl.c index da31457..0645cee 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -205,6 +205,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2) spl_net_load_image("usb_ether"); break; #endif +#ifdef CONFIG_SPL_USB_SUPPORT + case BOOT_DEVICE_USB: + spl_usb_load_image(); + break; +#endif default: debug("SPL: Un-supported Boot Device\n"); hang(); diff --git a/common/spl/spl_usb.c b/common/spl/spl_usb.c new file mode 100644 index 0000000..94c442e --- /dev/null +++ b/common/spl/spl_usb.c @@ -0,0 +1,179 @@ +/* + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * Dan Murphy dmurphy@ti.com + * + * SPDX-License-Identifier: GPL-2.0+ + * + * Derived work from spl_mmc.c + */ + +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <usb.h> +#include <fat.h> +#include <version.h> +#include <image.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_USB_STORAGE +static int usb_stor_curr_dev = -1; /* current device */ +#endif + +static int usb_load_image_raw(block_dev_desc_t *stor_dev, unsigned long sector) +{ + unsigned long err; + u32 image_size_sectors; + struct image_header *header; + + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - + sizeof(struct image_header)); + + /* read image header to find the image size & load address */ + err = stor_dev->block_read(usb_stor_curr_dev, sector, 1, (ulong *)header); + if (err == 0) + goto end; + + if (image_get_magic(header) != IH_MAGIC) + return -1; + + spl_parse_image_header(header); + + /* convert size to sectors - round up + image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) / + mmc->read_bl_len;*/ + image_size_sectors = 0; + + /* Read the header too to avoid extra memcpy */ + err = stor_dev->block_read(usb_stor_curr_dev, sector, + image_size_sectors, (void *)spl_image.load_addr); + +end: +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + if (err == 0) + printf("spl: USB blk read err - %lu\n", err); +#endif + return (err == 0); + +} + +#ifdef CONFIG_SPL_OS_BOOT +static int usb_load_image_raw_os(struct usb_device *usb_dev) +{ + return -1; +} +#endif + +#ifdef CONFIG_SPL_FAT_SUPPORT +static int usb_load_image_fat(const char *filename) +{ + int err; + struct image_header *header; + + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - + sizeof(struct image_header)); + + err = file_fat_read(filename, header, sizeof(struct image_header)); + if (err <= 0) + goto end; + + spl_parse_image_header(header); + + err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); + +end: +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + if (err <= 0) + printf("spl: error reading image %s, err - %d\n", + filename, err); +#endif + + return (err <= 0); +} + +#ifdef CONFIG_SPL_OS_BOOT +static int usb_load_image_fat_os(struct usb_device *usb_dev) +{ + int err; + + err = file_fat_read(CONFIG_SPL_FAT_LOAD_ARGS_NAME, + (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); + if (err <= 0) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("spl: error reading image %s, err - %d\n", + CONFIG_SPL_FAT_LOAD_ARGS_NAME, err); +#endif + return -1; + } + + return usb_load_image_fat(CONFIG_SPL_FAT_LOAD_KERNEL_NAME); +} +#endif + +#endif + +void spl_usb_load_image(void) +{ + struct usb_device *usb_dev; + int err; + u32 boot_mode; + block_dev_desc_t *stor_dev; + + usb_stop(); + err = usb_init(); + if (err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("spl: usb init failed: err - %d\n", err); +#endif + hang(); + } else { +#ifdef CONFIG_USB_STORAGE + /* try to recognize storage devices immediately */ + usb_stor_curr_dev = usb_stor_scan(1); + stor_dev = usb_stor_get_dev(usb_stor_curr_dev); +#endif + } + + boot_mode = spl_boot_mode(); + if (boot_mode == USB_MODE_RAW) { + debug("boot mode - RAW\n"); +#ifdef CONFIG_SPL_OS_BOOT + if (spl_start_uboot() || usb_load_image_raw_os(usb_dev)) +#endif + err = usb_load_image_raw(stor_dev, + CONFIG_SYS_USB_MODE_U_BOOT_SECTOR); +#ifdef CONFIG_SPL_FAT_SUPPORT + } else if (boot_mode == USB_MODE_FAT) { + debug("boot mode - FAT\n"); + + err = fat_register_device(stor_dev, + CONFIG_SYS_USB_FAT_BOOT_PARTITION); + if (err) { + #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("spl: fat register err - %d\n", err); + #endif + hang(); + } + +#ifdef CONFIG_SPL_OS_BOOT + if (spl_start_uboot() || usb_load_image_fat_os(usb_dev)) +#endif + err = usb_load_image_fat(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); + if (err) { + puts("Error loading USB device\n"); + hang(); + } +#endif + } else { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + puts("spl: wrong USB boot mode\n"); +#endif + hang(); + } + + if (err) + hang(); +} diff --git a/include/spl.h b/include/spl.h index 2bd6e16..5730ec7 100644 --- a/include/spl.h +++ b/include/spl.h @@ -16,6 +16,10 @@ #define MMCSD_MODE_RAW 1 #define MMCSD_MODE_FAT 2
+#define USB_MODE_UNDEFINED 0 +#define USB_MODE_RAW 1 +#define USB_MODE_FAT 2 + struct spl_image_info { const char *name; u8 os; @@ -60,6 +64,9 @@ void spl_spi_load_image(void); /* Ethernet SPL functions */ void spl_net_load_image(const char *device);
+/* USB SPL functions */ +void spl_usb_load_image(void); + #ifdef CONFIG_SPL_BOARD_INIT void spl_board_init(void); #endif diff --git a/spl/Makefile b/spl/Makefile index 29d7818..26de0d3 100644 --- a/spl/Makefile +++ b/spl/Makefile @@ -86,6 +86,8 @@ LIBS-$(CONFIG_SPL_ETH_SUPPORT) += drivers/net/ LIBS-$(CONFIG_SPL_ETH_SUPPORT) += drivers/net/phy/ LIBS-$(CONFIG_SPL_USBETH_SUPPORT) += drivers/net/phy/ LIBS-$(CONFIG_SPL_MUSB_NEW_SUPPORT) += drivers/usb/musb-new/ +LIBS-$(CONFIG_SPL_USB_HOST_SUPPORT) += drivers/usb/host/ +LIBS-$(CONFIG_OMAP_USB_PHY) += drivers/usb/phy/ LIBS-$(CONFIG_SPL_USBETH_SUPPORT) += drivers/usb/gadget/ LIBS-$(CONFIG_SPL_WATCHDOG_SUPPORT) += drivers/watchdog/

Enable the USB host boot support for the AM437 evm
Signed-off-by: Dan Murphy dmurphy@ti.com --- arch/arm/include/asm/arch-am33xx/spl.h | 1 + include/configs/am43xx_evm.h | 7 +++++++ 2 files changed, 8 insertions(+)
diff --git a/arch/arm/include/asm/arch-am33xx/spl.h b/arch/arm/include/asm/arch-am33xx/spl.h index 95de9aa..166ff24 100644 --- a/arch/arm/include/asm/arch-am33xx/spl.h +++ b/arch/arm/include/asm/arch-am33xx/spl.h @@ -20,6 +20,7 @@ #if defined(CONFIG_AM33XX) || defined(CONFIG_AM43XX) #define BOOT_DEVICE_MMC1 8 #define BOOT_DEVICE_MMC2 9 /* eMMC or daughter card */ +#define BOOT_DEVICE_USB 13 #elif defined(CONFIG_TI814X) #define BOOT_DEVICE_MMC1 9 #define BOOT_DEVICE_MMC2 8 /* ROM only supports 2nd instance */ diff --git a/include/configs/am43xx_evm.h b/include/configs/am43xx_evm.h index d9b6c16..eb3377c 100644 --- a/include/configs/am43xx_evm.h +++ b/include/configs/am43xx_evm.h @@ -129,6 +129,13 @@ #define CONFIG_SYS_SPL_MALLOC_START 0x80a08000 #define CONFIG_SYS_SPL_MALLOC_SIZE 0x100000
+#define CONFIG_SYS_USB_FAT_BOOT_PARTITION 1 +#define CONFIG_SYS_USB_MODE_U_BOOT_SECTOR 0x300 + +/* SPL USB Support */ +#define CONFIG_SPL_USB_SUPPORT +#define CONFIG_SPL_USB_HOST_SUPPORT + /* Unsupported features */ #undef CONFIG_USE_IRQ
participants (1)
-
Dan Murphy