4 Replies Latest reply on Mar 16, 2020 10:15 PM by CaLi_4592466

    内部flash 的配置

    CaLi_4592466

      DevicePreset "20706A2 Serial Flash kb"

      {

      ConfigFSOffset = 0

      DLReadWriteMode = "Cortex M3 HCI"

      DLWriteVerifyMode = "Write and verify"

      DLMaxWriteSize = 249

      DLSectorEraseMode = "Chip erase"

      DLDTRReset = 0

      DLPostResetDelay_ms = 100

      DLAutobaud = 0

      DLAutobaudRepeat = 1

      DLAutobaudRepeatDelay_ms = 200

      DLWaitForLaunchAnnounce = 0

      DLConfigReprogramIF_PLL = 0

      DLUsbBulkPipe = 0

      DLMinidriver = 0

      DLMinidriverPathUSB = "[MINIDRIVERS]\20706\usb_legacy_ramcfg_only.hex"

      DLMinidriverPathNET = "[MINIDRIVERS]\20706\INVALID.hex"

      DLMinidriverPathSDIO = "[MINIDRIVERS]\20706\INVALID.hex"

      DLMinidriverPathUPRX = "[MINIDRIVERS]\20706\uart_legacy_ramcfg_only.hex"

      DLMinidriverPathUART = "[MINIDRIVERS]\20706\uart_legacy_ramcfg_only.hex"

      DLFirmware = 0

      DLFirmwareTargeting = "Standard"

      DLConfig = 1

      DLConfigTargeting = "EEPROM"

      ConfigPath = "A_20706A2-generic.cgs"

      DLConfigFixedHeader = 1

      DLConfigFixedHeaderFromBurnImage = 0

      DLConfigOmitRF_PLL = 1

      DLConfigIncludeChargerConfig = 0

      DLConfigDFUKey = 4294967295

      DLConfigCrystalFreqMHzX10000 = 240000

      DLConfigOutputPowerAdjust = 40

      DLConfigImpedanceMatchTuning = 31

      DLConfigSerialControlBaudRate = 115200

      DLConfigEEPROMAccessSpeed = 100

      DLConfigVSOffset = 0

      ConfigDSLocation = 12288

      DLConfigSSLocation = 0

      DLConfigIncludeBTWSecurityKey = 0

      DLConfigVSLocation = 4096

      DLConfigVSLength = 4096

      DLConfigRemoteDeviceCount = 0

      DLConfigBD_ADDRBase = "88888888****"

      DLConfigFixedBD_ADDRFlag = "Can change"

      OTAFWUAckAllRecords = 0

      OTAFWUUpdateFirmware = 1

      OTAFWUUpdateConfig = 1

      }

      我在WICED-Studio-6.2\20706-A2_Bluetooth\platforms\CYBT_343026_EVAL 目录下看到CYBT_343026_EVAL_SFLASH.btp 这个文件,是否可以通过 这个文件对VS的大小进行配置 满足我对存储数据在内部flash的需求?能否配置到20K ?怎么配置?

        • 1. Re: 内部flash 的配置
          XinghaoZ_26

          建议将数据存储到DS区域中,FW之外的部分,直接调用写flash的API。

          具体操作起来比较复杂,我这边明天整理一下再回复你。

          另外,请问一下,这个问题和Cary在case中问的问题是同一个吗?编译的代码一样,大概占用80k,需要OTA?

          • 2. Re: 内部flash 的配置
            CaLi_4592466

            是的,是同一个问题。请尽快出一个修改说明,谢谢!

            • 3. Re: 内部flash 的配置
              XinghaoZ_26
              1. flash分块介绍

              如之前所述,sFlash被分为如下区域,ss, vs1, vs2, ds1, ds2

              其中ss被芯片底层使用,vs用来存储用户数据,ds用来存储FW

              343026中,flash各个区块的分配如下(libraries/fw_upgrade_lib/fw_upgrade.c):

                  // 4 MB Serial flash offsets for firmware upgrade.

                  nv_loc_len.ss_loc   = 0x0000;

                  nv_loc_len.vs1_loc  = (FLASH_SECTOR_SIZE + FLASH_SECTOR_SIZE); // one sector after SS for fail safe

                  nv_loc_len.vs1_len  = FLASH_SECTOR_SIZE;

                  nv_loc_len.vs2_loc  = nv_loc_len.vs1_loc + nv_loc_len.vs1_len;

                  nv_loc_len.vs2_len  = FLASH_SECTOR_SIZE;

                  nv_loc_len.ds1_loc  = nv_loc_len.vs2_loc + nv_loc_len.vs2_len;

              #if defined(USE_256K_SECTOR_SIZE)

                  nv_loc_len.ds1_len  = FLASH_SECTOR_SIZE;

                  nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

                  nv_loc_len.ds2_len  = FLASH_SECTOR_SIZE;

              #else

                  {

                      uint32_t ds1_ds2_length = (FW_UPGRADE_FLASH_SIZE - nv_loc_len.ds1_loc);

                      nv_loc_len.ds1_len = ds1_ds2_length/2;

                      nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

                      nv_loc_len.ds2_len = ds1_ds2_length/2;

                  }

              #endif

               

              由此可见,各个区块大小ss(8k), vs1(4k), vs2(4k), ds1(248k), ds2(248k)VS区域无法满足储存20k数据的需求。所以建议将数据存储在FW区域,即DS1区域。根据你发过来的编译信息,application大小在80k左右,理论上有160k左右可供使用。但是,请注意flash的最大读写次数为10w次,请根据你的应用来评估是否可以满足。如果不能满足,则需要在程序中做一个循环写入的逻辑,例如,将可用空间分为两块,循坏使用,这样可用空间就只有80k

               

              2. 如何向flash固定区块写入数据

              首先,需要根据编译出来的hex文件确定应用程序在flash中占用的大小以及具体的位置。下面以ota demo为例,在编译出来的hex文件,或者download.log中可以看到总共占用了多少空间:

               

              A total of 2 contiguous memory areas were filled:

              [FF000000..FF000080] DATA (129 bytes)

              [FF004000..FF0154D1] DATA (70866 bytes)

              Total execution time: 11.60 seconds     Net downloading time: 11.60 seconds

               

              理论上来讲,从0154D1之后的区域,都可以用来存储数据。但是请注意,flash4k sector的,也就是说,每次在擦除的时候是以4k为单位进行的,所以在写入用户数据的时候请注意以4k为单位对齐。在这个例子中,可用区域应该从016000开始。

               

              3.写入数据时使用的API

              请参考libraries/fw_upgrade_lib/fw_upgrade.c中的function wiced_firmware_upgrade_store_to_nv

              在这个函数中调用了fw_upgrade_write_mem,这个函数底层使用的是

              wiced_hal_sflash_write(write_to, len, data)

              在使用的过程中,可以根据应用程序的需要在这个API的基础上封装自己需要的function

               

              4. 其他注意事项

              由于类似的应用之前并没有其他客户使用过,我们这边只有在测试flash性能的时候使用相关的函数进行过flash的读写测试。因此需要你那边进行测试。

              另外,在OTA的时候,是在DS1DS2之间相互切换,即第一次烧写存储在DS1OTA的代码放在DS2。下一次OTA的代码会放在DS1。相关的函数为

              fw_upgrade_switch_active_ds

              所以,在存放用户数据的时候,需要考虑到OTA代码写入的时候,如果OTA代码比较大,可能会擦除掉用户数据。OTA的在擦除的时候也是按照sector来进行的,并不是整个flash擦除,可以参考libraries/fw_upgrade_lib/fw_upgrade.c中的代码。

               

              在写入数据之后,建议对设备多次进行OTA,然后读取用户数据,测试数据是否被擦除。

              • 4. Re: 内部flash 的配置
                CaLi_4592466

                好的,谢谢!

                我们这边会测试下。