kopia lustrzana https://github.com/espressif/esp-idf
78 wiersze
2.0 KiB
C
78 wiersze
2.0 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "esp_sleep.h"
|
|
#include "lp_core_main.h"
|
|
#include "ulp_lp_core.h"
|
|
#include "lp_core_i2c.h"
|
|
|
|
extern const uint8_t lp_core_main_bin_start[] asm("_binary_lp_core_main_bin_start");
|
|
extern const uint8_t lp_core_main_bin_end[] asm("_binary_lp_core_main_bin_end");
|
|
|
|
static void lp_core_init(void)
|
|
{
|
|
esp_err_t ret = ESP_OK;
|
|
|
|
ulp_lp_core_cfg_t cfg = {
|
|
.wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_HP_CPU,
|
|
};
|
|
|
|
ret = ulp_lp_core_load_binary(lp_core_main_bin_start, (lp_core_main_bin_end - lp_core_main_bin_start));
|
|
if (ret != ESP_OK) {
|
|
printf("LP Core load failed\n");
|
|
abort();
|
|
}
|
|
|
|
ret = ulp_lp_core_run(&cfg);
|
|
if (ret != ESP_OK) {
|
|
printf("LP Core run failed\n");
|
|
abort();
|
|
}
|
|
|
|
printf("LP core loaded with firmware successfully\n");
|
|
}
|
|
|
|
static void lp_i2c_init(void)
|
|
{
|
|
esp_err_t ret = ESP_OK;
|
|
|
|
/* Initialize LP I2C with default configuration */
|
|
const lp_core_i2c_cfg_t i2c_cfg = LP_CORE_I2C_DEFAULT_CONFIG();
|
|
ret = lp_core_i2c_master_init(LP_I2C_NUM_0, &i2c_cfg);
|
|
if (ret != ESP_OK) {
|
|
printf("LP I2C init failed\n");
|
|
abort();
|
|
}
|
|
|
|
printf("LP I2C initialized successfully\n");
|
|
}
|
|
|
|
void app_main(void)
|
|
{
|
|
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
|
|
if (cause != ESP_SLEEP_WAKEUP_ULP) {
|
|
printf("Not an LP core wakeup. Cause = %d\n", cause);
|
|
printf("Initializing...\n");
|
|
|
|
/* Initialize LP_I2C from the main processor */
|
|
lp_i2c_init();
|
|
|
|
/* Load LP Core binary and start the coprocessor */
|
|
lp_core_init();
|
|
} else if (cause == ESP_SLEEP_WAKEUP_ULP) {
|
|
printf("LP core woke up the main CPU\n");
|
|
printf("Lux = %ld\n", ulp_lux);
|
|
}
|
|
|
|
/* Setup wakeup triggers */
|
|
ESP_ERROR_CHECK(esp_sleep_enable_ulp_wakeup());
|
|
|
|
/* Enter Deep Sleep */
|
|
printf("Entering deep sleep...\n");
|
|
esp_deep_sleep_start();
|
|
}
|