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 17, 2025
1 parent 9b8fffe commit 668d121
Show file tree
Hide file tree
Showing 8 changed files with 944 additions and 9 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, , 0x1A9000,
ota_1, app, ota_1, , 0x190000,
rcp_fw, data, spiffs, , 0xA0000,
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
249 changes: 249 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,221 @@ 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;
}

/** Nodes should be expected to be deployed to any and all regions of the world. These global regions
may have differing common languages, units of measurements, and numerical formatting
standards. As such, Nodes that visually or audibly convey information need a mechanism by which
they can be configured to use a user’s preferred language, units, etc */
cluster LocalizationConfiguration = 43 {
revision 1; // NOTE: Default/not specifically set

attribute access(write: manage) char_string<35> activeLocale = 0;
readonly attribute char_string supportedLocales[] = 1;
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;
}

/** Nodes should be expected to be deployed to any and all regions of the world. These global regions
may have differing preferences for how dates and times are conveyed. As such, Nodes that visually
or audibly convey time information need a mechanism by which they can be configured to use a
user’s preferred format. */
cluster TimeFormatLocalization = 44 {
revision 1; // NOTE: Default/not specifically set

enum CalendarTypeEnum : enum8 {
kBuddhist = 0;
kChinese = 1;
kCoptic = 2;
kEthiopian = 3;
kGregorian = 4;
kHebrew = 5;
kIndian = 6;
kIslamic = 7;
kJapanese = 8;
kKorean = 9;
kPersian = 10;
kTaiwanese = 11;
kUseActiveLocale = 255;
}

enum HourFormatEnum : enum8 {
k12hr = 0;
k24hr = 1;
kUseActiveLocale = 255;
}

bitmap Feature : bitmap32 {
kCalendarFormat = 0x1;
}

attribute access(write: manage) HourFormatEnum hourFormat = 0;
attribute access(write: manage) optional CalendarTypeEnum activeCalendarType = 1;
readonly attribute optional CalendarTypeEnum supportedCalendarTypes[] = 2;
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;
}

/** 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 +1618,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 +1674,39 @@ 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 eventList;
callback attribute attributeList;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;

handle command AnnounceOTAProvider;
}

server cluster LocalizationConfiguration {
persist attribute activeLocale default = "en-US";
callback attribute supportedLocales;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
}

server cluster TimeFormatLocalization {
persist attribute hourFormat default = 0;
persist attribute activeCalendarType default = 0;
callback attribute supportedCalendarTypes;
ram attribute featureMap default = 0;
ram attribute clusterRevision default = 1;
}

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

0 comments on commit 668d121

Please sign in to comment.