Skip to content

Commit b88108f

Browse files
committed
Update the implementation of some APIs
1 parent d836b80 commit b88108f

File tree

7 files changed

+74
-194
lines changed

7 files changed

+74
-194
lines changed

config/esp32/components/chip/idf_component.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ dependencies:
2626
- if: "target != esp32h2"
2727

2828
espressif/esp_rcp_update:
29-
version: "1.2.0"
29+
version: "~1.3.0"
3030
rules:
3131
- if: "idf_version >=5.0"
3232

examples/thread-br-app/esp32/README.md

+12-13
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ guides to get started.
1111

1212
---
1313

14-
- [OpenThread Border Router Board](#openthread-border-router-board)
15-
- [OpenThread RCP](#openthread-rcp)
16-
- [OpenThread CLI](#openthread-cli)
17-
- [Setup Thread Network](#setup-thread-network)
18-
- [Commissioning Thread End Devices](#commissioning-thread-end-devices)
19-
- [Generate OTA Firmware For BR](#generate-ota-firmware-for-br)
14+
- [Matter ESP32 Thread Border Router Example](#matter-esp32-thread-border-router-example)
15+
- [OpenThread Border Router Board](#openthread-border-router-board)
16+
- [OpenThread RCP](#openthread-rcp)
17+
- [OpenThread CLI](#openthread-cli)
18+
- [Setup Thread Network](#setup-thread-network)
19+
- [Commissioning Thread End Devices](#commissioning-thread-end-devices)
20+
- [Generate OTA Firmware For BR](#generate-ota-firmware-for-br)
2021

2122
---
2223

@@ -96,12 +97,10 @@ the Thread network.
9697

9798
### Generate OTA Firmware For BR
9899

99-
Can use this python
100-
[script](https://github.com/espressif/esp-thread-br/blob/main/components/esp_rcp_update/create_ota_image.py)
101-
to merge thread border router firmware and the RCP firmware
100+
After enable the option `CONFIG_CREATE_OTA_IMAGE_WITH_RCP_FW` in menuconfig, will generate
101+
OTA image with rcp firmware in build process, named `ota_with_rcp_image` in build folder.
102102

103+
Then can add a Matter OTA header for the ota_with_rcp_image file.
103104
```
104-
python create_ota_image.py --rcp-build-dir /path/to/rcp_image/dir --br-firmware /path/to/br_image --target-file ota_target_file.bin
105-
```
106-
107-
Then can use the generated bin file to create a Matter OTA file normally.
105+
./ota_image_tool.py create -v 65521 -p 32768 --version 1 --version-str "v1.0" -da sha256 build/ota_with_rcp_image ota_with_rcp_image.ota
106+
```

examples/thread-br-app/esp32/partitions.csv

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
nvs, data, nvs, , 0xC000,
44
otadata, data, ota, , 0x2000,
55
phy_init, data, phy, , 0x1000,
6-
ota_0, app, ota_0, , 1700k,
6+
ota_0, app, ota_0, , 1600k,
77
ota_1, app, ota_1, , 1600k,
88
rcp_fw, data, spiffs, , 640k,

examples/thread-br-app/esp32/sdkconfig.defaults

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n
2929

3030
# Increase some stack size
3131
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=7200
32-
CONFIG_ESP_MAIN_TASK_STACK_SIZE=10240
32+
CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120
3333
CONFIG_ESP_TIMER_TASK_STACK_SIZE=5120
34-
CONFIG_CHIP_TASK_STACK_SIZE=10240
34+
CONFIG_CHIP_TASK_STACK_SIZE=9216
3535

3636
# USB console for Thread border board
3737
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
@@ -88,7 +88,7 @@ CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
8888

8989
CONFIG_EVENT_LOGGING_CRIT_BUFFER_SIZE=1024
9090

91-
#CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
91+
CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
9292

9393
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
9494
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y

src/platform/ESP32/OTAImageProcessorImpl.cpp

+44-174
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,13 @@
3636
#include <esp_delta_ota.h>
3737
#endif // CONFIG_ENABLE_DELTA_OTA
3838

39-
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
40-
#include "esp_br_firmware.h"
41-
#include "esp_check.h"
42-
#include "esp_rcp_update.h"
43-
#endif
44-
4539
#define TAG "OTAImageProcessor"
4640

4741
#ifdef CONFIG_ENABLE_DELTA_OTA
4842
#define PATCH_HEADER_SIZE 64
4943
#define DIGEST_SIZE 32
5044
#endif // CONFIG_ENABLE_DELTA_OTA
5145

52-
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
53-
#define MAX_WRITE_RETRY_COUNT 5
54-
#define OTA_MAX_WRITE_SIZE 16
55-
#endif // defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
56-
5746
using namespace chip::System;
5847
using namespace ::chip::DeviceLayer::Internal;
5948

@@ -292,178 +281,33 @@ esp_err_t OTAImageProcessorImpl::DeltaOTAWriteCallback(const uint8_t * buf, size
292281
#endif // CONFIG_ENABLE_DELTA_OTA
293282

294283
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
295-
typedef enum rcpImageState
284+
esp_err_t OTAImageProcessorImpl::ProcessRcpImage(intptr_t context, const uint8_t * buffer, uint32_t bufLen)
296285
{
297-
BR_OTA_INIT = 0,
298-
RCP_DOWNLOAD,
299-
BR_FW_DOWNLOAD,
300-
} RcpImageState_t;
286+
esp_err_t err = ESP_OK;
287+
auto * imageProcessor = reinterpret_cast<OTAImageProcessorImpl *>(context);
301288

302-
static int WriteFileForLength(FILE * fp, const void * buf, size_t size)
303-
{
304-
int retryCount = 0;
305-
int offset = 0;
306-
const uint8_t * data = (const uint8_t *) buf;
307-
while (offset < size)
289+
if (!imageProcessor->mRcpDone)
308290
{
309-
int ret = fwrite(data + offset, 1, ((size - offset) < OTA_MAX_WRITE_SIZE ? (size - offset) : OTA_MAX_WRITE_SIZE), fp);
310-
if (ret < 0)
311-
{
312-
return ret;
313-
}
314-
if (ret == 0)
315-
{
316-
retryCount++;
317-
}
318-
else
319-
{
320-
offset += ret;
321-
retryCount = 0;
322-
}
323-
324-
if (retryCount > MAX_WRITE_RETRY_COUNT)
325-
{
326-
return -1;
327-
}
328-
}
329-
return size;
330-
}
331-
332-
esp_err_t OTAImageProcessorImpl::ProcessRcpImage(esp_ota_handle_t handle, const uint8_t * buffer, uint32_t bufLengthen)
333-
{
334-
static char rcpTargetPath[RCP_FILENAME_MAX_SIZE];
335-
static RcpImageState_t state = BR_OTA_INIT;
336-
static const char * rcpFirmwareDir = esp_rcp_get_firmware_dir();
337-
static int8_t rcpUpdateSeq = esp_rcp_get_next_update_seq();
338-
static uint32_t headerSize = 0;
339-
static uint32_t totalRevSize = 0;
340-
static uint32_t brFirmwareOffset = 0;
341-
static uint32_t brFirmwareSize = 0;
342-
static FILE * fp = NULL;
343-
344-
switch (state)
345-
{
346-
case BR_OTA_INIT: {
347-
sprintf(rcpTargetPath, "%s_%d/" ESP_BR_RCP_IMAGE_FILENAME, rcpFirmwareDir, rcpUpdateSeq);
348-
ESP_LOGI(TAG, "Downloading RCP target file %s", rcpTargetPath);
349-
350-
fp = fopen(rcpTargetPath, "w");
351-
if (!fp)
352-
{
353-
ESP_LOGE(TAG, "Fail to open %s, will delete it", rcpTargetPath);
354-
remove(rcpTargetPath);
355-
return ESP_FAIL;
356-
}
357-
358-
esp_br_subfile_info_t subFileInfo[7];
359-
if (sizeof(subFileInfo) > bufLengthen)
360-
{
361-
ESP_LOGE(TAG, "Packet len is less than the RCP header len");
362-
if (fp != NULL)
363-
{
364-
fclose(fp);
365-
}
366-
return ESP_FAIL;
367-
}
368-
369-
memcpy((char *) subFileInfo, buffer, sizeof(subFileInfo));
370-
for (int i = 0; i < 7; i++)
371-
{
372-
ESP_LOGD(TAG, "subFileInfo[%d].tag:0x%lx--offset:0x%lx---size:0x%lx\n", i, subFileInfo[i].tag, subFileInfo[i].offset,
373-
subFileInfo[i].size);
374-
if (subFileInfo[i].tag == FILETAG_IMAGE_HEADER)
375-
{
376-
headerSize = subFileInfo[i].size;
377-
ESP_LOGI(TAG, "RCP image header-----headerSize:%ld\n", headerSize);
378-
}
379-
else if (subFileInfo[i].tag == FILETAG_BR_FIRMWARE)
380-
{
381-
brFirmwareOffset = subFileInfo[i].offset;
382-
brFirmwareSize = subFileInfo[i].size;
383-
ESP_LOGI(TAG, "Border Router image--offset:%ld--size:%ld\n", brFirmwareOffset, brFirmwareSize);
384-
}
385-
}
386-
387-
if ((headerSize != sizeof(subFileInfo)) || (brFirmwareOffset == 0) || (brFirmwareSize == 0))
388-
{
389-
ESP_LOGE(TAG, "RCP header error");
390-
fclose(fp);
391-
return ESP_FAIL;
392-
}
291+
size_t rcpOtaReceivedLen = 0;
292+
err = esp_rcp_ota_receive(imageProcessor->mRcpOtaHandle, buffer, bufLen, &rcpOtaReceivedLen);
393293

394-
if (WriteFileForLength(fp, buffer, bufLengthen) != bufLengthen)
294+
if (esp_rcp_ota_get_state(imageProcessor->mRcpOtaHandle) == ESP_RCP_OTA_STATE_FINISHED)
395295
{
396-
ESP_LOGE(TAG, "Failed to write data");
397-
fclose(fp);
398-
return ESP_FAIL;
296+
imageProcessor->mBrFirmwareSize = esp_rcp_ota_get_subfile_size(imageProcessor->mRcpOtaHandle, FILETAG_HOST_FIRMWARE);
297+
err = esp_ota_write(imageProcessor->mOTAUpdateHandle, buffer + rcpOtaReceivedLen, bufLen - rcpOtaReceivedLen);
298+
imageProcessor->mRcpDone = true;
399299
}
400-
401-
state = RCP_DOWNLOAD;
402-
totalRevSize = bufLengthen;
403-
break;
404-
}
405-
case RCP_DOWNLOAD: {
406-
if (totalRevSize + bufLengthen >= brFirmwareOffset)
407-
{
408-
uint32_t len = brFirmwareOffset - totalRevSize;
409-
if (WriteFileForLength(fp, buffer, len) == len)
410-
{
411-
ESP_LOGI(TAG, "RCP receive done, total size %ld bytes", brFirmwareOffset);
412-
state = BR_FW_DOWNLOAD;
413-
fclose(fp);
414-
if (esp_rcp_submit_new_image() != ESP_OK)
415-
{
416-
ESP_LOGI(TAG, "Failed to submit RCP image");
417-
state = BR_OTA_INIT;
418-
return ESP_FAIL;
419-
}
420-
}
421-
else
422-
{
423-
ESP_LOGE(TAG, "Failed to write data");
424-
fclose(fp);
425-
state = BR_OTA_INIT;
426-
return ESP_FAIL;
427-
}
428-
429-
if (esp_ota_write(handle, buffer + len, bufLengthen - len) != ESP_OK)
430-
{
431-
ESP_LOGE(TAG, "OTA write failed");
432-
state = BR_OTA_INIT;
433-
return ESP_FAIL;
434-
}
435-
436-
totalRevSize = bufLengthen - len;
437-
}
438-
else
439-
{
440-
if (WriteFileForLength(fp, buffer, bufLengthen) != bufLengthen)
441-
{
442-
ESP_LOGE(TAG, "Failed to write data");
443-
fclose(fp);
444-
state = BR_OTA_INIT;
445-
return ESP_FAIL;
446-
}
447-
totalRevSize += bufLengthen;
448-
}
449-
break;
450-
}
451-
case BR_FW_DOWNLOAD: {
452-
if (esp_ota_write(handle, buffer, bufLengthen) != ESP_OK)
453-
{
454-
ESP_LOGE(TAG, "OTA write failed");
455-
state = BR_OTA_INIT;
456-
return ESP_FAIL;
457-
ESP_LOGI(TAG, "Thread BR image receive done");
458-
}
459-
break;
460300
}
461-
default: {
462-
return ESP_FAIL;
301+
else if (imageProcessor->mBrFirmwareSize > 0)
302+
{
303+
err = esp_ota_write(imageProcessor->mOTAUpdateHandle, buffer, bufLen);
463304
}
305+
else
306+
{
307+
err = ESP_FAIL;
464308
}
465309

466-
return ESP_OK;
310+
return err;
467311
}
468312
#endif
469313

@@ -524,6 +368,16 @@ void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context)
524368
}
525369
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
526370

371+
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
372+
imageProcessor->mRcpOtaHandle = 0;
373+
imageProcessor->mBrFirmwareSize = 0;
374+
imageProcessor->mRcpDone = false;
375+
if (esp_rcp_ota_begin(&imageProcessor->mRcpOtaHandle) != ESP_OK)
376+
{
377+
return;
378+
}
379+
#endif
380+
527381
imageProcessor->mHeaderParser.Init();
528382
imageProcessor->mDownloader->OnPreparedForDownload(CHIP_NO_ERROR);
529383
PostOTAStateChangeEvent(DeviceLayer::kOtaDownloadInProgress);
@@ -567,6 +421,12 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context)
567421

568422
err = esp_ota_end(imageProcessor->mOTAUpdateHandle);
569423
DeltaOTACleanUp(reinterpret_cast<intptr_t>(imageProcessor));
424+
#elif defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
425+
esp_err_t err = esp_rcp_ota_end(imageProcessor->mRcpOtaHandle);
426+
err |= esp_ota_end(imageProcessor->mOTAUpdateHandle);
427+
imageProcessor->mRcpOtaHandle = 0;
428+
imageProcessor->mBrFirmwareSize = 0;
429+
imageProcessor->mRcpDone = false;
570430
#else
571431
esp_err_t err = esp_ota_end(imageProcessor->mOTAUpdateHandle);
572432
#endif // CONFIG_ENABLE_DELTA_OTA
@@ -608,6 +468,16 @@ void OTAImageProcessorImpl::HandleAbort(intptr_t context)
608468
DeltaOTACleanUp(reinterpret_cast<intptr_t>(imageProcessor));
609469
#endif // CONFIG_ENABLE_DELTA_OTA
610470

471+
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
472+
if (esp_rcp_ota_abort(imageProcessor->mRcpOtaHandle) != ESP_OK)
473+
{
474+
ESP_LOGE(TAG, "ESP RCP OTA abort failed");
475+
}
476+
imageProcessor->mRcpOtaHandle = 0;
477+
imageProcessor->mBrFirmwareSize = 0;
478+
imageProcessor->mRcpDone = false;
479+
#endif
480+
611481
if (esp_ota_abort(imageProcessor->mOTAUpdateHandle) != ESP_OK)
612482
{
613483
ESP_LOGE(TAG, "ESP OTA abort failed");
@@ -671,7 +541,7 @@ void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context)
671541
// Apply the patch and writes that data to the passive partition.
672542
err = esp_delta_ota_feed_patch(imageProcessor->mDeltaOTAUpdateHandle, blockToWrite.data() + index, blockToWrite.size() - index);
673543
#elif defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
674-
err = imageProcessor->ProcessRcpImage(imageProcessor->mOTAUpdateHandle, blockToWrite.data(), blockToWrite.size());
544+
err = imageProcessor->ProcessRcpImage(context, blockToWrite.data(), blockToWrite.size());
675545
#else
676546
err = esp_ota_write(imageProcessor->mOTAUpdateHandle, blockToWrite.data(), blockToWrite.size());
677547
#endif // CONFIG_ENABLE_DELTA_OTA

src/platform/ESP32/OTAImageProcessorImpl.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
#define IMG_HEADER_LEN sizeof(esp_image_header_t)
3434
#endif // CONFIG_ENABLE_DELTA_OTA
3535

36+
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
37+
#include "esp_check.h"
38+
#include "esp_rcp_update.h"
39+
#include "esp_rcp_ota.h"
40+
#endif
41+
3642
namespace chip {
3743

3844
class OTAImageProcessorImpl : public OTAImageProcessorInterface
@@ -101,7 +107,10 @@ class OTAImageProcessorImpl : public OTAImageProcessorInterface
101107
#endif // CONFIG_ENABLE_ENCRYPTED_OTA
102108

103109
#if defined(CONFIG_AUTO_UPDATE_RCP) && defined(CONFIG_OPENTHREAD_BORDER_ROUTER)
104-
esp_err_t ProcessRcpImage(esp_ota_handle_t handle, const uint8_t * buffer, uint32_t bufLengthen);
110+
esp_rcp_ota_handle_t mRcpOtaHandle;
111+
bool mRcpDone;
112+
uint32_t mBrFirmwareSize;
113+
esp_err_t ProcessRcpImage(intptr_t context, const uint8_t * buffer, uint32_t bufLen);
105114
#endif
106115
};
107116

src/platform/ESP32/OpenthreadLauncher.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ static void update_rcp(void)
156156
{
157157
// Deinit uart to transfer UART to the serial loader
158158
esp_openthread_rcp_deinit();
159-
if (esp_rcp_update() == ESP_OK)
159+
160+
esp_err_t err = esp_rcp_update();
161+
if (err == ESP_OK)
160162
{
161163
esp_rcp_mark_image_verified(true);
162164
}

0 commit comments

Comments
 (0)