On Wed, Feb 18, 2015 at 4:53 PM, Dileep Katta <dileep.ka...@linaro.org> wrote: > This adds the functionality to flash u-boot and MLO images to QSPI using > fastboot > > Signed-off-by: Dileep Katta <dileep.ka...@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(+) > > diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c > index f7d84bf..a170eea 100644 > --- a/drivers/usb/gadget/f_fastboot.c > +++ b/drivers/usb/gadget/f_fastboot.c > @@ -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) {
xloader is pretty specific to TI, so it belongs in TI specific code. > + 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) { This if is almost completely duplicated from above. To address both issues, I would create a weak function to retrieve all the spi programming parameters as well as whether to use spi or not. Rob > + 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); > -- > 1.8.3.2 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot