【经验】蓝牙开发零门槛之十三:实现客户私有OTA Service的方法
本文介绍在ING918xx上移植、实现一种客户私有OTA Service过程。INGCHIPS OTA Service的开发和演示请参考空中固件升级(FOTA)的快速演示(https://ingchips.github.io/blog/fota_demo_zh/)。
1、ING918xx OTA实现方式
下载新的程序(下图中的Application 2)到Flash的空闲区域;
提供新程序的启动地址;
重启,BootLoader会自动搬移并完成更新。
2、实现细节
创建新文件ota_private_service.c。
2.1准备状态记录信息结构体
// 包含必须的头文件
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "ingsoc.h"
#include "platform_api.h"
#include "rom_tools.h"
#include "eflash.h"
#include "ota_service.h"
// 创建状态记录信息结构体
#define PAGE_SIZE (8192)//static size for one flash page
typedef enum
{
OTA_SERVICE_DISABLED= 0,
OTA_SERVICE_START= (1 << 0),
OTA_SERVICE_END= (1 << 1)
} ota_service_flag_e;
typedef struct
{
ota_ver_t ota_ver;//place to save app version
ota_service_flag_e ota_service_flag;//start/end
// static data from controller
uint32_t ota_load_addr;//load address of new app
uint32_t ota_flash_base_addr;//flash address to save ota data
uint32_t ota_file_size;//total size of new app bin
// dynamic variables to hold downloading progess
uint32_t ota_curr_page_addr;
uint32_t ota_curr_page_size;
uint8_t page_buffer[PAGE_SIZE];
uint32_t ota_total_size;//size that has been program to flash
} ota_service_data_s;
ota_service_data_s ota_service_data =
{
.ota_service_flag = OTA_SERVICE_DISABLED,
.ota_ver = { .app = {.major = 0, .minor = 0, .patch = 0} },
.ota_curr_page_addr = 0,
.ota_total_size = 0
};
2.2创建初始化接口
在开始下载之前,有三个信息需要提供:
load addr:新程序的启动地址;
flash addr:重启之前,用来放置新程序的 Flash 基地址;
file size: 新程序的大小。
//需要注意的是所有地址都必须是word对齐的,文件大小不能超过flash的空闲区域大小。
uint8_t ota_service_init(uint32_t load_addr, uint32_t flash_addr, uint32_t file_size){
if ((load_addr & 0x3) || (flash_addr & 0x3) || (!file_size) ||
((flash_addr + file_size) > 0x84000))
{
return 0;
}
ota_service_data.ota_load_addr = load_addr;
ota_service_data.ota_flash_base_addr = flash_addr;
ota_service_data.ota_file_size = file_size;
ota_service_data.ota_curr_page_addr = flash_addr;
ota_service_data.ota_service_flag = OTA_SERVICE_START;
return 1;
}
接口返回为 0, 代表初始化失败。
2.3创建初始化接口
准备OTA数据的下载接口:
// 将接受到的数据暂时放在buffer中,满足一个page的大小才可以擦写到flash
#define OTA_SERVICE_SAVE_PAGE_DATA(data, len) \{ \ memcpy(ota_service_data.page_buffer + ota_service_data.ota_curr_page_size, data, len); \ ota_service_data.ota_curr_page_size += len; \}
// 将一个page的数据写到flash
#define OTA_SERVICE_FLUSH_PAGE_DATA \{ \ if(ota_service_data.ota_curr_page_size > 0) {\ program_flash(ota_service_data.ota_curr_page_addr, ota_service_data.page_buffer, ota_service_data.ota_curr_page_size); \ ota_service_data.ota_curr_page_addr += 0x2000; \ ota_service_data.ota_curr_page_size = 0; }\}
// 数据处理接口,全部OTA数据下载完成后,返回1,否则返回0
uint8_t ota_service_handle(const uint8_t* data, uint16_t len)
{ uint8_t complete = 0;
uint32_t part1_size = 0;
uint32_t part2_size = 0;
if(ota_service_data.ota_service_flag != OTA_SERVICE_START) return 0;
if((ota_service_data.ota_curr_page_size + len) > PAGE_SIZE)
{
part1_size = PAGE_SIZE - ota_service_data.ota_curr_page_size;
part2_size = len - part1_size; } else { part1_size = len; }
if(part1_size > 0)
{
OTA_SERVICE_SAVE_PAGE_DATA(data, part1_size);
}
if((part2_size > 0) || (ota_service_data.ota_curr_page_size == PAGE_SIZE))
{
OTA_SERVICE_FLUSH_PAGE_DATA;
}
if(part2_size > 0) {
OTA_SERVICE_SAVE_PAGE_DATA(data+part1_size, part2_size);
}
ota_service_data.ota_total_size += len;
if(ota_service_data.ota_total_size == ota_service_data.ota_file_size)
{
complete = 1;
OTA_SERVICE_FLUSH_PAGE_DATA;
ota_service_data.ota_service_flag = OTA_SERVICE_END; }
return(complete);
}
2.4创建重启接口
// 数据下载完成后,重启系统
void ota_service_reboot(){
uint8_t buffer[50];
if(ota_service_data.ota_service_flag != OTA_SERVICE_END) return;
ota_meta_t *meta = (ota_meta_t *)(buffer + 0);
meta->entry = 0;
meta->blocks[0].dest = ota_service_data.ota_load_addr;
meta->blocks[0].src = ota_service_data.ota_flash_base_addr;
meta->blocks[0].size = ota_service_data.ota_total_size;
program_fota_metadata(meta->entry, 1, meta->blocks);
platform_reset();}
3、实现细节
调用流程如下:
1.在profile.c中找到以下API,以及确定OTA使用到的handle(eg. HANDLE_OF_OTA_DATA)
static int att_write_callback(……)
{
switch (att_handle)
{
case HANDLE_OF_OTA_DATA:
// add your ota code
return 0;
default:
return 1;
}
}
2.主设备发送start cmd,启动OTA,并传递相关信息 (load_addr, flash_addr, file_size)
case HANDLE_OF_DATA:
...
if(start cmd)
{
ret = ota_service_init(load_addr, flash_addr, file_size);
//check ret
}
return 0;
3.主设备发送data cmd,开始OTA下载
case HANDLE_OF_DATA:
...
if(data cmd)
{
ret &= ota_service_handle(buffer, buffer_size);
//check ret
}
return 0;
4.主设备发送reboot cmd,重启设备,完成OTA下载
case HANDLE_OF_DATA:
...
if(reboot cmd) && (ret == 1)
{
ota_service_reboot();
}
return 0;
4、可能的问题
下载程序没有添加应用层的校验,视情况可以自行实现,比如CRC。
没有验证功能(将下载后的程序读取到主设备,对比验证),读取部分可以用memcpy实现,可以根据情况自行添加。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由耳神666转载自桃芯科技公众号,原文标题为:蓝牙开发零门槛之十三-客户私有OTA Service,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
为ING916搭建Zephyr开发环境
对于ING916/ING918 的NoOS 软件包,可以使用 Zephyr OS作为实时内核。SDK v8.4.1 提供了完整的 Controller 接口,可以对接 Zephyr BLE Host 协议栈。这里桃芯科技将为ING916 搭建 Zephyr 开发环境。在这个环境下,开发者可以使用 Zephyr RTOS 及其 BLE 协议栈。
【经验】桃芯科技蓝牙5.1芯片ING918xx的SDK介绍及其hello 世界示例
INGCHIPS(桃芯科技)为客户提供易用的SDK,帮助客户便捷、高效地开发蓝牙产品。该SDK支持目前桃芯的ING918xx系列所有蓝牙5.1芯片。本文将介绍该SDK及其hello 世界的示例。
【经验】桃芯科技提供网页版Log记录器可通过BLE蓝牙从空中抓取Trace数据
本文介绍如何通过BLE从空中抓取Trace数据。针对本文提供的参考实现,桃芯科技提供了网页版Log记录器。Trace对于分析协议栈流程问题非常重要。考虑到蓝牙设备的多样性,Trace数据的导出、记录由开发者在应用里实现。
INGCHIPS Announced Smarter, Cooler, Smaller ING918xx Series BLE5.1 SoC with Sensitivity Reaching 102dB@125kbps
INGCHIPS recently released series low-power Bluetooth 5.1 SoC, ING918xx. The ING918xx series of chips, based on the concept of smarter, low power and smaller, have better performance in terms of BLE5.1 features, RF characteristics, low power consumption and overall chip specifications against the international top products.
Ingchips ING918xx Series BLE SoC for Feiyu Vimble 3 Stabilizer with 1.25Mbps GATT Data Rate Provides High Stability and Performance
Ingchips high-performance BLE SoC ING918xx was applied in Feiyu Vimble 3 mobile phone stabilizer which was officially launched on March 23, 2022. ING918xx series BLE SoC, with its leading chip design technology, provide high stability, high compatibility and development convenience to the customers.
【产品】国产高稳定性和高兼容性的BLE SoC芯片ING918xx,适用于飞宇Vimble 3三轴手机稳定器
飞宇Vimble 3三轴手机稳定器,于2022年3月23日上午10点正式上市。这款产品中的BLE SoC芯片采用了桃芯的ING918XX系列产品。该产品具有高稳定性、高兼容性、适应于敏感复杂环境等一系列特点。
【产品】采用QFN40封装的低功耗蓝牙5.1芯片ING918xx,支持全新的蓝牙5.0全部特性
桃芯科技推出了一款采用QFN40封装、40nm工艺的低功耗蓝牙5.1芯片ING918xx,无论从BLE5特性,射频特性,芯片整体规格,以及低功耗等方面,均具更好的表现。
【经验】如何使用918xx蓝牙SoC芯片进行BLE 5.x测速
桃芯科技为客户提供易用的SDK,帮助客户便捷、高效地开发蓝牙产品。本文桃芯科技将要分享918xx蓝牙SoC芯片通过BLE 2M 物理层带来的 1.2M+ “实感”速率无疑可以为 BLE 开拓更多的应用场景:支持视频实时传输的智能门铃,低时延高保真耳机等等。
【经验】桃芯科技SDK如何快捷完成多角色多状态并发及量产任务
INGChips(桃芯科技)为客户提供易用的 SDK,帮助客户便捷、高效地开发蓝牙产品。本文演示通过INGChips SDK如何快捷地完成多角色并发及量产功能。
Ingchips SDK用户指南
本指南为INGCHIPS 918xx/9186xx蓝牙5.x全功能SoC解决方案的软件开发套件(SDK)提供详细说明。内容包括SDK架构、核心工具、语言与IDE集成、平台包、示例和文档。指南涵盖了从软件角度深入理解蓝牙开发的过程,包括Hello World教程、iBeacon教程、核心工具介绍、内存管理、多任务处理、中断管理、电源管理、CMSIS API、调试与跟踪等。
桃芯科技 - BLE 5.X全功能SOC,SOFTWARE DEVELOPMENT KIT,软件开发工具包,SDK,BLE 5.X FULL FEATURE SOC,SDK开发包,ING918XX,ING9186XX
INGCHIPS SDK开发者用户手册
本手册为INGCHIPS SDK开发者提供全面指南,涵盖从项目创建到固件升级的BLE开发流程。内容包括: 1. SDK架构,支持C语言和Nim语言开发,提供核心工具和RTOS软件包。 2. 教程示例,包括“Hello, World”、iBeacon、温度计和FOTA温度计。 3. 核心工具,如向导、下载器和Trace工具。 4. 深入SDK,涉及内存管理、多任务、中断管理和功耗管理。 5. Platform API参考,提供详细函数原型和示例。 6. iBeacon扫描设备,实现iBeacon扫描和距离估算。 7. 通知&指示,处理任务间通信和定时器。 8. 吞吐量测试,评估系统性能。 9. 双角色&BLE网关,创建外设APP和Nim APP。
桃芯科技 - SOFTWARE DEVELOPMENT KIT,软件开发工具包,BLE 5.X全功能SOC,SDK,SDK开发包,ING918XX,ING9186XX,ING916XX,916XX,918XX
ING918XX测试报告
本报告详细介绍了ING91XX系列元器件的测试结果。内容包括电源测试、时钟测试、ADC测试、RF测试、CP测试、功能测试、与手机可靠性测试、范围与数据速率测试、ESD测试和HTOL测试。报告涵盖了各项测试的详细数据和结果分析,旨在全面评估该系列元器件的性能和可靠性。
桃芯科技 - ING918XX,ING91XX
桃芯科技完成首个支持AoA/AoD的蓝牙BLE5.1芯片Link+PHY+RF BQB子系统认证
桃芯科技在泰尔实验室完成了第一个支持AoA/AoD的BLE5.1 Link+PHY+RF BQB子系统认证。泰尔终端实验室召开“泰尔论坛2020-5G+AIoT助推人居生活数字化发展”专题活动,向桃芯科技颁发蓝牙5.1BLE芯片“物联网智能化测评证书”。
【视频】桃芯科技BLE+UWB+NFC三合一汽车钥匙,完美解决10厘米安全定位
桃芯科技 - 消费级低功耗蓝牙芯片,BLE SOC,车规级低功耗蓝牙芯片,BLE SOC语言,ING91871B,ING91881B,ING91682C,ING91870C,ING91680C,ING91880C,ING91888A,ING91870CQ,智能水表,智慧畜牧业,工业物联网,AOA,国家电网,医疗设备,边缘计算,AOD,智能家居,消费电子,智慧农业,汽车电子
电子商城
登录 | 立即注册
提交评论