Skip to content

Commit c13b4f4

Browse files
committed
esp32: add thread border router ota function
1 parent 9b8fffe commit c13b4f4

File tree

8 files changed

+662
-62
lines changed

8 files changed

+662
-62
lines changed

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

+13
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ guides to get started.
1616
- [OpenThread CLI](#openthread-cli)
1717
- [Setup Thread Network](#setup-thread-network)
1818
- [Commissioning Thread End Devices](#commissioning-thread-end-devices)
19+
- [Generate OTA Firmware For BR](#generate-ota-firmware-for-br)
1920

2021
---
2122

@@ -92,3 +93,15 @@ the Thread network.
9293
```
9394
./chip-tool pairing ble-wifi 2 hex:<dataset_tlvs> <pincode> <discriminator>
9495
```
96+
97+
### Generate OTA Firmware For BR
98+
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
102+
103+
```
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.

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

+3-3
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, , 1800K,
7-
ota_1, app, ota_1, , 1800K,
8-
rcp_fw, data, spiffs, , 300K,
6+
ota_0, app, ota_0, , 0x1A9000,
7+
ota_1, app, ota_1, , 0x190000,
8+
rcp_fw, data, spiffs, , 0xA0000,

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

+22-3
Original file line numberDiff line numberDiff line change
@@ -29,8 +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=5120
32+
CONFIG_ESP_MAIN_TASK_STACK_SIZE=10240
3333
CONFIG_ESP_TIMER_TASK_STACK_SIZE=5120
34+
CONFIG_CHIP_TASK_STACK_SIZE=10240
3435

3536
# USB console for Thread border board
3637
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
@@ -69,9 +70,27 @@ CONFIG_THREAD_NETWORK_COMMISSIONING_DRIVER=n
6970

7071
# Auto update RCP firmware
7172
CONFIG_AUTO_UPDATE_RCP=y
73+
CONFIG_ENABLE_OTA_REQUESTOR=y
74+
CONFIG_CREATE_OTA_IMAGE_WITH_RCP_FW=y
7275

7376
# Use platform mDNS
7477
CONFIG_USE_MINIMAL_MDNS=n
7578

76-
# Enable Matter shell
77-
CONFIG_ENABLE_CHIP_SHELL=y
79+
# Reduce flash size
80+
CONFIG_ENABLE_CHIP_SHELL=n
81+
CONFIG_OPENTHREAD_CLI=n
82+
CONFIG_NEWLIB_NANO_FORMAT=y
83+
84+
CONFIG_NIMBLE_MAX_CONNECTIONS=1
85+
CONFIG_BTDM_CTRL_BLE_MAX_CONN=1
86+
CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
87+
CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
88+
89+
CONFIG_EVENT_LOGGING_CRIT_BUFFER_SIZE=1024
90+
91+
#CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
92+
93+
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
94+
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y
95+
CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
96+
CONFIG_ESP_ERR_TO_NAME_LOOKUP=n

examples/thread-br-app/thread-br-common/thread-br-app.matter

+172
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,160 @@ cluster BasicInformation = 40 {
496496
command MfgSpecificPing(): DefaultSuccess = 0;
497497
}
498498

499+
/** Provides an interface for providing OTA software updates */
500+
cluster OtaSoftwareUpdateProvider = 41 {
501+
revision 1; // NOTE: Default/not specifically set
502+
503+
enum ApplyUpdateActionEnum : enum8 {
504+
kProceed = 0;
505+
kAwaitNextAction = 1;
506+
kDiscontinue = 2;
507+
}
508+
509+
enum DownloadProtocolEnum : enum8 {
510+
kBDXSynchronous = 0;
511+
kBDXAsynchronous = 1;
512+
kHTTPS = 2;
513+
kVendorSpecific = 3;
514+
}
515+
516+
enum StatusEnum : enum8 {
517+
kUpdateAvailable = 0;
518+
kBusy = 1;
519+
kNotAvailable = 2;
520+
kDownloadProtocolNotSupported = 3;
521+
}
522+
523+
readonly attribute command_id generatedCommandList[] = 65528;
524+
readonly attribute command_id acceptedCommandList[] = 65529;
525+
readonly attribute event_id eventList[] = 65530;
526+
readonly attribute attrib_id attributeList[] = 65531;
527+
readonly attribute bitmap32 featureMap = 65532;
528+
readonly attribute int16u clusterRevision = 65533;
529+
530+
request struct QueryImageRequest {
531+
vendor_id vendorID = 0;
532+
int16u productID = 1;
533+
int32u softwareVersion = 2;
534+
DownloadProtocolEnum protocolsSupported[] = 3;
535+
optional int16u hardwareVersion = 4;
536+
optional char_string<2> location = 5;
537+
optional boolean requestorCanConsent = 6;
538+
optional octet_string<512> metadataForProvider = 7;
539+
}
540+
541+
response struct QueryImageResponse = 1 {
542+
StatusEnum status = 0;
543+
optional int32u delayedActionTime = 1;
544+
optional char_string<256> imageURI = 2;
545+
optional int32u softwareVersion = 3;
546+
optional char_string<64> softwareVersionString = 4;
547+
optional octet_string<32> updateToken = 5;
548+
optional boolean userConsentNeeded = 6;
549+
optional octet_string<512> metadataForRequestor = 7;
550+
}
551+
552+
request struct ApplyUpdateRequestRequest {
553+
octet_string<32> updateToken = 0;
554+
int32u newVersion = 1;
555+
}
556+
557+
response struct ApplyUpdateResponse = 3 {
558+
ApplyUpdateActionEnum action = 0;
559+
int32u delayedActionTime = 1;
560+
}
561+
562+
request struct NotifyUpdateAppliedRequest {
563+
octet_string<32> updateToken = 0;
564+
int32u softwareVersion = 1;
565+
}
566+
567+
/** Determine availability of a new Software Image */
568+
command QueryImage(QueryImageRequest): QueryImageResponse = 0;
569+
/** Determine next action to take for a downloaded Software Image */
570+
command ApplyUpdateRequest(ApplyUpdateRequestRequest): ApplyUpdateResponse = 2;
571+
/** Notify OTA Provider that an update was applied */
572+
command NotifyUpdateApplied(NotifyUpdateAppliedRequest): DefaultSuccess = 4;
573+
}
574+
575+
/** Provides an interface for downloading and applying OTA software updates */
576+
cluster OtaSoftwareUpdateRequestor = 42 {
577+
revision 1; // NOTE: Default/not specifically set
578+
579+
enum AnnouncementReasonEnum : enum8 {
580+
kSimpleAnnouncement = 0;
581+
kUpdateAvailable = 1;
582+
kUrgentUpdateAvailable = 2;
583+
}
584+
585+
enum ChangeReasonEnum : enum8 {
586+
kUnknown = 0;
587+
kSuccess = 1;
588+
kFailure = 2;
589+
kTimeOut = 3;
590+
kDelayByProvider = 4;
591+
}
592+
593+
enum UpdateStateEnum : enum8 {
594+
kUnknown = 0;
595+
kIdle = 1;
596+
kQuerying = 2;
597+
kDelayedOnQuery = 3;
598+
kDownloading = 4;
599+
kApplying = 5;
600+
kDelayedOnApply = 6;
601+
kRollingBack = 7;
602+
kDelayedOnUserConsent = 8;
603+
}
604+
605+
fabric_scoped struct ProviderLocation {
606+
node_id providerNodeID = 1;
607+
endpoint_no endpoint = 2;
608+
fabric_idx fabricIndex = 254;
609+
}
610+
611+
info event StateTransition = 0 {
612+
UpdateStateEnum previousState = 0;
613+
UpdateStateEnum newState = 1;
614+
ChangeReasonEnum reason = 2;
615+
nullable int32u targetSoftwareVersion = 3;
616+
}
617+
618+
critical event VersionApplied = 1 {
619+
int32u softwareVersion = 0;
620+
int16u productID = 1;
621+
}
622+
623+
info event DownloadError = 2 {
624+
int32u softwareVersion = 0;
625+
int64u bytesDownloaded = 1;
626+
nullable int8u progressPercent = 2;
627+
nullable int64s platformCode = 3;
628+
}
629+
630+
attribute access(write: administer) ProviderLocation defaultOTAProviders[] = 0;
631+
readonly attribute boolean updatePossible = 1;
632+
readonly attribute UpdateStateEnum updateState = 2;
633+
readonly attribute nullable int8u updateStateProgress = 3;
634+
readonly attribute command_id generatedCommandList[] = 65528;
635+
readonly attribute command_id acceptedCommandList[] = 65529;
636+
readonly attribute event_id eventList[] = 65530;
637+
readonly attribute attrib_id attributeList[] = 65531;
638+
readonly attribute bitmap32 featureMap = 65532;
639+
readonly attribute int16u clusterRevision = 65533;
640+
641+
request struct AnnounceOTAProviderRequest {
642+
node_id providerNodeID = 0;
643+
vendor_id vendorID = 1;
644+
AnnouncementReasonEnum announcementReason = 2;
645+
optional octet_string<512> metadataForNode = 3;
646+
endpoint_no endpoint = 4;
647+
}
648+
649+
/** Announce the presence of an OTA Provider */
650+
command AnnounceOTAProvider(AnnounceOTAProviderRequest): DefaultSuccess = 0;
651+
}
652+
499653
/** This cluster is used to manage global aspects of the Commissioning flow. */
500654
cluster GeneralCommissioning = 48 {
501655
revision 1; // NOTE: Default/not specifically set
@@ -1403,6 +1557,7 @@ provisional cluster ThreadBorderRouterManagement = 1106 {
14031557
endpoint 0 {
14041558
device type ma_rootdevice = 22, version 1;
14051559

1560+
binding cluster OtaSoftwareUpdateProvider;
14061561

14071562
server cluster Descriptor {
14081563
callback attribute deviceTypeList;
@@ -1458,6 +1613,23 @@ endpoint 0 {
14581613
ram attribute clusterRevision default = 3;
14591614
}
14601615

1616+
server cluster OtaSoftwareUpdateRequestor {
1617+
emits event StateTransition;
1618+
emits event VersionApplied;
1619+
emits event DownloadError;
1620+
callback attribute defaultOTAProviders;
1621+
ram attribute updatePossible default = true;
1622+
ram attribute updateState default = 0;
1623+
ram attribute updateStateProgress;
1624+
callback attribute generatedCommandList;
1625+
callback attribute acceptedCommandList;
1626+
callback attribute attributeList;
1627+
ram attribute featureMap default = 0;
1628+
ram attribute clusterRevision default = 1;
1629+
1630+
handle command AnnounceOTAProvider;
1631+
}
1632+
14611633
server cluster GeneralCommissioning {
14621634
ram attribute breadcrumb default = 0x0000000000000000;
14631635
callback attribute basicCommissioningInfo;

0 commit comments

Comments
 (0)