|
38 | 38 | #include <esp_sleep.h>
|
39 | 39 | #include <esp_system.h>
|
40 | 40 | #include <esp_task_wdt.h>
|
| 41 | + |
| 42 | +// driver/gpio.h is required for wakeup from light sleep |
| 43 | +#include <driver/gpio.h> |
41 | 44 | #include <mbedtls/cipher.h>
|
42 | 45 | #include <mbedtls/md5.h>
|
43 | 46 | #include <mbedtls/sha1.h>
|
44 | 47 | #include <mbedtls/sha256.h>
|
45 | 48 | #include <mbedtls/sha512.h>
|
46 | 49 | #include <soc/soc.h>
|
| 50 | + |
47 | 51 | #include <stdlib.h>
|
48 | 52 |
|
49 | 53 | // introduced starting with 4.4
|
@@ -340,6 +344,17 @@ static term nif_esp_deep_sleep(Context *ctx, int argc, term argv[])
|
340 | 344 | return OK_ATOM;
|
341 | 345 | }
|
342 | 346 |
|
| 347 | +static term nif_esp_light_sleep(Context *ctx, int argc, term argv[]) |
| 348 | +{ |
| 349 | + UNUSED(ctx); |
| 350 | + UNUSED(argc); |
| 351 | + UNUSED(argv); |
| 352 | + |
| 353 | + esp_err_t ret = esp_light_sleep_start(); |
| 354 | + |
| 355 | + return (ret == ESP_OK) ? OK_ATOM : ERROR_ATOM; |
| 356 | +} |
| 357 | + |
343 | 358 | #if SOC_PM_SUPPORT_EXT_WAKEUP || SOC_PM_SUPPORT_EXT0_WAKEUP
|
344 | 359 | static const char *const sleep_wakeup_ext0_atom = "\x11" "sleep_wakeup_ext0";
|
345 | 360 | #endif
|
@@ -513,6 +528,47 @@ static term nif_esp_deep_sleep_enable_gpio_wakeup(Context *ctx, int argc, term a
|
513 | 528 | }
|
514 | 529 | #endif
|
515 | 530 |
|
| 531 | +static term nif_esp_gpio_wakeup_enable(Context *ctx, int argc, term argv[]) |
| 532 | +{ |
| 533 | + UNUSED(ctx); |
| 534 | + UNUSED(argc); |
| 535 | + |
| 536 | + VALIDATE_VALUE(argv[0], term_is_integer); |
| 537 | + if ((argv[1] != LOW_ATOM) && (argv[1] != HIGH_ATOM)) { |
| 538 | + RAISE_ERROR(BADARG_ATOM); |
| 539 | + } |
| 540 | + |
| 541 | + avm_int_t gpio = term_to_int(argv[0]); |
| 542 | + gpio_int_type_t int_type = (argv[1] == LOW_ATOM) ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL; |
| 543 | + |
| 544 | + esp_err_t ret = gpio_wakeup_enable(gpio, int_type); |
| 545 | + |
| 546 | + return (ret == ESP_OK) ? OK_ATOM : ERROR_ATOM; |
| 547 | +} |
| 548 | + |
| 549 | +static term nif_esp_sleep_enable_gpio_wakeup(Context *ctx, int argc, term argv[]) |
| 550 | +{ |
| 551 | + UNUSED(ctx); |
| 552 | + UNUSED(argc); |
| 553 | + UNUSED(argv); |
| 554 | + |
| 555 | + esp_err_t ret = esp_sleep_enable_gpio_wakeup(); |
| 556 | + |
| 557 | + return (ret == ESP_OK) ? OK_ATOM : ERROR_ATOM; |
| 558 | +} |
| 559 | + |
| 560 | +static term nif_esp_sleep_enable_timer_wakeup_us(Context *ctx, int argc, term argv[]) |
| 561 | +{ |
| 562 | + UNUSED(ctx); |
| 563 | + UNUSED(argc); |
| 564 | + |
| 565 | + VALIDATE_VALUE(argv[0], term_is_any_integer); |
| 566 | + avm_int64_t us = term_maybe_unbox_int64(argv[0]); |
| 567 | + |
| 568 | + esp_err_t ret = esp_sleep_enable_timer_wakeup(us); |
| 569 | + |
| 570 | + return (ret == ESP_OK) ? OK_ATOM : ERROR_ATOM; |
| 571 | +} |
516 | 572 |
|
517 | 573 | #if SOC_ULP_SUPPORTED
|
518 | 574 |
|
@@ -842,6 +898,11 @@ static const struct Nif esp_deep_sleep_nif =
|
842 | 898 | .base.type = NIFFunctionType,
|
843 | 899 | .nif_ptr = nif_esp_deep_sleep
|
844 | 900 | };
|
| 901 | +static const struct Nif esp_light_sleep_nif = |
| 902 | +{ |
| 903 | + .base.type = NIFFunctionType, |
| 904 | + .nif_ptr = nif_esp_light_sleep |
| 905 | +}; |
845 | 906 | static const struct Nif esp_sleep_get_wakeup_cause_nif =
|
846 | 907 | {
|
847 | 908 | .base.type = NIFFunctionType,
|
@@ -880,6 +941,21 @@ static const struct Nif esp_deep_sleep_enable_gpio_wakeup_nif =
|
880 | 941 | .nif_ptr = nif_esp_deep_sleep_enable_gpio_wakeup
|
881 | 942 | };
|
882 | 943 | #endif
|
| 944 | +static const struct Nif esp_gpio_wakeup_enable_nif = |
| 945 | +{ |
| 946 | + .base.type = NIFFunctionType, |
| 947 | + .nif_ptr = nif_esp_gpio_wakeup_enable |
| 948 | +}; |
| 949 | +static const struct Nif esp_sleep_enable_gpio_wakeup_nif = |
| 950 | +{ |
| 951 | + .base.type = NIFFunctionType, |
| 952 | + .nif_ptr = nif_esp_sleep_enable_gpio_wakeup |
| 953 | +}; |
| 954 | +static const struct Nif esp_sleep_enable_timer_wakeup_us_nif = |
| 955 | +{ |
| 956 | + .base.type = NIFFunctionType, |
| 957 | + .nif_ptr = nif_esp_sleep_enable_timer_wakeup_us |
| 958 | +}; |
883 | 959 | #if SOC_ULP_SUPPORTED
|
884 | 960 | static const struct Nif esp_sleep_ulp_wakeup_nif =
|
885 | 961 | {
|
@@ -981,6 +1057,10 @@ const struct Nif *platform_nifs_get_nif(const char *nifname)
|
981 | 1057 | TRACE("Resolved platform nif %s ...\n", nifname);
|
982 | 1058 | return &esp_deep_sleep_nif;
|
983 | 1059 | }
|
| 1060 | + if (strcmp("esp:light_sleep/0", nifname) == 0) { |
| 1061 | + TRACE("Resolved platform nif %s ...\n", nifname); |
| 1062 | + return &esp_light_sleep_nif; |
| 1063 | + } |
984 | 1064 | if (strcmp("esp:sleep_get_wakeup_cause/0", nifname) == 0) {
|
985 | 1065 | TRACE("Resolved platform nif %s ...\n", nifname);
|
986 | 1066 | return &esp_sleep_get_wakeup_cause_nif;
|
@@ -1013,6 +1093,18 @@ const struct Nif *platform_nifs_get_nif(const char *nifname)
|
1013 | 1093 | return &esp_deep_sleep_enable_gpio_wakeup_nif;
|
1014 | 1094 | }
|
1015 | 1095 | #endif
|
| 1096 | + if (strcmp("esp:gpio_wakeup_enable/2", nifname) == 0) { |
| 1097 | + TRACE("Resolved platform nif %s ...\n", nifname); |
| 1098 | + return &esp_gpio_wakeup_enable_nif; |
| 1099 | + } |
| 1100 | + if (strcmp("esp:sleep_enable_gpio_wakeup/0", nifname) == 0) { |
| 1101 | + TRACE("Resolved platform nif %s ...\n", nifname); |
| 1102 | + return &esp_sleep_enable_gpio_wakeup_nif; |
| 1103 | + } |
| 1104 | + if (strcmp("esp:sleep_enable_timer_wakeup_us/1", nifname) == 0) { |
| 1105 | + TRACE("Resolved platform nif %s ...\n", nifname); |
| 1106 | + return &esp_sleep_enable_timer_wakeup_us_nif; |
| 1107 | + } |
1016 | 1108 | #if SOC_ULP_SUPPORTED
|
1017 | 1109 | if (strcmp("esp:sleep_ulp_wakeup/0", nifname) == 0) {
|
1018 | 1110 | TRACE("Resolved platform nif %s ...\n", nifname);
|
|
0 commit comments