This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2642R:使用简单外设片外应用实现 FOTA

Guru**** 2589245 points
Other Parts Discussed in Thread: CC2642R, SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1118460/cc2642r-fota-implementation-using-simple-peripheral-off-chip-application

器件型号:CC2642R
Thread 中讨论的其他器件: SysConfig

您好,

我们将使用 simple_peripheral_oad_offchip 和 bim_offchip 开始实施 FOTA。 并且、我已经使用 SDK 中提供的 simple_peripheral 示例代码开发了我的 FW 应用。 现在、我们 计划将 定制的 simple_peripheral 应用集成到  simple_peripheral_oad_offchip 代码中。 我们 根据要求对 simple_peripheral 应用代码进行了一些更改、这些更改如下所示:

1) 1)在 syscfg 中->配置 Genral BLE 设置->在 syscfg 文件中将地址模式更改为公共地址。
                                      将 PDU 的最大大小更改为255
                                      将最大连接数更改为1

在 syscfg ->配置外设角色设置->将请求的最小连接间隔(ms)更改为10
                                        将请求的最大连接间隔(ms)更改为20

syscfg ->  Broadcaster Configuration -> Advertisement Set 1 -> Scan Response Data 1 ->将最小连接间隔(ms)更改为100
                                                                         将最大连接间隔(ms)更改为130 (扫描响应数据2也更改了相同值)

2) 2)我们使用内部振荡器 LF RCOSC

3) 3)要更改器件名称器件名称、请更改以下数组中的广播和扫描响应数据 advData1、scanResData1、advData2

4)在 simple_gatt_profile.c 中->在函数 GATTServApp_ProcessCharCfg 中->添加了如下所示的参数(SDK BLE 堆栈更改)

更改前:

GATTServApp_ProcessCharCfg (simpleProfileChar4Config、&simpleProfileChar4、false、
simpleProfileAttrTbl、GATT_NUM_ATTRS (simpleProfileAttrTbl)、
invalid _task_ID,simpleProfile_ReadAttrCB );

更改后:(此处添加了第三个参数、以便在从 perupheral 发送通知期间发送带数据的长度)

GATTServApp_ProcessCharCfg ( simpleProfileChar4Config、 simpleProfileChar4、length、false、
simpleProfileAttrTbl、GATT_NUM_ATTRS ( simpleProfileAttrTbl)、
invalid _task_ID、 simpleProfile_ReadAttrCB);  //&simpleProfileChar4 -仅用于1字节


5)将特性4 (通知特性)缓冲器长度更改为240
6) 6)将 gattAttribute_t SimpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTELTED 变量中的特性5权限从 GATT_permissing_AUTHEN_Read 更改为 GATT_permissing_read。

7) 7)在以下 API 中使用 GAP_ADV_ENABLE_OPTIONS_USE_MAX 选项启用通告、而不是 GAP_ADV_ENABLE_OPTIONS_USE_DURATION -> GapAdv_ENABLE (gBLE_HandleLegacy、GAP_ADV_ENABLE_OPTIONS_USE_MAX、0);

  

在将自定义的 simple_peripheral 应用与 simple_peripheral_oad_offchip 应用集成时 ,上述7点将影响  simple_peripheral_oad_offchip 应用,还是不会影响? 请尽快告知我们这些详细信息。   如果它影响我们如何处理它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在仔细查看所提供的更改后、我相信不会对您的应用产生影响。 我建议将这些更改和测试整合在一起、以确保正确。 请告诉我、如果您在添加这些更改时观察到任何意外行为或错误、我将非常乐意为您提供帮助。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、

    芯片组的定制硬件:CC2642R
    EVK:CC2642R1/CC2652R1开发套件
    SDK:simplelink_cc13x2_26x2_sdk_5_20_00_52
    定制硬件中的 SPI 闪存:MX25R1635FZNIH0


    1)简单外设片外 OAD 正在 EVK 中工作。我们将仅使用 BIM 和应用程序。 不使用持久应用程序、因为它不是必需的。我们将在自定义硬件中实现相同的应用程序。 在 EVK 中、使用了 macronix 1MB 闪存、但在我们的硬件中、我们使用 macronix 2MB 闪存(MX25R1635FZNIH0)。我们尝试在硬件中加载默认的简单外设片外代码。 现在、我们正在从 TI Starter Link Mobile 应用程序发出 OAD 升级请求、当新固件开始下载时、我们知道新映像将下载到外部闪存中、并且我们已经为配置映射了 SPI 闪存的前1MB 部分 数据。 因此、我们计划将 SPI 闪存的下一个1MB 部分用于 OAD 映像。 当我们在您的指南行中查看了片外应用的内存分配、如下所示、

    我们计划为下一个1MB 映射相同的内容。 通过 BIM、我们还将访问定制硬件中的外部闪存。 在 Bim 片外、无论示例代码中遵循什么序列、我们计划使用相同的序列来访问定制硬件 SPI 闪存中的下一个1MB。 您能告诉我们这是否不会造成任何问题、以确保我们的安全。

    当从 Bim 片外应用程序访问我们定制硬件中的 SPI 时,示例 Bim 片外代码中使用的现有 API 不适用于我们的定制硬件 SPI 闪存,那么我们应该可以使用默认 SPI API,或者应该实施我们的定制 SPI API

    2) 2)是否必须在外部 SPI 闪存中加载出厂映像?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否澄清哪些 API 在您的定制硬件中不起作用? 我将研究您的方法是否存在问题、并尽快返回给您。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    否目前它正在使用 示例片外代码和 EVK。  对于我的定制硬件,我们应该 使用 默认的 SPI API,还是应该实施我们的定制 SPI API?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Mohan、

    我看不到使用默认 SPI API 时出现任何问题。 由于外部闪存器件已更改、您必须为新的闪存器件(即引脚分配的任何更改)对其进行配置。 这应该使用 SysConfig 来完成。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ammar:

    我们 有一个有关实现片外 OAD 的查询。

    步骤1:我加载了 OAD_offchip 和 bim_off 芯片代码

    第2步:我使用 starter link 移动应用程序连接了器件、并 根据  下面给出的图片、点击了移动应用程序中的"TI OAD Service"

    步骤3:  现在 、在 简单外设 OAD off_chip 应用中、它正在调用"OAD_ProcessQueue"函数->现在它进入"OAD_idle"状态->现在它进入"OAD_WRITE_Identify_Req"事件->现在它正在调用函数"oadImgIdentifywrite"->现在、它进入该函数 if (!useExternalFlas)->现在它正在调用"oadFindExtFlMetaPage->在该函数中、它们正在从外部闪存读取数据、如下所述

    for (uint8_t curPg = EFL_FACT_IMG_meta_PG;curPg < OAD_EFL_MAX_meta;++curPg)   

    //从 ExtFl 读取元数据     

    readFlashPg (curPg、0、(uint8_t *)&extFlMetaHdr、sizeof (ExtImageInfo_t));

    此处、我们使用"extFlMetaHdr"结构从外部闪存读取数据。

    但这里的查询 实际上是 我们在代码中写入外部闪存的位置? 因为如果我们在某个地方将此数据写入外部闪存,那么我们只能读取正确的数据? 因此、请 提供详细信息、例如、我们将这些标头详细信息写入外部闪存的代码。  

    我们提出的原因是->我们在项目中使用 SPI 闪存、因此我们必须在 SPI 闪存上写入相同的内容、并且我们必须在调用这些 "oadFindExtFlMetaPage"函数时进行回读。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="507677" URL"~支持/无线连接/bluetooth-group/f/bluetooth-forum/1118460/cc2642r-FOTA-Implementation 使用- simple-peripheral-off-chip-application/4162904#4162904"]但此处的查询 实际上是 我们在代码中写入外部闪存的位置?[引用/引用]

     在状态机切换到 OAD_DOWNLOAD 状态后、映像随 OAD_WRITE_BLOCK_REQ 事件一起下载。 验证映像后将切换状态。 OAD_WRITE_BLOCK_REQ 调用 oadImgBlockWrite 来执行任务。

    [引用 userid="507677" URL"~支持/无线连接/bluetooth-group/f/bluetooth-forum/1118460/cc2642r-FOTA-Implementation 使用- simple-peripheral-off-chip-application/4162904#4162904"]我们要求的原因是->我们在我们的项目中使用 SPI 闪存、 同时调用了相同的函 数 Flating/函数 Flating]

    您能澄清一下用例吗? 您无需更改 OAD 文件、只需更改闪存接口即可。 不需要修改 OAD 状态机背后的特定逻辑。 有关信息、请查看 flash_interface.h 文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ammar:

    我们检查 了 OAD_WRITE_BLOCK_REQ oadImgBlockWrite 我们期望的数据不是在该位置写入的。

    我们在 oadFindExtFlMetaPage"函数 中包含了头文件结构打印。  在使用 EVK 外部闪存时 、我们接收 到以下数据、这些数据是从外部闪存接收的、

    curPg:0 
    extFlMetaHdr.extFlAddr:de000
    extFlMetaHdr.counter:85 
    extFlMetaHdr.bimVer:3. 
    extFlMetaHdr.CRC32:986029725 
    extFlMetaHdr.crcStat:254 
    extFlMetaHdr.hdrLen:44 
    extFlMetaHdr.imgCpStat:255 
    extFlMetaHdr.imgEndAddr:132960 
    extFlMetaHdr.imgID:O A D N V M 1. 
    extFlMetaHdr.imgNo:1. 
    extFlMetaHdr.imgType:5. 
    extFlMetaHdr.imgVld:4294967295 
    extFlMetaHdr.len:132960 
    extFlMetaHdr.metaVer:1. 
    extFlMetaHdr.prgEntry:144 
    extFlMetaHdr.rfu:65535 
    extFlMetaHdr.softVer:53688036 
    extFlMetaHdr.techType:65534 

    我们怀疑从外部闪存读取的数据应该写入代码中的某个位置、对吧?

    1) 1)当我们尝试为 定制硬件打印上述内容时、我们会得到的数据为0、从这一点我们了解到标头数据尚未写入外部闪存。 因此、我们 尝试找到这段代码来处理我的定制外部闪存硬件上的标头写入、但无法找到这部分代码。 您能告诉我们代码的哪个部分处理此写入吗? 它 在哪个状态下写入到外部闪存中?

    2) 2)在我们的定制硬件中,我们使用不同 的外部闪存部件,由于 我们先前遇到的一些问题,我们在实施中使用 SPI_open、SPI_write。
    现在、在 OAD 中、他们使用 NVS_WRITE、NVS_OPEN 调用。 我们是否可以使用 SPI_open、SPI_write 代替 NVS 调用。 是否也可以确认?

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~引语 userid="507677" URL"支持/无线连接/bluetooth-group/f/bluetooth-forum/1118460/cc2642r-FOTA-implementation - using - simple-peripheral-off-chip-application/4164418#4164418"]您能告诉我们代码的哪个部分处理此写入? 在哪个状态期间 、它将写入外部闪存?[/quot]

    您可以跟踪 对 writeFlashPg 的调用以查看何时将数据写入外部闪存。

    [引用 userid="507677" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/1118460/cc2642r-FOTA-implementation 使用-simple-peripheral-off-chip-application/4164418#4164418"]2)在我们的定制硬件中,我们使用不同 的外部闪存部件, 并且由于我们在使用 SPI_write 之前的实施存在一些问题,因此我们在使用 SPI_write。
    现在、在 OAD 中、他们使用 NVS_WRITE、NVS_OPEN 调用。 我们是否可以使用 SPI_open、SPI_write 代替 NVS 调用。 是否也可以确认?

    请看 FLASH_interface.h 理论  上、您应该能够用 FLASH_interface_ext_rtos_NVS.c 文件替换 FLASH_interface_ext_rtos 文件(仅使用 SPI 写入)。 可能需要执行其他步骤。 我们的 LaunchPad 使用 MX25R8035F SPI 闪存、该闪存通过"使用硬件"字段传递到 NVS 驱动程序(我将查看生成的代码 ti_drivers_config.c 文件)。

    后退一步、您是否曾尝试重新映射 SPI 硬件线路以匹配您的定制器件? 同样、不需要在负载级别进行更改、您应该能够通过重新映射 SPI 硬件并重新配置 FLASH_interface 来使用不同的外部闪存部件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Ammar

    我们跟踪了所有  writeFlashPg 调用以及 OAD_WRITE_BLOCK_REQ 这个调用、但是我们仍然不能找到 它写入外部 闪存的确切位置。 在 oad_image_header.h 中、我们找到 const 与头文件结构相同的结构。 它是否有任何可重链接的内容?

    如果您在代码中提到写入外部闪存中的图像标头的那部分、那会更有帮助

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Mohan、

    我想我可能会误解这个问题。

    您想知道映像在外部闪存中写入的位置吗?

    writeFlashPg()函数用于执行写入外部闪存的任务。 当我们写入闪存时、我们传递页码(即  "imagePage"外部闪存中的位置)。

    具体而言、图像标题应以行~1167的形式写入、请参阅以下摘录。

                    // Write a OAD_BLOCK to Flash.
                    status = writeFlashPg(imagePage, 0,
                                            (uint8_t * ) &candidateImageHeader,
                                            sizeof(imgHdr_t));