imx8qm平台下fastboot烧写spi_norflash

版权声明:本文为博主原创文章,欢迎转载,转载请注明转载地址 https://blog.csdn.net/u012839187/article/details/85045743

在fastboot的功能里面实现烧写flexspi的uboot到nor_flash上面

643 修改:
644     uboot/drivers/usb/gadget/f_fastboot.c
645     @@ -25,6 +25,9 @@
646      #include <linux/compiler.h>
647      #include <version.h>
648      #include <g_dnl.h>
649     +#include <spi.h>
650     +#include <spi_flash.h>
651     +#include <dm/device-internal.h>
652      #ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
653      #include <fb_mmc.h>
654      #endif
655     @@ -234,6 +237,9 @@ static struct usb_gadget_strings *fastboot_strings[] = {
656      #define TEE_HWPARTITION_ID 2
657      #endif
658 
659         +#define ANDROID_BOOTLOADER_NOR_OFFSET  0x0        //0 offset
660         +#define ANDROID_BOOTLOADER_NOR_SIZE    0x100000   //1MB size
661          #define ANDROID_MBR_OFFSET         0
662          #define ANDROID_MBR_SIZE           0x200
663          #ifdef  CONFIG_BOOTLOADER_OFFSET_33K
664     @@ -259,8 +265,11 @@ struct fastboot_device_info fastboot_devinfo;
665      enum {
666           PTN_GPT_INDEX = 0,
667           PTN_TEE_INDEX,
668 +         PTN_BOOTLOADER_NOR_INDEX,
669           PTN_BOOTLOADER_INDEX,
670 +         PTN_MAX_INDEX,
671         };
672 
673           static unsigned int download_bytes_unpadded;
674 
675       static struct cmd_fastboot_interface interface = {
676     @@ -639,6 +648,60 @@ int write_backup_gpt(void)
677             return 0;
678     }
679 
680     +int save_img_to_nor(uchar *buff, u32 start_address, size_t len)
681     +{
682     +#if 1
683     +#ifdef CONFIG_DM_SPI_FLASH
684     +       int ret = 0;
685     +       unsigned int bus = 0;
686     +       unsigned int cs = 0;
687     +       unsigned int speed = 29000000;
688     +       unsigned int mode = 0;
689     +    struct spi_flash *flash;
690     +       struct udevice *new, *bus_dev;
691     +
692     +       /* Remove the old device, otherwise probe will just be a nop */
693     +       ret = spi_find_bus_and_cs(bus, cs, &bus_dev, &new);
694     +       if (!ret) {
695     +               device_remove(new);
696     +       }
697     +       flash = NULL;
698     +       ret = spi_flash_probe_bus_cs(bus, cs, speed, mode, &new);
699     +       if (ret) {
700     +               printf("Failed to initialize SPI flash at %u:%u (error %d)\n",
701     +                      bus, cs, ret);
702     +               return 1;
703     +       }else
704     +               {
705     +               printf(" Initialize SPI flash at %u:%u with speed %u; mode %u(success %d)\n",
706     +                      bus, cs, speed, mode, ret);
707     +               };
708     +
709     +       flash = dev_get_uclass_priv(new);
710     +
711     +       ret = spi_flash_erase(flash, start_address , len);
712     +       printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)start_address,
713     +              ret ? "ERROR" : "OK");
714     +       if (ret) {
715     +               printf("SPI flash erase failed\n");
716     +               return 1;
717     +       }
718     +
719     +       ret = spi_flash_write(flash, start_address, len, buff);
720     +       printf("SF: %zu bytes @ %#x : Written\n", (size_t)len, (u32)start_address);
721     +       if (ret) {
722     +               printf("SPI flash write failed\n");
723     +               return 1;
724     +       }
725     +#endif
726     +       return ret;
727     +#endif
728     +    printf("save_img_to_nor back\n");
729     +    return 0;
730     +}
731     +
732     +
733      static void process_flash_mmc(const char *cmdbuf)
734       {
735                   if (download_bytes) {
736     @@ -660,6 +723,16 @@ static void process_flash_mmc(const char *cmdbuf)
737                     ptn = fastboot_flash_find_ptn(cmdbuf);
738                     if (ptn == NULL) {
739                             fastboot_fail("partition does not exist");
740     +               } else if (memcmp(ptn->name, "bootloader_nor", 14) == 0){
741     +                               printf("writing to partition '%s'\n", ptn->name);
742     +
743     +                       if (save_img_to_nor(interface.transfer_buffer, ptn->start, ptn->length)) {
744     +                               printf("Writing '%s' FAILED!\n", ptn->name);
745     +                               fastboot_fail("Write partition");
746     +                       } else {
747     +                               printf("Writing '%s' DONE!\n", ptn->name);
748     +                               fastboot_okay("OKAY");
749     +                       }
750                     } else if ((download_bytes >
751                                ptn->length * MMC_SATA_BLOCK_SIZE) &&
752                                         !(ptn->flags & FASTBOOT_PTENTRY_FLAGS_WRITE_ENV)) {
753     @@ -967,7 +1040,7 @@ static int _fastboot_parts_add_ptable_entry(int ptable_index,
754                     if (part_get_info(dev_desc,
755                                             mmc_dos_partition_index, &info)) {
756                             debug("Bad partition index:%d for partition:%s\n",
757     -                      mmc_dos_partition_index, name);
758     +                      mmc_dos_partition_index, (const char *)info.name);
759                                          return -1;
760                                                  }
761                                  ptable[ptable_index].start = info.start;
762     @@ -1072,6 +1145,11 @@ static int _fastboot_parts_load_from_ptable(void)
763                 ptable[PTN_TEE_INDEX].partition_id = TEE_HWPARTITION_ID;
764             strcpy(ptable[PTN_TEE_INDEX].fstype, "raw");
765 
766     +   /* Bootloader_nor */
767     +    strcpy(ptable[PTN_BOOTLOADER_NOR_INDEX].name, "bootloader_nor");
768     +    ptable[PTN_BOOTLOADER_NOR_INDEX].start = ANDROID_BOOTLOADER_NOR_OFFSET;
769     +    ptable[PTN_BOOTLOADER_NOR_INDEX].length = ANDROID_BOOTLOADER_NOR_SIZE;
770     +
771         /* Bootloader */
772          strcpy(ptable[PTN_BOOTLOADER_INDEX].name, FASTBOOT_PARTITION_BOOTLOADER);
773          ptable[PTN_BOOTLOADER_INDEX].start =
774     @@ -1085,7 +1163,7 @@ static int _fastboot_parts_load_from_ptable(void)
775                 int tbl_idx;
776                 int part_idx = 1;
777                 int ret;
778     -       for (tbl_idx = PTN_BOOTLOADER_INDEX + 1; tbl_idx < MAX_PTN; tbl_idx++) {
779     +       for (tbl_idx = PTN_MAX_INDEX; tbl_idx < MAX_PTN; tbl_idx++) {
780                 ret = _fastboot_parts_add_ptable_entry(tbl_idx,
781                                 part_idx++,
782                                 user_partition,
783     @@ -1095,7 +1173,7 @@ static int _fastboot_parts_load_from_ptable(void)
784                 if (ret)
785                         break;
786             }
787     -       for (i = 0; i <= part_idx; i++)
788     +       for (i = 0; i <= tbl_idx-1; i++)
789                     fastboot_flash_add_ptn(&ptable[i]);
790 
791             return 0;
792 
793     uboot/drivers/mtd/spi/spi_flash_ids.c
794     @@ -135,6 +135,7 @@ const struct spi_flash_info spi_flash_ids[] = {
795             {"n25q1024a",      INFO(0x20bb21, 0x0,  64 * 1024,  2048, RD_FULL | WR_QPP | E_FSR | SECT_4K) },
796             {"mt25qu02g",      INFO(0x20bb22, 0x0,  64 * 1024,  4096, RD_FULL | WR_QPP | E_FSR | SECT_4K) },
797             {"mt25ql02g",      INFO(0x20ba22, 0x0,  64 * 1024,  4096, RD_FULL | WR_QPP | E_FSR | SECT_4K) },
798     //+       {"mt35xu256aba",   INFO(0x2c5b19, 0x0, 128 * 1024,   256, E_FSR   | SECT_4K) },
799     +       {"mt35xu256aba",   INFO(0x2c5b19, 0x0, 128 * 1024,   256, E_FSR) },
800             {"mt35xu512aba",   INFO(0x2c5b1a, 0x0, 128 * 1024,   512, E_FSR) },
801         #endif
802         #ifdef CONFIG_SPI_FLASH_SST            /* SST */
803 
804 
805     uboot/configs/mx8qm_lpddr4_vinson_android_defconfig
806         @@ -45,7 +45,8 @@ CONFIG_FSL_FSPI=y
807          CONFIG_DM_SPI=y
808          CONFIG_DM_SPI_FLASH=y
809          CONFIG_SPI_FLASH=y
810         -CONFIG_SPI_FLASH_BAR=y
811         +CONFIG_QSPI_BOOT=y
812         +CONFIG_SPI_FLASH_4BYTES_ADDR=y
813         +CONFIG_SPI_FLASH_USE_4K_SECTORS=y
814          CONFIG_SPI_FLASH_STMICRO=y
815          CONFIG_CMD_SF=y
816 
817     uboot/arch/arm/dts/fsl-imx8qm-lpddr4-vinson.dts
818     @@ -398,7 +398,7 @@
819     pinctrl-0 = <&pinctrl_flexspi0>;
820     status = "okay";
821 
822     -       flash0: mt35xu512aba@0 {
823     +       flash0: mt35xu256aba@0 {
824                     reg = <0>;
825                     #address-cells = <1>;
826                     #size-cells = <1>;
827 
828 

至此,fastboot支持烧写bootloader_nor分区,并且能够正常的烧写启动。

主要改动的是bootloader里面fastboot工具的烧写逻辑.另外.这边遇到setctor4k的flag是有问题的.所以拿掉了这个flag.也就是说每次对nor_flash进行烧写的时候都是全擦的..另外nxp release的imx8的bootloader关于分区显示的逻辑是有点小问题的.我这里也改了一下

猜你喜欢

转载自blog.csdn.net/u012839187/article/details/85045743
QM