[U-Boot] [PATCH v1 1/2] fastboot: Add support to flash u-boot and MLO to QSPI

Rob Herring robherring2 at gmail.com
Thu Feb 19 21:04:01 CET 2015


On Wed, Feb 18, 2015 at 4:53 PM, Dileep Katta <dileep.katta at linaro.org> wrote:
> This adds the functionality to flash u-boot and MLO images to QSPI using fastboot
>
> Signed-off-by: Dileep Katta <dileep.katta at 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
>


More information about the U-Boot mailing list