3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2018 Nest Labs, Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 * Provides an implementation of the PlatformManager object
23 * for the ESP32 platform.
25 /* this file behaves like a config.h, comes first */
26 #include <platform/internal/CHIPDeviceLayerInternal.h>
28 #include <crypto/CHIPCryptoPAL.h>
29 #include <platform/PlatformManager.h>
30 #include <platform/internal/GenericPlatformManagerImpl_FreeRTOS.cpp>
32 #include "esp_event.h"
33 #include "esp_heap_caps_init.h"
35 #include "esp_netif.h"
36 #include "esp_spi_flash.h"
37 #include "esp_system.h"
41 namespace DeviceLayer {
44 extern CHIP_ERROR InitLwIPCoreLock(void);
47 PlatformManagerImpl PlatformManagerImpl::sInstance;
49 static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen)
51 esp_fill_random(output, len);
56 CHIP_ERROR PlatformManagerImpl::_InitChipStack(void)
59 wifi_init_config_t cfg;
63 // Make sure the LwIP core lock has been initialized
64 err = Internal::InitLwIPCoreLock();
67 err = esp_netif_init();
70 // Arrange for the ESP event loop to deliver events into the CHIP Device layer.
71 err = esp_event_loop_create_default();
74 esp_netif_create_default_wifi_ap();
75 esp_netif_create_default_wifi_sta();
77 esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, PlatformManagerImpl::HandleESPSystemEvent, NULL);
79 esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, PlatformManagerImpl::HandleESPSystemEvent, NULL);
82 // Initialize the ESP WiFi layer.
83 cfg = WIFI_INIT_CONFIG_DEFAULT();
84 err = esp_wifi_init(&cfg);
87 esp_wifi_get_mode(&mode);
88 if ((mode == WIFI_MODE_AP) || (mode == WIFI_MODE_APSTA))
90 esp_fill_random(ap_mac, sizeof(ap_mac));
91 /* Bit 0 of the first octet of MAC Address should always be 0 */
92 ap_mac[0] &= (uint8_t) ~0x01;
93 err = esp_wifi_set_mac(ESP_IF_WIFI_AP, ap_mac);
97 // Call _InitChipStack() on the generic implementation base class
98 // to finish the initialization process.
99 err = Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_InitChipStack();
102 err = chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16);
109 CHIP_ERROR PlatformManagerImpl::InitLwIPCoreLock(void)
111 return Internal::InitLwIPCoreLock();
114 void PlatformManagerImpl::HandleESPSystemEvent(void * arg, esp_event_base_t eventBase, int32_t eventId, void * eventData)
116 ChipDeviceEvent event;
117 memset(&event, 0, sizeof(event));
118 event.Type = DeviceEventType::kESPSystemEvent;
119 event.Platform.ESPSystemEvent.Base = eventBase;
120 event.Platform.ESPSystemEvent.Id = eventId;
121 if (eventBase == IP_EVENT)
125 case IP_EVENT_STA_GOT_IP:
126 memcpy(&event.Platform.ESPSystemEvent.Data.IpGotIp, eventData, sizeof(event.Platform.ESPSystemEvent.Data.IpGotIp));
128 case IP_EVENT_GOT_IP6:
129 memcpy(&event.Platform.ESPSystemEvent.Data.IpGotIp6, eventData, sizeof(event.Platform.ESPSystemEvent.Data.IpGotIp6));
131 case IP_EVENT_AP_STAIPASSIGNED:
132 memcpy(&event.Platform.ESPSystemEvent.Data.IpApStaIpAssigned, eventData,
133 sizeof(event.Platform.ESPSystemEvent.Data.IpApStaIpAssigned));
139 else if (eventBase == WIFI_EVENT)
143 case WIFI_EVENT_SCAN_DONE:
144 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaScanDone, eventData,
145 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaScanDone));
147 case WIFI_EVENT_STA_CONNECTED:
148 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaConnected, eventData,
149 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaConnected));
151 case WIFI_EVENT_STA_DISCONNECTED:
152 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaDisconnected, eventData,
153 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaDisconnected));
155 case WIFI_EVENT_STA_AUTHMODE_CHANGE:
156 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaAuthModeChange, eventData,
157 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaAuthModeChange));
159 case WIFI_EVENT_STA_WPS_ER_PIN:
160 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaWpsErPin, eventData,
161 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaWpsErPin));
163 case WIFI_EVENT_STA_WPS_ER_FAILED:
164 memcpy(&event.Platform.ESPSystemEvent.Data.WifiStaWpsErFailed, eventData,
165 sizeof(event.Platform.ESPSystemEvent.Data.WifiStaWpsErFailed));
167 case WIFI_EVENT_AP_STACONNECTED:
168 memcpy(&event.Platform.ESPSystemEvent.Data.WifiApStaConnected, eventData,
169 sizeof(event.Platform.ESPSystemEvent.Data.WifiApStaConnected));
171 case WIFI_EVENT_AP_STADISCONNECTED:
172 memcpy(&event.Platform.ESPSystemEvent.Data.WifiApStaDisconnected, eventData,
173 sizeof(event.Platform.ESPSystemEvent.Data.WifiApStaDisconnected));
175 case WIFI_EVENT_AP_PROBEREQRECVED:
176 memcpy(&event.Platform.ESPSystemEvent.Data.WifiApProbeReqRecved, eventData,
177 sizeof(event.Platform.ESPSystemEvent.Data.WifiApProbeReqRecved));
184 sInstance.PostEvent(&event);
187 } // namespace DeviceLayer