- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0xFFFFFFFF,
// Program Length
OTA_MANUFACTURER_ID, // Manufacturer ID
OTA_TYPE_ID,
// Image Type
0x00000001,
// Image Version
};
#pragma required=OTA_Preamble//cyjadd
1. Boot loader 文件位置 C:\Texas Instruments\ZStack-CC2530-2.5.0\Projects\zstack\OTA\Boot\CC2530DB 如果需开启 OTA 功能,首先节点需要烧写 OTA 启动代码,方便重新引导新下载的镜像。 与 OAD 相比,OTA 的启动代码修改起来方便多了。(OAD 的方法我不多说,需要手动修 改 2 进制文件,有兴趣的朋友可以去查看 OAD 的文档)。 1. 核 对 Linker 中 output 标 签 项 下 的 配 置 信 息 ( 下 图 所 示 )
#pragma location="CRC"
const CODE otaCrc_t OTA_CRC =
{
0xFFFF,
// CRC
0xFFFF,
// CRC Shadow
};
#pragma required=OTA_CRC//cyjadd
接着需要修改链接器信息。下图所示,把原来的 xcl 文件修改成 ota.xcl,复制下面就行。 $PROJ_DIR$\..\..\..\Tools\CC2530DB\ota.xcl
选择 Texas Instruments 的目录,核对 Retain unchanged pages 和 CRC16 的勾选,勾选 前者的原因是前面已经下载的 OTA boot loader 需要在 flash page0 中保留,不能够擦 除。
2. 设置完毕后,编译一下,如果没有出错,进入下一步。 3. 生成二进制文件,按照下图配置,Output format 必须为 simple code。完成后编译一
添加下列代码到应用层初始化函数中,例如 SAPI_Init( byte task_id )注释部分是为了 方便理解自己添加的,不喜欢可以去掉。 OTA_ImageHeader_t header;//声明 preamble_t preamble;//声明 #if HAL_OTA_XNV_IS_SPI
XNV_SPI_INIT(); //初始化片外 flash 的 SPI 总线
4. 完成上述设置后,编译一下,正常是不会再有出错。进入下一步。 5. 在应用层初始化函数中,需要读取协议栈版本信息,新镜像版本号信息,当前运行镜像
的制造商 ID,镜像类型和镜像版本号等信息。最后,需要在应用层注册 OTA 回调事件 ZCL_OTA_START_CALLBACK 与 ZCL_OTA_DL_COMPLETE_CALLBACK,前者指示节点更新开始, 后者指示节点下载完成。
修 改 后 在 Tools 目 录 下 添 加 ota.xcl 文 件 , 路 径 在 C:\Texas Instruments\ZStack-CC2530-2.5.0\Projects\zstack\Tools\CC2530DB,并把原来的 f8w2530.xcl 去 掉。注意,去掉的方法是对文件点击右键 option,然后勾选 exclude from build 就行。
下,在工程目录会发现出现.sim 的文件,如果没有,再检测配置过程。 ZStack-CC2530-2.5.0\Projects\zstack\Samples\SensorDemo\CC2530DB\SensorEB\Exe
3. 添加代码与 C 文件 ZigBee 的 OTA 规范是基于 ZigBee_Cluster_Library,所以首先需要在工程中添加
#endif//cyjadd //读取 OTA 文件头信息
HalOTARead(0, (uint8 *)&header, sizeof(OTA_ImageHeader_t), HAL_OTA_DL);
if (header.magicNumber == OTA_HDR_MAGIC_NUMBER)
{
zclOTA_DownloadedFileVersion = header.fileId.version;
在 Linker 中的 Output 标签,核对下图的配置,一定要勾选 Allow C-SPY…..那个地方。 这个跟你编译后的输出文件有关,具体是什么我忘记了。
在 Debugger 目录下,如果是 CC2530DB 平台,选择 TI 的驱动,如果下面的 Device description file 是空白,自行添加,路径按照下面就行。
case ZCL_OTA_DL_COMPLETE_CALLBACK: if (pMsg->hdr.status == ZSuccess) { // Reset the CRC Shadow and reboot. The bootloader will see the // CRC shadow has been cleared and switch to the new image HalOTAInvRC(); SystemReset(); } else { // slow the poll rate back down. RxOnIdle = FALSE; ZMacSetReq( ZMacRxOnIdle, &RxOnIdle ); NLME_SetPollRate(DEVICE_POLL_RATE); } break;
*
* @param none
*
* @return none
*/
static void SensorDemoOta_ProcessOTAMsgs( zclOTA_CallbackMsg_t* pMsg )
{
uint8 RxOnIdle;
switch(pMsg->ota_event) { case ZCL_OTA_START_CALLBACK:
/*********************************************************************
* @fn
SensorDemoOta_ProcessOTAMsgs
*
* @brief Called to process callbacks from the ZCL OTA.
macTaskInit( taskID++ ); nwk_init( taskID++ ); Hal_Init( taskID++ ); #if defined( MT_TASK ) MT_TaskInit( taskID++ ); #endif APS_Init( taskID++ ); ZDApp_Init( taskID++ ); zcl_Init( taskID++ );//cyjadd SAPI_Init( taskID++ ); zclOTA_Init ( taskID );//cyjadd } 找到 tasksArr[],添加下面红色的函数指针。 const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, #if defined( MT_TASK ) MT_ProcessEvent, #endif APS_event_loop, ZDApp_event_loop, zcl_event_loop,//cyjadd SAPI_ProcessEvent, zclOTA_event_loop//cyjadd 找到工程的应用层.c 文件中,(我这里是 sapi.c,其他工程类似)添加下面部分代码, 其实就是镜像大小,制造商 ID,镜像类型与镜像版本号信息,当然还有 CRC 信息。 添加的时候,最好放在 GLOBAL VARIABLES 声明的部分,放的地方不对,貌似会报错。 #pragma location="PREAMBLE" const CODE preamble_t OTA_Preamble = {
2. Debugger 记 得 选 你 所 使 用 的 驱 动 公 司 , 一 般 都 是 TI 的 。
3. 选择 Texas Instruments 的目录,核对 Erase Flash 与 Verify download 必须是勾选,这 一 步 非 常 重 要 , 因 为 烧 写 启 动 代 码 之 前 , 需 要 把 所 有 flash 清 空 一 遍 。
if (pMsg->hdr.status == ZSuccess) {
// Speed up the poll rate RxOnIdle = TRUE;
ZMacSetReq( ZMacRxOnIdle, &RxOnIdle ); NLME_SetPollRate( 1000 ); } break;
zcl_Init( taskID++ )ZCL 任务初始化函数和 zcl_event_loop 事件处理函数。其后 需要添加 zclOTA_Init( taskID )OTA 任务初始化函数和 zclOTA_event_loop 事件处 理函数,后者正是执行 OTA 代码分发协议的核心所在。
找到 osalInitTasks( void )这个函数,添加下面的红色的初始化函数,顺序不能搞 错,一定需要反正在应用层上下两侧。
//在应用层注册 ZCL OTA 回调事件 zclOTA_Register(sapi_TaskID); 值得注意,如果不添加上述的代码,会影响到 OTA 应用控制台无法读取属性值,不添加回 调事件,会影响到 OTA 升级无法开始和传输后无法更新的错误。
接着添加回调事件的处理函数,这里函数名可以自己取,记得在前面需要声明 static void SensorDemoOta_ProcessOTAMsgs( zclOTA_CallbackMsg_t* pMsg );
4. 设置完成后,编译一下,然后下载到节点中。
2. 移植信息配置 根据 TI 的 OTA 文档,按照它的移植方法,其实最后还是漏了几点步骤没有说明,导致 我移植过程中,摸索和很久才有发现问题,起初到 TI 的 e2e 论坛发帖求助也得不到太大 帮助,后来对比了 HA 的那个 OTA 例子,不停地尝试,终于找到了解决方法。下面我简 单说一说主要步骤。以 sensordemo 为例子,移植其他例子也行。 1. 核对并修改各种配置信息(千万要认真核对) 打开工程后,到 workspace 选择你需要开启 OTA 的逻辑设备(协调器,路由器或者 节点),一般是节点,所以我这里选 SensorEB。下图所示,在 C/C++compiler 中的预 编译标签,添加 OTA_CLIENT=TRUE,如果是 HA 的例子,还需要添加 OTA_HA(一般 工程不需要)。
然后添加下图选中的四个文件,路径如下,如果不添加这个 4 个文件,编译一定会报错的。 C:\Texas Instruments\ZStack-CC2530-2.5.0\Components\stack\zcl
接着把 OTA 与 ZCL 源码文件路径添加到工程目录中,添加的所在地方如下图所示。如果不添 加,编译会提示文件路径不存在。直接复制下面进去就可以。 $PROJ_DIR$\..\..\Source $PROJ_DIR$\..\..\..\OTA\Source $PROJ_DIR$\..\..\..\..\..\Components\stack\zcl
//保存下载镜源自文库版本号
zclOTA_DownloadedZigBeeStackVersion = header.stackVersion; //保存下载镜像协议
栈版本
}
//从非易失性变量区读取 OTA 属性变量 HalOTARead(PREAMBLE_OFFSET, (uint8 *)&preamble, sizeof(preamble_t), HAL_OTA_RC); zclOTA_ManufacturerId = preamble.manufacturerId; //保存当前镜像制造商 ID zclOTA_ImageType = preamble.imageType;//保存当前镜像类型 zclOTA_CurrentFileVersion = preamble.imageVersion; //保存当前镜像版本号
void osalInitTasks( void ) {
uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));