@@ -492,10 +492,23 @@ static void cb_continue(struct usb_ep *ep, struct usb_request *req)
}
#ifdef CONFIG_FASTBOOT_FLASH
+#ifdef CONFIG_SPL_SPI_SUPPORT
+int boot_from_spi = 0;
+#endif
+
static void cb_flash(struct usb_ep *ep, struct usb_request *req)
{
char *cmd = req->buf;
char response[RESPONSE_LEN];
+#ifdef CONFIG_SPL_SPI_SUPPORT
+ char source[32];
+ int status = 0;
+ char *sf_probe[3] = {"sf", "probe", "0"};
+ char *sf_write_xloader[5] = {"sf", "write", NULL, "0", "20000"};
+ char *sf_update_xloader[5] = {"sf", "update", NULL, "0", "20000"};
+ char *sf_write_bl[5] = {"sf", "write", NULL, "80000", "80000"};
+ char *sf_update_bl[5] = {"sf", "update", NULL, "80000", "80000"};
+#endif
strsep(&cmd, ":");
if (!cmd) {
@@ -505,6 +518,68 @@ static void cb_flash(struct usb_ep *ep, struct usb_request *req)
}
strcpy(response, "FAILno flash device defined");
+#ifdef CONFIG_SPL_SPI_SUPPORT
+ /*
+ * Check if this is for xloader or bootloader.
+ * Also, check if we have to flash to SPI
+ */
+ if (strcmp(cmd, "xloader") == 0 && boot_from_spi) {
+ printf("Flashing %s to SPI\n", cmd);
+ status = do_spi_flash(NULL, 0, 3, sf_probe);
+ if (status) {
+ fastboot_tx_write_str("FAILcould not probe SPI");
+ return;
+ }
+ sf_write_xloader[2] = source;
+ sf_update_xloader[2] = source;
+ sprintf(source, "0x%x",
+ (unsigned int)CONFIG_USB_FASTBOOT_BUF_ADDR);
+
+ printf("Updating X-LOADER to SPI\n");
+ status = do_spi_flash(NULL, 0, 5, sf_update_xloader);
+ if (status) {
+ fastboot_tx_write_str("FAILupdate xloader failed");
+ return;
+ }
+
+ printf("Writing X-LOADER to SPI\n");
+ status = do_spi_flash(NULL, 0, 5, sf_write_xloader);
+ if (status) {
+ fastboot_tx_write_str("FAILwrite xloader failed");
+ return;
+ }
+ printf("Writing xloader DONE\n");
+ fastboot_tx_write_str("OKAY");
+ return;
+ }
+ if (strcmp(cmd, "bootloader") == 0 && boot_from_spi) {
+ printf("Flashing %s to SPI\n", cmd);
+ status = do_spi_flash(NULL, 0, 3, sf_probe);
+ if (status) {
+ fastboot_tx_write_str("FAILcould not probe SPI");
+ return;
+ }
+ sf_write_bl[2] = source;
+ sf_update_bl[2] = source;
+ sprintf(source, "0x%x",
+ (unsigned int)CONFIG_USB_FASTBOOT_BUF_ADDR);
+ printf("Updating bootloader to SPI\n");
+ status = do_spi_flash(NULL, 0, 5, sf_update_bl);
+ if (status) {
+ fastboot_tx_write_str("FAILupdate bootloader failed");
+ return;
+ }
+ printf("Writing bootloader to SPI\n");
+ status = do_spi_flash(NULL, 0, 5, sf_write_bl);
+ if (status) {
+ fastboot_tx_write_str("FAILwrite bootloader failed");
+ return;
+ }
+ printf("Writing bootloader DONE\n");
+ fastboot_tx_write_str("OKAY");
+ return;
+ }
+#endif
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
fb_mmc_flash_write(cmd, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
download_bytes, response);
This adds the functionality to flash u-boot and MLO images to QSPI using fastboot Signed-off-by: Dileep Katta <dileep.katta@linaro.org> --- Note: This is on top of Rob Herring patches submitted to support oem format command drivers/usb/gadget/f_fastboot.c | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+)