蓝牙固件升级(OTA升级)原理设计
转:http://blog.csdn.net/yueqian_scut/article/details/50849033
固件空中升级(OTA)与固件二次引导的原理和设计
蓝牙固件空中升级(OTA)涉及到蓝牙无线通信、固件外存分布、固件内存分布(定制链接脚本)、固件二次引导等技术,需要开发人员深入理解蓝牙单芯片的存储架构、启动引导流程、外存设备驱动和产品电路设计等领域知识。完整和完美地设计和实现OTA,是一名嵌入式物联网软件工程师最好的技术体现。
本文以Dialog公司研发的号称全球最低功耗蓝牙单芯片DA14580平台为基础进行分析和设计,但设计思想可以推广到其他蓝牙单芯片平台,甚至也适用于wifi固件空中升级。
一、OTA意义
固件空中升级是如此重要,在于:
1.修复产品缺陷。
2.丰富产品功能,增加用户粘性。
3.迭代的产品升级,也有助于快速切入市场,降低整体开发成本。
二、场景和问题分析
我们以常见的通过手机蓝牙来升级蓝牙设备固件这种方式来分析OTA会遇到什么问题:
1.固件的形式。我们一般在调试时使用HEX格式来烧写,HEX带有地址信息,因此可以烧写到任意地方,也即是固件的代码和数据的分布是可以不连续的。但是在OTA里面,如果蓝牙的OTA profile在接收到数据后还要进行hex到bin的转换,那效率无疑是相当低的。因此一般的OTA都要求固件为bin格式,也意味着固件的代码和数据要连续存放。这里说的数据是指const data和.data的初始化值,它们和.bss的运行时地址并不要求跟代码的地址是连续的,程序运行起来,可以将初始化数据搬到对应的运行时地址所对应的地方。Hex是标准格式,因此也有标准的Hex2bin工具来支持完成转换。
2.固件的头。除了代码和数据,在无线传输中,如何让对方认为这是一份完整无错误的固件?这就需要在代码和数据之外定义一个固件头,它至少要包括校验(一般是CRC)字段和代码数据的长度字段。这样,对方可以对代码数据进行校验,并将结果和校验字段比较,以确定是否完整。另外,为了让引导程序快速判断是否是固件,宜在固件头部进入固件标识字段,如0x7050是DA14580的第一次引导辨别的固件标识,而0x7051是二次引导辨别的固件标识。
3.OTA后蓝牙设备是一份固件还是两份固件?我们可能会想,反正在OTA过程中,原来的代码数据已经运行在内存中,新固件可以直接烧到原固件所在的地方,因此设备永远都是只存一份。如果是这样,那我就没必要在这里巴拉巴拉那么多了。这种方法确实是可行的,但是万一在传输的过程中出现意外(掉电,干扰等等,这概率可不是万一了),那就相当于设备里面没有固件,直接变成垃圾。所以支持OTA的设备必须要在外存中开辟不同的区域来存储新、旧两份固件。
4.两份固件就够了吗?系统ROM中的一次引导程序是必读某个外存地址的,两份固件在不同的地方,一次引导怎么知道要Run哪份固件呢?ROM的一次引导之前可没有考虑OTA这档子事的。所以我们自然应该要加入二次引导程序,让二次引导程序放在ROM必读的起始地址上,由二次引导程序(开发人员可以定制开发的)来判断哪份固件是新的且是完整无误的,再选择性引导新固件。
5.二次引导加上两份固件够了吗?其实是够的,但是不够灵活。假如是这样,那么两份固件一定要放置在二次引导程序指定的两个地方,这显然是很笨的方法,假如两份代码间隔设置大了会浪费,设置小了,万一固件长度超了不就歇菜了。我们可以考虑在二次引导程序指定的一个地方烧写进一个简单的配置文件,由该配置文件来指定两份固件的起始点。
三、设备的外存固件分布
根据以上分析,我们可以得出蓝牙设备的外存固件分布图,假设flash:
四、设备芯片的内存框架和运行时内存分布
1.一般无线单芯片SOC
一般无线(蓝牙和wifi)单芯片SOC都内置ROM和RAM,并支持多种外存引导,如nor flash、eerom,有些还可能有OTP等存储类型,也可能支持SPI、I2C等总线接口方式。
二次引导程序被ROM中的一次引导程序从flash中引导到RAM中运行,而二次引导程序运行过程中也要将最新固件引导到RAM。因此,二次引导程序和固件所运行的RAM中是不可以重复的,必须分布独立的内存空间。
二次引导程序在引导出固件后,它的使命就完成了,因此它所占有的内存空间应该被定义为固件的数据运行空间(如.bss段),否则就浪费了。
综上所述,一般的内存框架和运行时分布的图示如下:
2.DA14580的内存框架和运行时内存分布
DA14580的内存框架应该说在低端电子产品SOC的设计领域是非常经典的,它不仅在设计时因考虑OTA而将内存分块为两个区域(当然,其中也有深度睡眠时保存数据的原因),也为了低成本设计了OTP。产品在发布可以不要任何外存,直接将固件烧进OTP即可,当然没有外存是不可以OTA的。
如果支持OTA,那一般的方式是将二次引导程序烧写到OTP。因为DA14580的一次引导程序支持多种方式引导,其尝试引导的顺序为OTP、SPI接口、I2C接口。所以放到OTP有利于加快启动时间。
运行时图示如下:
五、引导过程
有了以上分析,相信对引导过程非常清晰了。
六、蓝牙OTA profile设计和实现
待下一篇文章再做详细讲解。
蓝牙固件升级(OTA升级)原理设计的更多相关文章
- 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...
- Android Recovery OTA升级(一)—— make otapackage
文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...
- OTA升级详解(一)
不积跬步,无以至千里: 不积小流,无以成江海. 出自荀子<劝学篇> 1.概念解释 OTA是何物? 英文解释为 Over The Air,既空中下载的意思,具体指远程无线方式,OTA 技术可 ...
- RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
目录 1.阅读源码之前的思考 2.从 Broker 启动流程看 DLedger 2.1 构建 DefaultMessageStore 2.2 增加节点状态变更事件监听器 2.3 调用 DefaultM ...
- Android Recovery升级原理
摘要 Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windows PE或DOS).也可以称之为安卓的恢复模式,在这个所谓的恢复模式下,我们可以刷入新的安卓系统,或者 ...
- Android OTA 升级之三:生成recovery.img
Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...
- 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...
- 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)
从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...
- android 标准OTA升级流程
标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...
随机推荐
- 第一百七十二节,jQuery,动画效果
jQuery,动画效果 学习要点: 1.显示.隐藏 2.滑动.卷动 3.淡入.淡出 4.自定义动画 5.列队动画方法 6.动画相关方法 7.动画全局属性 一.显示.隐藏 jQuery 中显示方法为:. ...
- WPF-数据转换
有时我们展现的数据,需要进行转换,比如如果一个学生的成绩过了60,我们显示一个Pass的图片. XAML: <Window x:Class="DeepXAML.MainWindow&q ...
- 初涉Quartz
1.首先需要导入包,必须导入的包如下: quartz-1.8.5.jar commons-logging.jar spring-core-3.0.5.RELEASE.jar sprin ...
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...
- 转载:DenseNet算法详解
原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/a ...
- mongodb基础操作
查询选择器>db.customers.find({age:{$lt:102}})查询age小于102的数据$lte表示小于或等于$gt表示大于$gte表示大于或等于>db.customer ...
- jPage.js分页
jPage.js插件使用文档 这一款插件主要是为了bootstrap原生的分页功能效果不理想而诞生的一款插件. jPage.js代码更新地址为:https://github.com/leslieSie ...
- ehcache.xml配置详解
一:配置文件案例 <ehcache> <!-- 磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存 path:指定在硬盘上存储对象的路径 --> ...
- 洛谷 P1407 [国家集训队]稳定婚姻
洛谷 这个题面很有意思,像我这样的菜鸡,完全不需考虑婚姻的稳定 性 问题. tarjan裸题,直接讲算法吧: 原配夫妻之间分别连一条边,小情人之间反向连边. 这时候我们会发现一个性质,如果婚姻稳定,那 ...
- pymysql连接数据库,实现数据库增删改查
1.数据库连接 # 创建连接 def create_conn(): import pymysql conn = pymysql.connect( host='localhost', port=3306 ...