Skip to content

Commit

Permalink
esp32: add thread border router ota function
Browse files Browse the repository at this point in the history
  • Loading branch information
Jerry-ESP committed Jan 23, 2025
1 parent 9b8fffe commit f487cc2
Show file tree
Hide file tree
Showing 8 changed files with 662 additions and 62 deletions.
13 changes: 13 additions & 0 deletions examples/thread-br-app/esp32/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ guides to get started.
- [OpenThread CLI](#openthread-cli)
- [Setup Thread Network](#setup-thread-network)
- [Commissioning Thread End Devices](#commissioning-thread-end-devices)
- [Generate OTA Firmware For BR](#generate-ota-firmware-for-br)

---

Expand Down Expand Up @@ -92,3 +93,15 @@ the Thread network.
```
./chip-tool pairing ble-wifi 2 hex:<dataset_tlvs> <pincode> <discriminator>
```

### Generate OTA Firmware For BR

Can use this python
[script](https://github.com/espressif/esp-thread-br/blob/main/components/esp_rcp_update/create_ota_image.py)
to merge thread border router firmware and the RCP firmware

```
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
```

Then can use the generated bin file to create a Matter OTA file normally.
6 changes: 3 additions & 3 deletions examples/thread-br-app/esp32/partitions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
nvs, data, nvs, , 0xC000,
otadata, data, ota, , 0x2000,
phy_init, data, phy, , 0x1000,
ota_0, app, ota_0, , 1800K,
ota_1, app, ota_1, , 1800K,
rcp_fw, data, spiffs, , 300K,
ota_0, app, ota_0, , 1700k,
ota_1, app, ota_1, , 1600k,
rcp_fw, data, spiffs, , 640k,
25 changes: 22 additions & 3 deletions examples/thread-br-app/esp32/sdkconfig.defaults
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n

# Increase some stack size
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=7200
CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120
CONFIG_ESP_MAIN_TASK_STACK_SIZE=10240
CONFIG_ESP_TIMER_TASK_STACK_SIZE=5120
CONFIG_CHIP_TASK_STACK_SIZE=10240

# USB console for Thread border board
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
Expand Down Expand Up @@ -69,9 +70,27 @@ CONFIG_THREAD_NETWORK_COMMISSIONING_DRIVER=n

# Auto update RCP firmware
CONFIG_AUTO_UPDATE_RCP=y
CONFIG_ENABLE_OTA_REQUESTOR=y
CONFIG_CREATE_OTA_IMAGE_WITH_RCP_FW=y

# Use platform mDNS
CONFIG_USE_MINIMAL_MDNS=n

# Enable Matter shell
CONFIG_ENABLE_CHIP_SHELL=y
# Reduce flash size
CONFIG_ENABLE_CHIP_SHELL=n
CONFIG_OPENTHREAD_CLI=n
CONFIG_NEWLIB_NANO_FORMAT=y

CONFIG_NIMBLE_MAX_CONNECTIONS=1
CONFIG_BTDM_CTRL_BLE_MAX_CONN=1
CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
CONFIG_BT_NIMBLE_ROLE_OBSERVER=n

CONFIG_EVENT_LOGGING_CRIT_BUFFER_SIZE=1024

#CONFIG_LOG_DEFAULT_LEVEL_ERROR=y

CONFIG_COMPILER_OPTIMIZATION_SIZE=y
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y
CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
172 changes: 172 additions & 0 deletions examples/thread-br-app/thread-br-common/thread-br-app.matter
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,160 @@ cluster BasicInformation = 40 {
command MfgSpecificPing(): DefaultSuccess = 0;
}

/** Provides an interface for providing OTA software updates */
cluster OtaSoftwareUpdateProvider = 41 {
revision 1; // NOTE: Default/not specifically set

enum ApplyUpdateActionEnum : enum8 {
kProceed = 0;
kAwaitNextAction = 1;
kDiscontinue = 2;
}

enum DownloadProtocolEnum : enum8 {
kBDXSynchronous = 0;
kBDXAsynchronous = 1;
kHTTPS = 2;
kVendorSpecific = 3;
}

enum StatusEnum : enum8 {
kUpdateAvailable = 0;
kBusy = 1;
kNotAvailable = 2;
kDownloadProtocolNotSupported = 3;
}

readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;

request struct QueryImageRequest {
vendor_id vendorID = 0;
int16u productID = 1;
int32u softwareVersion = 2;
DownloadProtocolEnum protocolsSupported[] = 3;
optional int16u hardwareVersion = 4;
optional char_string<2> location = 5;
optional boolean requestorCanConsent = 6;
optional octet_string<512> metadataForProvider = 7;
}

response struct QueryImageResponse = 1 {
StatusEnum status = 0;
optional int32u delayedActionTime = 1;
optional char_string<256> imageURI = 2;
optional int32u softwareVersion = 3;
optional char_string<64> softwareVersionString = 4;
optional octet_string<32> updateToken = 5;
optional boolean userConsentNeeded = 6;
optional octet_string<512> metadataForRequestor = 7;
}

request struct ApplyUpdateRequestRequest {
octet_string<32> updateToken = 0;
int32u newVersion = 1;
}

response struct ApplyUpdateResponse = 3 {
ApplyUpdateActionEnum action = 0;
int32u delayedActionTime = 1;
}

request struct NotifyUpdateAppliedRequest {
octet_string<32> updateToken = 0;
int32u softwareVersion = 1;
}

/** Determine availability of a new Software Image */
command QueryImage(QueryImageRequest): QueryImageResponse = 0;
/** Determine next action to take for a downloaded Software Image */
command ApplyUpdateRequest(ApplyUpdateRequestRequest): ApplyUpdateResponse = 2;
/** Notify OTA Provider that an update was applied */
command NotifyUpdateApplied(NotifyUpdateAppliedRequest): DefaultSuccess = 4;
}

/** Provides an interface for downloading and applying OTA software updates */
cluster OtaSoftwareUpdateRequestor = 42 {
revision 1; // NOTE: Default/not specifically set

enum AnnouncementReasonEnum : enum8 {
kSimpleAnnouncement = 0;
kUpdateAvailable = 1;
kUrgentUpdateAvailable = 2;
}

enum ChangeReasonEnum : enum8 {
kUnknown = 0;
kSuccess = 1;
kFailure = 2;
kTimeOut = 3;
kDelayByProvider = 4;
}

enum UpdateStateEnum : enum8 {
kUnknown = 0;
kIdle = 1;
kQuerying = 2;
kDelayedOnQuery = 3;
kDownloading = 4;
kApplying = 5;
kDelayedOnApply = 6;
kRollingBack = 7;
kDelayedOnUserConsent = 8;
}

fabric_scoped struct ProviderLocation {
node_id providerNodeID = 1;
endpoint_no endpoint = 2;
fabric_idx fabricIndex = 254;
}

info event StateTransition = 0 {
UpdateStateEnum previousState = 0;
UpdateStateEnum newState = 1;
ChangeReasonEnum reason = 2;
nullable int32u targetSoftwareVersion = 3;
}

critical event VersionApplied = 1 {
int32u softwareVersion = 0;
int16u productID = 1;
}

info event DownloadError = 2 {
int32u softwareVersion = 0;
int64u bytesDownloaded = 1;
nullable int8u progressPercent = 2;
nullable int64s platformCode = 3;
}

attribute access(write: administer) ProviderLocation defaultOTAProviders[] = 0;
readonly attribute boolean updatePossible = 1;
readonly attribute UpdateStateEnum updateState = 2;
readonly attribute nullable int8u updateStateProgress = 3;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;

request struct AnnounceOTAProviderRequest {
node_id providerNodeID = 0;
vendor_id vendorID = 1;
AnnouncementReasonEnum announcementReason = 2;
optional octet_string<512> metadataForNode = 3;
endpoint_no endpoint = 4;
}

/** Announce the presence of an OTA Provider */
command AnnounceOTAProvider(AnnounceOTAProviderRequest): DefaultSuccess = 0;
}

/** This cluster is used to manage global aspects of the Commissioning flow. */
cluster GeneralCommissioning = 48 {
revision 1; // NOTE: Default/not specifically set
Expand Down Expand Up @@ -1403,6 +1557,7 @@ provisional cluster ThreadBorderRouterManagement = 1106 {
endpoint 0 {
device type ma_rootdevice = 22, version 1;

binding cluster OtaSoftwareUpdateProvider;

server cluster Descriptor {
callback attribute deviceTypeList;
Expand Down Expand Up @@ -1458,6 +1613,23 @@ endpoint 0 {
ram attribute clusterRevision default = 3;
}

server cluster OtaSoftwareUpdateRequestor {
emits event StateTransition;
emits event VersionApplied;
emits event DownloadError;
callback attribute defaultOTAProviders;
ram attribute updatePossible default = true;
ram attribute updateState default = 0;
ram attribute updateStateProgress;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;

handle command AnnounceOTAProvider;
}

server cluster GeneralCommissioning {
ram attribute breadcrumb default = 0x0000000000000000;
callback attribute basicCommissioningInfo;
Expand Down
Loading

0 comments on commit f487cc2

Please sign in to comment.