Skip to content

Commit 7ae5070

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

File tree

8 files changed

+945
-13
lines changed

8 files changed

+945
-13
lines changed

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

+16-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +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)
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)
1921

2022
---
2123

@@ -92,3 +94,12 @@ the Thread network.
9294
```
9395
./chip-tool pairing ble-wifi 2 hex:<dataset_tlvs> <pincode> <discriminator>
9496
```
97+
98+
### Generate OTA Firmware For BR
99+
100+
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
101+
102+
```
103+
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
104+
```
105+
Then you 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

+249
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,221 @@ 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+
653+
/** Nodes should be expected to be deployed to any and all regions of the world. These global regions
654+
may have differing common languages, units of measurements, and numerical formatting
655+
standards. As such, Nodes that visually or audibly convey information need a mechanism by which
656+
they can be configured to use a user’s preferred language, units, etc */
657+
cluster LocalizationConfiguration = 43 {
658+
revision 1; // NOTE: Default/not specifically set
659+
660+
attribute access(write: manage) char_string<35> activeLocale = 0;
661+
readonly attribute char_string supportedLocales[] = 1;
662+
readonly attribute command_id generatedCommandList[] = 65528;
663+
readonly attribute command_id acceptedCommandList[] = 65529;
664+
readonly attribute event_id eventList[] = 65530;
665+
readonly attribute attrib_id attributeList[] = 65531;
666+
readonly attribute bitmap32 featureMap = 65532;
667+
readonly attribute int16u clusterRevision = 65533;
668+
}
669+
670+
/** Nodes should be expected to be deployed to any and all regions of the world. These global regions
671+
may have differing preferences for how dates and times are conveyed. As such, Nodes that visually
672+
or audibly convey time information need a mechanism by which they can be configured to use a
673+
user’s preferred format. */
674+
cluster TimeFormatLocalization = 44 {
675+
revision 1; // NOTE: Default/not specifically set
676+
677+
enum CalendarTypeEnum : enum8 {
678+
kBuddhist = 0;
679+
kChinese = 1;
680+
kCoptic = 2;
681+
kEthiopian = 3;
682+
kGregorian = 4;
683+
kHebrew = 5;
684+
kIndian = 6;
685+
kIslamic = 7;
686+
kJapanese = 8;
687+
kKorean = 9;
688+
kPersian = 10;
689+
kTaiwanese = 11;
690+
kUseActiveLocale = 255;
691+
}
692+
693+
enum HourFormatEnum : enum8 {
694+
k12hr = 0;
695+
k24hr = 1;
696+
kUseActiveLocale = 255;
697+
}
698+
699+
bitmap Feature : bitmap32 {
700+
kCalendarFormat = 0x1;
701+
}
702+
703+
attribute access(write: manage) HourFormatEnum hourFormat = 0;
704+
attribute access(write: manage) optional CalendarTypeEnum activeCalendarType = 1;
705+
readonly attribute optional CalendarTypeEnum supportedCalendarTypes[] = 2;
706+
readonly attribute command_id generatedCommandList[] = 65528;
707+
readonly attribute command_id acceptedCommandList[] = 65529;
708+
readonly attribute event_id eventList[] = 65530;
709+
readonly attribute attrib_id attributeList[] = 65531;
710+
readonly attribute bitmap32 featureMap = 65532;
711+
readonly attribute int16u clusterRevision = 65533;
712+
}
713+
499714
/** This cluster is used to manage global aspects of the Commissioning flow. */
500715
cluster GeneralCommissioning = 48 {
501716
revision 1; // NOTE: Default/not specifically set
@@ -1403,6 +1618,7 @@ provisional cluster ThreadBorderRouterManagement = 1106 {
14031618
endpoint 0 {
14041619
device type ma_rootdevice = 22, version 1;
14051620

1621+
binding cluster OtaSoftwareUpdateProvider;
14061622

14071623
server cluster Descriptor {
14081624
callback attribute deviceTypeList;
@@ -1458,6 +1674,39 @@ endpoint 0 {
14581674
ram attribute clusterRevision default = 3;
14591675
}
14601676

1677+
server cluster OtaSoftwareUpdateRequestor {
1678+
emits event StateTransition;
1679+
emits event VersionApplied;
1680+
emits event DownloadError;
1681+
callback attribute defaultOTAProviders;
1682+
ram attribute updatePossible default = true;
1683+
ram attribute updateState default = 0;
1684+
ram attribute updateStateProgress;
1685+
callback attribute generatedCommandList;
1686+
callback attribute acceptedCommandList;
1687+
callback attribute eventList;
1688+
callback attribute attributeList;
1689+
ram attribute featureMap default = 0;
1690+
ram attribute clusterRevision default = 1;
1691+
1692+
handle command AnnounceOTAProvider;
1693+
}
1694+
1695+
server cluster LocalizationConfiguration {
1696+
persist attribute activeLocale default = "en-US";
1697+
callback attribute supportedLocales;
1698+
ram attribute featureMap default = 0;
1699+
ram attribute clusterRevision default = 1;
1700+
}
1701+
1702+
server cluster TimeFormatLocalization {
1703+
persist attribute hourFormat default = 0;
1704+
persist attribute activeCalendarType default = 0;
1705+
callback attribute supportedCalendarTypes;
1706+
ram attribute featureMap default = 0;
1707+
ram attribute clusterRevision default = 1;
1708+
}
1709+
14611710
server cluster GeneralCommissioning {
14621711
ram attribute breadcrumb default = 0x0000000000000000;
14631712
callback attribute basicCommissioningInfo;

0 commit comments

Comments
 (0)