text: // Copyright 2021 Espressif Systems (Shanghai) PTE LTD
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  
  //     http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  #pragma once
  
  #include <stdbool.h>
  #include <stdint.h>
  #include "sdkconfig.h"
  #include "esp_bit_defs.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  
  /**
   * @brief Chip models
   */
  typedef enum {
      CHIP_ESP32  = 1, //!< ESP32
      CHIP_ESP32S2 = 2, //!< ESP32-S2
      CHIP_ESP32S3 = 4, //!< ESP32-S3
      CHIP_ESP32C3 = 5, //!< ESP32-C3
  } esp_chip_model_t;
  
  /* Chip feature flags, used in esp_chip_info_t */
  #define CHIP_FEATURE_EMB_FLASH      BIT(0)      //!< Chip has embedded flash memory
  #define CHIP_FEATURE_WIFI_BGN       BIT(1)      //!< Chip has 2.4GHz WiFi
  #define CHIP_FEATURE_BLE            BIT(4)      //!< Chip has Bluetooth LE
  #define CHIP_FEATURE_BT             BIT(5)      //!< Chip has Bluetooth Classic
  
  /**
   * @brief The structure represents information about the chip
   */
  typedef struct {
      esp_chip_model_t model;  //!< chip model, one of esp_chip_model_t
      uint32_t features;       //!< bit mask of CHIP_FEATURE_x feature flags
      uint8_t cores;           //!< number of CPU cores
      uint8_t revision;        //!< chip revision number
  } esp_chip_info_t;
  
  /**
   * @brief Fill an esp_chip_info_t structure with information about the chip
   * @param[out] out_info structure to be filled
   */
  void esp_chip_info(esp_chip_info_t* out_info);
  
  #if CONFIG_ESP32_ECO3_CACHE_LOCK_FIX
  /**
   * @brief Cache lock bug exists or not
   *
   * @return
   *          - ture : bug exists
   *          - false : bug not exists
   */
  bool soc_has_cache_lock_bug(void);
  #endif
  
  #ifdef __cplusplus
  }
  #endif
  