嗨,对话框中,
最近在弄DA14580的SUOTA,之前搞过北欧的在线旅行社,我想问DA14580的SUOTA怎么保证固件传输的可靠性,如果在传输固件的时候突然断电了会不会导致变砖,北欧的方案是加了Flash缓冲区,即先把接收到的固件存到一块闪光里面,校验正确后才会把原来的固件覆盖,请问DA14580是怎么做?我看代码里面好像是先放在sysram里面再拷贝到Flash是吗?另外,对要升级的固件有没有大小的限制?固件升级及蓝牙栈所耗的RAM分别又是多少吗?谢谢!
布罗尔,
年轻
设备:
580年不会在每个形象的头上会有一位字节valid_flag,如果中途断电,这位是不会写0 xaa的。
580年的suota机制,是先把数据复制到spota_all_pd,然后再复制到闪存里。这块区域在scatterfile里面定义了。
固件的大小上限就是580 SRAM的大小,图像在脑袋里面有定义。
RAM的消耗主要就是spotar服务的数据库大小,还有就是SRAM里面暂存数据的那块数组。
嗨Gongyu_Dialog,
谢谢你的回复,我按照文档“- b - 010使用SUOTA DA14580”完整地做了一次,发现在IOS上面是可以正常升级的,但是在三星S6 Android 6.0.1中上面不成功,现象是升级刚开始就中断了(见附件),SUOTA版本是V1.1,怀疑是连接间隔的设置问题,所以将SDK5.0.3的prox_reporter例子的连接时间间隔从原来的10-20ms改成20-30ms,结果也是一样的,这是怎么回事?请赐教!
布罗尔,
年轻
补充:
外挂的FLASH是SPI的连接方式,芯片为W25X20CL, 256 kb的存储大小,“一个使用SUOTA - b - 010 DA14580”教程唯一改变的地方为第8.5章烧写FLASH的方式不同,我是用UART的连接方式,这个应该不影响吧,还是我刚才又在制作形象那里加了加密操作,但结果还是一样的,IOS可以,安卓不行。
布罗尔,
年轻
补充:
双映像引导加载程序存储在闪光中使用方案1的方案。
烧写方向应该有关系。加密操作品应该也不合会没有太大影响。Android不行是什么意思,是刚开始更新就跳出失败,还是更新的中途跳出失败的?
没有跳出失败的提示,但是一直停留到升级的页面,中间没有提示任何错误,见附件。
嗨Gongyu_Dialog,
又测试了两台手机、LG G3 Android 5.0.1跟Nexus 5 x Android 6.0.1中结果都是一样的,究竟是怎么回的事,你能帮我测试下吗?
布罗尔,
年轻
我刚刚又试了另一台手机HTC (Android 6.0.1中),情况是一样的,最终也停留在那个页面。
你的IOS环境是好的吗?android环境下用的APK版本吗?
户外,文明不加起来是好的?
嗨Gongyu_Dialog,
ios环境是好的,android环境下使用的空洞版本是v1.1,文章加载不加入都一道。
布罗尔,
年轻
嗨Gongyu_Dialog,
更新了应用程序就可以正常运行了,谢谢!另外,我还有个疑惑,根据“嗯- b - 012 - _da14580_581_583创建一个二级引导loader_v3.0”第8.2章的描述,AES_ENCRYPTED_IMAGE_SUPPORTED及SUPPORT_AN_B_001的正确组合应该是:
1.要编辑图像引导加载程序放在闪存中:
#define aes_encrypted_image_supported 0.
#定义SUPPORT_AN_B_001
2.双重形象引导装载程序放在OTP处:
#define aes_encrypted_image_supported 1
#undef support_an_b_001.
但是当我的把双图像引导装载程序放在闪光处时发现,如果是上面的那种配置的话,代码根本跑不起来,必须改为“双重图像引导装载程序放在OTP处”的配置才能正常运行,
双重图像引导加载程序放在otp处的我没试过,不清上衣的配置对不行,而且是我的理论有着误吗还怎么事?
布罗尔,
年轻
首先AES_ENCRYPTED_IMAGE_SUPPORTED这个宏一般都建议开着,因为是通过检查标题图片里的加密位来查看是否需要解密。图片没有加密,在宏开的情况下也没关系。
而SUPPORT_AN_B_001这个宏,会去检查以这8个头字节“0 x70/0x50 / X / X / X / X /代码大小(左)/代码大小(H)”的形象,也就是平时smartsnippets设定的启动映像会添加8个字节的头字节。
所以对照代码看spi_loadActiveImage函数,就会看到如果双重图像引导装载程序放在flash的情况下,不能定义SUPPORT_AN_B_001,否则直接从0地址开始取图像内容了。
如果双重图像引导装载程序放在OTP的情况下则就要定义SUPPORT_AN_B_001是吧,刚刚试过不定义根本跑不起来,还有二级引导装载程序跟双图像引导的区别究竟是什么?
“嗯- b - 012 - _da14580_581_583创建一个二级引导loader_v3.0”说的定义太绕口了,看得一头雾水。
布罗尔,
年轻
补充:要将双重图像引导装载程序放在OTP有什么需要注意的吗?代码处需要做什么修改,电路有没有什么要求(除了烧录条件要的电源及GPIO口外)?
谢谢!
布罗尔,
年轻
放OTP是一样的,宏没有变化。你看文档AN-B 15-16页,关于两种模式的flash存储描述。
support_an_b_001定义,只有一个种情况,就是二级引导程序在OTP,同时闪电图0地址带amp-001的8个头字节,也不在于双重图像的选择,就一个闪存直接拷贝到ram里了
“如果双重图像引导装载程序放在OTP的情况下则就要定义SUPPORT_AN_B_001是吧,刚刚试过不定义根本跑不起来”
//我是你的闪存0地址一般放放an-b-001的8个字节;或者smartsnippets烧写的时代,选选启动启用的模式。
如果otp里没建国,正常会进入驱动模式,即按照rom默认的引导加载程序的顺序跑,所以最长时空需要spi / uart / i2c / spi。
但如果OTP里有代码,即二级引导装载程序,那OTP模式把seconday引导装载程序的内容直接复制到ram 0地址,就可以按照里面代码的执行顺序,直接从你想要的外设去引导代码。这样会省时间。
双重形象引导装载程序讲的是,通过读取产品头字段,可以在两块代码区间进行选择,然后决定把谁复制到ram的0地址去。主要用在suota上,方便更新代码。
嗨Gongyu_Dialog,
原来是OTP头部分没有配置,现在可以正常跑了,谢谢!
关于外挂的SPI FLASH的功耗,想请教请教:
情况是这样,如上面说的,双重图像引导程序放在otp,应用程序放在外面的闪光灯(w25x20cl)里面,把他们烧到正式的位置后,程序他们正式跑,suota也可做,都正式,考虑到闪烁如果一般开着,功耗会比较大,所以所以了个新的形象,在这个新的映像的主数里将闪光灯配置为电源向下模式以节省功耗,配置配置下所示:
int main_func(void)
{
sleep_mode_t sleep_mode;
system_init();
spi_flash_power_down ();
而(1)
{.................}
}
将这个新形象的通过SUOTA更新到FLASH之后发现,程序不知道跑哪里去了,手机搜不到任何广播信息,这是为什么?FLASH的功耗应该怎么优化?
这里还引发了另一个问题,当双图像引导装载程序烧进OTP时,原来通过UART给FALSH烧录程序的方法行不通了,SmartSnippets一直停留在UART重置的界面,这又是怎么回事,有什么方法补救么?因为在SUOTA更新到一个无法广播的固件的时候只能通过有线的方法来擦除烧录固件。
布罗尔,
年轻
我看到在sencod_bootloader代码里面,start_run_user_application函数里面已经有关flash的操作了。为什么要再加一笔关flash的操作?
start_run_user_application里面仅仅是da14580拉高了cs而已,而对w25x20cl来到还的待命模式而不可能不可能opply模式,用来spi_flash_power_down()才是正当的,并且有没有是诗歌,而且是诗歌?是在app_spotar_read_mem()里面的这个语句吗:platfore_reset(reset_after_spota_update)???
我现在的处理方法是在主函数处关闭FLASH使其进入省电低功耗模式:
Int8_t man_dev_id = 0;
man_dev_id = spi_flash_enable(SPI_EN_GPIO_PORT, SPI_EN_GPIO_PIN);
if (man_dev_id == SPI_FLASH_AUTO_DETECT_NOT_DETECTED) / /发送到指定位置
{
//设备未被识别。使用默认参数。
//也可以在这里断言错误。
spi_flash_init(spi_flash_default_size,spi_flash_default_page);
}
spi_flash_power_down ();
在platform_reset(reset_after_spota_update)疑似疑似复位作用的语句前加:
案例SPOTAR_REBOOT:
man_dev_id = spi_flash_enable(SPI_EN_GPIO_PORT, SPI_EN_GPIO_PIN);
if (man_dev_id == SPI_FLASH_AUTO_DETECT_NOT_DETECTED) / /发送到指定位置
{
spi_flash_init(spi_flash_default_size,spi_flash_default_page);
}
SPI_FLASH_RELEASE_FROM_POWER_DOWN();
platform_reset(reset_after_spota_update);
休息;
将程序烧进去后发现再次做SUOTA时,升级失败,提示无法与外部FLAHS通讯,就算我在主函数处已经将FLASH关闭,但是SUOTA开始前不是会去开启的吗?怎么会这样子呢?求解!谢谢
布罗尔,
年轻
我想在suota代码里的app_spi_flash_init并没有调用spi_flash_release_from_power_down();。
案例SPOTAR_IMG_SPI_FLASH:
#if(!spotar_spi_disable)
app_spotar_spi_config(&spi_conf);
app_spi_flash_init (&spi_conf.cs);
而空白on_spotar_status_change (const uint8_t spotar_event)因为是580年,所以这段代码走不进
{
#if define (__DA14583__) && (!SPOTAR_SPI_DISABLE)
Int8_t man_dev_id = 0;
man_dev_id = spi_flash_enable(SPI_EN_GPIO_PORT, SPI_EN_GPIO_PIN);
if (man_dev_id == SPI_FLASH_AUTO_DETECT_NOT_DETECTED) / /发送到指定位置
{
//设备未被识别。使用默认参数。
//也可以在这里断言错误。
spi_flash_init(spi_flash_default_size,spi_flash_default_page);
}
if(spotar_event == SPOTAR_END) / /结束
{
//电源向下SPI Flash
spi_flash_power_down ();
}
# endif
}
嗨Gongyu_Dialog,
现在可以是正确的,闪光的功耗也应该正当了,我是我重复偶像的的程度中发作,不仅在ios还android,都很容易在传输完的crc的crc校验校验这,提示“整体补丁数据CRC失败“,而且android平台比iOS更容易出现这个错误,Android报告:90%,iOS:40%左右,通讯距离已经尽可口地短了已经短短了,应该不可行的了,应该是什么,能解决么?谢谢!
ps:我的连接间隔设置为:
.intv_min = MS_TO_DOUBLESLOTS (20),
.intv_max = MS_TO_DOUBLESLOTS (30),
布罗尔,
年轻
我遇里比较很少遇见crc错的。空间隔,一般都是手机设的,device主动发参数更新请求了吗?
android 90%的错,你用的是哪个应用?要不你用附件的试试?