22个员额/ 0个新员额
最后发表
young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
SUOTA固件传输疑惑

嗨,对话框中,

最近在弄DA14580的SUOTA,之前搞过北欧的在线旅行社,我想问DA14580的SUOTA怎么保证固件传输的可靠性,如果在传输固件的时候突然断电了会不会导致变砖,北欧的方案是加了Flash缓冲区,即先把接收到的固件存到一块闪光里面,校验正确后才会把原来的固件覆盖,请问DA14580是怎么做?我看代码里面好像是先放在sysram里面再拷贝到Flash是吗?另外,对要升级的固件有没有大小的限制?固件升级及蓝牙栈所耗的RAM分别又是多少吗?谢谢!

BR,

年轻的

设备:
Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
580年不会在每个形象的头上会有一位字节有效

580年不会在每个形象的头上会有一位字节valid_flag,如果中途断电,这位是不会写0 xaa的。
580年的suota机制,是先把数据复制到spota_all_pd,然后再复制到闪存里。这块区域在scatterfile里面定义了。
固件的大小上限就是580 SRAM的大小,图像在脑袋里面有定义。
RAM的消耗主要就是spotar服务的数据库大小,还有就是SRAM里面暂存数据的那块数组。

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

谢谢你的回复,我按照文档“- b - 010使用SUOTA DA14580”完整地做了一次,发现在IOS上面是可以正常升级的,但是在三星S6 Android 6.0.1中上面不成功,现象是升级刚开始就中断了(见附件),SUOTA版本是V1.1,怀疑是连接间隔的设置问题,所以将SDK5.0.3的prox_reporter例子的连接时间间隔从原来的10-20ms改成20-30ms,结果也是一样的,这是怎么回事?请赐教!

BR,

年轻的

附件:
young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
补充:

补充:

外挂的FLASH是SPI的连接方式,芯片为W25X20CL, 256 kb的存储大小,“一个使用SUOTA - b - 010 DA14580”教程唯一改变的地方为第8.5章烧写FLASH的方式不同,我是用UART的连接方式,这个应该不影响吧,还是我刚才又在制作形象那里加了加密操作,但结果还是一样的,IOS可以,安卓不行。

BR,

年轻的

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
补充:

补充:

双重形象引导装载程序存储在flash中即用scheme1的方式进行。

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
烧写方式应该没有关系。加密操作应该也不会有太大影响。

烧写方式应该没有关系。加密操作应该也不会有太大影响。Android不行是什么意思,是刚开始更新就跳出失败,还是更新的中途跳出失败的?

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
没有跳出失败的提示,但是一直停留到升级的页面

没有跳出失败的提示,但是一直停留到升级的页面,中间没有提示任何错误,见附件。

附件:
young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

又测试了两台手机、LG G3 Android 5.0.1跟Nexus 5 x Android 6.0.1中结果都是一样的,究竟是怎么回的事,你能帮我测试下吗?

BR,

年轻的

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
我刚刚又试了另一台手机HTC (Android 6

我刚刚又试了另一台手机HTC (Android 6.0.1中),情况是一样的,最终也停留在那个页面。

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
你的IOS环境是好的吗?android环境下用的APK版本吗?

你的IOS环境是好的吗?android环境下用的APK版本吗?

另外,文件不加密是否是好的?

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

IOS环境是好的,android环境下用的APK版本是V1.1,文件加密不加密都一样。

BR,

年轻的

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

更新了应用程序就可以正常运行了,谢谢!另外,我还有个疑惑,根据“嗯- b - 012 - _da14580_581_583创建一个二级引导loader_v3.0”第8.2章的描述,AES_ENCRYPTED_IMAGE_SUPPORTED及SUPPORT_AN_B_001的正确组合应该是:

1.双重形象引导装载程序放在闪光处:
#定义AES_ENCRYPTED_IMAGE_SUPPORTED 0
#定义SUPPORT_AN_B_001

2.双重形象引导装载程序放在OTP处:
#定义AES_ENCRYPTED_IMAGE_SUPPORTED 1
# undef SUPPORT_AN_B_001

但是当我的把双图像引导装载程序放在闪光处时发现,如果是上面的那种配置的话,代码根本跑不起来,必须改为“双重图像引导装载程序放在OTP处”的配置才能正常运行,
双重形象引导装载程序放在OTP处的我没试过,不知道上面的配置对不对,是我的理解有误吗还是怎么回事?

BR,

年轻的

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
首先AES_ENCRYPTED_IMAGE

首先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地址开始取图像内容了。

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
如果双重形象

如果双重图像引导装载程序放在OTP的情况下则就要定义SUPPORT_AN_B_001是吧,刚刚试过不定义根本跑不起来,还有二级引导装载程序跟双图像引导的区别究竟是什么?

“嗯- b - 012 - _da14580_581_583创建一个二级引导loader_v3.0”说的定义太绕口了,看得一头雾水。

BR,

年轻的

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
补充:要将双重形象

补充:要将双重图像引导装载程序放在OTP有什么需要注意的吗?代码处需要做什么修改,电路有没有什么要求(除了烧录条件要的电源及GPIO口外)?

谢谢!

BR,

年轻的

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
放OTP是一样的,宏没有变化。你看文档AN-B 15

放OTP是一样的,宏没有变化。你看文档AN-B 15-16页,关于两种模式的flash存储描述。
SUPPORT_AN_B_001定义,只有一种情况,就是二级引导装载程序在OTP,同时闪光里面0地址带有- b - 001的8个头字节,也不存在双重形象的选择,就一片闪光直接复制到内存里了

“如果双重图像引导装载程序放在OTP的情况下则就要定义SUPPORT_AN_B_001是吧,刚刚试过不定义根本跑不起来”
/ /我想你的flash 0地址一定放了一个- b - 001的8个字节,或者smartsnippets烧写的时候,选了引导使的模式。

如果OTP里没东西,正常会进入发展模式,即按照罗默认的引导装载程序的顺序跑,所以最长时间需要遍历SPI / UART / I2C / SPI。
但如果OTP里有代码,即二级引导装载程序,那OTP模式把seconday引导装载程序的内容直接复制到ram 0地址,就可以按照里面代码的执行顺序,直接从你想要的外设去引导代码。这样会省时间。

双重形象引导装载程序讲的是,通过读取产品头字段,可以在两块代码区间进行选择,然后决定把谁复制到ram的0地址去。主要用在suota上,方便更新代码。

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

原来是OTP头部分没有配置,现在可以正常跑了,谢谢!

关于外挂的SPI FLASH的功耗,想请教请教:

情况是这样,如上面说的,双图像引导装载程序放在OTP,应用放在外挂的FLASH (W25X20CL)里的面,把他们烧到正确的位置后,程序可以正常跑,SUOTA也可以做,都正常,考虑到FLASH如果一直开着,功耗会比较大,所以做了个新的形象,在这个新的形象的主要函数里将FLASH配置为断电模式以节省功耗,配置如下所示:

int main_func(空白)

sleep_mode_t sleep_mode;

system_init ();

spi_flash_power_down ();

而(1)
{.............}
}

将这个新形象的通过SUOTA更新到FLASH之后发现,程序不知道跑哪里去了,手机搜不到任何广播信息,这是为什么?FLASH的功耗应该怎么优化?
这里还引发了另一个问题,当双图像引导装载程序烧进OTP时,原来通过UART给FALSH烧录程序的方法行不通了,SmartSnippets一直停留在UART重置的界面,这又是怎么回事,有什么方法补救么?因为在SUOTA更新到一个无法广播的固件的时候只能通过有线的方法来擦除烧录固件。

BR,

年轻的

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
我看到在sencod_bootloader代码里面

我看到在sencod_bootloader代码里面,start_run_user_application函数里面已经有关flash的操作了。为什么要再加一笔关flash的操作?

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
start_run_user

start_run_user_application里面仅仅是DA14580拉高了CS而已,而对W25X20CL来说还是处于备用模式而不是省电低功耗模式,用spi_flash_power_down()才是正确的吧,还有就是SUOTA升级完不是会复位吗?是在app_spotar_read_mem()里面的这个语句吗:platform_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开始前不是会去开启的吗?怎么会这样子呢?求解!谢谢

BR,

年轻的

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
我想在suota代码里的app_spi_flash

我想在suota代码里的app_spi_flash_init并没有调用spi_flash_release_from_power_down();。

案例SPOTAR_IMG_SPI_FLASH:
#如果(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
}

young_dialog
离线
最后看到:4年3个星期前
加入:2016-05-10 07:14
嗨Gongyu_Dialog,

嗨Gongyu_Dialog,

现在可以正常跑了,FLASH的功耗也应该正常了,但是,我重复做SUOTA的过程中发现,不管是在IOS还是Android,都很容易在传输完后的CRC校验这里出的错,提示“整体补丁数据CRC失败”,而且Android平台比IOS更容易出现这个错误,Android报错率:90%,IOS: 40%左右,通讯距离已经尽可能地短了,应该不是距离的问题,这是什么问题,能解决么?谢谢!
ps:我的连接间隔设置为:
.intv_min = MS_TO_DOUBLESLOTS (20),
.intv_max = MS_TO_DOUBLESLOTS (30),

BR,

年轻的

Gongyu_Dialog
离线
最后看到:1天23小时前
加入:2016-04-27 07:07
我这里比较很少遇见CRC错的问题。连接间隔

我这里比较很少遇见CRC错的问题。连接间隔,一般都是手机设的,device主动发参数更新请求了吗?
android 90%的错,你用的是哪个应用?要不你用附件的试试?

附件: