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 ?怎么配置?
已解决! 转到解答。
- 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之后的区域,都可以用来存储数据。但是请注意,flash是4k 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的时候,是在DS1和DS2之间相互切换,即第一次烧写存储在DS1,OTA的代码放在DS2。下一次OTA的代码会放在DS1。相关的函数为
fw_upgrade_switch_active_ds
所以,在存放用户数据的时候,需要考虑到OTA代码写入的时候,如果OTA代码比较大,可能会擦除掉用户数据。OTA的在擦除的时候也是按照sector来进行的,并不是整个flash擦除,可以参考libraries/fw_upgrade_lib/fw_upgrade.c中的代码。
在写入数据之后,建议对设备多次进行OTA,然后读取用户数据,测试数据是否被擦除。
建议将数据存储到DS区域中,FW之外的部分,直接调用写flash的API。
具体操作起来比较复杂,我这边明天整理一下再回复你。
另外,请问一下,这个问题和Cary在case中问的问题是同一个吗?编译的代码一样,大概占用80k,需要OTA?
是的,是同一个问题。请尽快出一个修改说明,谢谢!
- 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之后的区域,都可以用来存储数据。但是请注意,flash是4k 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的时候,是在DS1和DS2之间相互切换,即第一次烧写存储在DS1,OTA的代码放在DS2。下一次OTA的代码会放在DS1。相关的函数为
fw_upgrade_switch_active_ds
所以,在存放用户数据的时候,需要考虑到OTA代码写入的时候,如果OTA代码比较大,可能会擦除掉用户数据。OTA的在擦除的时候也是按照sector来进行的,并不是整个flash擦除,可以参考libraries/fw_upgrade_lib/fw_upgrade.c中的代码。
在写入数据之后,建议对设备多次进行OTA,然后读取用户数据,测试数据是否被擦除。
好的,谢谢!
我们这边会测试下。