commit 159633e837f6a1af588c237e46185176274bb918 Author: Taras Syvash Date: Sat Jan 17 09:53:08 2026 +0200 Initial commit diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..437f255 --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Remove: [-f*, -m*] diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..dafb8ad --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +ARG DOCKER_TAG=latest +FROM espressif/idf:${DOCKER_TAG} + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8 + +RUN apt-get update -y && apt-get install udev -y + +RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc + +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] + +CMD ["/bin/bash", "-c"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b801786 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "ESP-IDF QEMU", + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.espIdfPath": "/opt/esp/idf", + "idf.toolsPath": "/opt/esp", + "idf.gitPath": "/usr/bin/git" + }, + "extensions": [ + "espressif.esp-idf-extension", + "espressif.esp-idf-web" + ] + } + }, + "runArgs": ["--privileged"] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24aa298 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# ESP-IDF build outputs +build/ +build-*/ +**/build/ + +# Python cache +__pycache__/ +*.py[cod] +.venv/ +**/.venv/ + +# IDE/editor +.vscode/ +.idea/ +*.swp + +# OS +.DS_Store diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1f350e0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Waveshare-ESP32-components"] + path = Waveshare-ESP32-components + url = https://github.com/waveshareteam/Waveshare-ESP32-components.git diff --git a/61252685.LR1121_V2_1_data_sheet.pdf b/61252685.LR1121_V2_1_data_sheet.pdf new file mode 100644 index 0000000..013b477 Binary files /dev/null and b/61252685.LR1121_V2_1_data_sheet.pdf differ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..56a2b4f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16) + +message(FATAL_ERROR "Це workspace з двома застосунками. Використовуйте idf.py -C apps/tx або idf.py -C apps/rx") diff --git a/README.md b/README.md new file mode 100644 index 0000000..e3a241c --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# LoRa генератор сигналів (TX/RX) + +Цей workspace містить дві окремі прошивки ESP-IDF для ESP32 з LR1121 по SPI, I2C OLED та 5-позиційним джойстиком: +- `apps/tx` — передавач. +- `apps/rx` — приймач. + +Спільні драйвери та утиліти лежать у `components/`. + +## Структура +``` +components/ + common/ # базова інформація про чип, роль + input/ # джойстик через ADC (резистивний дільник) + lora_radio/ # LR1121 (SPI, busy/dio1), налаштування пінів через Kconfig + ui/ # I2C OLED (за замовчуванням SSD1306 128x64) +apps/ + tx/ # прошивка передавача + sdkconfig.defaults + rx/ # прошивка приймача + sdkconfig.defaults +``` + +## Збірка +Вкажіть потрібний застосунок через `-C`, окремі build-директорії краще розділяти: +- Передавач: `idf.py -C apps/tx -B build-tx -DSDKCONFIG_DEFAULTS=sdkconfig.defaults build` +- Приймач: `idf.py -C apps/rx -B build-rx -DSDKCONFIG_DEFAULTS=sdkconfig.defaults build` + +## Налаштування +- Піни LR1121 (SPI CS/MOSI/MISO/SCK, BUSY, DIO1, RST) та радіо-параметри налаштовуються в `apps/*/sdkconfig.defaults` (Kconfig у `components/lora_radio`). BUSY має бути підключений; дозволяється ставити `-1` на RST/DIO1 (немає лінії), але без RST складніше відновлюватись після зависань, без DIO1 — робота тільки через опитування статусу. +- Роль пристрою визначається `CONFIG_LORA_ROLE_TX` / `CONFIG_LORA_ROLE_RX` (див. `components/common/Kconfig`). +- OLED: виберіть I2C порт/адресу/пін `SDA/SCL/RST` та розмір дисплея через `components/ui/Kconfig` (дефолт — SSD1306 128x64, addr `0x3C`). +- Джойстик: один ADC канал з резистивним дільником на кожну кнопку. Вкажіть канал та очікувані рівні АЦП (`CONFIG_JOYSTICK_ADC_LEVEL_*`) і допуск (`CONFIG_JOYSTICK_ADC_TOLERANCE`). + +## Екрани та керування (OLED + джойстик) +Джойстик: LEFT/RIGHT — перемикання екранів, UP/DOWN — змінити поточне значення, CENTER — підтвердити/оновити (або toggle на деяких екранах). + +### RX +- `FREQ`: робоча частота (крок 1 МГц) у межах вибраного band. CENTER просто повторно застосовує параметри. +- `BAND`: вибір діапазону (430, 868, 915 МГц; L‑band 1.525–1.660 ГГц; S‑band 1.9–2.1 ГГц; 2.4 ГГц ISM 2400–2483.5 МГц). FREQ клампиться всередині band. +- `BANDW`: смуга (BW) 125/250/500 кГц. +- `SPREAD`: LoRa SF 5…12. +- `CODERATE`: LoRa CR 4/5…4/8. +- `PAYLOAD`: відображає останній прийнятий пакет (ASCII до 31 символа), нижче завжди показані метрики SNR/RSSI/статус. +- `BOOT`: перезавантаження в ROM bootloader (USB CDC/JTAG) для прошивки. CENTER запускає перезавантаження; підключіть USB і запускайте флешер. + +### TX +- `FREQ`: робоча частота (крок 1 МГц) у межах вибраного band. +- `BAND`: діапазони як у RX (430/868/915/L/S/2.4G), FREQ клампиться всередині band. +- `BANDW`: смуга (BW) 125/250/500 кГц. +- `SPREAD`: LoRa SF 5…12. +- `CODERATE`: LoRa CR 4/5…4/8. +- `POWER`: вихідна потужність у dBm. Ліміт суб‑ГГц до +22 dBm, для HF (L/S/2.4 ГГц) до ~+13 dBm, мінімум −17 dBm. +- `PAYLOAD`: вибір фрази для передачі з готового списку `PING 1`…`PING 10` (UP/DOWN гортає). +- `PERIOD`: період автопередачі в мс (100…60000, крок 100). +- `TX`: enable/disable автопередачу (UP=ON, DOWN=OFF, CENTER=tgl). +- `BOOT`: перезавантаження в ROM bootloader (USB CDC/JTAG) для прошивки. CENTER запускає перезавантаження; підключіть USB і запускайте флешер. + +У кожному екрані нижні рядки відображають SNR/RSSI/стан IRQ з радіо. Застосування параметрів відбувається одразу після зміни (через `lora_radio_apply_params`). + +## USB JSON API +- Працює через USB Serial/JTAG (CDC ACM). Читайте/пишіть рядки UTF-8 із завершенням `\n`. +- Команди: + - `{"cmd":"get_status"}` — повертає JSON зі статусом/параметрами. + - `{"cmd":"set_params","params":{"band":"430","freq_mhz":433,"bw_khz":125,"sf":7,"cr":5,"tx_power_dbm":14,"period_ms":1000,"tx_enabled":true,"payload":"PING 1"}}` — застосувати параметри (RX ігнорує TX-поля). + - `{"cmd":"reboot_bootloader"}` — перезавантаження в ROM bootloader. +- Відповідь `status` для TX: `role`, `freq_mhz`, `bw_khz`, `sf`, `cr`, `band`, `tx_power_dbm`, `period_ms`, `tx_enabled`, `snr_db`, `rssi_dbm`, `last_status`. Для RX додається `payload` (останній прийнятий пакет). +- Готовий GUI-клієнт: `py_app/` (PyQt6), відправляє `set_params` одразу після зміни полів. + +збірка +IDF_TARGET=esp32s3 idf.py -C apps/tx -B build-tx -DSDKCONFIG_DEFAULTS=sdkconfig.defaults build diff --git a/Waveshare-ESP32-components b/Waveshare-ESP32-components new file mode 160000 index 0000000..fc44cc4 --- /dev/null +++ b/Waveshare-ESP32-components @@ -0,0 +1 @@ +Subproject commit fc44cc479877e435f515419c8d25b80810630e43 diff --git a/apps/rx/CMakeLists.txt b/apps/rx/CMakeLists.txt new file mode 100644 index 0000000..c92203a --- /dev/null +++ b/apps/rx/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +idf_build_set_property(MINIMAL_BUILD ON) + +set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../components") +set(COMPONENTS main lora_radio common input ui) + +project(lora-rx) diff --git a/apps/rx/dependencies.lock b/apps/rx/dependencies.lock new file mode 100644 index 0000000..e233d8d --- /dev/null +++ b/apps/rx/dependencies.lock @@ -0,0 +1,10 @@ +dependencies: + idf: + source: + type: idf + version: 5.5.1 +direct_dependencies: +- idf +manifest_hash: 9db7a265ef57175d265e0d6eb7847107508a68a5847e4adbd1375406a7c73c51 +target: esp32s3 +version: 2.0.0 diff --git a/apps/rx/main/CMakeLists.txt b/apps/rx/main/CMakeLists.txt new file mode 100644 index 0000000..f0d0963 --- /dev/null +++ b/apps/rx/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "rx_main.c" + INCLUDE_DIRS "." + REQUIRES common lora_radio input ui usb_api +) diff --git a/apps/rx/main/rx_main.c b/apps/rx/main/rx_main.c new file mode 100644 index 0000000..293810b --- /dev/null +++ b/apps/rx/main/rx_main.c @@ -0,0 +1,448 @@ +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_system.h" +#include "sdkconfig.h" +#include "soc/rtc_cntl_reg.h" + +#include "common.h" +#include "input.h" +#include "lora_radio.h" +#include "ui.h" +#include "usb_api.h" +#include + +static const char *TAG = "lora_rx"; + +typedef enum { + FIELD_FREQ = 0, + FIELD_BW, + FIELD_SF, + FIELD_CR, + FIELD_COUNT +} field_t; + +typedef enum { + SCREEN_FREQ = 0, + SCREEN_BAND, + SCREEN_BW, + SCREEN_SF, + SCREEN_CR, + SCREEN_PAYLOAD, + SCREEN_BOOT, + SCREEN_COUNT +} screen_t; + +static lora_params_t s_params; +static field_t s_field = FIELD_FREQ; +static screen_t s_screen = SCREEN_FREQ; +static const char *s_screen_icon[SCREEN_COUNT] = {"ƒ", "BND", "BW", "SF", "CR", "PKT", "BL"}; +static const char *s_screen_label[SCREEN_COUNT] = {"FREQ", "BAND", "BANDW", "SPREAD", "CODERATE", "PAYLOAD", "BOOT"}; + +static const int s_bw_options[] = {125, 250, 500}; +typedef struct { + const char *name; + int min_cmhz; + int max_cmhz; + int default_cmhz; +} band_t; +static const band_t s_bands[] = { + {"430", 43000, 44000, 43300}, + {"868", 86300, 87000, 86800}, + {"915", 90200, 92800, 91500}, + {"L", 152500, 166000, 155000}, // 1.525-1.660 GHz + {"S", 190000, 210000, 200000}, // 1.9-2.1 GHz + {"2.4G", 240000, 248350, 244200}, // 2.4 GHz ISM (2400-2483.5 MHz) +}; +static int s_band_idx = 0; + +// --- JSON helpers for USB control ------------------------------------------------- + +static void sanitize_json_string(const char *in, char *out, size_t out_len) +{ + if (!out || out_len == 0) { + return; + } + size_t w = 0; + for (size_t i = 0; in && in[i] != '\0' && w + 1 < out_len; i++) { + char c = in[i]; + if (c == '\\' || c == '"' || (unsigned char)c < 0x20) { + out[w++] = ' '; + } else { + out[w++] = c; + } + } + out[w] = '\0'; +} + +static bool parse_int_field(const char *json, const char *key, int *out) +{ + if (!json || !key || !out) { + return false; + } + char pattern[32]; + snprintf(pattern, sizeof(pattern), "\"%s\"", key); + const char *p = strstr(json, pattern); + if (!p) return false; + p = strchr(p, ':'); + if (!p) return false; + p++; + int val = 0; + if (sscanf(p, " %d", &val) == 1) { + *out = val; + return true; + } + return false; +} + +static bool parse_string_field(const char *json, const char *key, char *out, size_t out_len) +{ + if (!json || !key || !out || out_len == 0) { + return false; + } + char pattern[32]; + snprintf(pattern, sizeof(pattern), "\"%s\"", key); + const char *p = strstr(json, pattern); + if (!p) return false; + p = strchr(p, ':'); + if (!p) return false; + const char *q = strchr(p, '"'); + if (!q) return false; + q++; // after quote + const char *end = strchr(q, '"'); + if (!end) return false; + size_t len = (size_t)(end - q); + if (len >= out_len) len = out_len - 1; + memcpy(out, q, len); + out[len] = '\0'; + return true; +} + +static int find_band_idx(const char *name) +{ + if (!name) return -1; + for (size_t i = 0; i < sizeof(s_bands)/sizeof(s_bands[0]); i++) { + if (strcasecmp(name, s_bands[i].name) == 0) { + return (int)i; + } + } + return -1; +} + +static int detect_band_from_freq(int cmhz) +{ + for (size_t i = 0; i < sizeof(s_bands) / sizeof(s_bands[0]); i++) { + if (cmhz >= s_bands[i].min_cmhz && cmhz <= s_bands[i].max_cmhz) { + return (int)i; + } + } + return 0; +} + +static void clamp_freq_to_band(void) +{ + const band_t *b = &s_bands[s_band_idx]; + if (s_params.freq_centi_mhz < b->min_cmhz) s_params.freq_centi_mhz = b->min_cmhz; + if (s_params.freq_centi_mhz > b->max_cmhz) s_params.freq_centi_mhz = b->max_cmhz; + // Нормалізуємо до цілих MHz + s_params.freq_centi_mhz = ((s_params.freq_centi_mhz + 50) / 100) * 100; +} + +static void usb_send_status(void) +{ + lora_metrics_t metrics = {0}; + char payload[48]; + char safe_payload[48]; + lora_radio_get_metrics(&metrics); + lora_radio_get_last_payload(payload, sizeof(payload)); + sanitize_json_string(payload, safe_payload, sizeof(safe_payload)); + char line[256]; + snprintf(line, sizeof(line), + "{\"resp\":\"status\",\"role\":\"rx\",\"freq_mhz\":%d,\"bw_khz\":%d,\"sf\":%d,\"cr\":%d," + "\"band\":\"%s\",\"snr_db\":%d,\"rssi_dbm\":%d,\"last_status\":%u,\"payload\":\"%s\"}\n", + s_params.freq_centi_mhz / 100, + s_params.bw_khz, + s_params.sf, + s_params.cr, + s_bands[s_band_idx].name, + metrics.snr_db, + metrics.rssi_dbm, + (unsigned)metrics.last_status, + safe_payload); + usb_api_send_line(line); +} + +static void usb_handle_set_params(const char *json) +{ + bool changed = false; + lora_params_t next = s_params; + + int band_idx = -1; + char band_name[16] = {0}; + if (parse_string_field(json, "band", band_name, sizeof(band_name))) { + band_idx = find_band_idx(band_name); + if (band_idx >= 0) { + s_band_idx = band_idx; + changed = true; + } + } + + int val = 0; + if (parse_int_field(json, "freq_mhz", &val)) { + next.freq_centi_mhz = val * 100; + changed = true; + } + if (parse_int_field(json, "bw_khz", &val)) { + next.bw_khz = val; + changed = true; + } + if (parse_int_field(json, "sf", &val)) { + next.sf = val; + changed = true; + } + if (parse_int_field(json, "cr", &val)) { + next.cr = val; + changed = true; + } + + if (!changed) { + return; + } + s_params = next; + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "USB set_params failed: %s", esp_err_to_name(err)); + } else { + ESP_LOGI(TAG, "USB set_params applied"); + } +} + +static void usb_handle_line(const char *line) +{ + if (!line || line[0] == '\0') { + return; + } + ESP_LOGI(TAG, "USB RX: %s", line); + if (strstr(line, "set_params")) { + usb_handle_set_params(line); + return; + } + if (strstr(line, "get_status")) { + usb_send_status(); + return; + } + if (strstr(line, "reboot_bootloader")) { + ui_show_status("Bootloader", "Rebooting to USB", "Connect USB", NULL, NULL, NULL); + vTaskDelay(pdMS_TO_TICKS(200)); + REG_SET_BIT(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT); + esp_restart(); + } +} + +static void set_band(int idx) +{ + int max_idx = (int)(sizeof(s_bands) / sizeof(s_bands[0])) - 1; + if (idx < 0) idx = 0; + if (idx > max_idx) idx = max_idx; + s_band_idx = idx; + s_params.freq_centi_mhz = s_bands[s_band_idx].default_cmhz; + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Apply params failed: %s", esp_err_to_name(err)); + } +} + +static void bump_field(int delta) +{ + switch (s_field) { + case FIELD_FREQ: + s_params.freq_centi_mhz += delta * 100; // крок 1 MHz + clamp_freq_to_band(); + break; + case FIELD_BW: { + int idx = 0; + for (size_t i = 0; i < sizeof(s_bw_options)/sizeof(s_bw_options[0]); i++) { + if (s_bw_options[i] == s_params.bw_khz) { + idx = i; + break; + } + } + idx += delta; + if (idx < 0) idx = 0; + if (idx >= (int)(sizeof(s_bw_options)/sizeof(s_bw_options[0]))) idx = (int)(sizeof(s_bw_options)/sizeof(s_bw_options[0])) - 1; + s_params.bw_khz = s_bw_options[idx]; + break; + } + case FIELD_SF: + s_params.sf += delta; + if (s_params.sf < 5) s_params.sf = 5; + if (s_params.sf > 12) s_params.sf = 12; + break; + case FIELD_CR: + s_params.cr += delta; + if (s_params.cr < 5) s_params.cr = 5; + if (s_params.cr > 8) s_params.cr = 8; + break; + default: + break; + } + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Apply params failed: %s", esp_err_to_name(err)); + } +} + +static void next_screen(int delta) +{ + int idx = (int)s_screen + delta; + if (idx < 0) idx = SCREEN_COUNT - 1; + if (idx >= SCREEN_COUNT) idx = 0; + s_screen = (screen_t)idx; + switch (s_screen) { + case SCREEN_FREQ: s_field = FIELD_FREQ; break; + case SCREEN_BAND: s_field = FIELD_FREQ; break; + case SCREEN_BW: s_field = FIELD_BW; break; + case SCREEN_SF: s_field = FIELD_SF; break; + case SCREEN_CR: s_field = FIELD_CR; break; + default: break; + } +} + +static void adjust_current(int delta) +{ + switch (s_screen) { + case SCREEN_FREQ: s_field = FIELD_FREQ; bump_field(delta); break; + case SCREEN_BAND: set_band(s_band_idx + delta); break; + case SCREEN_BW: s_field = FIELD_BW; bump_field(delta); break; + case SCREEN_SF: s_field = FIELD_SF; bump_field(delta); break; + case SCREEN_CR: s_field = FIELD_CR; bump_field(delta); break; + case SCREEN_PAYLOAD: + case SCREEN_BOOT: + default: + break; + } +} + +static void app_loop(void) +{ + lora_metrics_t metrics = {0}; + while (true) { + input_event_t evt = input_poll(); + switch (evt) { + case INPUT_LEFT: next_screen(-1); break; + case INPUT_RIGHT: next_screen(1); break; + case INPUT_UP: adjust_current(1); break; + case INPUT_DOWN: adjust_current(-1); break; + case INPUT_CENTER: + if (s_screen == SCREEN_BOOT) { + ui_show_status("Bootloader", "Rebooting to USB", "Connect USB", NULL, NULL, NULL); + vTaskDelay(pdMS_TO_TICKS(200)); + REG_SET_BIT(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT); + esp_restart(); + } else { + bump_field(0); + } + break; + default: break; + } + + usb_api_tick(); + lora_radio_tick_rx(); + lora_radio_get_metrics(&metrics); + char line1[32]; + char line2[32]; + char line3[32]; + char line4[32]; + char line5[32]; + char line6[32]; + char payload[48]; + memset(line1, 0, sizeof(line1)); + memset(line2, 0, sizeof(line2)); + memset(line3, 0, sizeof(line3)); + memset(line4, 0, sizeof(line4)); + memset(line5, 0, sizeof(line5)); + memset(line6, 0, sizeof(line6)); + + switch (s_screen) { + case SCREEN_FREQ: + snprintf(line1, sizeof(line1), "Freq: %d MHz", s_params.freq_centi_mhz / 100); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_BAND: { + const band_t *b = &s_bands[s_band_idx]; + snprintf(line1, sizeof(line1), "Band %s", b->name); + snprintf(line2, sizeof(line2), "%d-%d MHz", b->min_cmhz / 100, b->max_cmhz / 100); + snprintf(line3, sizeof(line3), "UP/DN to select"); + break; + } + case SCREEN_BW: + snprintf(line1, sizeof(line1), "BW: %d kHz", s_params.bw_khz); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_SF: + snprintf(line1, sizeof(line1), "SF: %d", s_params.sf); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_CR: + snprintf(line1, sizeof(line1), "CR: 4/%d", s_params.cr); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_PAYLOAD: + lora_radio_get_last_payload(payload, sizeof(payload)); + snprintf(line1, sizeof(line1), "Payload:"); + snprintf(line2, sizeof(line2), "%.31s", payload); + break; + case SCREEN_BOOT: + snprintf(line1, sizeof(line1), "USB Bootloader"); + snprintf(line2, sizeof(line2), "CENTER to reboot"); + snprintf(line3, sizeof(line3), "Plug USB first"); + break; + default: + break; + } + + // Метрики залишаємо у видимих рядках (5 рядків + заголовок) + snprintf(line4, sizeof(line4), "SNR %ddB", metrics.snr_db); + snprintf(line5, sizeof(line5), "RSSI %ddBm ST 0x%02X", metrics.rssi_dbm, metrics.last_status); + + char header[32]; + snprintf(header, sizeof(header), "%s %s", s_screen_icon[s_screen], s_screen_label[s_screen]); + ui_show_role(header); + ui_show_status(line1, line2, line3, line4, line5, line6); + vTaskDelay(pdMS_TO_TICKS(500)); + } +} + +void app_main(void) +{ + common_print_boot_info(); + input_init(); + ui_init(); + ui_show_role("RX"); + bool radio_ok = lora_radio_init(false); + ui_show_status(radio_ok ? "LR1121 OK" : "LR1121 FAIL", "Listening air", NULL, NULL, NULL, NULL); + ESP_LOGI(TAG, "LR1121 init: %s", radio_ok ? "OK" : "FAIL"); + s_params.freq_centi_mhz = CONFIG_LORA_FREQ_MHZ * 100; + s_params.bw_khz = CONFIG_LORA_BW_KHZ; + s_params.sf = CONFIG_LORA_SF; + s_params.cr = CONFIG_LORA_CR; + s_params.tx_power_dbm = 14; + s_params.preamble_syms = 8; + s_params.payload_len = 0; + s_params.crc_on = true; + s_params.iq_invert = false; + s_params.header_implicit = false; + s_band_idx = detect_band_from_freq(s_params.freq_centi_mhz); + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Initial params failed: %s", esp_err_to_name(err)); + } + usb_api_init(usb_handle_line); + app_loop(); +} diff --git a/apps/rx/sdkconfig b/apps/rx/sdkconfig new file mode 100644 index 0000000..87e0f8a --- /dev/null +++ b/apps/rx/sdkconfig @@ -0,0 +1,1715 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_LCDCAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y +CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_CACHE_SUPPORT_WRAP=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_RISCV_COPROC_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_USB_OTG_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_SIMD_INSTRUCTION_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=24 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CACHE_ACS_INVALID_STATE_ON_PANIC=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=49 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=48 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_DMA=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_RGB_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=1 +CONFIG_SOC_LCD_RGB_PANELS=1 +CONFIG_SOC_LCD_I80_BUS_WIDTH=16 +CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 +CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_I80_NUM_BUSES=1 +CONFIG_SOC_LCDCAM_I80_BUS_WIDTH=16 +CONFIG_SOC_LCDCAM_RGB_NUM_PANELS=1 +CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16 +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 +CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTCIO_PIN_COUNT=22 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_SUPPORT_OCT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_SRC_FREQ_120M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=2 +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=1 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=14 +CONFIG_SOC_TOUCH_SUPPORT_BENCHMARK=y +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y +CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y +CONFIG_SOC_TOUCH_SUPPORT_DENOISE_CHAN=y +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_USB_OTG_PERIPH_NUM=1 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y +CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_FLASH_OPI_MODE=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y +CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1 +CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16 +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_USB_OTG_NUM=3 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CONSOLE_OUTPUT_SECONDARY=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# !!! MINIMAL_BUILD is enabled !!! +# + +# +# Only common components and those transitively required by the main component are listed +# + +# +# If a component configuration is missing, please add it to the main component's requirements +# + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-S3 Revision (Rev v0.99) +# +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 + +# +# Maximum Supported ESP32-S3 eFuse Block Revision (eFuse Block Rev v1.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# end of Cache config + +# +# Memory +# +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +# CONFIG_ESP_CONSOLE_UART_DEFAULT is not set +# CONFIG_ESP_CONSOLE_USB_CDC is not set +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_NONE=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART_NUM=-1 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=4 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +CONFIG_SPI_FLASH_HPM_ON=y +CONFIG_SPI_FLASH_HPM_DC_AUTO=y +# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# LoRa common options +# +# CONFIG_LORA_ROLE_TX is not set +CONFIG_LORA_ROLE_RX=y +# end of LoRa common options + +# +# Joystick input +# +CONFIG_JOYSTICK_ADC_CHANNEL=5 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=2630 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1230 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=0 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=1970 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=680 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 +# end of Joystick input + +# +# LoRa radio (LR1121) +# +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_RST=5 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=4 +CONFIG_LORA_FREQ_MHZ=433 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 +# end of LoRa radio (LR1121) + +# +# Display +# +CONFIG_DISPLAY_DRIVER="SSD1306 I2C OLED" +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=64 +# end of Display +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +# CONFIG_CONSOLE_UART_DEFAULT is not set +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART_NUM=-1 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_IPC_TASK_STACK_SIZE=1280 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# End of deprecated options diff --git a/apps/rx/sdkconfig.defaults b/apps/rx/sdkconfig.defaults new file mode 100644 index 0000000..3c3439c --- /dev/null +++ b/apps/rx/sdkconfig.defaults @@ -0,0 +1,43 @@ +# Роль за замовчуванням +CONFIG_LORA_ROLE_RX=y + + +# Піни RA01 (налаштуйте під свою плату) +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_RST=-1 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=-1 + +# Радіо +CONFIG_LORA_FREQ_MHZ=433 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 + +# Консоль через USB Serial/JTAG (CDC), щоб не тримати BOOT +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_UART_NONE=y +# CONFIG_ESP_CONSOLE_UART_DEFAULT is not set +# CONFIG_ESP_CONSOLE_USB_CDC is not set + +# Джойстик +CONFIG_JOYSTICK_ADC_CHANNEL=5 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=600 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1200 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=1900 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=2600 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=3300 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 + +# Дисплей +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=64 diff --git a/apps/rx/sdkconfig.old b/apps/rx/sdkconfig.old new file mode 100644 index 0000000..aae2a5a --- /dev/null +++ b/apps/rx/sdkconfig.old @@ -0,0 +1,1548 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_MAX_DATA_WIDTH=24 +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=1 +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=0 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=9 +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=1 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=1 +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D4=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V1_SUPPORTED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# !!! MINIMAL_BUILD is enabled !!! +# + +# +# Only common components and those transitively required by the main component are listed +# + +# +# If a component configuration is missing, please add it to the main component's requirements +# + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y +CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y +CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y +CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +CONFIG_ADC_DISABLE_DAC=y +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy DAC Driver Configurations +# +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy DAC Driver Configurations + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set + +# +# ADC Calibration Configurations +# +CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y +CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CALI_LUT_ENABLE=y +# end of ADC Calibration Configurations + +CONFIG_ADC_DISABLE_DAC_OUTPUT=y +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:DAC Configurations +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of ESP-Driver:DAC Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +# CONFIG_XTAL_FREQ_32 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=0 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-MM: Memory Management Configurations +# +# end of ESP-MM: Memory Management Configurations + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_TG0_LAC=y +# end of ESP Timer (High Resolution Timer) + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# LoRa common options +# +# CONFIG_LORA_ROLE_TX is not set +CONFIG_LORA_ROLE_RX=y +# end of LoRa common options + +# +# Joystick input +# +CONFIG_JOYSTICK_ADC_CHANNEL=6 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=600 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1200 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=1900 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=2600 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=3300 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 +# end of Joystick input + +# +# LoRa radio (LR1121) +# +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_RST=-1 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=-1 +CONFIG_LORA_FREQ_MHZ=868 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 +# end of LoRa radio (LR1121) + +# +# Display +# +CONFIG_DISPLAY_DRIVER="ST7735" +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=160 +# end of Display +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +CONFIG_ADC2_DISABLE_DAC=y +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# End of deprecated options diff --git a/apps/tx/CMakeLists.txt b/apps/tx/CMakeLists.txt new file mode 100644 index 0000000..a20c8dc --- /dev/null +++ b/apps/tx/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +idf_build_set_property(MINIMAL_BUILD ON) + +set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../components") +set(COMPONENTS main lora_radio common input ui) + +project(lora-tx) diff --git a/apps/tx/dependencies.lock b/apps/tx/dependencies.lock new file mode 100644 index 0000000..e233d8d --- /dev/null +++ b/apps/tx/dependencies.lock @@ -0,0 +1,10 @@ +dependencies: + idf: + source: + type: idf + version: 5.5.1 +direct_dependencies: +- idf +manifest_hash: 9db7a265ef57175d265e0d6eb7847107508a68a5847e4adbd1375406a7c73c51 +target: esp32s3 +version: 2.0.0 diff --git a/apps/tx/main/CMakeLists.txt b/apps/tx/main/CMakeLists.txt new file mode 100644 index 0000000..06e6b92 --- /dev/null +++ b/apps/tx/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "tx_main.c" + INCLUDE_DIRS "." + REQUIRES common lora_radio input ui usb_api +) diff --git a/apps/tx/main/tx_main.c b/apps/tx/main/tx_main.c new file mode 100644 index 0000000..14e7720 --- /dev/null +++ b/apps/tx/main/tx_main.c @@ -0,0 +1,581 @@ +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "esp_system.h" +#include "sdkconfig.h" +#include "soc/rtc_cntl_reg.h" + +#include "common.h" +#include "input.h" +#include "lora_radio.h" +#include "ui.h" +#include "usb_api.h" +#include +#include + +static const char *TAG = "lora_tx"; + +typedef enum { + FIELD_FREQ = 0, + FIELD_BW, + FIELD_SF, + FIELD_CR, + FIELD_TX_POWER, + FIELD_PERIOD, + FIELD_COUNT +} field_t; + +typedef enum { + SCREEN_FREQ = 0, + SCREEN_BAND, + SCREEN_BW, + SCREEN_SF, + SCREEN_CR, + SCREEN_POWER, + SCREEN_PAYLOAD, + SCREEN_PERIOD, + SCREEN_TX_ENABLE, + SCREEN_BOOT, + SCREEN_COUNT +} screen_t; + +static lora_params_t s_params; +static field_t s_field = FIELD_FREQ; +static screen_t s_screen = SCREEN_FREQ; +static const char *s_screen_icon[SCREEN_COUNT] = {"ƒ", "BND", "BW", "SF", "CR", "P", "PKT", "PRD", "ON", "BL"}; +static const char *s_screen_label[SCREEN_COUNT] = {"FREQ", "BAND", "BANDW", "SPREAD", "CODERATE", "POWER", "PAYLOAD", "PERIOD", "TX", "BOOT"}; + +static const int s_bw_options[] = {125, 250, 500}; +static const char *s_payload_options[] = { + "PING 1", "PING 2", "PING 3", "PING 4", "PING 5", + "PING 6", "PING 7", "PING 8", "PING 9", "PING 10" +}; +static int s_payload_idx = 0; +static char s_payload[32] = "PING 1"; +static int s_period_ms = 1000; +static int64_t s_last_tx_us = 0; +static bool s_tx_enabled = true; +typedef struct { + const char *name; + int min_cmhz; + int max_cmhz; + int default_cmhz; +} band_t; +static const band_t s_bands[] = { + {"430", 43000, 44000, 43300}, + {"868", 86300, 87000, 86800}, + {"915", 90200, 92800, 91500}, + {"L", 152500, 166000, 155000}, // 1.525-1.660 GHz + {"S", 190000, 210000, 200000}, // 1.9-2.1 GHz + {"2.4G", 240000, 248350, 244200}, // 2.4 GHz ISM (2400-2483.5 MHz) +}; +static int s_band_idx = 0; + +// --- JSON helpers for USB control ------------------------------------------------- + +static void sanitize_json_string(const char *in, char *out, size_t out_len) +{ + if (!out || out_len == 0) { + return; + } + size_t w = 0; + for (size_t i = 0; in && in[i] != '\0' && w + 1 < out_len; i++) { + char c = in[i]; + if (c == '\\' || c == '\"' || (unsigned char)c < 0x20) { + out[w++] = ' '; + } else { + out[w++] = c; + } + } + out[w] = '\0'; +} + +static bool parse_int_field(const char *json, const char *key, int *out) +{ + if (!json || !key || !out) { + return false; + } + char pattern[32]; + snprintf(pattern, sizeof(pattern), "\"%s\"", key); + const char *p = strstr(json, pattern); + if (!p) return false; + p = strchr(p, ':'); + if (!p) return false; + p++; + int val = 0; + if (sscanf(p, " %d", &val) == 1) { + *out = val; + return true; + } + return false; +} + +static bool parse_string_field(const char *json, const char *key, char *out, size_t out_len) +{ + if (!json || !key || !out || out_len == 0) { + return false; + } + char pattern[32]; + snprintf(pattern, sizeof(pattern), "\"%s\"", key); + const char *p = strstr(json, pattern); + if (!p) return false; + p = strchr(p, ':'); + if (!p) return false; + const char *q = strchr(p, '\"'); + if (!q) return false; + q++; // after quote + const char *end = strchr(q, '\"'); + if (!end) return false; + size_t len = (size_t)(end - q); + if (len >= out_len) len = out_len - 1; + memcpy(out, q, len); + out[len] = '\0'; + return true; +} + +static bool parse_bool_field(const char *json, const char *key, bool *out) +{ + if (!json || !key || !out) { + return false; + } + char pattern[32]; + snprintf(pattern, sizeof(pattern), "\"%s\"", key); + const char *p = strstr(json, pattern); + if (!p) return false; + p = strchr(p, ':'); + if (!p) return false; + p++; + if (strncmp(p, " true", 5) == 0 || strncmp(p, "true", 4) == 0 || strncmp(p, "1", 1) == 0) { + *out = true; + return true; + } + if (strncmp(p, " false", 6) == 0 || strncmp(p, "false", 5) == 0 || strncmp(p, "0", 1) == 0) { + *out = false; + return true; + } + return false; +} + +static int find_band_idx(const char *name) +{ + if (!name) return -1; + for (size_t i = 0; i < sizeof(s_bands)/sizeof(s_bands[0]); i++) { + if (strcasecmp(name, s_bands[i].name) == 0) { + return (int)i; + } + } + return -1; +} + +static void apply_payload_selection(void) +{ + if (s_payload_idx < 0) { + s_payload_idx = 0; + } + int max_idx = (int)(sizeof(s_payload_options) / sizeof(s_payload_options[0])) - 1; + if (s_payload_idx > max_idx) { + s_payload_idx = max_idx; + } + strlcpy(s_payload, s_payload_options[s_payload_idx], sizeof(s_payload)); +} + +static void change_payload(int delta) +{ + s_payload_idx += delta; + apply_payload_selection(); +} + +static int detect_band_from_freq(int cmhz) +{ + for (size_t i = 0; i < sizeof(s_bands) / sizeof(s_bands[0]); i++) { + if (cmhz >= s_bands[i].min_cmhz && cmhz <= s_bands[i].max_cmhz) { + return (int)i; + } + } + return 0; +} + +static void clamp_freq_to_band(void) +{ + const band_t *b = &s_bands[s_band_idx]; + if (s_params.freq_centi_mhz < b->min_cmhz) s_params.freq_centi_mhz = b->min_cmhz; + if (s_params.freq_centi_mhz > b->max_cmhz) s_params.freq_centi_mhz = b->max_cmhz; + s_params.freq_centi_mhz = ((s_params.freq_centi_mhz + 50) / 100) * 100; +} + +static void usb_send_status(void) +{ + lora_metrics_t metrics = {0}; + lora_radio_get_metrics(&metrics); + char line[256]; + snprintf(line, sizeof(line), + "{\"resp\":\"status\",\"role\":\"tx\",\"freq_mhz\":%d,\"bw_khz\":%d,\"sf\":%d,\"cr\":%d," + "\"band\":\"%s\",\"tx_power_dbm\":%d,\"period_ms\":%d,\"tx_enabled\":%s," + "\"snr_db\":%d,\"rssi_dbm\":%d,\"last_status\":%u}\n", + s_params.freq_centi_mhz / 100, + s_params.bw_khz, + s_params.sf, + s_params.cr, + s_bands[s_band_idx].name, + s_params.tx_power_dbm, + s_period_ms, + s_tx_enabled ? "true" : "false", + metrics.snr_db, + metrics.rssi_dbm, + (unsigned)metrics.last_status); + usb_api_send_line(line); +} + +static void usb_handle_set_params(const char *json) +{ + bool radio_changed = false; + lora_params_t next = s_params; + + int band_idx = -1; + char band_name[16] = {0}; + if (parse_string_field(json, "band", band_name, sizeof(band_name))) { + band_idx = find_band_idx(band_name); + if (band_idx >= 0) { + s_band_idx = band_idx; + radio_changed = true; + } + } + + int val = 0; + if (parse_int_field(json, "freq_mhz", &val)) { + next.freq_centi_mhz = val * 100; + radio_changed = true; + } + if (parse_int_field(json, "bw_khz", &val)) { + next.bw_khz = val; + radio_changed = true; + } + if (parse_int_field(json, "sf", &val)) { + next.sf = val; + radio_changed = true; + } + if (parse_int_field(json, "cr", &val)) { + next.cr = val; + radio_changed = true; + } + if (parse_int_field(json, "tx_power_dbm", &val)) { + next.tx_power_dbm = val; + radio_changed = true; + } + + bool ctrl_changed = false; + if (parse_int_field(json, "period_ms", &val)) { + s_period_ms = val; + if (s_period_ms < 100) s_period_ms = 100; + if (s_period_ms > 60000) s_period_ms = 60000; + ctrl_changed = true; + } + bool bval = false; + if (parse_bool_field(json, "tx_enabled", &bval)) { + s_tx_enabled = bval; + ctrl_changed = true; + } + char payload[64] = {0}; + if (parse_string_field(json, "payload", payload, sizeof(payload))) { + sanitize_json_string(payload, payload, sizeof(payload)); + strlcpy(s_payload, payload, sizeof(s_payload)); + ctrl_changed = true; + } + + if (radio_changed) { + s_params = next; + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "USB set_params failed: %s", esp_err_to_name(err)); + } else { + ESP_LOGI(TAG, "USB set_params applied"); + } + } else if (!ctrl_changed) { + // nothing to do + return; + } +} + +static void usb_handle_line(const char *line) +{ + if (!line || line[0] == '\0') { + return; + } + ESP_LOGI(TAG, "USB RX: %s", line); + if (strstr(line, "set_params")) { + usb_handle_set_params(line); + return; + } + if (strstr(line, "get_status")) { + usb_send_status(); + return; + } + if (strstr(line, "reboot_bootloader")) { + ui_show_status("Bootloader", "Rebooting to USB", "Connect USB", NULL, NULL, NULL); + vTaskDelay(pdMS_TO_TICKS(200)); + REG_SET_BIT(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT); + esp_restart(); + } +} + +static void set_band(int idx) +{ + int max_idx = (int)(sizeof(s_bands) / sizeof(s_bands[0])) - 1; + if (idx < 0) idx = 0; + if (idx > max_idx) idx = max_idx; + s_band_idx = idx; + s_params.freq_centi_mhz = s_bands[s_band_idx].default_cmhz; + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Apply params failed: %s", esp_err_to_name(err)); + } +} + +static void bump_field(int delta) +{ + switch (s_field) { + case FIELD_FREQ: + s_params.freq_centi_mhz += delta * 100; // крок 1 MHz + clamp_freq_to_band(); + break; + case FIELD_BW: { + int idx = 0; + for (size_t i = 0; i < sizeof(s_bw_options)/sizeof(s_bw_options[0]); i++) { + if (s_bw_options[i] == s_params.bw_khz) { + idx = i; + break; + } + } + idx += delta; + if (idx < 0) idx = 0; + if (idx >= (int)(sizeof(s_bw_options)/sizeof(s_bw_options[0]))) idx = (int)(sizeof(s_bw_options)/sizeof(s_bw_options[0])) - 1; + s_params.bw_khz = s_bw_options[idx]; + break; + } + case FIELD_SF: + s_params.sf += delta; + if (s_params.sf < 5) s_params.sf = 5; + if (s_params.sf > 12) s_params.sf = 12; + break; + case FIELD_CR: + s_params.cr += delta; + if (s_params.cr < 5) s_params.cr = 5; + if (s_params.cr > 8) s_params.cr = 8; + break; + case FIELD_TX_POWER: + s_params.tx_power_dbm += delta; + break; + case FIELD_PERIOD: + s_period_ms += delta * 100; + if (s_period_ms < 100) s_period_ms = 100; + if (s_period_ms > 60000) s_period_ms = 60000; + break; + default: + break; + } + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Apply params failed: %s", esp_err_to_name(err)); + } +} + +static void next_screen(int delta) +{ + int idx = (int)s_screen + delta; + if (idx < 0) idx = SCREEN_COUNT - 1; + if (idx >= SCREEN_COUNT) idx = 0; + s_screen = (screen_t)idx; + switch (s_screen) { + case SCREEN_FREQ: s_field = FIELD_FREQ; break; + case SCREEN_BAND: s_field = FIELD_FREQ; break; + case SCREEN_BW: s_field = FIELD_BW; break; + case SCREEN_SF: s_field = FIELD_SF; break; + case SCREEN_CR: s_field = FIELD_CR; break; + case SCREEN_POWER: s_field = FIELD_TX_POWER; break; + case SCREEN_PERIOD: s_field = FIELD_PERIOD; break; + case SCREEN_BOOT: s_field = FIELD_FREQ; break; + default: break; + } +} + +static void adjust_current(int delta) +{ + switch (s_screen) { + case SCREEN_FREQ: s_field = FIELD_FREQ; bump_field(delta); break; + case SCREEN_BAND: set_band(s_band_idx + delta); break; + case SCREEN_BW: s_field = FIELD_BW; bump_field(delta); break; + case SCREEN_SF: s_field = FIELD_SF; bump_field(delta); break; + case SCREEN_CR: s_field = FIELD_CR; bump_field(delta); break; + case SCREEN_POWER: s_field = FIELD_TX_POWER; bump_field(delta); break; + case SCREEN_PERIOD: s_field = FIELD_PERIOD; bump_field(delta); break; + case SCREEN_PAYLOAD: change_payload(delta); break; + case SCREEN_BOOT: break; + default: + break; + } +} + +static void app_loop(void) +{ + lora_metrics_t metrics = {0}; + while (true) { + input_event_t evt = input_poll(); + switch (evt) { + case INPUT_LEFT: next_screen(-1); break; + case INPUT_RIGHT: next_screen(1); break; + case INPUT_UP: + if (s_screen == SCREEN_TX_ENABLE) { + s_tx_enabled = true; + } else { + adjust_current(1); + } + break; + case INPUT_DOWN: + if (s_screen == SCREEN_TX_ENABLE) { + s_tx_enabled = false; + } else { + adjust_current(-1); + } + break; + case INPUT_CENTER: + if (s_screen == SCREEN_TX_ENABLE) { + s_tx_enabled = !s_tx_enabled; + } else if (s_screen == SCREEN_BOOT) { + ui_show_status("Bootloader", "Rebooting to USB", "Connect USB", NULL, NULL, NULL); + vTaskDelay(pdMS_TO_TICKS(200)); + REG_SET_BIT(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT); + esp_restart(); + } else { + bump_field(0); + } + break; + default: break; + } + + usb_api_tick(); + lora_radio_tick_tx(); + lora_radio_get_metrics(&metrics); + // Періодична передача + int64_t now = esp_timer_get_time(); + if (s_tx_enabled && now - s_last_tx_us >= (int64_t)s_period_ms * 1000) { + size_t len = strnlen(s_payload, sizeof(s_payload)); + if (len > 0) { + esp_err_t tx_err = lora_radio_send((const uint8_t *)s_payload, len); + if (tx_err == ESP_OK) { + s_last_tx_us = now; + ESP_LOGI(TAG, "TX \"%s\" (%u bytes)", s_payload, (unsigned)len); + } else { + ESP_LOGW(TAG, "TX failed: %s", esp_err_to_name(tx_err)); + s_last_tx_us = now; // уникнути спаму + } + } + } + char line1[32]; + char line2[32]; + char line3[32]; + char line4[32]; + char line5[32]; + char line6[32]; + memset(line1, 0, sizeof(line1)); + memset(line2, 0, sizeof(line2)); + memset(line3, 0, sizeof(line3)); + memset(line4, 0, sizeof(line4)); + memset(line5, 0, sizeof(line5)); + memset(line6, 0, sizeof(line6)); + + switch (s_screen) { + case SCREEN_FREQ: + snprintf(line1, sizeof(line1), "Freq: %d MHz", s_params.freq_centi_mhz / 100); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_BAND: { + const band_t *b = &s_bands[s_band_idx]; + snprintf(line1, sizeof(line1), "Band %s", b->name); + snprintf(line2, sizeof(line2), "%d-%d MHz", b->min_cmhz / 100, b->max_cmhz / 100); + snprintf(line3, sizeof(line3), "UP/DN to select"); + break; + } + case SCREEN_BW: + snprintf(line1, sizeof(line1), "BW: %d kHz", s_params.bw_khz); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_SF: + snprintf(line1, sizeof(line1), "SF: %d", s_params.sf); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_CR: + snprintf(line1, sizeof(line1), "CR: 4/%d", s_params.cr); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_POWER: + snprintf(line1, sizeof(line1), "PWR: %d dBm", s_params.tx_power_dbm); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_PAYLOAD: + snprintf(line1, sizeof(line1), "Payload:"); + snprintf(line2, sizeof(line2), "%.31s", s_payload); + snprintf(line3, sizeof(line3), "UP/DN pick PING"); + break; + case SCREEN_PERIOD: + snprintf(line1, sizeof(line1), "Period: %d ms", s_period_ms); + snprintf(line2, sizeof(line2), "UP/DN to change"); + break; + case SCREEN_TX_ENABLE: + snprintf(line1, sizeof(line1), "TX: %s", s_tx_enabled ? "ON" : "OFF"); + snprintf(line2, sizeof(line2), "UP=on DN=off CTR=tgl"); + break; + case SCREEN_BOOT: + snprintf(line1, sizeof(line1), "USB Bootloader"); + snprintf(line2, sizeof(line2), "CENTER to reboot"); + snprintf(line3, sizeof(line3), "Plug USB first"); + break; + default: + break; + } + + snprintf(line4, sizeof(line4), "SNR %ddB", metrics.snr_db); + snprintf(line5, sizeof(line5), "RSSI %ddBm ST 0x%02X", metrics.rssi_dbm, metrics.last_status); + + char header[32]; + snprintf(header, sizeof(header), "%s %s", s_screen_icon[s_screen], s_screen_label[s_screen]); + ui_show_role(header); + ui_show_status(line1, line2, line3, line4, line5, line6); + vTaskDelay(pdMS_TO_TICKS(500)); + } +} + +void app_main(void) +{ + common_print_boot_info(); + input_init(); + ui_init(); + ui_show_role("TX"); + bool radio_ok = lora_radio_init(true); + ui_show_status(radio_ok ? "LR1121 OK" : "LR1121 FAIL", "Ready", NULL, NULL, NULL, NULL); + ESP_LOGI(TAG, "LR1121 init: %s", radio_ok ? "OK" : "FAIL"); + s_params.freq_centi_mhz = CONFIG_LORA_FREQ_MHZ * 100; + s_params.bw_khz = CONFIG_LORA_BW_KHZ; + s_params.sf = CONFIG_LORA_SF; + s_params.cr = CONFIG_LORA_CR; + s_params.tx_power_dbm = 14; + s_params.preamble_syms = 8; + s_params.payload_len = 0; + s_params.crc_on = true; + s_params.iq_invert = false; + s_params.header_implicit = false; + apply_payload_selection(); + s_band_idx = detect_band_from_freq(s_params.freq_centi_mhz); + clamp_freq_to_band(); + esp_err_t err = lora_radio_apply_params(&s_params); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Initial params failed: %s", esp_err_to_name(err)); + } + usb_api_init(usb_handle_line); + app_loop(); +} diff --git a/apps/tx/sdkconfig b/apps/tx/sdkconfig new file mode 100644 index 0000000..c9d7f04 --- /dev/null +++ b/apps/tx/sdkconfig @@ -0,0 +1,1716 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_LCDCAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y +CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_CACHE_SUPPORT_WRAP=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_RISCV_COPROC_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_USB_OTG_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_SIMD_INSTRUCTION_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=24 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CACHE_ACS_INVALID_STATE_ON_PANIC=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=49 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=48 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_DMA=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_RGB_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=1 +CONFIG_SOC_LCD_RGB_PANELS=1 +CONFIG_SOC_LCD_I80_BUS_WIDTH=16 +CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 +CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_I80_NUM_BUSES=1 +CONFIG_SOC_LCDCAM_I80_BUS_WIDTH=16 +CONFIG_SOC_LCDCAM_RGB_NUM_PANELS=1 +CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16 +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 +CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTCIO_PIN_COUNT=22 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_SUPPORT_OCT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_SRC_FREQ_120M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=2 +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=1 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=14 +CONFIG_SOC_TOUCH_SUPPORT_BENCHMARK=y +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y +CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y +CONFIG_SOC_TOUCH_SUPPORT_DENOISE_CHAN=y +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_USB_OTG_PERIPH_NUM=1 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y +CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_FLASH_OPI_MODE=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y +CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1 +CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16 +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_USB_OTG_NUM=3 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CONSOLE_OUTPUT_SECONDARY=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# !!! MINIMAL_BUILD is enabled !!! +# + +# +# Only common components and those transitively required by the main component are listed +# + +# +# If a component configuration is missing, please add it to the main component's requirements +# + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-S3 Revision (Rev v0.99) +# +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 + +# +# Maximum Supported ESP32-S3 eFuse Block Revision (eFuse Block Rev v1.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# end of Cache config + +# +# Memory +# +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +# CONFIG_ESP_CONSOLE_UART_DEFAULT is not set +# CONFIG_ESP_CONSOLE_USB_CDC is not set +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +CONFIG_ESP_CONSOLE_NONE=y +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART_NUM=-1 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=-1 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +CONFIG_SPI_FLASH_HPM_ON=y +CONFIG_SPI_FLASH_HPM_DC_AUTO=y +# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# LoRa common options +# +CONFIG_LORA_ROLE_TX=y +# CONFIG_LORA_ROLE_RX is not set +# end of LoRa common options + +# +# Joystick input +# +CONFIG_JOYSTICK_ADC_CHANNEL=5 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=2630 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1230 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=0 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=1970 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=680 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 +# end of Joystick input + +# +# LoRa radio (LR1121) +# +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_RST=5 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=4 +CONFIG_LORA_FREQ_MHZ=433 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 +# end of LoRa radio (LR1121) + +# +# Display +# +CONFIG_DISPLAY_DRIVER="SSD1306 I2C OLED" +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=64 +# end of Display +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +# CONFIG_CONSOLE_UART_DEFAULT is not set +# CONFIG_CONSOLE_UART_CUSTOM is not set +CONFIG_CONSOLE_UART_NONE=y +CONFIG_ESP_CONSOLE_UART_NONE=y +CONFIG_CONSOLE_UART_NUM=-1 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_IPC_TASK_STACK_SIZE=1280 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# End of deprecated options diff --git a/apps/tx/sdkconfig.defaults b/apps/tx/sdkconfig.defaults new file mode 100644 index 0000000..09e031c --- /dev/null +++ b/apps/tx/sdkconfig.defaults @@ -0,0 +1,43 @@ +# Роль за замовчуванням +CONFIG_LORA_ROLE_TX=y + + +# Піни RA01 (налаштуйте під свою плату) +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_RST=-1 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=-1 + +# Радіо +CONFIG_LORA_FREQ_MHZ=433 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 + +# Консоль через USB Serial/JTAG (CDC), щоб не тримати BOOT +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_UART_NONE=y +# CONFIG_ESP_CONSOLE_UART_DEFAULT is not set +# CONFIG_ESP_CONSOLE_USB_CDC is not set + +# Джойстик +CONFIG_JOYSTICK_ADC_CHANNEL=6 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=600 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1200 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=1900 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=2600 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=3300 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 + +# Дисплей +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=64 diff --git a/apps/tx/sdkconfig.old b/apps/tx/sdkconfig.old new file mode 100644 index 0000000..9588a5f --- /dev/null +++ b/apps/tx/sdkconfig.old @@ -0,0 +1,1549 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_MAX_DATA_WIDTH=24 +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=1 +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=0 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=9 +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=1 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=1 +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D4=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V1_SUPPORTED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# !!! MINIMAL_BUILD is enabled !!! +# + +# +# Only common components and those transitively required by the main component are listed +# + +# +# If a component configuration is missing, please add it to the main component's requirements +# + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y +CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y +CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y +CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +CONFIG_ADC_DISABLE_DAC=y +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy DAC Driver Configurations +# +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy DAC Driver Configurations + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set + +# +# ADC Calibration Configurations +# +CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y +CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CALI_LUT_ENABLE=y +# end of ADC Calibration Configurations + +CONFIG_ADC_DISABLE_DAC_OUTPUT=y +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:DAC Configurations +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of ESP-Driver:DAC Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +# CONFIG_XTAL_FREQ_32 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=0 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-MM: Memory Management Configurations +# +# end of ESP-MM: Memory Management Configurations + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=n +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_UART_CUSTOM=n +CONFIG_ESP_CONSOLE_NONE=n +CONFIG_ESP_CONSOLE_UART=n +# CONFIG_ESP_CONSOLE_UART_NUM is not set +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +# CONFIG_ESP_CONSOLE_UART_BAUDRATE is not set +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_TG0_LAC=y +# end of ESP Timer (High Resolution Timer) + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# LoRa common options +# +CONFIG_LORA_ROLE_TX=y +# CONFIG_LORA_ROLE_RX is not set +# end of LoRa common options + +# +# Joystick input +# +CONFIG_JOYSTICK_ADC_CHANNEL=6 +CONFIG_JOYSTICK_ADC_LEVEL_LEFT=600 +CONFIG_JOYSTICK_ADC_LEVEL_UP=1200 +CONFIG_JOYSTICK_ADC_LEVEL_PRESS=1900 +CONFIG_JOYSTICK_ADC_LEVEL_DOWN=2600 +CONFIG_JOYSTICK_ADC_LEVEL_RIGHT=3300 +CONFIG_JOYSTICK_ADC_TOLERANCE=150 +# end of Joystick input + +# +# LoRa radio (LR1121) +# +CONFIG_LORA_SPI_HOST=2 +CONFIG_LORA_PIN_CS=12 +CONFIG_LORA_PIN_MOSI=10 +CONFIG_LORA_PIN_MISO=9 +CONFIG_LORA_PIN_SCK=11 +CONFIG_LORA_PIN_RST=-1 +CONFIG_LORA_PIN_BUSY=13 +CONFIG_LORA_PIN_DIO1=-1 +CONFIG_LORA_FREQ_MHZ=868 +CONFIG_LORA_BW_KHZ=125 +CONFIG_LORA_SF=7 +CONFIG_LORA_CR=5 +# end of LoRa radio (LR1121) + +# +# Display +# +CONFIG_DISPLAY_DRIVER="ST7735" +CONFIG_DISPLAY_I2C_PORT=0 +CONFIG_DISPLAY_I2C_ADDR=60 +CONFIG_DISPLAY_PIN_SDA=7 +CONFIG_DISPLAY_PIN_RST=-1 +CONFIG_DISPLAY_PIN_SCL=8 +CONFIG_DISPLAY_WIDTH=128 +CONFIG_DISPLAY_HEIGHT=160 +# end of Display +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +CONFIG_ADC2_DISABLE_DAC=y +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=n +# CONFIG_CONSOLE_UART_CUSTOM is not set +CONFIG_CONSOLE_UART_NONE=y +CONFIG_ESP_CONSOLE_UART_NONE=y +# CONFIG_CONSOLE_UART is not set +# CONFIG_CONSOLE_UART_NUM is not set +# CONFIG_CONSOLE_UART_BAUDRATE is not set +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# End of deprecated options diff --git a/components/common/CMakeLists.txt b/components/common/CMakeLists.txt new file mode 100644 index 0000000..00e01f0 --- /dev/null +++ b/components/common/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "common.c" + INCLUDE_DIRS "include" + PRIV_REQUIRES spi_flash +) diff --git a/components/common/Kconfig b/components/common/Kconfig new file mode 100644 index 0000000..27a183e --- /dev/null +++ b/components/common/Kconfig @@ -0,0 +1,17 @@ +menu "LoRa common options" + +choice LORA_ROLE + prompt "Device role" + default LORA_ROLE_TX + help + Виберіть роль прошивки за замовчуванням. Для кожної збірки можна + вказати власні sdkconfig.defaults з потрібним вибором. + + config LORA_ROLE_TX + bool "Transmitter" + + config LORA_ROLE_RX + bool "Receiver" +endchoice + +endmenu diff --git a/components/common/common.c b/components/common/common.c new file mode 100644 index 0000000..3049ce7 --- /dev/null +++ b/components/common/common.c @@ -0,0 +1,44 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_chip_info.h" +#include "esp_flash.h" +#include "esp_system.h" +#include "esp_log.h" + +#define TAG "common" + +void common_print_boot_info(void) +{ + esp_chip_info_t chip_info; + uint32_t flash_size = 0; + esp_chip_info(&chip_info); + + ESP_LOGI(TAG, "Chip: %s, cores: %d, features: %s%s%s%s", + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "", + (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "", + (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4" : ""); + + unsigned major_rev = chip_info.revision / 100; + unsigned minor_rev = chip_info.revision % 100; + ESP_LOGI(TAG, "Revision: v%u.%u", major_rev, minor_rev); + + if (esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + ESP_LOGW(TAG, "Cannot read flash size"); + } else { + ESP_LOGI(TAG, "Flash: %" PRIu32 " MB %s", + flash_size / (uint32_t)(1024 * 1024), + (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); + } + + ESP_LOGI(TAG, "Min free heap: %" PRIu32 " bytes", esp_get_minimum_free_heap_size()); + + for (int i = 3; i > 0; i--) { + ESP_LOGI(TAG, "Start in %d...", i); + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/components/common/include/common.h b/components/common/include/common.h new file mode 100644 index 0000000..2ce28ea --- /dev/null +++ b/components/common/include/common.h @@ -0,0 +1,5 @@ +#pragma once + +#include "esp_chip_info.h" + +void common_print_boot_info(void); diff --git a/components/esp_lora_1121/CMakeLists.txt b/components/esp_lora_1121/CMakeLists.txt new file mode 100755 index 0000000..ae3db37 --- /dev/null +++ b/components/esp_lora_1121/CMakeLists.txt @@ -0,0 +1,20 @@ +file(GLOB_RECURSE SRCS src/*.c + src/lr1121_printers/*.c + src/lr1121_modem/*.c + src/lr1121_common/*.c + src/lr11xx_driver/*.c +) + +set(INCLUDE_DIRS + include + include/lr1121_printers + include/lr1121_modem + include/lr1121_common + include/lr11xx_driver +) + +idf_component_register( + SRCS ${SRCS} + INCLUDE_DIRS ${INCLUDE_DIRS} + REQUIRES esp_timer esp_driver_i2c esp_driver_spi esp_driver_gpio +) diff --git a/components/esp_lora_1121/LICENSE b/components/esp_lora_1121/LICENSE new file mode 100755 index 0000000..d645695 --- /dev/null +++ b/components/esp_lora_1121/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/components/esp_lora_1121/README.md b/components/esp_lora_1121/README.md new file mode 100755 index 0000000..cd59f0a --- /dev/null +++ b/components/esp_lora_1121/README.md @@ -0,0 +1,117 @@ +# LoRa LR1121 + +[![Component Registry](https://components.espressif.com/components/waveshare/esp_lora_1121/badge.svg)](https://components.espressif.com/components/waveshare/esp_lora_1121) + +LR1121 transceiver driver, LR1121 is a multi-band, ultra-low-power RF transceiver. + +| LoRa controller | Communication interface | Component name | Link to datasheet | +| :--------------: | :---------------------: | :------------: | :---------------: | +| LR1121 | SPI | esp_lora_1121 | [WIKI](https://files.waveshare.com/wiki/Core1121/LR1121_H2_DS_v2_0.pdf) | + +## Add to project + +Packages from this repository are uploaded to [Espressif's component service](https://components.espressif.com/). +You can add them to your project via `idf.py add-dependancy`, e.g. +``` + idf.py add-dependency waveshare/esp_lora_1121==1.0.0 +``` + +Alternatively, you can create `idf_component.yml`. More is in [Espressif's documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html). + +## Example use +### Initialization of the SPI bus +```c +static esp_err_t spi_bus_init() { + spi_bus_config_t buscfg = { + .mosi_io_num = TEST_SPI_MOSI, + .miso_io_num = TEST_SPI_MISO, + .sclk_io_num = TEST_SPI_CLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = 64, + }; + + spi_device_interface_config_t devcfg = { + .clock_speed_hz = TEST_SPI_CLK_SPEED_HZ, // 8 MHz + .mode = 0, // SPI mode 0: CPOL=0, CPHA=0 + .spics_io_num = -1, + .queue_size = 1, + }; + // Initialize SPI bus + ESP_ERROR_CHECK(spi_bus_initialize(TEST_SPI_NUM, &buscfg, SPI_DMA_CH_AUTO)); + ESP_ERROR_CHECK(spi_bus_add_device(TEST_SPI_NUM, &devcfg, &spi_handle)); + + return ESP_OK; +} +``` +### LoRa initialization and configuration +```c + lora_init_io_context(&lr1121,TEST_SPI_CS,TEST_SPI_RESET,TEST_SPI_BUSY,TEST_SPI_INT); // Initialize the I/O context for the LR1121 + lora_init_io(&lr1121); // Initialize the I/O for the LR1121 + + lora_spi_init(&lr1121, spi_handle); // Initialize the SPI interface for the LR1121 + + printf( "===== LR11xx Ping-Pong example =====\n\n" ); + printf( "LR11XX driver version: %s\n", lr11xx_driver_version_get_version_string( ) ); + + // Initialize the system + lora_system_init(&lr1121); + // Print the version number for verification + lora_print_version(&lr1121); + // Initialize the LoRa radio + lora_radio_init(&lr1121); + + lora_init_irq(&lr1121, isr); // Initialize the interrupt service routine + + + ASSERT_LR11XX_RC( lr11xx_system_set_dio_irq_params( &lr1121, IRQ_MASK, 0 ) ); + ASSERT_LR11XX_RC( lr11xx_system_clear_irq_status( &lr1121, LR11XX_SYSTEM_IRQ_ALL_MASK ) ); + +``` +### Set the data to be sent and send it. +```c + memcpy( buffer_tx, ping_msg, PING_PONG_PREFIX_SIZE ); + buffer_tx[PING_PONG_PREFIX_SIZE] = ( uint8_t ) 0; + buffer_tx[ITERATION_INDEX] = ( uint8_t ) ( iteration ); + for( int i = PING_PONG_PREFIX_SIZE + 1 + 1; i < PAYLOAD_LENGTH; i++ ) + { + buffer_tx[i] = i; + } + + ASSERT_LR11XX_RC( lr11xx_regmem_write_buffer8( &lr1121, buffer_tx, PAYLOAD_LENGTH ) ); + ASSERT_LR11XX_RC( lr11xx_radio_set_tx( &lr1121, 0 ) ); +``` +### Read the current time and check if the alarm has been triggered +```c + while (1) + { + if(irq_flag) + lora_irq_process( &lr1121, IRQ_MASK ); + vTaskDelay(1 / portTICK_PERIOD_MS); // Short delay to control the loop speed + } +``` + +### Running results +```shell + Interrupt flags = 0x00000004 + Interrupt flags (after filtering) = 0x00000004 + Tx done + Sent message PING, iteration 50 + + Interrupt flags = 0x00000038 + Interrupt flags (after filtering) = 0x00000008 + Rx done + Packet content - (7 bytes): + 50 4F 4E 47 00 00 33 + Packet status: + - RSSI packet = -6 dBm + - Signal RSSI packet = -5 dBm + - SNR packet = 15 dB + Received message PONG, iteration 52 + + Interrupt flags = 0x00000004 + Interrupt flags (after filtering) = 0x00000004 + Tx done + Sent message PING, iteration 52 +------------ +``` diff --git a/components/esp_lora_1121/idf_component.yml b/components/esp_lora_1121/idf_component.yml new file mode 100755 index 0000000..fa40d52 --- /dev/null +++ b/components/esp_lora_1121/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + idf: + version: '>=5.3.0' + +description: Board Support Package for LoRa 1121 +version: 1.0.0 diff --git a/components/esp_lora_1121/include/esp_lora_1121.h b/components/esp_lora_1121/include/esp_lora_1121.h new file mode 100755 index 0000000..429612f --- /dev/null +++ b/components/esp_lora_1121/include/esp_lora_1121.h @@ -0,0 +1,80 @@ +#ifndef WAVESHARE_LORA_SPI_H +#define WAVESHARE_LORA_SPI_H + +#include +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "esp_timer.h" +#include "esp_log.h" + +#include "lr11xx_bootloader.h" +#include "lr11xx_hal.h" +#include "lr11xx_system.h" +#include "lr11xx_radio.h" +#include "lr11xx_regmem.h" +#include "lr11xx_lr_fhss.h" +#include "lr11xx_driver_version.h" + + +#include "lr1121_modem_helper.h" +#include "lr1121_modem_system_types.h" + +#include "lr1121_modem_common.h" +#include "lr1121_modem_modem.h" +#include "lr1121_modem_hal.h" +#include "lr1121_modem_system.h" +#include "lr1121_modem_bsp.h" +#include "lr1121_modem_radio.h" + +#include "lr11xx_bootloader_types_str.h" +#include "lr11xx_crypto_engine_types_str.h" +#include "lr11xx_lr_fhss_types_str.h" +#include "lr11xx_radio_types_str.h" +#include "lr11xx_rttof_types_str.h" +#include "lr11xx_system_types_str.h" +#include "lr11xx_types_str.h" +#include "lr11xx_printf_info.h" +#include "lr1121_modem_printf_info.h" + +#include "lr1121_common.h" + +// #define USE_LR11XX_CRC_OVER_SPI + +typedef struct lr1121_s +{ + int cs; + int reset; + int busy; + int irq; + int led; + spi_device_handle_t spi; +} lr1121_t; + +/** + * @brief Initializes the radio I/Os pins context + * + * @param [in] context Radio abstraction + */ +void lora_init_io_context(const void *context,int cs,int reset,int busy,int irq); +/** + * @brief Initializes the radio I/Os pins interface + * + * @param [in] context Radio abstraction + */ +void lora_init_io( const void* context ); + +void lora_init_irq(const void *context, gpio_isr_t handler); + +void lora_spi_init(const void* context, spi_device_handle_t spi); +void lora_spi_write_bytes(const void* context,const uint8_t *wirte,const uint16_t wirte_length); +void lora_spi_read_bytes(const void* context, uint8_t *read,const uint16_t read_length); +/** + * @brief Flush the modem event queue + * + * @param [in] context Radio abstraction + * + * @returns Modem-E response code + */ +lr1121_modem_response_code_t lr1121_modem_board_event_flush( const void* context ); + +#endif diff --git a/components/esp_lora_1121/include/lr1121_common/lr1121_common.h b/components/esp_lora_1121/include/lr1121_common/lr1121_common.h new file mode 100755 index 0000000..d9a8b73 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_common/lr1121_common.h @@ -0,0 +1,162 @@ +#ifndef LR1121_COMMON_H +#define LR1121_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lr11xx_driver/lr11xx_radio_types.h" +#include "lr11xx_driver/lr11xx_radio.h" + +#include "lr11xx_driver/lr11xx_system_types.h" +#include "lr11xx_driver/lr11xx_regmem.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + + #define SMTC_SHIELD_LR11XX_SUBGHZ_FREQ_MIN 150000000 + #define SMTC_SHIELD_LR11XX_SUBGHZ_FREQ_MAX 960000000 + + #define SMTC_SHIELD_LR112X_2GHZ_FREQ_MIN 2000000000 + #define SMTC_SHIELD_LR112X_2GHZ_FREQ_MAX 2100000000 + + #define SMTC_SHIELD_LR112X_2_4GHZ_FREQ_MIN 2400000000 + #define SMTC_SHIELD_LR112X_2_4GHZ_FREQ_MAX 2500000000 + + #define SMTC_SHIELD_LR11XX_MIN_PWR -9 + #define SMTC_SHIELD_LR11XX_MAX_PWR 22 + + #define SMTC_SHIELD_LR112X_MIN_PWR_HF -18 + #define SMTC_SHIELD_LR112X_MAX_PWR_HF 13 + + /*! + * @brief Stringify constants + */ +#define xstr( a ) str( a ) +#define str( a ) #a + + /*! + * @brief Helper macro that returned a human-friendly message if a command does not return LR11XX_STATUS_OK + * + * @remark The macro is implemented to be used with functions returning a @ref lr11xx_status_t + * + * @param[in] rc Return code + */ +#define ASSERT_LR11XX_RC( rc ) \ +{ \ + const lr11xx_status_t status = rc; \ + if( status != LR11XX_STATUS_OK ) \ + { \ + if( status == LR11XX_STATUS_ERROR ) \ + { \ + printf( "In %s - %s (line %d): %s\n", __FILE__, __func__, __LINE__, \ + xstr( LR11XX_STATUS_ERROR ) ); \ + } \ + } \ +} + + /* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + + /* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief Power amplifier and output power configurations structure definition + */ +typedef struct smtc_shield_lr11xx_pa_pwr_cfg_s +{ + int8_t power; + lr11xx_radio_pa_cfg_t pa_config; +} smtc_shield_lr11xx_pa_pwr_cfg_t; + +/** + * @brief External 32MHz oscillator configuration structure definition + */ +typedef struct smtc_shield_lr11xx_xosc_cfg_s +{ + bool has_tcxo; + lr11xx_system_tcxo_supply_voltage_t supply; + uint32_t startup_time_in_tick; +} smtc_shield_lr11xx_xosc_cfg_t; + +/** + * @brief 32kHz clock configuration structure definition + */ +typedef struct smtc_shield_lr11xx_lfclk_cfg_s +{ + lr11xx_system_lfclk_cfg_t lf_clk_cfg; + bool wait_32k_ready; +} smtc_shield_lr11xx_lfclk_cfg_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/** + * @see smtc_shield_lr11xx_get_rssi_calibration_table + */ +const lr11xx_radio_rssi_calibration_table_t* smtc_shield_lr11xx_get_rssi_calibration_table( + const uint32_t rf_freq_in_hz ); + + /** + * @see smtc_shield_lr11xx_get_rf_switch_cfg + */ +const lr11xx_system_rfswitch_cfg_t* smtc_shield_lr11xx_common_get_rf_switch_cfg( void ); + +/** + * @see smtc_shield_lr11xx_get_reg_mode + */ +lr11xx_system_reg_mode_t smtc_shield_lr11xx_common_get_reg_mode( void ); + +/** + * @see smtc_shield_lr11xx_get_lfclk_cfg + */ +const smtc_shield_lr11xx_lfclk_cfg_t* smtc_shield_lr11xx_common_get_lfclk_cfg( void ); + +/** + * @see smtc_shield_lr11xx_get_pa_pwr_cfg + */ +const smtc_shield_lr11xx_pa_pwr_cfg_t* smtc_shield_lr1121mb1gis_get_pa_pwr_cfg( const uint32_t rf_freq_in_hz, + int8_t expected_output_pwr_in_dbm ); + +const uint8_t smtc_shield_lr11xx_common_compute_lora_ldro( const lr11xx_radio_lora_sf_t sf, const lr11xx_radio_lora_bw_t bw ); + +/*! + * \brief Given the length of a BPSK frame, in bits, calculate the space necessary to hold the frame after differential + * encoding, in bits. + * + * \param [in] bpsk_pld_len_in_bits Length of a BPSK frame, in bits + * \returns Space required for DBPSK frame, after addition of start/stop bits [bits] + */ +static inline int smtc_dbpsk_get_pld_len_in_bits( int bpsk_pld_len_in_bits ) +{ + // Hold the last bit one extra bit-time + return bpsk_pld_len_in_bits + 2; +} + +/*! + * \brief Given the length of a BPSK frame, in bits, calculate the space necessary to hold the frame after differential + * encoding, in bytes. + * + * \param [in] bpsk_pld_len_in_bits Length of a BPSK frame, in bits + * \returns Space required for DBPSK frame, after addition of start/stop bits [bytes] + */ +static inline int smtc_dbpsk_get_pld_len_in_bytes( int bpsk_pld_len_in_bits ) +{ + return ( smtc_dbpsk_get_pld_len_in_bits( bpsk_pld_len_in_bits ) + 7 ) >> 3; +} + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp.h new file mode 100755 index 0000000..3347272 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp.h @@ -0,0 +1,294 @@ +/*! + * @file lr1121_modem_bsp.h + * + * @brief BSP driver for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_BSP_H +#define LR1121_MODEM_BSP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr1121_modem_common.h" +#include "lr1121_modem_bsp_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief This command gets the board-specific correction offset for transmission power to be used (signed integer in + * dB). + * + * @param [in] context Chip implementation context + * @param [out] tx_power_offset Tx power offset correction in dBm + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_tx_power_offset( const void* context, int8_t* tx_power_offset ); + +/*! + * @brief This command sets the board-specific correction offset for transmission power to be used + * + * The offset depends on the board design and antenna matching and is expressed in dB (signed integer). + * The default value is -2dB. + * + * @param [in] context Chip implementation context + * @param [in] tx_power_offset Tx power offset correction in dBm + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_tx_power_offset( const void* context, const int8_t tx_power_offset ); + +/*! + * @brief Configure the Output RF per power + * + * This command overload the output RF configuration for the given @p expected_power. + * + * @param [in] context Chip implementation context + * @param [in] output_power_configs Array of Tx output power configurations to set. It is up to the user to ensure it + * contains at least @p n_output_power_configs + * @param [in] n_output_power_configs Number of output power configuration to set. Valid values in range [1:41] + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_output_power_config( + const void* context, const lr1121_modem_output_power_config_t* output_power_configs, + uint8_t n_output_power_configs ); + +/*! + * @brief This command gets the 41 Tx output power configurations for all Tx powers + * + * In case an @p expected_power is not available due to hardware limitation, all corresponding values in @p + * lr1121_modem_output_power_config_t wil be set to 0x7F. + * + * @param [in] context Chip implementation context + * @param [out] output_power_config Tx output power configuration block list, \see + * lr1121_modem_output_power_config_list_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_output_power_config( + const void* context, lr1121_modem_output_power_config_list_t output_power_config ); + +/*! + * @brief Configure RF output configuration + * + * @param [in] context Chip implementation context + * @param [in] output RF output @ref lr1121_modem_bsp_radio_pa_selection_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_rf_output( const void* context, + const lr1121_modem_bsp_radio_pa_selection_t output ); + +/*! + * @brief Get RF output configuration + * + * @param [in] context Chip implementation context + * @param [out] output RF output @ref lr1121_modem_bsp_radio_pa_selection_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_rf_output( const void* context, + const lr1121_modem_bsp_radio_pa_selection_t* output ); + +/*! + * @brief Get the Crystal error + * + * @param [in] context Chip implementation context + * @param [out] crystal_error_ppm Crystal error in PPM + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_crystal_error( const void* context, uint32_t* crystal_error_ppm ); + +/*! + * @brief Set the Crystal error of the MCU to fine adjust the rx window for LoRaWAN + * + * The default value is: + * - When the Low-Frequency clock selected is @ref LR1121_MODEM_SYSTEM_LFCLK_RC : 16000 PPM + * - Otherwise: 50 PPM + * + * @param [in] context Chip implementation context + * @param [in] crystal_error_ppm Crystal error in PPM + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_crystal_error( const void* context, const uint32_t crystal_error_ppm ); + +/*! + * @brief Get the XOSC trimming capacitor + * + * @param [in] context Chip implementation context + * @param [out] capa_trim_a Trimming value for capacitance XTA + * @param [out] capa_trim_b Trimming value for capacitance XTB + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_xosc_capa_trim_a_b( const void* context, uint8_t* capa_trim_a, + uint8_t* capa_trim_b ); + +/*! + * @brief Set the XOSC trimming capacitor + * + * @p capa_trim_a and @p capa_trim_b both takes value within [0, 47]. It configures the corresponding trimming + * capacitance following \f$ C_{x,uF} = 0.47 \times capa\_trim\_x + N_x \f$ Where: + * - \f$ N_a = 11.3 \f$ + * - \f$ N_b = 10.1 \f$ + * + * So that \f$ C_{a,uF} \f$ goes from 11.3pF to 33.4pF ; and \f$ C_{b,uF} \f$ goes from 10.1pF to 32.2pF. + * + * Default value is 0x12 for both @p capa_trim_a and @p capa_trim_b which makes respectively 19.7pF and 18.5pF. + * + * Note that when the chip enters sleep mode, the capacitances XTA and XTB are respectively set to 13.6pF and 12.4pF. + * When leaving sleep mode, XTA and XTB are set to the value configured by this command (or to the default ones). + * + * @param [in] context Chip implementation context + * @param [in] capa_trim_a Trimming value for capacitance XTA + * @param [in] capa_trim_b Trimming value for capacitance XTB + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_xosc_capa_trim_a_b( const void* context, const uint8_t capa_trim_a, + const uint8_t capa_trim_b ); + +/** + * @brief Get the instantaneous power consumption table + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [out] consumption_per_power Table of instantaneous consumption + * @return Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_tx_power_consumption_ua( + const void* context, lr1121_modem_tx_power_consumption_list_t consumption_per_power ); + +/** + * @brief Set the instantaneous power consumption table + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [in] consumption_per_power Array of the instantaneous power consumption to set. Setting the field + * consumed_power_ua to 0 reset the instantaneous consumption corresponding to the given Tx RF power to 0. It is up to + * the caller to ensure this array contains at least n_consumption_per_power elements + * @param [in] n_consumption_per_power Number of elements in the array @p consumption_per_power to set. Valid values + * in range of [1:41] + * @return Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_tx_power_consumption_ua( + const void* context, const lr1121_modem_tx_power_consumption_value_t* consumption_per_power, + uint8_t n_consumption_per_power ); + +/** + * @brief Get LoRa Rx consumption configured + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [out] rx_consumption The LoRa instantaneous Rx consumption configured + * @return lr1121_modem_response_code_t + */ +lr1121_modem_response_code_t lr1121_modem_get_lora_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption ); + +/** + * @brief Set the LoRa Rx power consumption configuration + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [in] rx_consumption The LoRa Rx consumption structure to set. Setting one field to 0 reset it to its internal + * value. + * @return lr1121_modem_response_code_t + */ +lr1121_modem_response_code_t lr1121_modem_set_lora_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption ); + +/** + * @brief Get GFSK Rx power consumption configured + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [out] rx_consumption The GFSK instantaneous Rx consumption configured + * @return lr1121_modem_response_code_t + */ +lr1121_modem_response_code_t lr1121_modem_get_gfsk_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption ); + +/** + * @brief Set the GFSK Rx power consumption configuration + * + * The instantaneous power consumption values are used to evaluate the power consumption statistics. + * + * @param [in] context Chip implementation context + * @param [in] rx_consumption The GFSK Rx consumption structure to set. Setting one field to 0 reset it to its internal + * value. + * @return lr1121_modem_response_code_t + */ +lr1121_modem_response_code_t lr1121_modem_set_gfsk_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_BSP_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp_types.h new file mode 100755 index 0000000..f9d027b --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_bsp_types.h @@ -0,0 +1,203 @@ +/*! + * @file lr1121_modem_bsp_types.h + * + * @brief BSP driver types for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_BSP_TYPES_H +#define LR1121_MODEM_BSP_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Number of output power config blocks + */ +#define LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS ( 41 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Power Amplifier Selection values + * + * - Low-power Power Amplifier can reach up to 14dBm + * - High-power Power Amplifier can reach up to 22 dBm + */ +typedef enum +{ + LR1121_MODEM_BSP_RADIO_PA_SEL_LP = 0x00, //!< Low-power Power Amplifier + LR1121_MODEM_BSP_RADIO_PA_SEL_HP = 0x01, //!< High-power Power Amplifier + LR1121_MODEM_BSP_RADIO_PA_SEL_LP_HP_LF = + 0x02, //!< Automatic selection between Low-power and High-power depending on requested power + LR1121_MODEM_BSP_RADIO_PA_SEL_HF = 0x03, //!< High Frequency Power Amplifier +} lr1121_modem_bsp_radio_pa_selection_t; + +/*! + * @brief Ramping time for PA + * + * This parameter is the ramping time of the PA. A high value improves spectral quality. + */ +typedef enum +{ + LR1121_MODEM_RAMP_16_US = 0x00, //!< 16 us Ramp Time + LR1121_MODEM_RAMP_32_US = 0x01, //!< 32 us Ramp Time + LR1121_MODEM_RAMP_48_US = 0x02, //!< 48 us Ramp Time (Default) + LR1121_MODEM_RAMP_64_US = 0x03, //!< 64 us Ramp Time + LR1121_MODEM_RAMP_80_US = 0x04, //!< 80 us Ramp Time + LR1121_MODEM_RAMP_96_US = 0x05, //!< 96 us Ramp Time + LR1121_MODEM_RAMP_112_US = 0x06, //!< 112 us Ramp Time + LR1121_MODEM_RAMP_128_US = 0x07, //!< 128 us Ramp Time + LR1121_MODEM_RAMP_144_US = 0x08, //!< 144 us Ramp Time + LR1121_MODEM_RAMP_160_US = 0x09, //!< 160 us Ramp Time + LR1121_MODEM_RAMP_176_US = 0x0A, //!< 176 us Ramp Time + LR1121_MODEM_RAMP_192_US = 0x0B, //!< 192 us Ramp Time + LR1121_MODEM_RAMP_208_US = 0x0C, //!< 208 us Ramp Time + LR1121_MODEM_RAMP_240_US = 0x0D, //!< 240 us Ramp Time + LR1121_MODEM_RAMP_272_US = 0x0E, //!< 272 us Ramp Time + LR1121_MODEM_RAMP_304_US = 0x0F, //!< 304 us Ramp Time +} lr1121_modem_ramp_time_t; + +/*! + * @brief Select power amplifier supply source + */ +typedef enum +{ + LR1121_MODEM_PA_REG_SUPPLY_VREG = 0x00, //!< Power amplifier supplied by the main regulator + LR1121_MODEM_PA_REG_SUPPLY_VBAT = 0x01 //!< Power amplifier supplied by the battery +} lr1121_modem_pa_reg_supply_t; + +/*! + * @brief Power Amplifier selection for RF output configuration table + */ +typedef enum +{ + LR1121_MODEM_OUTPUT_POWER_CONFIGURATION_PA_SEL_LP = 0x00, //!< Low-power Power Amplifier + LR1121_MODEM_OUTPUT_POWER_CONFIGURATION_PA_SEL_HP = 0x01, //!< High-power Power Amplifier + LR1121_MODEM_OUTPUT_POWER_CONFIGURATION_PA_SEL_HF = 0x02, //!< High Frequency Power Amplifier +} lr1121_modem_output_power_configuration_pa_sel_t; + +/*! + * @brief Output Power Config structure + * + * A power configuration for an @p expected_power can be reset to its internal configuration by setting one of the other + * structure field to value 0x7F. + * + * @p pa_duty_cycle controls the duty cycle of Power Amplifier according to: + * \f$ dutycycle = 0.2 + 0.04 \times pa\_duty\_cycle \f$ + * It can be used to adapt the TX multi-band operation using a single-matching network. + * + * The allowed duty cycle values for LPA are from 0.2 to 0.48 (by step of 0.04). Therefore possible values for + * pa_duty_cycle go from 0 to 7. + * + * The allowed duty cycle values for HPA go from 0.2 to 0.36 (by step of 0.04). Therefore in this case, the possible + * values for pa_duty_cycle go from 0 to 4. + * + * @p pa_hp_sel controls the number of slices for HPA according to: \f$ \#slices = pa\_hp\_sel + 1 \f$ + */ +typedef struct +{ + uint8_t expected_power; //!< Expected power in dBm + uint8_t configured_power; //!< Configured power in dBm + lr1121_modem_pa_reg_supply_t pa_supply; //!< Power Amplifier regulator supply source + uint8_t pa_duty_cycle; //!< Power Amplifier duty cycle (Default 0x04) + lr1121_modem_output_power_configuration_pa_sel_t pa_sel; //!< Power Amplifier selection + uint8_t pa_hp_sel; //!< Number of slices for HPA (Default 0x07) + lr1121_modem_ramp_time_t pa_ramp_time; //!< Power amplifier ramp time +} lr1121_modem_output_power_config_t; + +/*! + * @brief Output power config type + */ +typedef lr1121_modem_output_power_config_t + lr1121_modem_output_power_config_list_t[LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS]; + +/** + * @brief Tx power consumption mapping structure + */ +typedef struct +{ + int8_t tx_power_dbm; //!< Tx RF output power + uint32_t consumed_power_ua; //!< Corresponding instantaneous power consumption (uA) +} lr1121_modem_tx_power_consumption_value_t; + +/** + * @brief Power consumption table + */ +typedef lr1121_modem_tx_power_consumption_value_t + lr1121_modem_tx_power_consumption_list_t[LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS]; + +/** + * @brief Rx power consumption structure + * + * The Rx power consumption depends on the Rx boosted configuration. + * + * @see lr1121_modem_radio_cfg_rx_boosted + */ +typedef struct +{ + uint32_t consumption_rx_boosted_off_ua; //!< Instantaneous consumption without Rx boosted disabled (uA) + uint32_t consumption_rx_boosted_on_ua; //!< Instantaneous consumption without Rx boosted enable (uA) +} lr1121_modem_rx_power_consumption_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_BSP_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_common.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_common.h new file mode 100755 index 0000000..b95dbc1 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_common.h @@ -0,0 +1,107 @@ +/*! + * @file lr1121_modem_common.h + * + * @brief modem driver common definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_COMMON_H +#define LR1121_MODEM_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Command group identifier + */ +typedef enum +{ + LR1121_MODEM_GROUP_ID_BSP = 0x0600, //!< Group ID for BSP commands + LR1121_MODEM_GROUP_ID_MODEM = 0x0601, //!< Group ID for modem commands + LR1121_MODEM_GROUP_ID_LORAWAN = 0x0602, //!< Group ID for LoRaWAN commands + LR1121_MODEM_GROUP_ID_RELAY = 0x0603, //!< Group ID for relay commands +} lr1121_modem_api_group_id_t; + +/*! + * @brief Command return code (RC) + */ +typedef enum +{ + LR1121_MODEM_RESPONSE_CODE_OK = 0x00, //!< Driver command executed successfully + LR1121_MODEM_RESPONSE_CODE_UNKOWN = 0x01, //!< Command code unknown + LR1121_MODEM_RESPONSE_CODE_NOT_IMPLEMENTED = 0x02, //!< Command not implemented + LR1121_MODEM_RESPONSE_CODE_NOT_INITIALIZED = 0x03, //!< Command not initialized + LR1121_MODEM_RESPONSE_CODE_INVALID = 0x04, //!< Invalid command parameters + LR1121_MODEM_RESPONSE_CODE_BUSY = 0x05, //!< Command cannot be executed now + LR1121_MODEM_RESPONSE_CODE_FAIL = 0x06, //!< Command execution failed + LR1121_MODEM_RESPONSE_CODE_BAD_CRC = 0x08, //!< CRC check failed + LR1121_MODEM_RESPONSE_CODE_BAD_SIZE = 0x0A, //!< Size check failed + LR1121_MODEM_RESPONSE_CODE_FRAME_ERROR = 0x0F, //!< SPI command checksum failed or CRC failed + LR1121_MODEM_RESPONSE_CODE_NO_TIME = 0x10, //!< Modem time is not synchronized + LR1121_MODEM_RESPONSE_CODE_NO_EVENT = 0x12, //!< No Event +} lr1121_modem_response_code_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_COMMON_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_driver_version.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_driver_version.h new file mode 100755 index 0000000..62f3a4d --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_driver_version.h @@ -0,0 +1,56 @@ +/*! + * @file lr1121_modem_driver_version.h + * + * @brief Placeholder to keep the version of LR1121 driver. + * + * The Clear BSD License + * Copyright Semtech Corporation 2024. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR1121_MODEM_DRIVER_VERSION_H +#define LR1121_MODEM_DRIVER_VERSION_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Version of the driver + */ +#define LR1121_MODEM_DRIVER_VERSION "v1.0.0" + +/** + * @brief Returns version string + */ +const char* lr1121_modem_driver_version_get_version_string( void ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_DRIVER_VERSION_H diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_hal.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_hal.h new file mode 100755 index 0000000..2dd4f3c --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_hal.h @@ -0,0 +1,227 @@ +/*! + * @file lr1121_modem_hal.h + * + * @brief Hardware Abstraction Layer (HAL) interface for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_HAL_H +#define LR1121_MODEM_HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Status reported by the HAL layer + */ +typedef enum lr1121_modem_hal_status_e +{ + LR1121_MODEM_HAL_STATUS_OK = 0x00, //!< Operation terminated successfully + LR1121_MODEM_HAL_STATUS_ERROR = 0x01, //!< Operation terminated with error + LR1121_MODEM_HAL_STATUS_BAD_FRAME = 0x0F, //!< Bad frame detected in the exchange + LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT = 0xFF, //!< Timeout occured while waiting for Busy line state +} lr1121_modem_hal_status_t; + +/* + * ============================================================================ + * API definitions to be implemented by the user + * ============================================================================ + */ + +/*! + * @brief Return the computed CRC + * + * @param [in] crc_initial_value initial value of the CRC + * @param [in] buffer Buffer used to compute the CRC + * @param [out] crc CRC computed + * + * @returns CRC value + */ +inline static uint8_t lr1121_modem_compute_crc( const uint8_t crc_initial_value, const uint8_t* buffer, + uint16_t length ) +{ + uint8_t crc = crc_initial_value; + uint8_t extract; + uint8_t sum; + for( int i = 0; i < length; i++ ) + { + extract = *buffer; + for( uint8_t j = 8; j; j-- ) + { + sum = ( crc ^ extract ) & 0x01; + crc >>= 1; + if( sum ) + { + crc ^= 0x65; + } + extract >>= 1; + } + buffer++; + } + return crc; +} + +/*! + * Radio data transfer - write + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [in] command_length Buffer size to be transmitted + * @param [in] data Pointer to the buffer to be transmitted + * @param [in] data_length Buffer size to be transmitted + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_write( const void* context, const uint8_t* command, + const uint16_t command_length, const uint8_t* data, + const uint16_t data_length ); + +/*! + * Radio data transfer - read + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [in] command_length Buffer size to be transmitted + * @param [out] data Pointer to the buffer to be received + * @param [in] data_length Buffer size to be received + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_read( const void* context, const uint8_t* command, + const uint16_t command_length, uint8_t* data, + const uint16_t data_length ); + +/*! + * @brief Radio data transfer - write & read in single operation + * + * @remark Must be implemented by the upper layer + * @remark Only required by lr1121_system_get_status command + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [out] data Pointer to the buffer to be received + * @param [in] data_length Buffer size to be received + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_write_read( const void* context, const uint8_t* command, uint8_t* data, + const uint16_t data_length ); + +/*! + * @brief Direct read from the SPI bus + * + * @remark Unlike @ref lr1121_modem_hal_read, this is a simple direct SPI bus SS/read/nSS operation. While reading the + * response data, the implementation of this function must ensure that only zero bytes (NOP) are written to the SPI bus. + * + * @remark Only required by the @ref lr1121_modem_system_get_status command + * + * @param [in] context Radio implementation parameters + * @param [out] data Pointer to the buffer to be received + * @param [in] data_length Buffer size to be received + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_direct_read( const void* context, uint8_t* data, + const uint16_t data_length ); + +/*! + * Radio data transfer - write without wait the return code - this API is dedicated to the functions which reset the + * Modem-E + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [in] command_length Buffer size to be transmitted + * @param [in] data Pointer to the buffer to be transmitted + * @param [in] data_length Buffer size to be transmitted + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_write_without_rc( const void* context, const uint8_t* command, + const uint16_t command_length, const uint8_t* data, + const uint16_t data_length ); + +/*! + * Reset the radio + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + * + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_reset( const void* context ); + +/*! + * Switch the radio in DFU mode + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + */ +void lr1121_modem_hal_enter_dfu( const void* context ); + +/*! + * Wake the radio up. + * + * @remark Must be implemented by the upper layer + * + * @param [in] context Radio implementation parameters + + * @returns Operation status + */ +lr1121_modem_hal_status_t lr1121_modem_hal_wakeup( const void* context ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_HAL_H diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_helper.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_helper.h new file mode 100755 index 0000000..1c902a5 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_helper.h @@ -0,0 +1,295 @@ +/*! + * @file lr1121_modem_helper.h + * + * @brief helper functions definition for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_HELPER_H +#define LR1121_MODEM_HELPER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr1121_modem_modem_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief LR1121 Modem helper status + */ +typedef enum +{ + LR1121_MODEM_HELPER_STATUS_OK = 0, + LR1121_MODEM_HELPER_STATUS_ERROR = 3, +} lr1121_modem_helper_status_t; + +/*! + * @brief TX status values + * + * @see LR1121_MODEM_LORAWAN_EVENT_TX_DONE + */ +typedef enum +{ + LR1121_MODEM_TX_NOT_SENT = 0x00, + LR1121_MODEM_UNCONFIRMED_TX = 0x01, + LR1121_MODEM_CONFIRMED_TX = 0x02, +} lr1121_modem_tx_done_event_t; + +/*! + * @brief Link check request values + */ +typedef enum +{ + LR1121_MODEM_LINK_CHECK_NOT_RECEIVED = 0x00, //!< Link check response has not been received + LR1121_MODEM_LINK_CHECK_RECEIVED = 0x01, //!< Link check response has been received +} lr1121_modem_link_check_event_t; + +/*! + * @brief Time request values + * + * @see LR1121_MODEM_LORAWAN_EVENT_LORAWAN_MAC_TIME + */ +typedef enum +{ + LR1121_MODEM_TIME_NOT_VALID = 0x00, //!< Time is not valid + LR1121_MODEM_TIME_VALID = 0x01, //!< Time is valid and has been synchronized + LR1121_MODEM_TIME_VALID_BUT_NOT_SYNC = 0x02, //!< Time is still valid but has not been synchronized +} lr1121_modem_mac_time_event_t; + +/*! + * @brief class b ping slot info + * + * @see LR1121_MODEM_LORAWAN_EVENT_CLASS_B_PING_SLOT_INFO + */ +typedef enum +{ + LR1121_MODEM_CLASS_B_PING_SLOT_INFO_NOT_ANSWERED = 0x00, + LR1121_MODEM_CLASS_B_PING_SLOT_INFO_ANSWERED = 0x01, +} lr1121_modem_class_b_ping_slot_info_t; + +/*! + * @brief class b ping slot status + * + * @see LR1121_MODEM_LORAWAN_EVENT_CLASS_B_STATUS + */ +typedef enum +{ + LR1121_MODEM_CLASS_B_PING_SLOT_STATUS_NOT_READY = 0x00, + LR1121_MODEM_CLASS_B_PING_SLOT_STATUS_READY = 0x01, +} lr1121_modem_class_b_ping_slot_status_t; + +/*! + * @brief Event status for Wake On Radio protocol status change + * + * @see LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_DYNAMIC + */ +typedef enum +{ + LR1121_MODEM_RELAY_TX_DYNAMIC_WOR_DISABLED = 0x00, + LR1121_MODEM_RELAY_TX_DYNAMIC_WOR_ENABLED = 0x01, +} lr1121_modem_relay_tx_dynamic_status_t; + +/*! + * @brief Event status for relay Tx activation change + * + * @see LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_MODE + */ +typedef enum +{ + LR1121_MODEM_RELAY_TX_MODE_DISABLED = 0x00, + LR1121_MODEM_RELAY_TX_MODE_ENABLED = 0x01, + LR1121_MODEM_RELAY_TX_MODE_DYNAMIC = 0x02, + LR1121_MODEM_RELAY_TX_MODE_DEVICE_CONTROLLED = 0x03, +} lr1121_modem_relay_tx_mode_status_t; + +/*! + * @brief Event status for relay synchronization change + * + * @see LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_SYNC + */ +typedef enum +{ + LR1121_MODEM_RELAY_TX_SYNCHRONIZATION_INIT = 0x00, + LR1121_MODEM_RELAY_TX_UNSYNCHRONIZED = 0x01, + LR1121_MODEM_RELAY_TX_SYNCHRONIZED = 0x02, +} lr1121_modem_relay_tx_sync_status_t; + +/** + * @brief Event status on FUOTA done event + * + * @see LR1121_MODEM_LORAWAN_EVENT_FUOTA_DONE + */ +typedef enum +{ + LR1121_MODEM_FUOTA_STATUS_TERMINATED_SUCCESSFULLY = 0x00, //!< FUOTA terminated successfully + LR1121_MODEM_FUOTA_STATUS_FAILED = 0x01, //!< FUOTA failed + LR1121_MODEM_FUOTA_STATUS_ONGOING = 0xFF, //!< FUOTA is ongoing + LR1121_MODEM_FUOTA_STATUS_NOT_STARTED = 0xFE, //!< FUOTA is not started +} lr1121_modem_fuota_status_t; + +/** + * @brief Event status on test mode event + * + * @see LR1121_MODEM_LORAWAN_EVENT_TEST_MODE + */ +typedef enum +{ + LR1121_MODEM_TEST_MODE_STATUS_TX_NOT_SENT = 0x00, + LR1121_MODEM_TEST_MODE_STATUS_TX_SENT = 0x01, + LR1121_MODEM_TEST_MODE_STATUS_TERMINATED_ACTION = 0x02, +} lr1121_modem_test_mode_status_t; + +/** + * @brief Event status on regional duty cycle event + * + * The duty cycle status can be obtained by calling @ref lr1121_modem_get_duty_cycle_status. + * + * @see lr1121_modem_get_duty_cycle_status + */ +typedef enum +{ + LR1121_MODEM_REGINAL_DUTY_CYCLE_TX_ALLOWED = + 0x00, //!< Previously duty cycle constrained transmissions are now allowed + LR1121_MODEM_REGINAL_DUTY_CYCLE_TX_CONSTRAINED = 0x01, //!< Transmissions are constrained by regional duty cycle +} lr1121_modem_regional_duty_cycle_status_t; + +/** + * @brief Structure holding event-related data + */ +typedef struct +{ + lr1121_modem_lorawan_event_type_t event_type; //!< Type of the event + uint8_t missed_events; //!< Number of @p event_type events missed before the current one + union + { + struct + { + uint16_t count; + } reset; + struct + { + lr1121_modem_tx_done_event_t status; + } txdone; + struct + { + lr1121_modem_link_check_event_t status; + } link_check; + struct + { + lr1121_modem_mac_time_event_t status; + } mac_time; + struct + { + lr1121_modem_class_b_ping_slot_info_t status; + } ping_slot_info; + struct + { + lr1121_modem_class_b_ping_slot_status_t status; + } ping_slot_status; + struct + { + uint8_t mc_group_id; + } new_multicast_class_c_groupid; + struct + { + uint8_t mc_group_id; + } new_multicast_class_b_groupid; + struct + { + lr1121_modem_relay_tx_dynamic_status_t status; + } relay_tx_dynamic_status; + struct + { + lr1121_modem_relay_tx_mode_status_t status; + } relay_tx_mode_status; + struct + { + lr1121_modem_relay_tx_sync_status_t status; + } relay_tx_sync_status; + struct + { + lr1121_modem_fuota_status_t status; + } fuota_status; + struct + { + lr1121_modem_test_mode_status_t status; + } test_mode_status; + struct + { + lr1121_modem_regional_duty_cycle_status_t status; + } regional_duty_cycle_status; + } event_data; //!< Status data associated to the event +} lr1121_modem_event_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/** + * @brief Extract the event data contained in the event field buffer + * + * @param [in] context Chip implementation context + * @param [out] modem_event Struct containing the event data \see lr1121_modem_event_t + * + * @returns Operation status + */ +lr1121_modem_helper_status_t lr1121_modem_helper_get_event_data( const void* context, + lr1121_modem_event_t* modem_event ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_HELPER_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan.h new file mode 100755 index 0000000..6714d41 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan.h @@ -0,0 +1,1006 @@ +/*! + * @file lr1121_modem_lorawan.h + * + * @brief LoRaWAN driver for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_LORAWAN_H +#define LR1121_MODEM_LORAWAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" +#include "lr1121_modem_lorawan_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Return the version of the LoRaWAN standard and of the regional parameters implemented + * + * @param [in] context Chip implementation context + * @param [out] lorawan_version LoRaWAN and regional parameters version implemented + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_lorawan_version( const void* context, + lr1121_modem_lorawan_version_t* lorawan_version ); + +/*! + * @brief Return the DeviceEUI + * + * @param [in] context Chip implementation context + * @param [out] dev_eui Device EUI buffer on 8 bytes + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_dev_eui( const void* context, lr1121_modem_dev_eui_t dev_eui ); + +/*! + * @brief Set the DeviceEUI + * + * The device EUI is stored in non-volatile upon this call but the keys are not derived. + * Refer to @ref lr1121_modem_derive_keys for keys derivation. + * + * @param [in] context Chip implementation context + * @param [in] dev_eui Device EUI buffer on 8 bytes + * + * @returns Operation status + * + * @see lr1121_modem_derive_keys + */ +lr1121_modem_response_code_t lr1121_modem_set_dev_eui( const void* context, const lr1121_modem_dev_eui_t dev_eui ); + +/*! + * @brief Return the join EUI + * + * @remark Join EUI is also known as Application Identifier in LoRaWan v1.0.4. + * + * @param [in] context Chip implementation context + * @param [out] join_eui Join EUI buffer on 8 bytes + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_join_eui( const void* context, lr1121_modem_join_eui_t join_eui ); + +/*! + * @brief Set the Join EUI + * + * The device EUI is stored in non-volatile upon this call but the keys are not derived. + * Refer to @ref lr1121_modem_derive_keys for keys derivation. + * + * @remark Join EUI is also known as Application Identifier in LoRaWan v1.0.4. + * + * @param [in] context Chip implementation context + * @param [in] join_eui Join EUI buffer on 8 bytes + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_join_eui( const void* context, const lr1121_modem_join_eui_t join_eui ); + +/*! + * @brief Set the network key + * + * The network key is named: + * - Application Key (AppKey) in LoRaWAN L2 1.0.4 Specification + * - NwkKey in LoRaWAN 1.1 Specification and after + * + * This key is reset by a factory reset @ref lr1121_modem_factory_reset. + * + * @param [in] context Chip implementation context + * @param [in] nwk_key Network Key buffer on 16 bytes + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_nwk_key( const void* context, const lr1121_modem_nwk_key_t nwk_key ); + +/*! + * @brief Set the application key + * + * The application key is named GenAppKey in LoRaWAN Remote Multicast Setup v1.0.0 Specification. + * + * This key is reset by a factory reset @ref lr1121_modem_factory_reset. + * + * @note This does not set the key named AppKey in LoRaWAN L2 1.0.4 Specification. To set the AppKey corresponding to + * LoRaWAN L2 1.0.4 Specification, use @ref lr1121_modem_set_nwk_key. + * + * @param [in] context Chip implementation context + * @param [in] app_key Application Key buffer on 16 bytes + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_app_key( const void* context, const lr1121_modem_app_key_t app_key ); + +/*! + * @brief Use the previously set of JoinEUI/DevEUI to derive the app keys used in the Semtech join server + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_derive_keys( const void* context ); + +/*! + * @brief Get the LoRaWAN device class + * + * @param [in] context Chip implementation context + * @param [out] modem_class LoRaWAN device class @ref lr1121_modem_classes_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_class( const void* context, lr1121_modem_classes_t* modem_class ); + +/*! + * @brief Set the LoRaWAN device class + * + * @param [in] context Chip implementation context + * @param [in] modem_class LoRaWAN device class @ref lr1121_modem_classes_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_class( const void* context, const lr1121_modem_classes_t modem_class ); + +/*! + * @brief Return the regulatory region + * + * @param [in] context Chip implementation context + * @param [out] region LoRaWAN regulatory region @ref lr1121_modem_regions_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_region( const void* context, lr1121_modem_regions_t* region ); + +/*! + * @brief Set the regulatory region + * + * Additionally this command resets the ADR profile to Network Server Controlled. If different ADR profile is desired, + * the profile needs to be set again. + * + * @param [in] context Chip implementation context + * @param [in] region LoRaWAN regulatory region @ref lr1121_modem_regions_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_region( const void* context, const lr1121_modem_regions_t region ); + +/*! + * @brief This command starts joining the network + * + * The join procedure started by this command stops either if the join succeed or if @ref lr1121_modem_leave_network is + * called to cancel the join procedure. In case of join failure, the procedure automatically starts again. + * + * During the join procedure no further transmissions can occur. When the network has been successfully joined, a Joined + * event is generated. If the device is already joined to a network, or is in the process of joining, this command has + * no effect. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_join( const void* context ); + +/*! + * @brief Leave joined network or cancel ongoing join process + * + * After leaving the network, no further transmissions can occur. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_leave_network( const void* context ); + +/*! + * @brief Get maximal length of next uplink payload + * + * This command returns the maximum application payload size possible according to the LoRaWAN regional + * parameters for the next transmission using the current data rate, while assuming no FOpts are present and that a + * device is not behind a repeater. + * + * @param [in] context Chip implementation context + * @param [out] tx_max_payload Maximum application payload size possible + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_next_tx_max_payload( const void* context, uint8_t* tx_max_payload ); + +/*! + * @brief Request uplink + * + * This command requests sending the given data on the specified port as an unconfirmed (0x00) or confirmed + * (0x01) frame. The request will be queued and the frame will be sent as soon as the current bandwidth usage of the + * regulatory region permits. A TxDone event is generated when the frame either has been sent, or if it couldn’t be sent + * because the specified data exceeded the maximum possible payload size. + * + * @param [in] context Chip implementation context + * @param [in] port LoRaWAN port + * @param [in] uplink_type Uplink type unconfirmed (0x00) or confirmed (0x01) @ref lr1121_modem_uplink_type_t + * @param [in] data Data buffer. It is up to the caller that @p data contains at least @p length elements + * @param [in] length Data length. Valid value in [0,242] + * + * @remark The application shall not use port 0 or the LoRaWAN test port 224 as well as the ports from 225 to 255 since + * they are reserved for future standardized application extensions. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_request_tx( const void* context, const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type, const uint8_t* data, + const uint8_t length ); + +/*! + * @brief Request empty uplink + * + * This command requests sending an empty payload on the specified port as an unconfirmed (0x00) or confirmed + * (0x01) frame. The request will be queued and the frame will be sent as soon as the current bandwidth usage of the + * regulatory region permits. A TxDone event is generated when the frame has been sent. + * + * @param [in] context Chip implementation context + * @param [in] is_fport_populated Indicate whether the fport should be included in the empty frame or not + * @param [in] port LoRaWAN port. Only meaningful if @p is_fport_populated is true + * @param [in] uplink_type Uplink type unconfirmed (0x00) or confirmed (0x01) @ref lr1121_modem_uplink_type_t + * + * @remark The application shall not use port 0 or the LoRaWAN test port 224 as well as the ports from 225 to 255 since + * they are reserved for future standardized application extensions. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_request_empty_tx( const void* context, bool is_fport_populated, + const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type ); + +/*! + * @brief Request emergency uplink + * + * An emergency uplink request has highest precedence than any other actions the chip may be doing, and the duty-cycle + * limitation is not honored. LoRaWAN payload size limitations still applies. + * + * It is intended to be used for alarm-like event that requires real time signaling. However, due to the relaxed + * limitations, it must be used with care. + * + * This command sends the given data on the specified port as an unconfirmed (0x00) or confirmed (0x01) frame + * immediately. It has higher priority than all other services and does not take duty cycle or payload size restrictions + * into account + * + * @param [in] context Chip implementation context + * @param [in] port LoRaWAN port + * @param [in] uplink_type Uplink type unconfirmed (0x00) or confirmed (0x01) @ref lr1121_modem_uplink_type_t + * @param [in] data Data buffer. It is up to the caller that @p data contains at least @p length elements + * @param [in] length Data length. Valid value in [0,242] + * + * @remark The application shall not use port 0 or the LoRaWAN test port 224 as well as the ports from 225 to 255 since + * they are reserved for future standardized application extensions. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_emergency_tx( const void* context, const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type, + const uint8_t* data, const uint8_t length ); + +/*! + * @brief Get the size of latest downlink + * + * This command must be called in the following sequence, without any other commands in between: + * 1. @ref lr1121_modem_get_downlink_data_size + * 2. @ref lr1121_modem_get_downlink_data + * 3. @ref lr1121_modem_get_downlink_metadata + * + * @param [in] context Chip implementation context + * @param [out] downlink_data_size Size of the received downlink + * @param [out] remaining_downlinks Number of remaining downlinks in the internal FiFo + * + * @see lr1121_modem_get_downlink_data, lr1121_modem_get_downlink_metadata + */ +lr1121_modem_response_code_t lr1121_modem_get_downlink_data_size( const void* context, uint8_t* downlink_data_size, + uint8_t* remaining_downlinks ); + +/*! + * @brief Read the last downlink data + * + * This command must be called in the following sequence, without any other commands in between: + * 1. @ref lr1121_modem_get_downlink_data_size + * 2. @ref lr1121_modem_get_downlink_data + * 3. @ref lr1121_modem_get_downlink_metadata + * + * @param [in] context Chip implementation context + * @param [in] buffer buffer containing the downlink data + * @param [in] downlink_data_size Size of the payload to read + * + * @see lr1121_modem_get_downlink_data_size, lr1121_modem_get_downlink_metadata + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_downlink_data( const void* context, uint8_t* buffer, + uint8_t downlink_data_size ); + +/*! + * @brief Get the metadata of the last downlink + * + * This command must be called in the following sequence, without any other commands in between: + * 1. @ref lr1121_modem_get_downlink_data_size + * 2. @ref lr1121_modem_get_downlink_data + * 3. @ref lr1121_modem_get_downlink_metadata + * + * @param [in] context Chip implementation context + * @param [out] metadata Downlink metada, @ref lr1121_modem_downlink_metadata_t + * + * @see lr1121_modem_get_downlink_data_size, lr1121_modem_get_downlink_data + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_downlink_metadata( const void* context, + lr1121_modem_downlink_metadata_t* metadata ); + +/*! + * @brief Get count of uplinks and duration since last received downlink + * + * @p lost_connection_counter is increased even in case of uplink retransmission (nb_trans), and is reset when a valid + * downlink is received. + * @p lost_connection_since_sec is reset when a downlink is received. + * + * @param [in] context Chip implementation context + * @param [out] lost_connection_counter Number of uplinks sent without downlink since last received downlink + * @param [out] lost_connection_since_sec Duration since last downlink received + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_lost_connection_counter( const void* context, + uint16_t* lost_connection_counter, + uint32_t* lost_connection_since_sec ); + +/*! + * @brief Get the LoRaWAN network type + * + * @param [in] context Chip implementation context + * @param [out] network_type Type of LoRaWAN network (see @ref lr1121_modem_network_type_t) + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_network_type( const void* context, + lr1121_modem_network_type_t* network_type ); + +/*! + * @brief Set the LoRaWAN network type + * + * By default the @ref LR1121_MODEM_LORAWAN_PUBLIC_NETWORK is set. + * + * @param [in] context Chip implementation context + * @param [in] network_type @ref lr1121_modem_network_type_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_network_type( const void* context, + const lr1121_modem_network_type_t network_type ); + +/*! + * @brief Get the LoRaWAN certification mode enable status + * + * @param [in] context Chip implementation context + * @param [out] enable @ref lr1121_modem_certification_mode_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_certification_mode( const void* context, + lr1121_modem_certification_mode_t* enable ); + +/*! + * @brief Activate/deactivate the LoRaWAN certification mode + * + * Upon certification activation, the LR1121 Modem start a join sequence. The duty-cycle is disabled after the join is + * accepted. The the LR1121 Modem automatically replies to certification test commands. + * + * The certification mode activation status is stored in non-volatile memory so that the LR1121 Modem can re-join with + * certification mode enable after a reset during certification test sequence. + * + * When certification tests are terminated, this command must be called to explicitly disable the certification mode. + * The duty-cycle is re-enabled when the certification mode is disabled. + * + * @param [in] context Chip implementation context + * @param [in] enable @ref lr1121_modem_certification_mode_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_certification_mode( const void* context, + const lr1121_modem_certification_mode_t enable ); + +/*! + * @brief Get Duty cycle status info + * + * The sign determines the meaning of the value: + * - duty_cycle >= 0: duty_cycle is the time budget in millisecond still available for transmission + * - duty_cycle < 0: Abs(duty_cycle) is the time in millisecond before it can start transmitting again + * + * @param [in] context Chip implementation context + * @param [out] duty_cycle Time in milliseconds (see notes for explanations) + * + * @note When duty cycle is deactivated, the returned value is 0. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_duty_cycle_status( const void* context, int32_t* duty_cycle ); + +/*! + * @brief Get the available data rate mask + * + * One bit indicates one data rate. Bit n = 1 mean Data Rate n is available. + * + * @param [in] context Chip implementation context + * @param [out] available_data_rate Available data rate bit mask + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_available_data_rate( const void* context, uint16_t* available_data_rate ); + +/*! + * @brief Return the ADR profile type + * + * @param [in] context Chip implementation context + * @param [out] adr_profile ADR profile type @ref lr1121_modem_adr_profiles_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_adr_profile( const void* context, + lr1121_modem_adr_profiles_t* adr_profile ); + +/*! + * @brief Set the ADR profile and parameters + * + * @param [in] context Chip implementation context + * @param [in] adr_profile ADR profile type @ref lr1121_modem_adr_profiles_t + * @param [in] adr_custom_list custom ADR profile consisting of a list of 16 preferred data rates + * + * @remark each call to the function reinitialize the data rate distribution. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_adr_profile( const void* context, + const lr1121_modem_adr_profiles_t adr_profile, + const uint8_t* adr_custom_list ); + +/*! + * @brief Set the join data rate distribution + * + * @param [in] context Chip implementation context + * @param [in] distribution 16-byte-array describing the distribution. It is up to the user to ensure it contains at + * least 16 bytes + * + * @remark each call to the function reinitialize the data rate distribution. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_join_data_rate_distribution( + const void* context, const uint8_t distribution[LR1121_MODEM_DATARATE_DISTRIBUTION_LENGTH] ); + +/*! + * @brief Get the LoRaWAN number of retransmission + * + * @param [in] context Chip implementation context + * @param [out] nb_trans Number of retransmission + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_nb_trans( const void* context, uint8_t* nb_trans ); + +/*! + * @brief Set the LoRaWAN number of retransmission + * + * @param [in] context Chip implementation context + * @param [in] nb_trans Number of retransmission. Valid values in [1:15] + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_nb_trans( const void* context, const uint8_t nb_trans ); + +/*! + * @brief Get the ADR fallback mechanism parameters + * + * @param [in] context Chip implementation context + * @param [out] limit + * @param [out] delay + * + * @returns Operation status + * + * @see lr1121_modem_set_adr_ack_limit_delay + */ +lr1121_modem_response_code_t lr1121_modem_get_adr_ack_limit_delay( const void* context, uint8_t* limit, + uint8_t* delay ); + +/*! + * @brief Set the ADR fallback mechanism parameters + * + * The ADR fallback mechanism is described in LoRaWAN specificiation ADR backoff sequence. + * + * @param [in] context Chip implementation context + * @param [in] limit The ADR ACK limit. Valid values in [2:127] + * @param [in] delay The ADR ACK delay. Valid values in [2:127] + * + * @returns Operation status + * + * @see lr1121_modem_get_adr_ack_limit_delay + */ +lr1121_modem_response_code_t lr1121_modem_set_adr_ack_limit_delay( const void* context, const uint8_t limit, + const uint8_t delay ); + +/*! + * @brief Get the listen before talk state + * + * @param [in] context Chip implementation context + * @param [out] enable @ref lr1121_modem_lbt_mode_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_lbt_state( const void* context, lr1121_modem_lbt_mode_t* enable ); + +/*! + * @brief Activate the listen before talk + * + * @param [in] context Chip implementation context + * @param [in] enable @ref lr1121_modem_lbt_mode_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_lbt_state( const void* context, const lr1121_modem_lbt_mode_t enable ); + +/*! + * @brief Configure the listen before talk + * + * @param [in] context Chip implementation context + * @param [in] duration LBT duration in ms, default value is 5 ms + * @param [in] threshold LBT treshold in dBm, default value is -80 dBm + * @param [in] bandwidth LBT bandwidth in Hz, default value is 200000 Hz + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_lbt_params( const void* context, const uint32_t duration, + const int16_t threshold, const uint32_t bandwidth ); + +/*! + * @brief Get the listen before talk configuration + * + * @param [in] context Chip implementation context + * @param [out] duration LBT duration in ms, default value is 5 ms + * @param [out] threshold LBT treshold in dBm, default value is -80 dBm + * @param [out] bandwidth LBT bandwidth in Hz, default value is 200000 Hz + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_lbt_params( const void* context, uint32_t* duration, int16_t* threshold, + uint32_t* bandwidth ); + +/*! + * @brief Get the Carrier Sense Multiple Access (CSMA) state + * + * @param [in] context Chip implementation context + * @param [out] enable @ref lr1121_modem_csma_mode_t + * + * @returns Operation status + * + * @see lr1121_modem_set_csma_state, lr1121_modem_set_csma_params + */ +lr1121_modem_response_code_t lr1121_modem_get_csma_state( const void* context, lr1121_modem_csma_mode_t* enable ); + +/*! + * @brief Enable or disable Carrier Sense Multiple Access (CSMA) + * + * The CSMA mechanism is the one described in LoRa-Alliance document TR013-1.0.0 "Enabling CSMA for LoRaWAN". + * It is enabled by default. + * + * @param [in] context Chip implementation context + * @param [in] enable @ref lr1121_modem_csma_mode_t + * + * @returns Operation status + * + * @see lr1121_modem_get_csma_state, lr1121_modem_set_csma_params + */ +lr1121_modem_response_code_t lr1121_modem_set_csma_state( const void* context, const lr1121_modem_csma_mode_t enable ); + +/*! + * @brief Configure the Carrier Sense Multiple Access (CSMA) + * + * Refer to LoRa-Alliance document TR013-1.0.0 "Enabling CSMA for LoRaWAN" for details concerning the configuration. + * + * @param [in] context Chip implementation context + * @param [in] max_channel_change Maximum number of sensing to execute on a channel before selecting another one + * @param [in] backoff_enable Indicate if backoff is enabled or disabled + * @param [in] nb_backoff_max Maximal number of sensing per channel to conclude it is free + * + * @returns Operation status + * + * @see lr1121_modem_get_csma_state, lr1121_modem_set_csma_state + */ +lr1121_modem_response_code_t lr1121_modem_set_csma_params( const void* context, const uint8_t max_channel_change, + const lr1121_modem_csma_backoff_mode_t backoff_enable, + const uint8_t nb_backoff_max ); + +/*! + * @brief Get the Carrier Sense Multiple Access (CSMA) configuration + * + * @param [in] context Chip implementation context + * @param [out] max_channel_change Maximum number of sensing to execute on a channel before selecting another one + * @param [out] backoff_enable Indicate if backoff is enabled or disabled + * @param [out] nb_backoff_max Maximal number of sensing per channel to conclude it is free + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_csma_params( const void* context, uint8_t* max_channel_change, + uint8_t* backoff_enable, uint8_t* nb_backoff_max ); + +/*! + * @brief Request a MAC command uplink + * + * @param [in] context Chip implementation context + * @param [in] mac_request Mask of lr1121_modem_mac_request_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_mac_request_tx( const void* context, + const lr1121_modem_mac_request_bitmask_t mac_request ); + +/*! + * @brief Get time from LoRaWAN network + * + * Time expressed as number of seconds since GPS epoch (January 6th 1980, 00:00:00). + * The MAC time is available after a successfully responded call @ref lr1121_modem_mac_request_tx with @ref + * LR1121_MODEM_MAC_REQUEST_TIME bit set. + * + * @param [in] context Chip implementation context + * @param [out] gps_time_sec + * @param [out] gps_fractionnal_sec + * + * @returns Operation status + * + * @see lr1121_modem_mac_request_tx, lr1121_modem_mac_request_bitmask_t + */ +lr1121_modem_response_code_t lr1121_modem_get_lorawan_mac_time( const void* context, uint32_t* gps_time_sec, + uint32_t* gps_fractionnal_sec ); + +/*! + * @brief Get the link check result + * + * The Link Check Request is initiated by calling @ref lr1121_modem_mac_request_tx with @ref + * LR1121_MODEM_MAC_REQUEST_LINK_CHECK bit set. + * + * @param [in] context Chip implementation context + * @param [out] margin The link demodulation margin obtained from last network received Link Check Request in dB + * @param [out] gateway_count Number of gateways that received the last Link Check Request + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_link_check_data( const void* context, uint8_t* margin, + uint8_t* gateway_count ); + +/*! + * @brief Set the battery level + * + * The battery level is used by the LR1121 Modem to respond to Device Status Request from LoRaWAN Network Server. + * + * @param [in] context Chip implementation context + * @param [in] modem_vs_user Indicate if the battery level should be obtained from internal value or not + * @param [in] value Battery level value to use. Only effective if @p modem_vs_user is @ref + * LR1121_MODEM_BATTERY_LEVEL_FROM_USER_VALUE. Possible values: 0 means the end device is connected to an external power + * source, 1-254 is the battery level (1is the minimum, 254 the maximum), 255 means the end device was not able to + * measure the battery level + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_battery_level( + const void* context, const lr1121_modem_battery_level_source_value_t modem_vs_user, uint8_t value ); + +/*! + * @brief Get the current class B ping slot periodicity + * + * @param [in] context Chip implementation context + * @param [in] ping_slot_periodicity Current class B ping slot periodicity + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_class_b_ping_slot_periodicity( + const void* context, lr1121_modem_class_b_ping_slot_t* ping_slot_periodicity ); + +/*! + * @brief Set the class B ping slot periodicity + * + * @param [in] context Chip implementation context + * @param [out] ping_slot_periodicity Class B ping slot periodicity to set + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_class_b_ping_slot_periodicity( + const void* context, const lr1121_modem_class_b_ping_slot_t ping_slot_periodicity ); + +/*! + * @brief Get the current multicast group configuration + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier + * @param [in] mc_group_address Multicast group address + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_multicast_group_config( const void* context, const uint8_t mc_group_id, + uint32_t* mc_group_address ); + +/*! + * @brief Set the multicast group configuration + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier + * @param [in] mc_group_address Multicast group address + * @param [in] mc_nwkskey Multicast network session key for this group + * @param [in] mc_appskey Multicast application session key for this group + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_multicast_group_config( const void* context, const uint8_t mc_group_id, + const uint32_t mc_group_address, + const uint8_t* mc_nwkskey, + const uint8_t* mc_appskey ); + +/*! + * @brief Start a class C multicast session + * + * Several class C multicast sessions can run in parallel if configured with the same downlink_frequency and + * downlink_data_rate. + * + * To have the class C multicast session started immediately upon call to @ref + * lr1121_modem_start_session_multicast_class_c, it is recommended to start class C before calling it. + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier + * @param [in] downlink_frequency Downlink frequency for this session + * @param [in] downlink_data_rate Datarate for this session + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_start_session_multicast_class_c( const void* context, + const uint8_t mc_group_id, + const uint32_t downlink_frequency, + const uint8_t downlink_data_rate ); + +/*! + * @brief Get the class C multicast session status + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier to get the status + * @param [out] lr1121_modem_multicast_class_c_status Status of the multicast class C session corresponding to @p + * mc_group_id + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_multicast_class_c_session_status( + const void* context, const uint8_t mc_group_id, + lr1121_modem_multicast_class_c_status_t* lr1121_modem_multicast_class_c_status ); + +/*! + * @brief Stop given class C multicast session + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier to stop session + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_stop_session_multicast_class_c( const void* context, + const uint8_t mc_group_id ); + +/*! + * @brief Stop all class C multicast sessions + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_stop_all_session_multicast_class_c( const void* context ); + +/*! + * @brief Start class B multicast session + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier + * @param [in] downlink_frequency Downlink frequency for this session + * @param [in] downlink_data_rate Datarate for this session + * @param [in] ping_slot Ping slot periodicity for this session + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_start_session_multicast_class_b( + const void* context, const uint8_t mc_group_id, const uint32_t downlink_frequency, const uint8_t downlink_data_rate, + const lr1121_modem_class_b_ping_slot_t ping_slot ); + +/*! + * @brief Get current status of given class B multicast session + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id Multicast group identifier + * @param [out] lr1121_modem_multicast_class_b_status Status of the multicast class B session corresponding to @p + * mc_group_id + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_multicast_class_b_session_status( + const void* context, const uint8_t mc_group_id, + lr1121_modem_multicast_class_b_status_t* lr1121_modem_multicast_class_b_status ); + +/*! + * @brief Stop given class B multicast session + * + * @param [in] context Chip implementation context + * @param [in] mc_group_id multicast group identifier to stop session + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_stop_session_multicast_class_b( const void* context, + const uint8_t mc_group_id ); +/*! + * @brief Stop all class B multicast sessions + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_stop_all_session_multicast_class_b( const void* context ); + +/** + * @brief Start the Applicative Layer Clock synchronization service + * + * This corresponds to the LoRaWAN Application Layer Clock Synchronization v2.0.0 available in LoRa Alliance document + * TS003-2.0.0. + * + * @param context Chip implementation context + * + * @return Operation status + * + * @see lr1121_modem_alc_sync_stop_service, lr1121_modem_alc_sync_get_time, lr1121_modem_alc_sync_trig_request + */ +lr1121_modem_response_code_t lr1121_modem_alc_sync_start_service( const void* context ); + +/** + * @brief Stop the Applicative Layer Clock synchronization service + * + * @param context Chip implementation context + * + * @return Operation status + * + * @see lr1121_modem_alc_sync_start_service, lr1121_modem_alc_sync_get_time, lr1121_modem_alc_sync_trig_request + */ +lr1121_modem_response_code_t lr1121_modem_alc_sync_stop_service( const void* context ); + +/** + * @brief Get the current time of the chip since GPS epoch + * + * This time is maintained by the chip after successful reception of an ALC sync downlink. + * It is expressed as number of seconds elapsed since January 6th 1980 modulo 2^32. + * + * @param context Chip implementation context + * @param alc_sync_epoch_time The current GPS time + * + * @return Operation status + * + * @see lr1121_modem_alc_sync_start_service, lr1121_modem_alc_sync_stop_service, lr1121_modem_alc_sync_trig_request + */ +lr1121_modem_response_code_t lr1121_modem_alc_sync_get_time( const void* context, uint32_t* alc_sync_epoch_time ); + +/** + * @brief Trig an Applicative Layer Clock synchronization time request + * + * @param context Chip implementation context + * + * @return Operation status + * + * @see lr1121_modem_alc_sync_start_service, lr1121_modem_alc_sync_stop_service, lr1121_modem_alc_sync_get_time + */ +lr1121_modem_response_code_t lr1121_modem_alc_sync_trig_request( const void* context ); + +/** + * @brief Get the FUOTA received file size and CRC + * + * This command must be called after @ref LR1121_MODEM_LORAWAN_EVENT_FUOTA_DONE event. + * + * @param context Chip implementation context + * @param file_size Size of the received file in bytes + * @param file_crc CRC of the received file + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_fuota_get_file_size_crc( const void* context, uint32_t* file_size, + uint32_t* file_crc ); + +/** + * @brief Read a FUOTA file fragment + * + * The maximal FUOTA file size the chip can store is 32768 bytes. And the maximal number of data that can be read in a + * single SPI transaction is 350 bytes. + * Therefore this function may be called several times to fetch a complete FUOTA file received. + * + * The complete size of the FUOTA file to read is obtained by calling @ref lr1121_modem_fuota_get_file_size_crc. + * + * @param [in] context Chip implementation context + * @param [in] base_address The base address to read fragment from. Valid values in [0:32768] + * @param [in] fragment_size The size of the fragment to read. Valid values in [0:350] + * @param [out] fragment A memory buffer to receive the fragment to read. It is up to the caller that it can store at + * least @p fragment_size bytes + * + * @return Operation status + * + * @see lr1121_modem_fuota_get_file_size_crc + */ +lr1121_modem_response_code_t lr1121_modem_fuota_read_file_fragment( const void* context, uint32_t base_address, + uint16_t fragment_size, uint8_t* fragment ); + +/** + * @brief Helper function to check the CRC of a file + * + * This function does not send any command to the chip. + * It is a helper function that check the CRC of a complete received file matches the expected value. + * The complete received file is obtained through successive @ref lr1121_modem_fuota_read_file_fragment calls, and the + * expected CRC is obtained by calling @ref lr1121_modem_fuota_get_file_size_crc. + * + * @param file Pointer to the buffer of the complete FUOTA file. It is up to the caller to ensure it is @p file_size + * byte long + * @param file_size The number of bytes of the complete FUOTA file + * @param expected_crc The expected CRC of the file + * @return true The CRC computed on the file content matches the expected CRC + * @return false The CRC computed on the file content does not match the expected CRC + */ +bool lr1121_modem_fuota_check_crc( const uint8_t* file, uint32_t file_size, uint32_t expected_crc ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_LORAWAN_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan_types.h new file mode 100755 index 0000000..31f1d28 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lorawan_types.h @@ -0,0 +1,339 @@ +/*! + * @file lr1121_modem_lorawan_types.h + * + * @brief LoRaWAN driver types for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_LORAWAN_TYPES_H +#define LR1121_MODEM_LORAWAN_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Length in bytes of a LoRaWAN device eui + */ +#define LR1121_MODEM_DEV_EUI_LENGTH ( 8 ) + +/*! + * @brief Length in bytes of a LoRaWAN join eui + */ +#define LR1121_MODEM_JOIN_EUI_LENGTH ( 8 ) + +/*! + * @brief Length in bytes of a LoRaWAN application key + */ +#define LR1121_MODEM_APP_KEY_LENGTH ( 16 ) + +/*! + * @brief Length in bytes of a LoRaWAN network key + */ +#define LR1121_MODEM_NWK_KEY_LENGTH ( 16 ) + +/*! + * @brief Length of datarate distribution array + */ +#define LR1121_MODEM_DATARATE_DISTRIBUTION_LENGTH ( 16 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief LoRaWAN class type + */ +typedef enum +{ + LR1121_LORAWAN_CLASS_A = 0x00, + LR1121_LORAWAN_CLASS_B = 0x01, + LR1121_LORAWAN_CLASS_C = 0x02, +} lr1121_modem_classes_t; + +/** + * @brief LoRaWAN network type + */ +typedef enum +{ + LR1121_MODEM_LORAWAN_PRIVATE_NETWORK = 0x00, //!< LoRaWAN private network + LR1121_MODEM_LORAWAN_PUBLIC_NETWORK = 0x01 //!< LoRaWAN public network +} lr1121_modem_network_type_t; + +/*! + * @brief LoRaWAN region type + */ +typedef enum +{ + LR1121_LORAWAN_REGION_EU868 = 0x01, + LR1121_LORAWAN_REGION_AS923_GRP1 = 0x02, + LR1121_LORAWAN_REGION_US915 = 0x03, + LR1121_LORAWAN_REGION_AU915 = 0x04, + LR1121_LORAWAN_REGION_CN470 = 0x05, + LR1121_LORAWAN_REGION_WW2G4 = 0x06, + LR1121_LORAWAN_REGION_AS923_GRP2 = 0x07, + LR1121_LORAWAN_REGION_AS923_GRP3 = 0x08, + LR1121_LORAWAN_REGION_IN865 = 0x09, + LR1121_LORAWAN_REGION_KR920 = 0x0A, + LR1121_LORAWAN_REGION_RU864 = 0x0B, + LR1121_LORAWAN_REGION_CN470_RP_1_0 = 0x0C, + LR1121_LORAWAN_REGION_AS923_GRP4 = 0x0D, +} lr1121_modem_regions_t; + +/*! + * @brief Adaptative Data Rate profiles type + */ +typedef enum +{ + LR1121_MODEM_ADR_PROFILE_NETWORK_SERVER_CONTROLLED = 0x00, //!< Network Server Controlled + LR1121_MODEM_ADR_PROFILE_MOBILE_LONG_RANGE = 0x01, //!< Mobile Long Range : 50% MinDr, 25% MinDr + 1, 25% MinDr + 2 + LR1121_MODEM_ADR_PROFILE_MOBILE_LOW_POWER = + 0x02, //!< Mobile Low Power : 25% MaxDr, 25% MaxDr - 1, 25% MaxDr - 2, 25% MaxDr - 3 + LR1121_MODEM_ADR_PROFILE_CUSTOM = + 0x03, //!< Custom List A custom ADR profile consists of a list of 16 preferred data rates. + //!< For every transmission, a random entry in that list is selected. +} lr1121_modem_adr_profiles_t; + +/*! + * @brief LoRaWAN uplink type + */ +typedef enum +{ + LR1121_MODEM_UPLINK_UNCONFIRMED = 0x00, + LR1121_MODEM_UPLINK_CONFIRMED = 0x01, +} lr1121_modem_uplink_type_t; + +/*! + * @brief LoRaWAN Duty Cycle activation type + */ +typedef enum +{ + LR1121_MODEM_CERTIFICATION_MODE_DISABLE = 0x00, + LR1121_MODEM_CERTIFICATION_MODE_ENABLE = 0x01, +} lr1121_modem_certification_mode_t; + +/*! + * @brief Listen Before Talk (LBT) activation type + */ +typedef enum +{ + LR1121_MODEM_LBT_MODE_DISABLE = 0x00, + LR1121_MODEM_LBT_MODE_ENABLE = 0x01, +} lr1121_modem_lbt_mode_t; + +/*! + * @brief Carrier Sense Multiple Access (CSMA) activation type + */ +typedef enum +{ + LR1121_MODEM_CSMA_MODE_DISABLE = 0x00, + LR1121_MODEM_CSMA_MODE_ENABLE = 0x01, +} lr1121_modem_csma_mode_t; + +/** + * @brief Carrier Sense Multiple Access (CSMA) backoff activation type + */ +typedef enum +{ + LR1121_MODEM_CSMA_BACKOFF_DISABLE = 0x00, //!< Disable CMSA backoff + LR1121_MODEM_CSMA_BACKOFF_ENABLE = 0x01, //!< Enable CMSA backoff +} lr1121_modem_csma_backoff_mode_t; + +/*! + * @brief LoRaWAN mac request field + */ +typedef enum +{ + LR1121_MODEM_MAC_REQUEST_LINK_CHECK = 0x01, //!< Enable the MAC Link Check request + LR1121_MODEM_MAC_REQUEST_TIME = 0x02, //!< Enable the MAC Time request + LR1121_MODEM_MAC_REQUEST_PING_SLOT_INFO = 0x04, //!< Enable the MAC Ping Slot Info request +} lr1121_modem_mac_request_t; + +/** + * @brief Bit mask for lr1121_modem_mac_request_t + * + * @see lr1121_modem_mac_request_t + */ +typedef uint8_t lr1121_modem_mac_request_bitmask_t; + +/*! + * @brief RX flags encoding + */ +typedef enum +{ + LR1121_MODEM_DOWNLINK_WINDOW_RX1 = 0x01, //!< received on RX1 unicast + LR1121_MODEM_DOWNLINK_WINDOW_RX2 = 0x02, //!< received on RX2 unicast + LR1121_MODEM_DOWNLINK_WINDOW_RXC = 0x03, //!< received on Class C RX unicast + LR1121_MODEM_DOWNLINK_WINDOW_RXC_MULTICAST_GROUP0 = 0x04, //!< received on Class C Multicast RX for group 0 + LR1121_MODEM_DOWNLINK_WINDOW_RXC_MULTICAST_GROUP1 = 0x05, //!< received on Class C Multicast RX for group 1 + LR1121_MODEM_DOWNLINK_WINDOW_RXC_MULTICAST_GROUP2 = 0x06, //!< received on Class C Multicast RX for group 2 + LR1121_MODEM_DOWNLINK_WINDOW_RXC_MULTICAST_GROUP3 = 0x07, //!< received on Class C Multicast RX for group 3 + LR1121_MODEM_DOWNLINK_WINDOW_RXB = 0x08, //!< received on Class B RX unicast + LR1121_MODEM_DOWNLINK_WINDOW_RXB_MULTICAST_GROUP0 = 0x09, //!< received on Class B Multicast RX for group 0 + LR1121_MODEM_DOWNLINK_WINDOW_RXB_MULTICAST_GROUP1 = 0x0A, //!< received on Class B Multicast RX for group 1 + LR1121_MODEM_DOWNLINK_WINDOW_RXB_MULTICAST_GROUP2 = 0x0B, //!< received on Class B Multicast RX for group 2 + LR1121_MODEM_DOWNLINK_WINDOW_RXB_MULTICAST_GROUP3 = 0x0C, //!< received on Class B Multicast RX for group 3 + LR1121_MODEM_DOWNLINK_WINDOW_RXBEACON = 0x0D, //!< received a Class B beacon + LR1121_MODEM_DOWNLINK_WINDOW_RXRELAY = 0x0E, //!< received on Relay window +} lr1121_modem_downlink_window_t; + +/*! + * @brief class b ping slot status + */ +typedef enum +{ + LR1121_MODEM_CLASS_B_PING_SLOT_1_S = 0x00, //!< 1 second ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_2_S = 0x01, //!< 2 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_4_S = 0x02, //!< 4 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_8_S = 0x03, //!< 8 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_16_S = 0x04, //!< 16 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_32_S = 0x05, //!< 32 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_64_S = 0x06, //!< 64 seconds ping-slot periodicity + LR1121_MODEM_CLASS_B_PING_SLOT_128_S = 0x07, //!< 128 seconds ping-slot periodicity +} lr1121_modem_class_b_ping_slot_t; + +/*! + * @brief Select the source of battery level value to use for DevStatusAns MAC command + * + */ +typedef enum +{ + LR1121_MODEM_BATTERY_LEVEL_FROM_INTERNAL_VALUE = + 0x00, //!< Battery level is obtained from LR1121 VBat (see @ref lr1121_modem_system_get_vbat) + LR1121_MODEM_BATTERY_LEVEL_FROM_USER_VALUE = 0x01, //!< Battery level is provided by user application +} lr1121_modem_battery_level_source_value_t; + +/*! + * @brief Join EUI type + */ +typedef uint8_t lr1121_modem_join_eui_t[LR1121_MODEM_JOIN_EUI_LENGTH]; + +/*! + * @brief Device EUI type + */ +typedef uint8_t lr1121_modem_dev_eui_t[LR1121_MODEM_DEV_EUI_LENGTH]; + +/*! + * @brief Application key type + */ +typedef uint8_t lr1121_modem_app_key_t[LR1121_MODEM_APP_KEY_LENGTH]; + +/*! + * @brief Application key type + */ +typedef uint8_t lr1121_modem_nwk_key_t[LR1121_MODEM_NWK_KEY_LENGTH]; + +/*! + * @brief modem downlink metadata structure + * + * The Signal to Noise Ratio (SNR) is returned as an integer part, and a decimal part in 0.25 dB. + * The SNR in dB is therefore obtained by: \f$ SNR_{dB} = snr\_integer + 0.25 \times snr\_quarter \f$ + */ +typedef struct +{ + uint8_t stack_id; //!< The stack identifier that receives the downlink + int16_t rssi; //!< The RSSI of the received downlink in dBm + int8_t snr_integer; //!< Signal to Noise Ratio of the received downlink (integer part, in dB) + uint8_t snr_quarter; //!< Signal to Noise Ratio of the received downlink (0.25dB counts) + lr1121_modem_downlink_window_t window; //!< Rx window of the received downlink + uint8_t fport; //!< LoRaWAN port of the received downlink + uint8_t fpending_bit; //!< Frame pending bit of the received downlink + uint32_t frequency_hz; //!< RF frequency of the received downlink + uint8_t datarate; //!< Datarate of the received downlink +} lr1121_modem_downlink_metadata_t; + +/*! + * @brief multicast class c status structure + */ +typedef struct +{ + uint8_t is_session_started; //!< Indicate if the multicast class C session is started + uint32_t downlink_frequency; //!< Downlink frequency of the multicast class C session + uint8_t downlink_datarate; //!< Datarate of the multicast class C session +} lr1121_modem_multicast_class_c_status_t; + +/*! + * @brief multicast class b status structure + */ +typedef struct +{ + uint8_t is_session_started; //!< Indicate if the multicast class B session is started + uint32_t downlink_frequency; //!< Downlink frequency of the multicast class B session + uint8_t downlink_datarate; //!< Datarate of the multicast class B session + uint8_t is_session_waiting_for_beacon; //!< Indicates whether the multicast class B session have received a beacon + uint8_t ping_slot_periodicity; //!< Ping slot periodicity of the multicast class B session +} lr1121_modem_multicast_class_b_status_t; + +/*! + * @brief LR1121 LoRaWAN version structure + */ +typedef struct +{ + uint8_t lorawan_major; //!< Major number of the LoRaWAN standard implemented + uint8_t lorawan_minor; //!< Minor number of the LoRaWAN standard implemented + uint8_t lorawan_patch; //!< Patch number of the LoRaWAN standard implemented + uint8_t lorawan_revision; //!< Revision number of the LoRaWAN standard implemented + uint8_t rp_major; //!< Major number of the regional parameters implemented + uint8_t rp_minor; //!< Minor number of the regional parameters implemented + uint8_t rp_patch; //!< Patch number of the regional parameters implemented + uint8_t rp_revision; //!< Revision number of the regional parameters implemented +} lr1121_modem_lorawan_version_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_LORAWAN_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss.h new file mode 100755 index 0000000..0dbdb7a --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss.h @@ -0,0 +1,144 @@ +/*! + * @file lr1121_modem_lr_fhss.h + * + * @brief LR_FHSS driver definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_LR_FHSS_H +#define LR1121_MODEM_LR_FHSS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr1121_modem_lr_fhss_types.h" +#include "lr1121_modem_common.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/** + * @brief Length, in bytes, of a LR-FHSS sync word + */ +#define LR_FHSS_SYNC_WORD_BYTES ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Initialize the LR_FHSS + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_lr_fhss_init( const void* context ); + +/** + * @brief Get the delay in microsecond between the last bit sent and the TX done interrupt + * + * @param [in] params lr1121 LR-FHSS parameter structure + * @param [in] payload_length Length of application-layer payload + * + * @returns Delay in microseconds + */ +uint16_t lr1121_modem_lr_fhss_get_bit_delay_in_us( const lr1121_modem_lr_fhss_params_t* params, + uint16_t payload_length ); + +/*! + * @brief Configure a payload to be sent with LR_FHSS + * + * When calling this method, lr1121_modem_radio_set_lr_fhss_sync_word is implicitely called to configure the sync word. + * Note that the syncword must be 4 bytes long. + * + * @param [in] context Chip implementation context + * @param [in] lr_fhss_params Parameter configuration structure of the LRFHSS + * @param [in] hop_sequence_id Seed used to derive the hopping sequence pattern. Only the nine LSBs are taken into + * account + * @param [in] payload The payload to send. It is the responsibility of the caller to ensure that this references an + * array containing at least payload_length elements + * @param [in] payload_length The length of the payload + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_lr_fhss_build_frame( const void* context, + const lr1121_modem_lr_fhss_params_t* lr_fhss_params, + uint16_t hop_sequence_id, const uint8_t* payload, + uint8_t payload_length ); + +/*! + * @brief Get the time on air in ms for LR-FHSS transmission + * + * @param [in] params LR1121 LR-FHSS parameter structure + * @param [in] payload_length Length of application-layer payload + * + * @returns Time-on-air value in ms for LR-FHSS transmission + */ +uint32_t lr1121_modem_lr_fhss_get_time_on_air_in_ms( const lr1121_modem_lr_fhss_params_t* params, + uint16_t payload_length ); + +/** + * @brief Return the number of hop sequences available using the given parameters + * + * @param [in] lr_fhss_params Parameter configuration structure of the LRFHSS + * + * @return Returns the number of valid hop sequences (512 or 384) + */ +unsigned int lr1121_modem_lr_fhss_get_hop_sequence_count( const lr1121_modem_lr_fhss_params_t* lr_fhss_params ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_LR_FHSS_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss_types.h new file mode 100755 index 0000000..14c6c95 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_lr_fhss_types.h @@ -0,0 +1,66 @@ +/*! + * @file lr1121_modem_lr_fhss_types.h + * + * @brief LR_FHSS types definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_LR_FHSS_TYPES_H +#define LR1121_MODEM_LR_FHSS_TYPES_H + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr_fhss_v1_base_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief LR FHSS parameter structure + */ +typedef struct +{ + lr_fhss_v1_params_t lr_fhss_params; //!< Base LR FHSS parameters + int8_t device_offset; //!< Per device offset to avoid collisions over the air. Possible values: + //!< - if lr_fhss_params.grid == LR_FHSS_V1_GRID_25391_HZ: + //!< [-26, 25] + //!< - if lr_fhss_params.grid == LR_FHSS_V1_GRID_3906_HZ: + //!< [-4, 3] +} lr1121_modem_lr_fhss_params_t; + +#endif // LR1121_MODEM_LR_FHSS_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem.h new file mode 100755 index 0000000..bd3aa6d --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem.h @@ -0,0 +1,393 @@ +/*! + * @file lr1121_modem_modem.h + * + * @brief Modem driver for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_MODEM_H +#define LR1121_MODEM_MODEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" +#include "lr1121_modem_modem_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Reset non-volatile settings to their default value + * + * Settings that are reset are: + * - region + * - devnonce + * - joinnonce + * - LoRaWAN certification state + * - low frequency clock source + * - reset counter + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_factory_reset( const void* context ); + +/*! + * @brief Return the modem version information + * + * @param [in] context Chip implementation context + * @param [out] modem_version Version of the LR1121 modem + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_modem_version( const void* context, + lr1121_modem_version_t* modem_version ); + +/*! + * @brief Return the modem status + * + * @param [in] context Chip implementation context + * @param [out] status LR1121 mode status bit mask @ref lr1121_modem_lorawan_status_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_status( const void* context, + lr1121_modem_lorawan_status_bitmask_t* status ); + +/*! + * @brief Return and reset the consumption statistics of the modem + * + * @param [in] context Chip implementation context + * @param [out] charge Charge counter in mAh + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_charge( const void* context, lr1121_modem_charge_t* charge ); + +/*! + * @brief Get pending events from the modem + * + * Pending events are indicated by the EVENT line. The EVENT line will be de-asserted after all events have been + * retrieved and no further events are available. + * When no event is available this command returns with empty response payload. + * + * @param [in] context Chip implementation context + * @param [out] event_fields \see lr1121_modem_event_fields_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_event( const void* context, lr1121_modem_event_fields_t* event_fields ); + +/*! + * @brief Suspend or resume the modem’s radio operations + * + * It can be used to prevent extra power consumption by the modem in case the application MCU temporarily needs more + * power itself and wants to prevent exceeding limits. + * + * @param [in] context Chip implementation context + * @param [in] suspend Operations are suspended with parameter value 0x01 and resumed with parameter value 0x00 @ref + * lr1121_modem_suspend_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_suspend( const void* context, const lr1121_modem_suspend_t suspend ); + +/*! + * @brief Get suspend or resume state of the the modem’s radio operations. + * + * @param [in] context Chip implementation context + * @param [out] suspend Operations are suspended with parameter value 0x01 and resumed with parameter value 0x00 @ref + * lr1121_modem_suspend_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_suspend( const void* context, lr1121_modem_suspend_t* suspend ); + +/*! + * @brief Set an application alarm timer in seconds + * + * When the timer has expired the event @ref LR1121_MODEM_LORAWAN_EVENT_ALARM is generated. + * If this command is applied again before the timer has expired, the timer will be started again with the new period. + * Value 0 immediately generates event @ref LR1121_MODEM_LORAWAN_EVENT_ALARM. + * + * @param [in] context Chip implementation context + * @param [in] seconds Seconds + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_set_alarm_timer( const void* context, uint32_t seconds ); + +/*! + * @brief Clear the alarm timer + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_clear_alarm_timer( const void* context ); + +/*! + * @brief Get the application alarm timer remaining time + * + * @param [in] context Chip implementation context + * @param [out] remaining_time Remaining time in seconds + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_alarm_remaining_time( const void* context, uint32_t* remaining_time ); + +/*! + * @brief Get the crashlog status + * + * @param [in] context Chip implementation context + * @param [out] status Crashlog status, see \ref lr1121_modem_crashlog_status_t + * @param [out] crashlog Function name in ASCII. It is up to the caller to ensure this pointer is at least 242 bytes + * long + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_get_crashlog( const void* context, lr1121_modem_crashlog_status_t* status, + uint8_t* crashlog ); + +/*! + * @brief Enable test functions + * + * With the exception of the @ref lr1121_modem_test_mode_start command, test commands are only available if test mode is + * active. Test mode can only be activated if the modem has not yet received a command that results in a radio + * operation. Once test mode is active, all other modem commands are disabled. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_mode_start( const void* context ); + +/*! + * @brief No operation. This command may be used to terminate an ongoing continuous TX operation. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_nop( const void* context ); + +/*! + * @brief Transmit LoRa packets + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] tx_power Tx power in dBm + * @param [in] payload_length Payload length + * @param [in] sf spreading factor @ref lr1121_modem_tst_mode_lora_sf_t + * @param [in] bw bandwidth @ref lr1121_modem_tst_mode_lora_bw_t + * @param [in] cr Coding Rate @ref lr1121_modem_tst_mode_lora_cr_t + * @param [in] is_iq_inverted Enable IQ inverted + * @param [in] is_crc_enabled Enable CRC field + * @param [in] header_mode Configure header implicit or explicit + * @param [in] preamble_length Number of preamble symbols + * @param [in] number_of_tx Number of packet to send. 0 makes the chip to send packet infinitely until call to @ref + * lr1121_modem_test_nop + * @param [in] delay_ms Delay between two consecutive transmit + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_tx_lora( + const void* context, uint32_t frequency, int8_t tx_power, uint8_t payload_length, + lr1121_modem_tst_mode_lora_sf_t sf, lr1121_modem_tst_mode_lora_bw_t bw, lr1121_modem_tst_mode_lora_cr_t cr, + bool is_iq_inverted, bool is_crc_enabled, lr1121_modem_tst_mode_lora_packet_header_mode_t header_mode, + uint32_t preamble_length, uint32_t number_of_tx, uint32_t delay_ms ); + +/*! + * @brief Transmit FSK packets + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] tx_power Tx power in dBm + * @param [in] payload_length Payload length + * @param [in] number_of_tx Number of packet to send. 0 makes the chip to send packet infinitely until call to @ref + * lr1121_modem_test_nop + * @param [in] delay_ms Delay between two consecutive transmit + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_tx_fsk( const void* context, uint32_t frequency, int8_t tx_power, + uint8_t payload_length, uint32_t number_of_tx, + uint32_t delay_ms ); + +/*! + * @brief Transmit LR-FHSS packets + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] tx_power Tx power in dBm + * @param [in] payload_length Payload length + * @param [in] grid LR-FHSS grid + * @param [in] bw LR-FHSS bandwidth + * @param [in] cr LR-FHSS coding rate + * @param [in] number_of_tx Number of packet to send. 0 makes the chip to send packet infinitely until call to @ref + * lr1121_modem_test_nop + * @param [in] delay_ms Delay between two consecutive transmit + * @param [in] is_hopping_enabled Enable LR-FHSS frequency hopping + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_tx_lr_fhss( const void* context, uint32_t frequency, int8_t tx_power, + uint8_t payload_length, + lr1121_modem_tst_mode_lr_fhss_grid_t grid, + lr1121_modem_tst_mode_lr_fhss_bw_t bw, + lr1121_modem_tst_mode_lr_fhss_cr_t cr, uint32_t number_of_tx, + uint32_t delay_ms, bool is_hopping_enabled ); + +/*! + * @brief Transmit a continuous wave. + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] tx_power Tx power in dBm + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_tx_cw( const void* context, uint32_t frequency, int8_t tx_power ); + +/*! + * @brief Continuously receive LoRa packets + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] sf spreading factor @ref lr1121_modem_tst_mode_lora_sf_t + * @param [in] bw bandwidth @ref lr1121_modem_tst_mode_lora_bw_t + * @param [in] cr Coding Rate @ref lr1121_modem_tst_mode_lora_cr_t + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_rx_lora_cont( const void* context, uint32_t frequency, + lr1121_modem_tst_mode_lora_sf_t sf, + lr1121_modem_tst_mode_lora_bw_t bw, + lr1121_modem_tst_mode_lora_cr_t cr ); + +/*! + * @brief Continuously receive FSK packets + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_rx_fsk_cont( const void* context, uint32_t frequency ); + +/*! + * @brief Read the packet counter received during continuously receive packets test. + * + * @param [in] context Chip implementation context + * @param [in] rx_packet_counter The counter of packet received during RX continuous packet test + * + * @returns Operation status + * + * @see lr1121_modem_test_rx_lora_cont + */ +lr1121_modem_response_code_t lr1121_modem_test_read_packet_counter_rx_cont( const void* context, + uint32_t* rx_packet_counter ); + +/*! + * @brief Continuously receive packets on Sub-GHz radio path. + * + * @param [in] context Chip implementation context + * @param [in] frequency Frequency in Hz + * @param [in] time_ms time in millisecond of the radio acquisition + * @param [in] bw_hz bandwidth in Hz + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_rssi_subghz( const void* context, uint32_t frequency, uint16_t time_ms, + uint32_t bw_hz ); + +/*! + * @brief Reset the LR1121 radio. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_radio_rst( const void* context ); + +/*! + * @brief Exit test mode and reset LR1121 modem. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_exit( const void* context ); + +/*! + * @brief Read RSSI after a Sub Gig / 2.4 Ghz test rssi command. + * + * @param [in] context Chip implementation context + * @param [out] rssi RSSI in dBm + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_test_read_rssi( const void* context, int16_t* rssi ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_MODEM_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem_types.h new file mode 100755 index 0000000..7f20524 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_modem_types.h @@ -0,0 +1,296 @@ +/*! + * @file lr1121_modem_modem_types.h + * + * @brief Modem driver types for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_MODEM_TYPES_H +#define LR1121_MODEM_MODEM_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Modem status bits + */ +typedef enum +{ + LR1121_LORAWAN_CRASH = 0x02, + LR1121_LORAWAN_JOINED = 0x08, + LR1121_LORAWAN_SUSPEND = 0x10, + LR1121_LORAWAN_JOINING = 0x40, +} lr1121_modem_lorawan_status_t; + +/** + * @brief Bit mask for lr1121_modem_lorawan_status_t + * + * @see lr1121_modem_lorawan_status_t + */ +typedef uint8_t lr1121_modem_lorawan_status_bitmask_t; + +/*! + * @brief LoRa spreading factor for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LORA_SF5 = 0x05, + LR1121_MODEM_TST_MODE_LORA_SF6 = 0x06, + LR1121_MODEM_TST_MODE_LORA_SF7 = 0x07, + LR1121_MODEM_TST_MODE_LORA_SF8 = 0x08, + LR1121_MODEM_TST_MODE_LORA_SF9 = 0x09, + LR1121_MODEM_TST_MODE_LORA_SF10 = 0x0A, + LR1121_MODEM_TST_MODE_LORA_SF11 = 0x0B, + LR1121_MODEM_TST_MODE_LORA_SF12 = 0x0C, +} lr1121_modem_tst_mode_lora_sf_t; + +/*! + * @brief LoRa bandwidth for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LORA_10_KHZ = 0x01, + LR1121_MODEM_TST_MODE_LORA_15_KHZ = 0x02, + LR1121_MODEM_TST_MODE_LORA_20_KHZ = 0x03, + LR1121_MODEM_TST_MODE_LORA_31_KHZ = 0x04, + LR1121_MODEM_TST_MODE_LORA_41_KHZ = 0x05, + LR1121_MODEM_TST_MODE_LORA_62_KHZ = 0x06, + LR1121_MODEM_TST_MODE_LORA_125_KHZ = 0x07, + LR1121_MODEM_TST_MODE_LORA_200_KHZ = 0x08, + LR1121_MODEM_TST_MODE_LORA_250_KHZ = 0x09, + LR1121_MODEM_TST_MODE_LORA_400_KHZ = 0x0A, + LR1121_MODEM_TST_MODE_LORA_500_KHZ = 0x0B, + LR1121_MODEM_TST_MODE_LORA_800_KHZ = 0x0C, +} lr1121_modem_tst_mode_lora_bw_t; + +/*! + * @brief LoRa coding rate for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LORA_CR_4_5 = 0x01, + LR1121_MODEM_TST_MODE_LORA_CR_4_6 = 0x02, + LR1121_MODEM_TST_MODE_LORA_CR_4_7 = 0x03, + LR1121_MODEM_TST_MODE_LORA_CR_4_8 = 0x04, + LR1121_MODEM_TST_MODE_LORA_CR_4_5_LONG_INTERLEAVING = 0x05, + LR1121_MODEM_TST_MODE_LORA_CR_4_6_LONG_INTERLEAVING = 0x06, + LR1121_MODEM_TST_MODE_LORA_CR_4_8_LONG_INTERLEAVING = 0x07, +} lr1121_modem_tst_mode_lora_cr_t; + +/** + * @brief LR_FHSS grid for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LR_FHSS_GRID_V1_25391_HZ = 0x00, + LR1121_MODEM_TST_MODE_LR_FHSS_GRID_V1_3906_HZ = 0x01, +} lr1121_modem_tst_mode_lr_fhss_grid_t; + +/** + * @brief LR-FHSS bandwidth for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_39063_HZ = 0x00, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_85938_HZ = 0x01, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_136719_HZ = 0x02, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_183594_HZ = 0x03, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_335938_HZ = 0x04, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_386719_HZ = 0x05, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_722656_HZ = 0x06, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_773438_HZ = 0x07, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_1523438_HZ = 0x08, + LR1121_MODEM_TST_MODE_LR_FHSS_BW_V1_1574219_HZ = 0x09, +} lr1121_modem_tst_mode_lr_fhss_bw_t; + +/** + * @brief LR-FHSS coding rate for test mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LR_FHSS_CR_V1_2_3 = 0x01, + LR1121_MODEM_TST_MODE_LR_FHSS_CR_V1_1_3 = 0x03, +} lr1121_modem_tst_mode_lr_fhss_cr_t; + +/*! + * @brief Packet header mode + */ +typedef enum +{ + LR1121_MODEM_TST_MODE_LORA_PACKET_HEADER_EXPLICIT = 0x00, + LR1121_MODEM_TST_MODE_LORA_PACKET_HEADER_IMPLICIT = 0x01, +} lr1121_modem_tst_mode_lora_packet_header_mode_t; + +/*! + * @brief Modem suspend type + */ +typedef enum +{ + LR1121_MODEM_RESUMED = 0x00, + LR1121_MODEM_SUSPEND = 0x01, +} lr1121_modem_suspend_t; + +/*! + * @brief Modem crashlog status type + */ +typedef enum +{ + LR1121_NO_NEW_CRASHLOG = 0x00, + LR1121_NEW_CRASHLOG = 0x01, +} lr1121_modem_crashlog_status_t; + +/*! + * @brief LR1121 modem consumption details + */ +typedef struct +{ + uint32_t tx_last_toa_ms; //!< Last Tx time-on-air (ms) + uint32_t rx_last_toa_ms; //!< Last Rx time-on-air (ms) + uint32_t tx_cumulated_toa_ms; //!< Cumulated Tx time-on-air (ms) + uint32_t rx_cumulated_toa_ms; //!< Cumulated Rx time-on-air (ms) + uint32_t none_consumption_ms; //!< Cumulated time not in Tx nor in Rx (ms) + uint32_t tx_consumption_ma; //!< Cumulated Tx power consumption (1/1000*uA*ms) + uint32_t rx_consumption_ma; //!< Cumulated Rx power consumption (1/1000*uA*ms) + uint32_t none_consumption_ma; //!< Cumulated power consumption not in Tx nor in Rx (1/1000*uA*ms) +} lr1121_modem_consumption_details_t; + +/*! + * @brief LR1121 modem consumption per stack action + */ +typedef struct +{ + lr1121_modem_consumption_details_t + suspend; //!< Consumptions when modem is in suspend state. These will always read 0, + //!< even if transceiver commands where called during this state + lr1121_modem_consumption_details_t class_b_beacon; //!< Consumptions of modem related to class B beacon + lr1121_modem_consumption_details_t lr1mac_stack; //!< Consumption of modem corresponding to LoRaWAN stack + lr1121_modem_consumption_details_t lbt; //!< Consumptions of modem related to Listen Before Talk + lr1121_modem_consumption_details_t cad; //!< Consumption of modem related to Channel Activity Detection + lr1121_modem_consumption_details_t class_b_ping_slot; //!< Consumptions of modem related to class B ping slots + lr1121_modem_consumption_details_t test_mode; //!< Consumptions of modem related to test mode + lr1121_modem_consumption_details_t + direct_rp_access; //!< Consumptions when modem is in direct radio planner access state. These will always read + //!< 0, even if transceiver commands where called during this state + lr1121_modem_consumption_details_t relay_tx; //!< Consumption of modem related to relay Tx + lr1121_modem_consumption_details_t class_c; //!< Consumptions of modem related to Class C +} lr1121_modem_charge_t; + +/*! + * @brief LR1121 modem version structure + */ +typedef struct +{ + uint8_t use_case; //!< Will always read 5 for LR1121 Modem-E + uint8_t modem_major; //!< Major number of Modem-E + uint8_t modem_minor; //!< Minor number of Modem-E + uint8_t modem_patch; //!< Patch number of Modem-E + uint8_t lbm_major; //!< Major number of built-in LoRa Basics Modem + uint8_t lbm_minor; //!< Minor number of built-in LoRa Basics Modem + uint8_t lbm_patch; //!< Patch number of built-in LoRa Basics Modem +} lr1121_modem_version_t; + +/*! + * @brief Event type for modem operation + */ +typedef enum +{ + LR1121_MODEM_LORAWAN_EVENT_RESET = 0x00, //!< Modem has reset + LR1121_MODEM_LORAWAN_EVENT_ALARM = 0x01, //!< Alarm time expired + LR1121_MODEM_LORAWAN_EVENT_JOINED = 0x02, //!< Network successfully joined + LR1121_MODEM_LORAWAN_EVENT_JOIN_FAIL = 0x03, //!< Attempt to join network failed + LR1121_MODEM_LORAWAN_EVENT_TX_DONE = 0x04, //!< Frame transmitted + LR1121_MODEM_LORAWAN_EVENT_DOWN_DATA = 0x05, //!< Downlink data received + LR1121_MODEM_LORAWAN_EVENT_LINK_CHECK = 0x06, //!< Modem received a LinkADR request + LR1121_MODEM_LORAWAN_EVENT_LORAWAN_MAC_TIME = 0x07, //!< Modem received a LinkADR request + LR1121_MODEM_LORAWAN_EVENT_CLASS_B_PING_SLOT_INFO = 0x08, //!< Ping Slot Info answered or not by network + LR1121_MODEM_LORAWAN_EVENT_CLASS_B_STATUS = 0x09, //!< Downlink class B is ready or not + LR1121_MODEM_LORAWAN_EVENT_NEW_MULTICAST_SESSION_CLASS_C = 0x0A, //!< New active multicast session in class C + LR1121_MODEM_LORAWAN_EVENT_NEW_MULTICAST_SESSION_CLASS_B = 0x0B, //!< New active multicast session in class B + LR1121_MODEM_LORAWAN_EVENT_NO_MORE_MULTICAST_SESSION_CLASS_C = 0x0C, //!< End of multicast session in class C + LR1121_MODEM_LORAWAN_EVENT_NO_MORE_MULTICAST_SESSION_CLASS_B = 0x0D, //!< End of multicast session in class B + LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_DYNAMIC = + 0x0E, //!< Relay Tx dynamic mode has enabled or disabled the Wake On Radio + LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_MODE = 0x0F, //!< Relay Tx activation has been updated + LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_SYNC = 0x10, //!< Relay Tx synchronization has changed + LR1121_MODEM_LORAWAN_EVENT_ALC_SYNC_TIME = 0x11, //!< Applicative Layer Clock is synchronized + LR1121_MODEM_LORAWAN_EVENT_FUOTA_DONE = 0x12, //!< FUOTA file download terminated + LR1121_MODEM_LORAWAN_EVENT_TEST_MODE = 0x13, //!< Test mode event + LR1121_MODEM_LORAWAN_EVENT_REGIONAL_DUTY_CYCLE = + 0x14, //!< Transmissions are blocked or allowed per regional duty cycle limitation +} lr1121_modem_lorawan_event_type_t; + +/*! + * @brief modem event fields structure + */ +typedef struct +{ + lr1121_modem_lorawan_event_type_t event_type; //!< Event type + uint8_t missed_events_count; //!< Counter of missed events of type @p event_type + uint16_t data; //!< Event data +} lr1121_modem_event_fields_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_MODEM_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio.h new file mode 100755 index 0000000..ab5c6ce --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio.h @@ -0,0 +1,1052 @@ +/*! + * @file lr1121_modem_radio.h + * + * @brief Radio driver definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_RADIO_H +#define LR1121_MODEM_RADIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" +#include "lr1121_modem_radio_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Length in byte of the GFSK sync word + */ +#define LR1121_MODEM_RADIO_GFSK_SYNC_WORD_LENGTH 8 + +/*! + * @brief Default GFSK sync word value + */ +#define LR1121_MODEM_RADIO_GFSK_SYNC_WORD_DEFAULT \ + { \ + 0x97, 0x23, 0x52, 0x25, 0x56, 0x53, 0x65, 0x64 \ + } + +/*! + * @brief Length in byte of the LR-FHSS sync word + */ +#define LR1121_MODEM_RADIO_LR_FHSS_SYNC_WORD_LENGTH ( 4 ) + +/*! + * @brief Ramp-up delay for the power amplifier in Sigfox context + * + * This parameter configures the delay to fine tune the ramp-up time of the power amplifier for BPSK operation. + */ +enum +{ + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_DEFAULT = 0x0000, //!< No optimization + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_100_BPS = 0x1306, //!< Ramp-up optimization for 100bps + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_600_BPS = 0x0325, //!< Ramp-up optimization for 600bps +}; + +/*! + * @brief Ramp-down delay for the power amplifier in Sigfox context + * + * This parameter configures the delay to fine tune the ramp-down time of the power amplifier for BPSK operation. + */ +enum +{ + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_DEFAULT = 0x0000, //!< No optimization + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS = 0x1D70, //!< Ramp-down optimization for 100bps + LR1121_MODEM_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_600_BPS = 0x04E1, //!< Ramp-down optimization for 600bps +}; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Reset internal statistics of the received packets + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr1121_modem_radio_get_gfsk_stats, lr1121_modem_radio_get_lora_stats + */ +lr1121_modem_response_code_t lr1121_modem_radio_reset_stats( const void* context ); + +/*! + * @brief Get the internal statistics of the GFSK received packets + * + * Internal statistics are reset on Power on Reset, by entering sleep mode without memory retention, or by calling @ref + * lr1121_modem_radio_reset_stats. + * + * @param [in] context Chip implementation context + * @param [out] stats The statistics structure of the received packets + * + * @returns Operation status + * + * @see lr1121_modem_radio_reset_stats + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_stats( const void* context, + lr1121_modem_radio_stats_gfsk_t* stats ); + +/*! + * @brief Get the internal statistics of the LoRa received packets + * + * Internal statistics are reset on Power on Reset, by entering sleep mode without memory retention, or by calling @ref + * lr1121_modem_radio_reset_stats. + * + * @param [in] context Chip implementation context + * @param [out] stats The statistics structure of the received packets + * + * @returns Operation status + * + * @see lr1121_modem_radio_reset_stats + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_stats( const void* context, + lr1121_modem_radio_stats_lora_t* stats ); + +/*! + * @brief Get the packet type currently configured + * + * @param [in] context Chip implementation context + * @param [out] pkt_type The packet type currently configured + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_pkt_type( const void* context, + lr1121_modem_radio_pkt_type_t* pkt_type ); + +/*! + * @brief Get the length of last received packet, and the offset in the RX internal buffer of the first byte of the + * received payload + * + * @param [in] context Chip implementation context + * @param [out] rx_buffer_status The structure of RX buffer status + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_rx_buffer_status( + const void* context, lr1121_modem_radio_rx_buffer_status_t* rx_buffer_status ); + +/*! + * @brief Get the status of last GFSK received packet + * + * The value depends on the received packet type + * + * @param [in] context Chip implementation context + * @param [out] pkt_status The last received packet status + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_pkt_status( const void* context, + lr1121_modem_radio_pkt_status_gfsk_t* pkt_status ); + +/*! + * @brief Get the status of last LoRa received packet + * + * The value depends on the received packet type + * + * @param [in] context Chip implementation context + * @param [out] pkt_status The last received packet status + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_pkt_status( const void* context, + lr1121_modem_radio_pkt_status_lora_t* pkt_status ); + +/*! + * @brief Get the instantaneous RSSI. + * + * This command can be used during reception of a packet + * + * @param [in] context Chip implementation context + * @param [out] rssi_in_dbm Instantaneous RSSI. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_rssi_inst( const void* context, int8_t* rssi_in_dbm ); + +/*! + * @brief Set the GFSK modem sync word + * + * This command is used to set the GFSK nodem sync word. This command expects a 8-byte long array to be passed as sync + * word parameter. By default, the value is 0x9723522556536564. + * + * @param [in] context Chip implementation context + * @param [in] gfsk_sync_word The sync word to be configured + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_sync_word( + const void* context, const uint8_t gfsk_sync_word[LR1121_MODEM_RADIO_GFSK_SYNC_WORD_LENGTH] ); + +/*! + * @brief Set the LoRa modem sync word + * + * @param [in] context Chip implementation context + * @param [in] sync_word The sync word to be configured + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_word( const void* context, const uint8_t sync_word ); + +/*! + * @brief Set the syncword for LR-FHSS + * + * Default value: 0x2C0F7995 + * + * @param [in] context Chip implementation context + * @param [in] sync_word The syncword to set. It is up to the caller to ensure this array is at least four bytes long + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lr_fhss_sync_word( + const void* context, const uint8_t sync_word[LR1121_MODEM_RADIO_LR_FHSS_SYNC_WORD_LENGTH] ); + +/*! + * @brief Set the LoRa modem sync word to private / public + * + * This command is used to select which LoRa network is selected + * + * @param [in] context Chip implementation context + * @param [in] network_type The network type to be configured + * + * @returns Operation status + * + * @warning This function is deprecated. Use lr1121_modem_radio_set_lora_sync_word for chip firmware equal to or more + * recent than 0x303. + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_public_network( + const void* context, const lr1121_modem_radio_lora_network_type_t network_type ); + +/*! + * @brief Start RX operations with a timeout in millisecond + * + * This command sets the LR1121 to RX mode. The radio must have been configured before using this command with @ref + * lr1121_modem_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if no packets have been received + * after a certain amount of time. This behavior can be altered by @ref lr1121_modem_radio_set_rx_tx_fallback_mode and + * @ref lr1121_modem_radio_auto_tx_rx. + * + * @remark To set the radio in Rx continuous mode, the function @ref lr1121_modem_radio_set_rx_with_timeout_in_rtc_step + * has to be called with \p timeout_in_rtc_step set to 0xFFFFFF + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_ms The timeout configuration for RX operation + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx( const void* context, const uint32_t timeout_in_ms ); + +/*! + * @brief Start RX operations with a timeout in millisecond and configure the LNA LF0 mode + * + * This command sets the LR1121 to RX mode and configures the LNA LF0 mode. The radio must have been configured before + * using this command with @ref lr1121_modem_radio_set_pkt_type + * + * This command must be issued only for sub-GHz RX operations as it configures the LNA LF0, which is only used for + * sub-GHz Rx operations. + * + * By default, the timeout parameter allows to return automatically to standby RC mode if no packets have been received + * after a certain amount of time. This behavior can be altered by @ref lr1121_modem_radio_set_rx_tx_fallback_mode and + * @ref lr1121_modem_radio_auto_tx_rx. + * + * @remark To set the radio in Rx continuous mode, the function @ref lr1121_modem_radio_set_rx_with_timeout_in_rtc_step + * has to be called with \p timeout_in_rtc_step set to 0xFFFFFF + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_ms The timeout configuration for RX operation + * @param [in] lna_mode Path to use for reception + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode, lr1121_modem_radio_set_lna_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_and_lna_mode( const void* context, const uint32_t timeout_in_ms, + lr1121_modem_radio_lna_mode_t lna_mode ); + +/*! + * @brief Start RX operations with a timeout in RTC step + * + * This command sets the LR1121 to RX mode. The radio must have been configured before using this command with @ref + * lr1121_modem_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if no packets have been received + * after a certain amount of time. This behavior can be altered by @ref lr1121_modem_radio_set_rx_tx_fallback_mode and + * @ref lr1121_modem_radio_auto_tx_rx. + * + * The timeout duration is obtained by: + * \f$ timeout\_duration\_ms = timeout \times \frac{1}{32.768} \f$ + * + * Maximal timeout value is 0xFFFFFF, which gives a maximal timeout of 511 seconds. + * + * The timeout argument can also have the following special values: + * + * + *
Special values Meaning
0x000000 RX single: LR1121 stays in RX mode until a + * packet is received, then switch to standby RC mode
0xFFFFFF + * RX continuous: LR1121 stays in RX mode even after reception of a + * packet + *
+ * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for RX operation + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_with_timeout_in_rtc_step( const void* context, + const uint32_t timeout_in_rtc_step ); + +/*! + * @brief Start RX operations with a timeout in RTC step and configure the LNA LF0 mode + * + * This command sets the LR1121 to RX mode and configures the LNA LF0 mode. The radio must have been configured before + * using this command with @ref lr1121_modem_radio_set_pkt_type It internally calls lr1121_modem_radio_set_lna_mode. + * This command must be issued only for sub-GHz RX operations as it configures the LNA LF0, which is only used for + * sub-GHz Rx operations. + * + * By default, the timeout parameter allows to return automatically to standby RC mode if no packets have been received + * after a certain amount of time. This behavior can be altered by @ref lr1121_modem_radio_set_rx_tx_fallback_mode and + * @ref lr1121_modem_radio_auto_tx_rx. + * + * The timeout duration is obtained by: + * \f$ timeout\_duration\_ms = timeout \times \frac{1}{32.768} \f$ + * + * Maximal timeout value is 0xFFFFFF, which gives a maximal timeout of 511 seconds. + * + * The timeout argument can also have the following special values: + * + * + *
Special values Meaning
0x000000 RX single: LR1121 stays in RX mode until a + * packet is received, then switch to standby RC mode
0xFFFFFF + * RX continuous: LR1121 stays in RX mode even after reception of a + * packet + *
+ * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for RX operation + * @param [in] lna_mode Path to use for reception + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( + const void* context, const uint32_t timeout_in_rtc_step, lr1121_modem_radio_lna_mode_t lna_mode ); + +/*! + * @brief Start TX operations + * + * This command sets the LR1121 to TX mode. The radio must have been configured before using this command with @ref + * lr1121_modem_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if the packet has not been + * completely transmitted after a certain amount of time. This behavior can be altered by @ref + * lr1121_modem_radio_set_rx_tx_fallback_mode and @ref lr1121_modem_radio_auto_tx_rx. + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_ms The timeout configuration for TX operation + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_tx( const void* context, const uint32_t timeout_in_ms ); + +/*! + * @brief Start TX operations + * + * This command sets the LR1121 to TX mode. The radio must have been configured before using this command with @ref + * lr1121_modem_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if the packet has not been + * completely transmitted after a certain amount of time. This behavior can be altered by @ref + * lr1121_modem_radio_set_rx_tx_fallback_mode and @ref lr1121_modem_radio_auto_tx_rx. + * + * The timeout duration is obtained by: + * \f$ timeout\_duration\_ms = timeout \times \frac{1}{32.768} \f$ + * + * Maximal value is 0xFFFFFF. + * + * If the timeout argument is 0, then no timeout is used. + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for TX operation + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_rx_tx_fallback_mode + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_with_timeout_in_rtc_step( const void* context, + const uint32_t timeout_in_rtc_step ); + +/*! + * @brief Set the frequency for future radio operations. + * + * @param [in] context Chip implementation context + * @param [in] freq_in_hz The frequency in Hz to set for radio operations + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rf_freq( const void* context, const uint32_t freq_in_hz ); + +/*! + * @brief Configure automatic TX after RX or automatic RX after TX + * + * After issuing this command, using the command @ref lr1121_modem_radio_set_tx_with_timeout_in_rtc_step or @ref + * lr1121_modem_radio_set_tx will make the LR1121 doing the following: + * - Enter TX mode as usual + * - Enter configurable Intermediary mode during configurable delay + * - Enter RX mode + * + * Similarly, after a @ref lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode, @ref + * lr1121_modem_radio_set_rx_with_timeout_in_rtc_step, @ref lr1121_modem_radio_set_rx_and_lna_mode, or @ref + * lr1121_modem_radio_set_rx command, the LR1121 will do the following: + * - Enter RX mode as usual + * - Enter configurable Intermediary mode during configurable delay + * - Enter TX mode + * + * In case delay is 0, the LR1121 does not enter Intermediary mode and directly enter the following mode. + * + * To disable this behavior, use this function with delay set to 0xFFFFFFFF. + * + * @param [in] context Chip implementation context + * @param [in] delay Time to spend in Intermediary mode expressed as steps of \f$\frac{1}{32.768 KHz}\f$ steps. + * @param [in] intermediary_mode The mode the LR1121 enters after first mode completion during delay time + * @param [in] timeout The timeout duration of the automatic RX or TX, expressed as steps of \f$ \frac{1}{32.768KHz} \f$ + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_auto_tx_rx( + const void* context, const uint32_t delay, const lr1121_modem_radio_intermediary_mode_t intermediary_mode, + const uint32_t timeout ); + +/*! + * @brief Set Channel Activity Detection configuration + * + * @param [in] context Chip implementation context + * @param [in] cad_params The structure defining CAD configuration + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_cad_params( const void* context, + const lr1121_modem_radio_cad_params_t* cad_params ); + +/*! + * @brief Set the packet type + * + * @param [in] context Chip implementation context + * @param [in] pkt_type Packet type to set + * + * @returns Operation status + * + * @see lr1121_modem_radio_get_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_pkt_type( const void* context, + const lr1121_modem_radio_pkt_type_t pkt_type ); + +/*! + * @brief Set the modulation parameters for GFSK packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_mod_params( + const void* context, const lr1121_modem_radio_mod_params_gfsk_t* mod_params ); + +/*! + * @brief Set the modulation parameters for BPSK packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_bpsk_mod_params( + const void* context, const lr1121_modem_radio_mod_params_bpsk_t* mod_params ); + +/*! + * @brief Set the modulation parameters for LoRa packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_mod_params( + const void* context, const lr1121_modem_radio_mod_params_lora_t* mod_params ); + +/*! + * @brief Set the modulation parameters for LR-FHSS + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr1121_modem_lr_fhss_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lr_fhss_mod_params( + const void* context, const lr1121_modem_radio_mod_params_lr_fhss_t* mod_params ); + +/*! + * @brief Set the packet parameters for GFSK packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_gfsk_mod_params + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_gfsk_t* pkt_params ); + +/*! + * @brief Set the packet parameters for BPSK packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_bpsk_mod_params + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_bpsk_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_bpsk_t* pkt_params ); + +/*! + * @brief Set the packet parameters for LoRa packets + * + * The command @ref lr1121_modem_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type, lr1121_modem_radio_set_lora_mod_params + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_lora_t* pkt_params ); + +/*! + * @brief Set the parameters for TX power and power amplifier ramp time + * + * The command @ref lr1121_modem_radio_set_pa_cfg must be called prior calling + * lr1121_modem_radio_set_tx_params. + * + * The range of possible TX output power values depends on PA selected with @ref lr1121_modem_radio_set_pa_cfg : + * - for LPA: power value goes from -17dBm to +14dBm (ie. from 0xEF to 0x0E) + * - for HPA: power value goes from -9dBm to +22dBm (ie. from 0xF7 to 0x16) + * + * Moreover, to use TX output power value higher than +10dBm, the @ref LR1121_MODEM_RADIO_PA_REG_SUPPLY_VBAT supply must + * have been selected with @ref lr1121_modem_radio_set_pa_cfg. + * + * @param [in] context Chip implementation context + * @param [in] pwr_in_dbm The TX output power in dBm + * @param [in] ramp_time The ramping time configuration for the PA + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_params( const void* context, const int8_t pwr_in_dbm, + const lr1121_modem_radio_ramp_time_t ramp_time ); + +/*! + * @brief Sets the Node and Broadcast address used for GFSK + * + * This setting is used only when filtering is enabled. + * + * @param [in] context Chip implementation context + * @param [in] node_address The node address used as filter + * @param [in] broadcast_address The broadcast address used as filter + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_pkt_address( const void* context, const uint8_t node_address, + const uint8_t broadcast_address ); + +/*! + * @brief Alter the chip mode after successfull transmission or reception operation + * + * This setting is not used during Rx Duty Cycle mode or Auto Tx Rx. + * + * @param [in] context Chip implementation context + * @param [in] fallback_mode The chip mode to enter after successfull transmission or reception. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_tx_fallback_mode( + const void* context, const lr1121_modem_radio_fallback_modes_t fallback_mode ); + +/*! + * @brief Configure and start a Rx Duty Cycle operation + * + * It executes the following steps: + * 1. Reception: enters reception state for duration defined by rx_period + * - If mode is LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_RX: it is standard RX mode + * - If mode is LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_CAD (only in LoRa) : it is CAD operation + * 2. Depending on the over-the-air activity detection: + * - In case of positive over-the-air detection, the rx_period timeout is recomputed to the value + * \f$2 \times rx\_period + sleep\_period\f$ + * - If no air activity is detected, the LR1121 goes back to sleep mode with retention for a duration defined by + * sleep_period + * 3. On wake-up, the LR1121 restarts the process with the reception state. + * + * @remark If mode is configured to @ref LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_CAD, then the CAD configuration used in + * step 1. is the one set from the last call to @ref lr1121_modem_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * @param [in] rx_period_in_ms The length of Rx period + * @param [in] sleep_period_in_ms The length of sleep period + * @param [in] mode The operation mode during Rx phase + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_cad_params + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_duty_cycle( const void* context, const uint32_t rx_period_in_ms, + const uint32_t sleep_period_in_ms, + const lr1121_modem_radio_rx_duty_cycle_mode_t mode ); + +/*! + * @brief Configure and start a Rx Duty Cycle operation + * + * It executes the following steps: + * 1. Reception: enters reception state for duration defined by rx_period + * - If mode is LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_RX: it is standard RX mode + * - If mode is LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_CAD (only in LoRa) : it is CAD operation + * 2. Depending on the over-the-air activity detection: + * - In case of positive over-the-air detection, the rx_period timeout is recomputed to the value + * \f$2 \times rx\_period + sleep\_period\f$ + * - If no air activity is detected, the LR1121 goes back to sleep mode with retention for a duration defined by + * sleep_period + * 3. On wake-up, the LR1121 restarts the process with the reception state. + * + * @remark If mode is configured to @ref LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_CAD, then the CAD configuration used in + * step 1. is the one set from the last call to @ref lr1121_modem_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * @param [in] rx_period_in_rtc_step The length of Rx period + * @param [in] sleep_period_in_rtc_step The length of sleep period + * @param [in] mode The operation mode during Rx phase + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_cad_params + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_duty_cycle_with_timings_in_rtc_step( + const void* context, const uint32_t rx_period_in_rtc_step, const uint32_t sleep_period_in_rtc_step, + const lr1121_modem_radio_rx_duty_cycle_mode_t mode ); + +/*! + * @brief Set the Power Amplifier configuration + * + * It must be called prior using @ref lr1121_modem_radio_set_tx_params. + * + * @param [in] context Chip implementation context + * @param [in] pa_cfg The structure for PA configuration + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_pa_cfg( const void* context, + const lr1121_modem_radio_pa_cfg_t* pa_cfg ); + +/*! + * @brief Define on which event the Rx timeout shall be stopped + * + * The two options are: + * - Syncword / Header detection + * - Preamble detection + * + * @param [in] context Chip implementation context + * @param [in] stop_timeout_on_preamble The choice of the event to be taken into account + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_stop_timeout_on_preamble( const void* context, + const bool stop_timeout_on_preamble ); + +/*! + * @brief Start the CAD mode + * + * The LoRa packet type shall be selected before this function is called. The fallback mode is configured with + * lr1121_modem_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_cad_params, lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_cad( const void* context ); + +/*! + * @brief Set the device into Tx continuous wave (RF tone). + * + * A packet type shall be selected before this function is called. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_pkt_type + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_cw( const void* context ); + +/*! + * @brief Set the device into Tx continuous preamble (modulated signal). + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_infinite_preamble( const void* context ); + +/*! + * @brief Configure the LoRa modem to issue a RX timeout after an exact number of symbols given in parameter if no LoRa + * modulation is detected + * + * @warning Values of nb_symbol higher than 255 are only valid for chip firmware equal to or more recent than 0x308. + * + * @param [in] context Chip implementation context + * @param [in] nb_symbol number of symbols to compute the timeout + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_timeout( const void* context, const uint16_t nb_symbol ); + +/*! + * @brief Configure the LoRa modem to issue a RX timeout after an exact number of symbols given in parameter if no LoRa + * modulation is detected + * + * @warning This command has been introduced in chip firware 0x0308 and is not available in earlier version + * + * @remark The number of symbol is computed as mantissa ^ (2*exponent + 1) + * + * @param [in] context Chip implementation context + * @param [in] mantissa Mantissa - from 0 to 31 - to compute the number of symbols of the timeout + * @param [in] exponent Exponent - from 0 to 7 - to compute the number of symbols of the timeout + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_timeout_with_mantissa_exponent( const void* context, + const uint8_t mantissa, + const uint8_t exponent ); + +/*! + * @brief Configure the seed and the polynomial used to compute CRC in GFSK packet + * + * @param [in] context Chip implementation context + * @param [in] seed Seed used to compute the CRC value + * @param [in] polynomial Polynomial used to compute the CRC value + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_crc_params( const void* context, const uint32_t seed, + const uint32_t polynomial ); + +/*! + * @brief Configure the whitening seed used in GFSK packet + * + * @param [in] context Chip implementation context + * @param [in] seed Whitening seed value + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_whitening_seed( const void* context, const uint16_t seed ); + +/*! + * @brief Configure the boost mode in reception + * + * @param [in] context Chip implementation context + * @param [in] enable_boost_mode Boost mode activation + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_cfg_rx_boosted( const void* context, const bool enable_boost_mode ); + +/*! + * @brief Set RSSI calibration table + * + * @param [in] context Chip implementation context + * @param [in] rssi_cal_table RSSI calibration table + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_rssi_calibration( + const void* context, const lr1121_modem_radio_rssi_calibration_table_t* rssi_cal_table ); + +/*! + * @brief Gets the radio bw parameter for a given bandwidth in Hz + * + * @param [in] bw_in_hz Requested GFSK Rx bandwidth + * @param [out] bw_parameter Radio parameter immediately above requested bw_in_hz + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_rx_bandwidth( uint32_t bw_in_hz, + lr1121_modem_radio_gfsk_bw_t* bw_parameter ); + +/** + * @brief Compute the numerator for LoRa time-on-air computation. + * + * @remark To get the actual time-on-air in seconds, this value has to be divided by the LoRa bandwidth in Hertz. + * + * @param [in] pkt_p Pointer to the structure holding the LoRa packet parameters + * @param [in] mod_p Pointer to the structure holding the LoRa modulation parameters + * + * @returns LoRa time-on-air numerator + */ +uint32_t lr1121_modem_radio_get_lora_time_on_air_numerator( const lr1121_modem_radio_pkt_params_lora_t* pkt_p, + const lr1121_modem_radio_mod_params_lora_t* mod_p ); + +/** + * @brief Get the actual value in Hertz of a given LoRa bandwidth + * + * @param [in] bw LoRa bandwidth parameter + * + * @returns Actual LoRa bandwidth in Hertz + */ +uint32_t lr1121_modem_radio_get_lora_bw_in_hz( lr1121_modem_radio_lora_bw_t bw ); + +/*! + * @brief Get the time on air in ms for LoRa transmission + * + * @param [in] pkt_p Pointer to a structure holding the LoRa packet parameters + * @param [in] mod_p Pointer to a structure holding the LoRa modulation parameters + * + * @returns Time-on-air value in ms for LoRa transmission + */ +uint32_t lr1121_modem_radio_get_lora_time_on_air_in_ms( const lr1121_modem_radio_pkt_params_lora_t* pkt_p, + const lr1121_modem_radio_mod_params_lora_t* mod_p ); + +/** + * @brief Compute the numerator for GFSK time-on-air computation. + * + * @remark To get the actual time-on-air in seconds, this value has to be divided by the GFSK bitrate in bits per + * second. + * + * @param [in] pkt_p Pointer to the structure holding the GFSK packet parameters + * + * @returns GFSK time-on-air numerator + */ +uint32_t lr1121_modem_radio_get_gfsk_time_on_air_numerator( const lr1121_modem_radio_pkt_params_gfsk_t* pkt_p ); + +/** + * @brief Get the time on air in ms for GFSK transmission + * + * @param [in] pkt_p Pointer to a structure holding the GFSK packet parameters + * @param [in] mod_p Pointer to a structure holding the GFSK modulation parameters + * + * @returns Time-on-air value in ms for GFSK transmission + */ +uint32_t lr1121_modem_radio_get_gfsk_time_on_air_in_ms( const lr1121_modem_radio_pkt_params_gfsk_t* pkt_p, + const lr1121_modem_radio_mod_params_gfsk_t* mod_p ); + +/** + * @brief Get the number of RTC steps for a given time in millisecond + * + * @param [in] time_in_ms Timeout in millisecond + * + * @returns Number of RTC steps + */ +uint32_t lr1121_modem_radio_convert_time_in_ms_to_rtc_step( uint32_t time_in_ms ); + +/*! + * @brief Configure the radio for Bluetooth® Low Energy Beaconing Compatibility. + * + * The caller shall ensure that the payload, if provided, follows the format of the Advertising physical channel PDU as + * defined in the Bluetooth® core specification. + * + * This automatically configures the syncword to 0x8e89bed6 and the 3-byte CRC (polynomial set to 0x100065b, seed set to + * 0x555555). + * + * @param [in] context Chip implementation context + * @param [in] channel_id BLE channel - allowed channels are 37, 38, 39 + * @param [in] buffer Array of bytes to be used as beacon payload (optional) + * @param [in] length Number of bytes in the @p buffer array + * + * @returns Operation status + * + * @note As opposed to the function @ref lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility, + * this function only configures the radio interface for Bluetooth® Low Energy Beaconing Compatibility advertising. To + * actually start the transmission, the function @ref lr1121_modem_radio_set_tx must be called. + * @note The previously configured payload with @ref + * lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility or + * @ref lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility is sent if @p length is set to 0, + * except if a call to @ref lr1121_modem_regmem_write_buffer8, @ref lr1121_modem_lr_fhss_build_frame is done in between + * or @ref lr1121_modem_system_set_sleep with warm start disabled + * + * @sa lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility + * @sa lr1121_modem_radio_set_tx + */ +lr1121_modem_response_code_t lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility( + const void* context, const uint8_t channel_id, const uint8_t* buffer, const uint8_t length ); + +/** + * @brief Get the information from the last received LoRa packet header (if @ref LR1121_MODEM_RADIO_LORA_PKT_EXPLICIT) + * or the locally configured settings (if @ref LR1121_MODEM_RADIO_LORA_PKT_IMPLICIT) + * + * @remark This function can be called only if @ref LR1121_MODEM_RADIO_PKT_TYPE_LORA is selected with @ref + * lr1121_modem_radio_set_pkt_type + * + * @param [in] context Chip implementation context + * @param [out] is_crc_present CRC configuration + * @param [out] cr LoRa coding rate + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_rx_info( const void* context, bool* is_crc_present, + lr1121_modem_radio_lora_cr_t* cr ); + +/*! + * @brief Configure the radio for Bluetooth® Low Energy Beaconing Compatibility and send the given beacon on the desired + * channel. + * + * The caller shall ensure that the payload, if provided, follows the format of the Advertising physical channel PDU as + * defined in the Bluetooth® core specification. + * + * This automatically configures the syncword to 0x8e89bed6 and the 3-byte CRC (polynomial set to 0x100065b, seed set to + * 0x555555). + * + * @param [in] context Chip implementation context + * @param [in] channel_id BLE channel - allowed channels are 37, 38, 39 + * @param [in] buffer Array of bytes to be used as beacon payload (optional) + * @param [in] length Number of bytes in the @p buffer array + * + * @returns Operation status + * + * @note This function combines the configuration for Bluetooth® Low Energy Beaconing Compatibility - done with @ref + * lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility) - and the actual transmission - done with @ref + * lr1121_modem_radio_set_tx. + * @note The previously configured payload with @ref + * lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility or + * @ref lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility is sent if @p length is set to 0, + * except if a call to @ref lr1121_modem_regmem_write_buffer8, @ref lr1121_modem_lr_fhss_build_frame is done in between + * or @ref lr1121_modem_system_set_sleep with warm start disabled + * + * @sa lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility + */ +lr1121_modem_response_code_t lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility( + const void* context, const uint8_t channel_id, const uint8_t* buffer, const uint8_t length ); + +/** + * @brief Get the mantissa and exponent for a given number of symbol + * + * @remark This function computes the [mantissa, exponent] duple which corresponds to nb_of_symb: the smallest + * value verifying both following conditions: + * - nb_of_symb >= nb_symbol; and + * - nb_of_symb = mant * 2 ^ (2 * exp + 1) + * + * @param [in] nb_symbol Number of symbols + * @param [out] mant Mantissa computed from nb_symb + * @param [out] exp Exponent computed from nb_symb + * + * @returns Number of symbols corresponding to the [mantissa, exponent] duple computed with the following formula: + * nb_of_symb = mant * 2 ^ (2 * exp + 1) + */ +uint16_t lr1121_modem_radio_convert_nb_symb_to_mant_exp( const uint16_t nb_symbol, uint8_t* mant, uint8_t* exp ); + +/** + * @brief Configure LNA LF0 mode + * + * @remark This function shall be called after each call to lr1121_modem_radio_set_rx or + * lr1121_modem_radio_set_rx_with_timeout_in_rtc_step to be taken into account. Helper functions + * lr1121_modem_radio_set_rx_on_lna_path or lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_on_lna_path can be used + * instead. + * + * @param [in] context Chip implementation context + * @param [in] lna_mode Value to put in the register, enum type + * + * @returns Operation status + * + * @see lr1121_modem_radio_set_rx_on_lna_path, lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_on_lna_path + */ +lr1121_modem_response_code_t lr1121_modem_radio_set_lna_mode( const void* context, + lr1121_modem_radio_lna_mode_t lna_mode ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_RADIO_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_timings.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_timings.h new file mode 100755 index 0000000..21fb698 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_timings.h @@ -0,0 +1,97 @@ +/** + * @file lr1121_modem_radio_timings.h + * + * @brief LR1121 timing helper functions definition + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_RADIO_TIMINGS_H +#define LR1121_MODEM_RADIO_TIMINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr1121_modem_radio_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/** + * @brief Get the time between the last bit sent (on Tx side) and the Rx done event (on Rx side) + * + * @param [in] mod_params Pointer to a structure holding the LoRa modulation parameters used for the computation + * + * @returns Delay in microsecond + */ +uint32_t lr1121_modem_radio_timings_get_delay_between_last_bit_sent_and_rx_done_in_us( + const lr1121_modem_radio_mod_params_lora_t* mod_params ); + +/** + * @brief Get the time between the last bit sent and the Tx done event + * + * @param [in] ramp_time Power amplifier ramp time + * + * @returns Delay in microsecond + */ +uint32_t lr1121_modem_radio_timings_get_delay_between_last_bit_sent_and_tx_done_in_us( + const lr1121_modem_radio_ramp_time_t ramp_time ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_RADIO_TIMINGS_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_types.h new file mode 100755 index 0000000..b353b62 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_radio_types.h @@ -0,0 +1,653 @@ +/*! + * @file lr1121_modem_radio_types.h + * + * @brief Radio driver types for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_RADIO_TYPES_H +#define LR1121_MODEM_RADIO_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Bit mask to set to indicate a LR-FHSS bitrate is defined in steps of 1/256 bit per seconds + */ +#define LR1121_MODEM_RADIO_LR_FHSS_BITRATE_DIVIDE_BY_256 ( 0x80000000 ) + +/*! + * @brief LR-FHSS bitrate value at 488.28125 bps defined as steps of 1/256 bitrate per seconds + */ +#define LR1121_MODEM_RADIO_LR_FHSS_BITRATE_IN_256_BPS_STEPS ( 125000 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Power Amplifier Selection values + * + * - Low-power Power Amplifier can reach up to 14dBm + * - High-power Power Amplifier can reach up to 22 dBm + */ +typedef enum +{ + LR1121_MODEM_RADIO_PA_SEL_LP = 0x00, //!< Low-power Power Amplifier + LR1121_MODEM_RADIO_PA_SEL_HP = 0x01, //!< High-power Power Amplifier + LR1121_MODEM_RADIO_PA_SEL_HF = 0x02, //!< High-frequency Power Amplifier +} lr1121_modem_radio_pa_selection_t; + +/*! + * @brief GFSK Address Filtering configurations + * + * If Address Filtering is enabled but a wrong address is received, therefore the reception is aborted and the address + * error flag of packet status is set. + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_ADDRESS_FILTERING_DISABLE = 0x00, //!< Filter deactivated + LR1121_MODEM_RADIO_GFSK_ADDRESS_FILTERING_NODE_ADDRESS = 0x01, //!< Filter on Node Address + LR1121_MODEM_RADIO_GFSK_ADDRESS_FILTERING_NODE_AND_BROADCAST_ADDRESSES = + 0x02, //!< Filtering on Node and Broadcast addresses +} lr1121_modem_radio_gfsk_address_filtering_t; + +/*! + * @brief Chip mode after successfull transmission or reception + * + * Unused for RX duty cycle and AutoTxRx operations + */ +typedef enum +{ + LR1121_MODEM_RADIO_FALLBACK_STDBY_RC = 0x01, //!< Standby RC (Default) + LR1121_MODEM_RADIO_FALLBACK_STDBY_XOSC = 0x02, //!< Standby XOSC + LR1121_MODEM_RADIO_FALLBACK_FS = 0x03 //!< FS +} lr1121_modem_radio_fallback_modes_t; + +/*! + * @brief Ramping time for PA + * + * This parameter is the ramping time of the PA. A high value improves spectral quality. + */ +typedef enum +{ + LR1121_MODEM_RADIO_RAMP_16_US = 0x00, //!< 16 us Ramp Time + LR1121_MODEM_RADIO_RAMP_32_US = 0x01, //!< 32 us Ramp Time + LR1121_MODEM_RADIO_RAMP_48_US = 0x02, //!< 48 us Ramp Time (Default) + LR1121_MODEM_RADIO_RAMP_64_US = 0x03, //!< 64 us Ramp Time + LR1121_MODEM_RADIO_RAMP_80_US = 0x04, //!< 80 us Ramp Time + LR1121_MODEM_RADIO_RAMP_96_US = 0x05, //!< 96 us Ramp Time + LR1121_MODEM_RADIO_RAMP_112_US = 0x06, //!< 112 us Ramp Time + LR1121_MODEM_RADIO_RAMP_128_US = 0x07, //!< 128 us Ramp Time + LR1121_MODEM_RADIO_RAMP_144_US = 0x08, //!< 144 us Ramp Time + LR1121_MODEM_RADIO_RAMP_160_US = 0x09, //!< 160 us Ramp Time + LR1121_MODEM_RADIO_RAMP_176_US = 0x0A, //!< 176 us Ramp Time + LR1121_MODEM_RADIO_RAMP_192_US = 0x0B, //!< 192 us Ramp Time + LR1121_MODEM_RADIO_RAMP_208_US = 0x0C, //!< 208 us Ramp Time + LR1121_MODEM_RADIO_RAMP_240_US = 0x0D, //!< 240 us Ramp Time + LR1121_MODEM_RADIO_RAMP_272_US = 0x0E, //!< 272 us Ramp Time + LR1121_MODEM_RADIO_RAMP_304_US = 0x0F, //!< 304 us Ramp Time +} lr1121_modem_radio_ramp_time_t; + +/*! + * @brief LoRa network type configuration + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_NETWORK_PRIVATE = 0x00, //!< LoRa private network + LR1121_MODEM_RADIO_LORA_NETWORK_PUBLIC = 0x01, //!< LoRa public network +} lr1121_modem_radio_lora_network_type_t; + +/*! + * @brief LoRa Spreading Factor configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_SF5 = 0x05, //!< Spreading Factor 5 + LR1121_MODEM_RADIO_LORA_SF6 = 0x06, //!< Spreading Factor 6 + LR1121_MODEM_RADIO_LORA_SF7 = 0x07, //!< Spreading Factor 7 + LR1121_MODEM_RADIO_LORA_SF8 = 0x08, //!< Spreading Factor 8 + LR1121_MODEM_RADIO_LORA_SF9 = 0x09, //!< Spreading Factor 9 + LR1121_MODEM_RADIO_LORA_SF10 = 0x0A, //!< Spreading Factor 10 + LR1121_MODEM_RADIO_LORA_SF11 = 0x0B, //!< Spreading Factor 11 + LR1121_MODEM_RADIO_LORA_SF12 = 0x0C, //!< Spreading Factor 12 +} lr1121_modem_radio_lora_sf_t; + +/*! + * @brief LoRa Bandwidth configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_BW_10 = 0x08, //!< Bandwidth 10.42 kHz + LR1121_MODEM_RADIO_LORA_BW_15 = 0x01, //!< Bandwidth 15.63 kHz + LR1121_MODEM_RADIO_LORA_BW_20 = 0x09, //!< Bandwidth 20.83 kHz + LR1121_MODEM_RADIO_LORA_BW_31 = 0x02, //!< Bandwidth 31.25 kHz + LR1121_MODEM_RADIO_LORA_BW_41 = 0x0A, //!< Bandwidth 41.67 kHz + LR1121_MODEM_RADIO_LORA_BW_62 = 0x03, //!< Bandwidth 62.50 kHz + LR1121_MODEM_RADIO_LORA_BW_125 = 0x04, //!< Bandwidth 125.00 kHz + LR1121_MODEM_RADIO_LORA_BW_250 = 0x05, //!< Bandwidth 250.00 kHz + LR1121_MODEM_RADIO_LORA_BW_500 = 0x06, //!< Bandwidth 500.00 kHz + LR1121_MODEM_RADIO_LORA_BW_200 = 0x0D, //!< Bandwidth 203.00 kHz, 2G4 and compatible with LR112x chips only + LR1121_MODEM_RADIO_LORA_BW_400 = 0x0E, //!< Bandwidth 406.00 kHz, 2G4 and compatible with LR112x chips only + LR1121_MODEM_RADIO_LORA_BW_800 = 0x0F, //!< Bandwidth 812.00 kHz, 2G4 and compatible with LR112x chips only +} lr1121_modem_radio_lora_bw_t; + +/*! + * @brief LoRa Coding Rate configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_NO_CR = 0x00, //!< No Coding Rate + LR1121_MODEM_RADIO_LORA_CR_4_5 = 0x01, //!< Coding Rate 4/5 Short Interleaver + LR1121_MODEM_RADIO_LORA_CR_4_6 = 0x02, //!< Coding Rate 4/6 Short Interleaver + LR1121_MODEM_RADIO_LORA_CR_4_7 = 0x03, //!< Coding Rate 4/7 Short Interleaver + LR1121_MODEM_RADIO_LORA_CR_4_8 = 0x04, //!< Coding Rate 4/8 Short Interleaver + LR1121_MODEM_RADIO_LORA_CR_LI_4_5 = 0x05, //!< Coding Rate 4/5 Long Interleaver + LR1121_MODEM_RADIO_LORA_CR_LI_4_6 = 0x06, //!< Coding Rate 4/6 Long Interleaver + LR1121_MODEM_RADIO_LORA_CR_LI_4_8 = 0x07, //!< Coding Rate 4/8 Long Interleaver +} lr1121_modem_radio_lora_cr_t; + +/*! + * @brief Values for intermediary mode + */ +typedef enum +{ + LR1121_MODEM_RADIO_MODE_SLEEP = 0x00, //!< Sleep + LR1121_MODEM_RADIO_MODE_STANDBY_RC = 0x01, //!< Standby RC + LR1121_MODEM_RADIO_MODE_STANDBY_XOSC = 0x02, //!< Standby XOSC + LR1121_MODEM_RADIO_MODE_FS = 0x03 //!< Frequency Synthesis +} lr1121_modem_radio_intermediary_mode_t; + +/*! + * @brief GFSK Cyclic Redundancy Check configurations + * + * If this value is set to something other than CRC_OFF, a CRC is automatically computed and added after the end of the + * payload on transmitter side. On receiver side, the CRC check is automatically processed. + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_CRC_OFF = 0x01, //!< CRC check deactivated + LR1121_MODEM_RADIO_GFSK_CRC_1_BYTE = 0x00, + LR1121_MODEM_RADIO_GFSK_CRC_2_BYTES = 0x02, + LR1121_MODEM_RADIO_GFSK_CRC_1_BYTE_INV = 0x04, + LR1121_MODEM_RADIO_GFSK_CRC_2_BYTES_INV = 0x06, +} lr1121_modem_radio_gfsk_crc_type_t; + +/*! + * @brief GFSK data whitening configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_DC_FREE_OFF = 0x00, //!< Whitening deactivated + LR1121_MODEM_RADIO_GFSK_DC_FREE_WHITENING = 0x01, //!< Whitening enabled + LR1121_MODEM_RADIO_GFSK_DC_FREE_WHITENING_SX128X_COMP = 0x03, //!< Whitening enabled - SX128x compatibility +} lr1121_modem_radio_gfsk_dc_free_t; + +/*! + * @brief GFSK Header Type configurations + * + * This parameter indicates whether or not the payload length is sent and read over the air. + * + * If the payload length is known beforehand by both transmitter and receiver, therefore there is no need to send it + * over the air. Otherwise, setting this parameter to LR1121_MODEM_RADIO_GFSK_PKT_VAR_LEN will make the modem to + * automatically prepand a byte containing the payload length to the the payload on transmitter side. On receiver side, + * this first byte is read to set the payload length to read. + * + * This configuration is only available for GFSK packet types. + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_PKT_FIX_LEN = 0x00, //!< Payload length is not sent/read over the air + LR1121_MODEM_RADIO_GFSK_PKT_VAR_LEN = 0x01, //!< Payload length is sent/read over the air + LR1121_MODEM_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP = + 0x02, //!< Payload length is sent/read over the air - SX128x compatibility +} lr1121_modem_radio_gfsk_pkt_len_modes_t; + +/*! + * @brief GFSK Preamble Detector Length configurations + * + * This parameter sets the minimum length of preamble bits to be received to continue reception of incoming packet. If a + * packet with preamble length lower than this value is being received, the reception stops without generating IRQ. + * + * This parameter has no impact on TX operations. + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_PREAMBLE_DETECTOR_OFF = 0x00, + LR1121_MODEM_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_8BITS = 0x04, + LR1121_MODEM_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_16BITS = 0x05, + LR1121_MODEM_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_24BITS = 0x06, + LR1121_MODEM_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_32BITS = 0x07 +} lr1121_modem_radio_gfsk_preamble_detector_t; + +/*! + * @brief LoRa Cyclic Redundancy Check configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_CRC_OFF = 0x00, //!< CRC deactivated + LR1121_MODEM_RADIO_LORA_CRC_ON = 0x01, //!< CRC activated +} lr1121_modem_radio_lora_crc_t; + +/*! + * @brief LoRa Header type configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_PKT_EXPLICIT = 0x00, //!< Explicit header: transmitted over the air + LR1121_MODEM_RADIO_LORA_PKT_IMPLICIT = 0x01, //!< Implicit header: not transmitted over the air +} lr1121_modem_radio_lora_pkt_len_modes_t; + +/*! + * @brief LoRa IQ mode configurations + * + * LoRa IQ modes are mutually exclusives: a physical packet sent with standard IQ will not be received by a receiver + * configured with inverted IQ. + */ +typedef enum +{ + LR1121_MODEM_RADIO_LORA_IQ_STANDARD = 0x00, //!< IQ standard + LR1121_MODEM_RADIO_LORA_IQ_INVERTED = 0x01, //!< IQ inverted +} lr1121_modem_radio_lora_iq_t; + +/*! + * @brief Packet type values + */ +typedef enum +{ + LR1121_MODEM_RADIO_PKT_NONE = 0x00, //!< State after cold start + LR1121_MODEM_RADIO_PKT_TYPE_GFSK = 0x01, //!< GFSK modulation + LR1121_MODEM_RADIO_PKT_TYPE_LORA = 0x02, //!< LoRa modulation + LR1121_MODEM_RADIO_PKT_TYPE_BPSK = 0x03, //!< BPSK modulation + LR1121_MODEM_RADIO_PKT_TYPE_LR_FHSS = 0x04, //!< LR-FHSS modulation +} lr1121_modem_radio_pkt_type_t; + +/*! + * @brief Select power amplifier supply source + */ +typedef enum +{ + LR1121_MODEM_RADIO_PA_REG_SUPPLY_VREG = 0x00, //!< Power amplifier supplied by the main regulator + LR1121_MODEM_RADIO_PA_REG_SUPPLY_VBAT = 0x01 //!< Power amplifier supplied by the battery +} lr1121_modem_radio_pa_reg_supply_t; + +/*! + * @brief RX Duty Cycle Modes + */ +typedef enum +{ + LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_RX = 0x00, //!< LoRa/GFSK: Uses Rx for listening to packets + LR1121_MODEM_RADIO_RX_DUTY_CYCLE_MODE_CAD = 0x01, //!< Only in LoRa: Uses CAD to listen for over-the-air activity +} lr1121_modem_radio_rx_duty_cycle_mode_t; + +/*! + * @brief GFSK Bandwidth configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_BW_4800 = 0x1F, //!< Bandwidth 4.8 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_5800 = 0x17, //!< Bandwidth 5.8 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_7300 = 0x0F, //!< Bandwidth 7.3 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_9700 = 0x1E, //!< Bandwidth 9.7 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_11700 = 0x16, //!< Bandwidth 11.7 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_14600 = 0x0E, //!< Bandwidth 14.6 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_19500 = 0x1D, //!< Bandwidth 19.5 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_23400 = 0x15, //!< Bandwidth 23.4 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_29300 = 0x0D, //!< Bandwidth 29.3 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_39000 = 0x1C, //!< Bandwidth 39.0 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_46900 = 0x14, //!< Bandwidth 46.9 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_58600 = 0x0C, //!< Bandwidth 58.6 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_78200 = 0x1B, //!< Bandwidth 78.2 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_93800 = 0x13, //!< Bandwidth 93.8 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_117300 = 0x0B, //!< Bandwidth 117.3 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_156200 = 0x1A, //!< Bandwidth 156.2 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_187200 = 0x12, //!< Bandwidth 187.2 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_234300 = 0x0A, //!< Bandwidth 232.3 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_312000 = 0x19, //!< Bandwidth 312.0 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_373600 = 0x11, //!< Bandwidth 373.6 kHz DSB + LR1121_MODEM_RADIO_GFSK_BW_467000 = 0x09 //!< Bandwidth 467.0 kHz DSB +} lr1121_modem_radio_gfsk_bw_t; + +/*! + * @brief Possible automatic actions when Channel Activity Detection operations terminate + * + * For RADIO_EXIT_MODE_CAD_RX, LR1121 enters RX mode on activity detected. The timeout value for this RX operation is + * defined as: + * + * \f$ 31.25us \times timeout \f$ + * + * With \f$ timeout \f$ defined in RadioCadParams_t::timeout + * + * If the CAD operation is negative with RADIO_CAD_EXIT_MODE_RX or if CAD operation is positive with + * RADIO_CAD_EXIT_MODE_TX, therefore the LR1121 enters Standby RC mode. + */ +typedef enum +{ + LR1121_MODEM_RADIO_CAD_EXIT_MODE_STANDBYRC = 0x00, //!< Enter standby RC mode after CAD operation + LR1121_MODEM_RADIO_CAD_EXIT_MODE_RX = 0x01, //!< Enter in RX mode if an activity is detected + LR1121_MODEM_RADIO_CAD_EXIT_MODE_TX = 0x10, //!< Enter in TX mode if no activity is detected +} lr1121_modem_radio_cad_exit_mode_t; + +/*! + * @brief Pulse shape configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_GFSK_PULSE_SHAPE_OFF = 0x00, //!< No filter applied + LR1121_MODEM_RADIO_GFSK_PULSE_SHAPE_BT_03 = 0x08, //!< Gaussian BT 0.3 + LR1121_MODEM_RADIO_GFSK_PULSE_SHAPE_BT_05 = 0x09, //!< Gaussian BT 0.5 + LR1121_MODEM_RADIO_GFSK_PULSE_SHAPE_BT_07 = 0x0A, //!< Gaussian BT 0.7 + LR1121_MODEM_RADIO_GFSK_PULSE_SHAPE_BT_1 = 0x0B //!< Gaussian BT 1.0 +} lr1121_modem_radio_gfsk_pulse_shape_t; + +/*! + * @brief BPSK pulse shape configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_DBPSK_PULSE_SHAPE = 0x16, //!< Double OSR / RRC / BT 0.7 +} lr1121_modem_radio_bpsk_pulse_shape_t; + +/*! + * @brief LR-FHSS bitrate configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LR_FHSS_BITRATE_488_BPS = + ( int ) ( LR1121_MODEM_RADIO_LR_FHSS_BITRATE_DIVIDE_BY_256 + + LR1121_MODEM_RADIO_LR_FHSS_BITRATE_IN_256_BPS_STEPS ), //!< 488.28215 bps +} lr1121_modem_radio_lr_fhss_bitrate_t; + +/*! + * @brief LR-FHSS pulse shape configurations + */ +typedef enum +{ + LR1121_MODEM_RADIO_LR_FHSS_PULSE_SHAPE_BT_1 = 0x0B //!< Gaussian BT 1.0 +} lr1121_modem_radio_lr_fhss_pulse_shape_t; + +/*! + * @brief Channel Activity Detection parameters + * + * Parameters detPeak and detMin are to be used for tuning the sensitivity of Channel Activity Detection. It depends on + * Spreading Factor, Bandwidth and symbolNum. + * + * For detPeak, the 5 MSBits are encoding the integer part, the 3 LSBits are encoding 1/8 of the decimal part. For + * instance, \f$detPeak = 50\f$ (= 0x32) leads to a ratio being \f$6 + 2 * 1/8 = 6.25\f$. + * + * detMin is unit free and represents the ratio between the minimal power of a correlation peak and measurement gain + * that can be considered as a peak detection. It helps to avoid detection on noise. Authorized values a from 0 to 181. + */ +typedef struct lr1121_modem_radio_cad_params_s +{ + uint8_t cad_symb_nb; //!< Number of symbols used for CAD detection + uint8_t cad_detect_peak; //!< Ratio for CAD between correlator peak and average + //!< (Default 0x32) + uint8_t cad_detect_min; //!< Minimum power of the correlation peak to be + //!< considered as a positive CAD (Default 0x0A) + lr1121_modem_radio_cad_exit_mode_t cad_exit_mode; //!< Automated action on CAD completion + uint32_t cad_timeout; //!< Value used to compute timeout +} lr1121_modem_radio_cad_params_t; + +/*! + * @brief Status of GFSK received packet + */ +typedef struct lr1121_modem_radio_pkt_status_gfsk_s +{ + int8_t rssi_sync_in_dbm; //!< RSSI value latched on detection of the last received packet Sync Address + int8_t rssi_avg_in_dbm; //!< RSSI averaged over the payload of the last received packet + uint8_t rx_len_in_bytes; //!< Length of the last received packet [Bytes] + bool is_addr_err; //!< Address filtering status. Asserted if received packet address does not match node address + //!< nor broadcast address + bool is_crc_err; //!< CRC status of the current packet (applicable only in RX, with CRC enabled) + bool is_len_err; //!< Asserted when the length of last received packet is greater than the maximal length + //!< (applicable only in RX with variable length packet) + bool is_abort_err; //!< Asserted when the current packet has been aborted (applicable in RX and TX) + bool is_received; //!< Asserted when packet reception is done (applicable in RX) + bool is_sent; //!< Asserted when packet transmission is done (applicable in TX) +} lr1121_modem_radio_pkt_status_gfsk_t; + +/*! + * @brief Status of received packet + */ +typedef struct lr1121_modem_radio_pkt_status_lora_s +{ + int8_t rssi_pkt_in_dbm; //!< Average RSSI over last received packet. + int8_t snr_pkt_in_db; //!< SNR estimated on last received packet. + int8_t signal_rssi_pkt_in_dbm; //!< RSSI of last packet latched after +} lr1121_modem_radio_pkt_status_lora_t; + +/*! + * @brief Length and offset of received packet + */ +typedef struct lr1121_modem_radio_rx_buffer_status_s +{ + uint8_t pld_len_in_bytes; //!< Length of received packet [Bytes] + uint8_t buffer_start_pointer; //!< Offset in the reception buffer of + //!< first byte received [Bytes] +} lr1121_modem_radio_rx_buffer_status_t; + +/*! + * @brief GFSK packet statistic structure + */ +typedef struct lr1121_modem_radio_stats_gfsk_s +{ + uint16_t nb_pkt_received; //!< Total number of received packets + uint16_t nb_pkt_crc_error; //!< Total number of received packets with CRC error + uint16_t nb_pkt_len_error; //!< Total number of received packets with a length error +} lr1121_modem_radio_stats_gfsk_t; + +/*! + * @brief LoRa packet statistic structure + */ +typedef struct lr1121_modem_radio_stats_lora_s +{ + uint16_t nb_pkt_received; //!< Total number of received packets + uint16_t nb_pkt_crc_error; //!< Total number of received packets with CRC error + uint16_t nb_pkt_header_error; //!< Total number of packets with header error + uint16_t nb_pkt_falsesync; //!< Total number of false sync +} lr1121_modem_radio_stats_lora_t; + +/*! + * @brief Modulation configuration for GFSK packet + */ +typedef struct lr1121_modem_radio_mod_params_gfsk_s +{ + uint32_t br_in_bps; //!< GFSK bitrate [bit/s] + lr1121_modem_radio_gfsk_pulse_shape_t pulse_shape; //!< GFSK pulse shape + lr1121_modem_radio_gfsk_bw_t bw_dsb_param; //!< GFSK bandwidth + uint32_t fdev_in_hz; //!< GFSK frequency deviation [Hz] +} lr1121_modem_radio_mod_params_gfsk_t; + +/*! + * @brief Modulation configuration for BPSK packet + */ +typedef struct lr1121_modem_radio_mod_params_bpsk_s +{ + uint32_t br_in_bps; //!< BPSK bitrate [bit/s] + lr1121_modem_radio_bpsk_pulse_shape_t pulse_shape; //!< BPSK pulse shape +} lr1121_modem_radio_mod_params_bpsk_t; + +/*! + * @brief Modulation configuration for LoRa packet + */ +typedef struct lr1121_modem_radio_mod_params_lora_s +{ + lr1121_modem_radio_lora_sf_t sf; //!< LoRa spreading factor + lr1121_modem_radio_lora_bw_t bw; //!< LoRa bandwidth + lr1121_modem_radio_lora_cr_t cr; //!< LoRa coding rate + uint8_t ldro; //!< LoRa LDRO +} lr1121_modem_radio_mod_params_lora_t; + +/*! + * @brief Modulation configuration for LR-FHSS packets + */ +typedef struct lr1121_modem_radio_mod_params_lr_fhss_s +{ + lr1121_modem_radio_lr_fhss_bitrate_t br_in_bps; //!< LR-FHSS bitrate + lr1121_modem_radio_lr_fhss_pulse_shape_t pulse_shape; //!< LR-FHSS pulse shape +} lr1121_modem_radio_mod_params_lr_fhss_t; + +/*! + * @brief Packet parameter configuration for GFSK packets + */ +typedef struct lr1121_modem_radio_pkt_params_gfsk_s +{ + uint16_t preamble_len_in_bits; //!< GFSK Preamble length [bits] + lr1121_modem_radio_gfsk_preamble_detector_t preamble_detector; //!< GFSK Preamble detection configuration + uint8_t sync_word_len_in_bits; //!< GFSK Syncword length [bits] + lr1121_modem_radio_gfsk_address_filtering_t address_filtering; //!< GFSK Address filtering/comparison configuration + lr1121_modem_radio_gfsk_pkt_len_modes_t header_type; //!< GFSK Header type configuration + uint8_t pld_len_in_bytes; //!< GFSK Payload length [bytes] + lr1121_modem_radio_gfsk_crc_type_t crc_type; //!< GFSK CRC configuration + lr1121_modem_radio_gfsk_dc_free_t dc_free; //!< GFSK Whitening configuration +} lr1121_modem_radio_pkt_params_gfsk_t; + +/*! + * @brief Packet parameter configuration for BPSK packets + */ +typedef struct lr1121_modem_radio_pkt_params_bpsk_s +{ + uint8_t pld_len_in_bytes; //!< Payload length [bytes] + uint16_t ramp_up_delay; //!< Delay to fine tune ramp-up time, if non-zero + uint16_t ramp_down_delay; //!< Delay to fine tune ramp-down time, if non-zero + uint16_t pld_len_in_bits; //!< If non-zero, used to ramp down PA before end of a payload with length that is not a + //!< multiple of 8. pld_len_in_bits <= pld_len_in_bytes * 8 +} lr1121_modem_radio_pkt_params_bpsk_t; + +/*! + * @brief Packet parameter configuration for LoRa packets + */ +typedef struct lr1121_modem_radio_pkt_params_lora_s +{ + uint16_t preamble_len_in_symb; //!< LoRa Preamble length [symbols] + lr1121_modem_radio_lora_pkt_len_modes_t header_type; //!< LoRa Header type configuration + uint8_t pld_len_in_bytes; //!< LoRa Payload length [bytes] + lr1121_modem_radio_lora_crc_t crc; //!< LoRa CRC configuration + lr1121_modem_radio_lora_iq_t iq; //!< LoRa IQ configuration +} lr1121_modem_radio_pkt_params_lora_t; + +/*! + * @brief Configuration of Power Amplifier + * + * @p pa_duty_cycle controls the duty cycle of Power Amplifier according to: + * \f$ dutycycle = 0.2 + 0.04 \times pa\_duty\_cycle \f$ + * It can be used to adapt the TX multi-band operation using a single-matching network. + * + * The allowed duty cycle values for LPA are from 0.2 to 0.48 (by step of 0.04). Therefore possible values for + * pa_duty_cycle go from 0 to 7. + * + * The allowed duty cycle values for HPA go from 0.2 to 0.36 (by step of 0.04). Therefore in this case, the possible + * values for pa_duty_cycle go from 0 to 4. + * + * @p pa_hp_sel controls the number of slices for HPA according to: \f$ \#slices = pa\_hp\_sel + 1 \f$ + */ +typedef struct lr1121_modem_radio_pa_cfg_s +{ + lr1121_modem_radio_pa_selection_t pa_sel; //!< Power Amplifier selection + lr1121_modem_radio_pa_reg_supply_t pa_reg_supply; //!< Power Amplifier regulator supply source + uint8_t pa_duty_cycle; //!< Power Amplifier duty cycle (Default 0x04) + uint8_t pa_hp_sel; //!< Number of slices for HPA (Default 0x07) +} lr1121_modem_radio_pa_cfg_t; + +/*! + * @brief RSSI calibration table + */ +typedef struct lr1121_modem_radio_rssi_calibration_table_s +{ + struct + { + uint8_t g4; + uint8_t g5; + uint8_t g6; + uint8_t g7; + uint8_t g8; + uint8_t g9; + uint8_t g10; + uint8_t g11; + uint8_t g12; + uint8_t g13; + uint8_t g13hp1; + uint8_t g13hp2; + uint8_t g13hp3; + uint8_t g13hp4; + uint8_t g13hp5; + uint8_t g13hp6; + uint8_t g13hp7; + } gain_tune; //!< Used to set gain tune value for RSSI calibration + + int16_t gain_offset; //!< Used to set gain offset value for RSSI calibration +} lr1121_modem_radio_rssi_calibration_table_t; + +/*! + * @brief Values to use to setup LNA LF0 configuration + * + * LNA can be configured in either of the 3 modes: Single N, Single P or differential (which is default) + * + */ +typedef enum +{ + LR1121_MODEM_RADIO_LNA_MODE_SINGLE_RFI_N_LF0 = 1, //!< Use only RFI_N_LF0 antenna + LR1121_MODEM_RADIO_LNA_MODE_SINGLE_RFI_P_LF0 = 2, //!< Use only RFI_P_LF0 antenna + LR1121_MODEM_RADIO_LNA_MODE_DIFFERENTIAL_LF0 = 3 //!< Configure LNA LF0 in differential mode (default) +} lr1121_modem_radio_lna_mode_t; +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_RADIO_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_regmem.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_regmem.h new file mode 100755 index 0000000..ecbb611 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_regmem.h @@ -0,0 +1,209 @@ +/*! + * @file lr1121_modem_regmem.h + * + * @brief Register/memory driver definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_REGMEM_H +#define LR1121_MODEM_REGMEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr1121_modem_common.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Maximum number of words that can be written to / read from a LR1121 chip with regmem32 commands + */ +#define LR1121_MODEM_REGMEM_MAX_WRITE_READ_WORDS 64 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Write up to 64 words into register memory space of LR1121. + * + * A word is 32-bit long. The writing operations write contiguously in register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start writing operation + * @param [in] buffer The buffer of words to write into memory. Its size must be enough to contain length words. + * @param [in] length Number of words to write into memory + * + * @returns Operation status + * + * @see lr1121_modem_regmem_read_regmem32 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_write_regmem32( const void* context, const uint32_t address, + const uint32_t* buffer, const uint8_t length ); + +/*! + * @brief Read up to 64 words into register memory space of LR1121. + * + * A word is 32-bit long. The reading operations read contiguously from register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start reading operation + * @param [in] length Number of words to read from memory + * @param [out] buffer Pointer to a words array to be filled with content from memory. Its size must be enough to + * contain at least length words. + * + * @returns Operation status + * + * @see lr1121_modem_regmem_write_regmem32 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_read_regmem32( const void* context, const uint32_t address, + uint32_t* buffer, const uint8_t length ); + +/*! + * @brief Write bytes into register memory space of LR1121. + * + * A byte is 8-bit long. The writing operations write contiguously in register memory, starting at the address provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start writing operation + * @param [in] buffer The buffer of bytes to write into memory. Its size must be enough to contain length bytes + * @param [in] length Number of bytes to write into memory + * + * @returns Operation status + * + * @see lr1121_modem_regmem_read_mem8 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_write_mem8( const void* context, const uint32_t address, + const uint8_t* buffer, const uint8_t length ); + +/*! + * @brief Read bytes into register memory space of LR1121. + * + * A byte is 8-bit long. The reading operations read contiguously from register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start reading operation + * @param [in] length Number of bytes to read from memory + * @param [in] buffer Pointer to a byte array to be filled with content from memory. Its size must be enough to contain + * at least length bytes + * + * @returns Operation status + * + * @see lr1121_modem_regmem_write_mem8 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_read_mem8( const void* context, const uint32_t address, + uint8_t* buffer, const uint8_t length ); + +/*! + * @brief Write bytes into radio TX buffer memory space of LR1121. + * + * @param [in] context Chip implementation context + * @param [in] buffer The buffer of bytes to write into radio buffer. Its size must be enough to contain length bytes + * @param [in] length Number of bytes to write into radio buffer + * + * @returns Operation status + * + * @see lr1121_modem_regmem_read_buffer8 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_write_buffer8( const void* context, const uint8_t* buffer, + const uint8_t length ); + +/*! + * @brief Read bytes from radio RX buffer memory space of LR1121. + * + * @param [in] context Chip implementation context + * @param [in] buffer Pointer to a byte array to be filled with content from radio buffer. Its size must be enough to + * contain at least length bytes + * @param [in] offset Memory offset to start reading + * @param [in] length Number of bytes to read from radio buffer + * + * @returns Operation status + * + * @see lr1121_modem_regmem_write_buffer8 + */ +lr1121_modem_response_code_t lr1121_modem_regmem_read_buffer8( const void* context, uint8_t* buffer, + const uint8_t offset, const uint8_t length ); + +/*! + * @brief Clear radio RX buffer + * + * Set to 0x00 all content of the radio RX buffer + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_regmem_clear_rxbuffer( const void* context ); + +/*! + * @brief Read-modify-write data at given register/memory address + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to be modified + * @param [in] mask The mask to be applied on read data + * @param [in] data The data to be written + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_regmem_write_regmem32_mask( const void* context, const uint32_t address, + const uint32_t mask, const uint32_t data ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_REGMEM_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay.h new file mode 100755 index 0000000..a5132bc --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay.h @@ -0,0 +1,99 @@ +/*! + * @file lr1121_modem_relay.h + * + * @brief Relay driver for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_RELAY_H +#define LR1121_MODEM_RELAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_common.h" +#include "lr1121_modem_relay_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Get the Tx relay configuration + * + * @param [in] context Chip implementation context + * @param [out] configuration Tx relay configuration + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_relay_get_tx_config( const void* context, + lr1121_modem_relay_tx_configuration_t* configuration ); + +/*! + * @brief Set the Tx relay configuration + * + * @param [in] context Chip implementation context + * @param [out] configuration Tx relay configuration to set + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_relay_set_tx_config( + const void* context, const lr1121_modem_relay_tx_configuration_t* configuration ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_RELAY_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay_types.h new file mode 100755 index 0000000..4031e20 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_relay_types.h @@ -0,0 +1,127 @@ +/*! + * @file lr1121_modem_relay_types.h + * + * @brief Relay driver types for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_RELAY_TYPES_H +#define LR1121_MODEM_RELAY_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief Relay activation + * + * Refer to LoRaWAN Relay specification document for details. + */ +typedef enum +{ + LR1121_MODEM_RELAY_ACTIVATION_DISABLE = 0x00, //!< The relay is disabled + LR1121_MODEM_RELAY_ACTIVATION_ENABLE = + 0x01, //!< The relay is enabled, even if no WOR ack nor downlink on RxR is received + LR1121_MODEM_RELAY_ACTIVATION_DYNAMIC = + 0x02, //!< The device automatically enable the relay if no downlink is received after several uplinks + LR1121_MODEM_RELAY_ACTIVATION_DEVICE_CONTROLLED = 0x03, //!< The device automatically enable or disable the relay +} lr1121_modem_relay_activation_t; + +/** + * @brief Smart level configuration + * + * Refer to LoRaWAN Relay specification document for details. + */ +typedef enum +{ + LR1121_MODEM_RELAY_SMART_LEVEL_8 = + 0x00, //!< The relay shall be enabled if no valid downlink is received during 8 consecutive uplinks + LR1121_MODEM_RELAY_SMART_LEVEL_16 = + 0x01, //!< The relay shall be enabled if no valid downlink is received during 16 consecutive uplinks + LR1121_MODEM_RELAY_SMART_LEVEL_32 = + 0x02, //!< The relay shall be enabled if no valid downlink is received during 32 consecutive uplinks + LR1121_MODEM_RELAY_SMART_LEVEL_64 = + 0x03, //!< The relay shall be enabled if no valid downlink is received during 64 consecutive uplinks +} lr1121_modem_relay_smart_level_t; + +/** + * @brief Configuration of relay Tx + */ +typedef struct +{ + uint32_t wor_second_channel_frequency_hz; //!< Frequency of the second Wake On Radio channel (Hz) + uint32_t + wor_ack_second_channel_frequency_hz; //!< Frequency of the second Wake On Radio acknowledgment channel (Hz) + uint8_t wor_second_channel_datarate; //!< Datarate of the second Wake On Radio chanel + uint8_t wor_second_channel_enable; //!< Wake On Radio second channel enable + uint8_t backoff_behavior; //!< Indicate number of missed ACK tolerated before sending the LoRaWAN uplink. Possible + //!< values in [0:63] (0 means the LoRaWAN uplink is always sent) + lr1121_modem_relay_activation_t activation; //!< Relay activation configuration + lr1121_modem_relay_smart_level_t smart_level; //!< Smart level configuration. Only valid if @ref activation is set + //!< to @ref LR1121_MODEM_RELAY_ACTIVATION_DYNAMIC + uint8_t missed_ack_to_unsynchronized_threshold; //!< Number of consecutively WOR ACK to miss before switching to + //!< unsynchronized state +} lr1121_modem_relay_tx_configuration_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_RELAY_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system.h new file mode 100755 index 0000000..545b7a7 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system.h @@ -0,0 +1,606 @@ +/*! + * @file lr1121_modem_system.h + * + * @brief System driver definition for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_SYSTEM_H +#define LR1121_MODEM_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "lr1121_modem_common.h" +#include "lr1121_modem_system_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Frequency step in MHz used to compute the image calibration parameter + * + * @see lr1121_modem_system_calibrate_image_in_mhz + */ +#define LR1121_MODEM_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ 4 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Reset the radio + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_reset( const void* context ); + +/** + * @brief Wake the radio up from sleep mode. + * + * @param [in] context Chip implementation context. + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_wakeup( const void* context ); + +/*! + * @brief Return stat1, stat2, and irq_status + * + * @param [in] context Chip implementation context + * @param [out] stat1 Pointer to a variable for holding stat1. Can be NULL. + * @param [out] stat2 Pointer to a variable for holding stat2. Can be NULL. + * @param [out] irq_status Pointer to a variable for holding irq_status. Can be NULL. + * + * @returns Operation status + * + * @remark To simplify system integration, this function does not actually execute the GetStatus command, which would + * require bidirectional SPI communication. It obtains the stat1, stat2, and irq_status values by performing an ordinary + * SPI read (which is required to send null/NOP bytes on the MOSI line). This is possible since the LR1121 returns these + * values automatically whenever a read that does not directly follow a response-carrying command is performed. + * Unlike with the GetStatus command, however, the reset status information is NOT cleared by this command. The function + * @ref lr1121_modem_system_clear_reset_status_info may be used for this purpose when necessary. + */ +lr1121_modem_response_code_t lr1121_modem_system_get_status( const void* context, lr1121_modem_system_stat1_t* stat1, + lr1121_modem_system_stat2_t* stat2, + lr1121_modem_system_irq_mask_t* irq_status ); + +/*! + * @brief Clear the reset status information stored in stat2 + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_clear_reset_status_info( const void* context ); + +/*! + * @brief Return irq_status + * + * @param [in] context Chip implementation context + * @param [out] irq_status irq_status status variable + * + * @returns Operation status + */ +static inline lr1121_modem_response_code_t lr1121_modem_system_get_irq_status( + const void* context, lr1121_modem_system_irq_mask_t* irq_status ) +{ + return lr1121_modem_system_get_status( context, 0, 0, irq_status ); +} + +/*! + * @brief Return the version of the system (hardware and software) + * + * @param [in] context Chip implementation context + * @param [out] version Pointer to the structure holding the system version + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_get_version( const void* context, + lr1121_modem_system_version_t* version ); + +/*! + * @brief Return the system errors + * + * Errors may be fixed following: + * - calibration error can be fixed by attempting another RC calibration; + * - XOsc related errors may be due to hardware problems, can be fixed by reset; + * - PLL lock related errors can be due to not-locked PLL, or by attempting to use an out-of-band frequency, can be + * fixed by executing a PLL calibration, or by using other frequencies. + * + * @param [in] context Chip implementation context + * @param [out] errors Pointer to a value holding error flags + * + * @returns Operation status + * + * @see lr1121_modem_system_calibrate, lr1121_modem_system_calibrate_image, lr1121_modem_system_clear_errors + */ +lr1121_modem_response_code_t lr1121_modem_system_get_errors( const void* context, uint16_t* errors ); + +/*! + * @brief Clear all error flags pending. + * + * This function cannot be used to clear flags individually. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr1121_modem_system_get_errors + */ +lr1121_modem_response_code_t lr1121_modem_system_clear_errors( const void* context ); + +/*! + * @brief lr1121_modem_system_calibrate the requested blocks + * + * This function can be called in any mode of the chip. + * + * The chip will return to standby RC mode on exit. Potential calibration issues can be read out with + * lr1121_modem_system_get_errors command. + * + * @param [in] context Chip implementation context + * @param [in] calib_param Structure holding the reference to blocks to be calibrated + * + * @returns Operation status + * + * @see lr1121_modem_system_get_errors + */ +lr1121_modem_response_code_t lr1121_modem_system_calibrate( const void* context, const uint8_t calib_param ); + +/*! + * @brief Configure the regulator mode to be used in specific modes + * + * This function shall only be called in standby RC mode. + * + * The reg_mode parameter defines if the DC-DC converter is switched on in the following modes: STANDBY XOSC, FS, RX, TX + * and RX_CAPTURE. + * + * @param [in] context Chip implementation context + * @param [in] reg_mode Regulator mode configuration + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_set_reg_mode( const void* context, + const lr1121_modem_system_reg_mode_t reg_mode ); + +/*! + * @brief Launch an image calibration valid for all frequencies inside an interval, in steps + * + * This function can be called in any mode of the chip. + * + * The chip will return to standby RC mode on exit. Potential calibration issues can be read out with + * lr1121_modem_system_get_errors command. + * + * The frequencies given in parameters are defined in 4MHz step (Eg. 900MHz corresponds to 0xE1). If freq1 = freq2, only + * one calibration is performed. + * + * @param [in] context Chip implementation context + * @param [in] freq1 Image calibration interval lower bound, in steps + * @param [in] freq2 Image calibration interval upper bound, in steps + * + * @remark freq1 must be less than or equal to freq2 + * + * @returns Operation status + * + * @see lr1121_modem_system_get_errors + */ +lr1121_modem_response_code_t lr1121_modem_system_calibrate_image( const void* context, const uint8_t freq1, + const uint8_t freq2 ); + +/*! + * @brief Launch an image calibration valid for all frequencies inside an interval, in MHz + * + * @remark This function relies on @ref lr1121_modem_system_calibrate_image + * + * @param [in] context Chip implementation context + * @param [in] freq1_in_mhz Image calibration interval lower bound, in MHz + * @param [in] freq2_in_mhz Image calibration interval upper bound, in MHz + * + * @remark freq1 must be less than or equal to freq2 + * + * @returns Operation status + * + * @see lr1121_modem_system_calibrate_image + */ +lr1121_modem_response_code_t lr1121_modem_system_calibrate_image_in_mhz( const void* context, + const uint16_t freq1_in_mhz, + const uint16_t freq2_in_mhz ); + +/*! + * @brief Set the RF switch configurations for each RF setup + * + * This function shall only be called in standby RC mode. + * + * By default, no DIO is used to control a RF switch. All DIOs are set in High-Z mode. + * + * @param [in] context Chip implementation context + * @param [in] rf_switch_cfg Pointer to a structure that holds the switches configuration + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_set_dio_as_rf_switch( + const void* context, const lr1121_modem_system_rfswitch_cfg_t* rf_switch_cfg ); + +/*! + * @brief Set which interrupt signals are redirected to the dedicated DIO pin + * + * By default, no interrupt signal is redirected. + * + * The dedicated DIO pin will remain asserted until all redirected interrupt signals are cleared with a call to + * lr1121_modem_system_clear_irq_status. + * + * @param [in] context Chip implementation context + * @param [in] irqs_to_enable_dio1 Variable that holds the interrupt mask for dio1 + * @param [in] irqs_to_enable_dio2 Variable that holds the interrupt mask for dio2 + * + * @returns Operation status + * + * @see lr1121_modem_system_clear_irq_status + */ +lr1121_modem_response_code_t lr1121_modem_system_set_dio_irq_params( + const void* context, const lr1121_modem_system_irq_mask_t irqs_to_enable_dio1, + const lr1121_modem_system_irq_mask_t irqs_to_enable_dio2 ); + +/*! + * @brief Clear requested bits in the internal pending interrupt register + * + * @param [in] context Chip implementation context + * @param [in] irqs_to_clear Variable that holds the interrupts to be cleared + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_clear_irq_status( const void* context, + const lr1121_modem_system_irq_mask_t irqs_to_clear ); + +/** + * @brief This helper function clears any radio irq status flags that are set and returns the flags that were cleared. + * + * @param [in] context Chip implementation context. + * @param [out] irq Pointer to a variable for holding the system interrupt status. Can be NULL. + * + * @returns Operation status + * + * @see lr1121_modem_system_get_irq_status, lr1121_modem_system_clear_irq_status + */ +lr1121_modem_response_code_t lr1121_modem_system_get_and_clear_irq_status( const void* context, + lr1121_modem_system_irq_mask_t* irq ); + +/*! + * @brief Defines which clock is used as Low Frequency (LF) clock + * + * @param [in] context Chip implementation context + * @param [in] lfclock_cfg Low frequency clock configuration + * @param [in] wait_for_32k_ready Tells the radio if it has to check if 32k source is ready before driving busy low + * + * @returns Operation status + * + * @see lr1121_modem_system_calibrate, lr1121_modem_system_calibrate_image + */ +lr1121_modem_response_code_t lr1121_modem_system_cfg_lfclk( const void* context, + const lr1121_modem_system_lfclk_cfg_t lfclock_cfg, + const bool wait_for_32k_ready ); + +/*! + * @brief Enable and configure TCXO supply voltage and detection timeout + * + * This function shall only be called in standby RC mode. + * + * The timeout parameter is the maximum time the firmware waits for the TCXO to be ready. The timeout duration is given + * by: \f$ timeout\_duration\_us = timeout \times 30.52 \f$ + * + * The TCXO mode can be disabled by setting timeout parameter to 0. + * + * @param [in] context Chip implementation context + * @param [in] tune Supply voltage value + * @param [in] timeout Gating time before which the radio starts its Rx / Tx operation + * + * @returns Operation status + * + * @see lr1121_modem_system_calibrate, lr1121_modem_system_calibrate_image + */ +lr1121_modem_response_code_t lr1121_modem_system_set_tcxo_mode( const void* context, + const lr1121_modem_system_tcxo_supply_voltage_t tune, + const uint32_t timeout ); + +/*! + * @brief Software reset of the chip. + * + * This function should be used to reboot the chip in a specified mode. Rebooting in flash mode presumes that the + * content in flash memory is not corrupted (i.e. the integrity check performed by the bootloader before executing the + * first instruction in flash is OK). + * + * @param [in] context Chip implementation context + * @param [in] stay_in_bootloader Selector to stay in bootloader or execute flash code after reboot. If true, the + * bootloader will not execute the flash code but activate SPI interface to allow firmware upgrade + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_reboot( const void* context, const bool stay_in_bootloader ); + +/*! + * @brief Returns the value of Vbat + * + * Vbat value (in V) is a function of Vana (typ. 1.35V) using the following + * formula: \f$ Vbat_{V} = (5 \times \frac{Vbat}{255} - 1) \times Vana \f$ + * + * @param [in] context Chip implementation context + * @param [out] vbat A pointer to the Vbat value + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_get_vbat( const void* context, uint8_t* vbat ); + +/*! + * @brief Returns the value of Temp + * + * The temperature (in °C) is a function of Vana (typ. 1.35V), Vbe25 (Vbe voltage @ 25°C, typ. 0.7295V) and VbeSlope + * (typ. -1.7mV/°C) using the following formula: + * \f$ Temperature_{°C} = (\frac{Temp(10:0)}{2047} \times Vana - Vbe25) \times \frac{1000}{VbeSlope} + 25 \f$ + * + * @remark If a TCXO is used, make sure to configure it with @ref lr1121_modem_system_set_tcxo_mode before calling this + * function + * + * @param [in] context Chip implementation context + * @param [out] temp A pointer to the Temp value + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_get_temp( const void* context, uint16_t* temp ); + +/*! + * @brief Set the device into Sleep or Deep Sleep Mode + * + * The \p sleep_cfg parameter defines in which sleep mode is to use. + * + * The \p sleep_time parameter sets the sleep duration in number of clock cycles: + * \f$ sleep\_time\_ms = sleep\_time \times \frac{1}{32.768} \f$ + * + * @param [in] context Chip implementation context + * @param [in] sleep_cfg Sleep mode configuration + * @param [in] sleep_time Value of the RTC timeout (if RtcTimeout = 1) + * + * @returns Operation status + * + * @see lr1121_modem_system_set_standby, lr1121_modem_system_set_fs + */ +lr1121_modem_response_code_t lr1121_modem_system_set_sleep( const void* context, + const lr1121_modem_system_sleep_cfg_t sleep_cfg, + const uint32_t sleep_time ); + +/*! + * @brief Set the device into the requested Standby mode + * + * @param [in] context Chip implementation context + * @param [in] standby_cfg Stand by mode configuration (RC or XOSC) + * + * @returns Operation status + * + * @see lr1121_modem_system_set_sleep, lr1121_modem_system_set_fs + */ +lr1121_modem_response_code_t lr1121_modem_system_set_standby( const void* context, + const lr1121_modem_system_standby_cfg_t standby_cfg ); + +/*! + * @brief Set the device into Frequency Synthesis (FS) mode + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr1121_modem_system_set_standby, lr1121_modem_system_set_sleep + */ +lr1121_modem_response_code_t lr1121_modem_system_set_fs( const void* context ); + +/*! + * @brief Erase an info page + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page to be erased. Only LR1121_MODEM_SYSTEM_INFOPAGE_1 is allowed. + * + * @returns Operation status + * + * @see lr1121_modem_system_write_infopage, lr1121_modem_system_read_infopage + */ +lr1121_modem_response_code_t lr1121_modem_system_erase_infopage( const void* context, + const lr1121_modem_system_infopage_id_t info_page_id ); + +/*! + * @brief Write data in an info page + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page where data are written. Only LR1121_MODEM_SYSTEM_INFOPAGE_1 is allowed. + * @param [in] address Address within the info page (aligned on 32-bit data) + * @param [in] data Pointer to the data to write (data buffer shall be - at least - length words long) + * @param [in] length Number of 32-bit data to write (maximum value is 64) + * + * @returns Operation status + * + * @see lr1121_modem_system_erase_infopage, lr1121_modem_system_read_infopage + */ +lr1121_modem_response_code_t lr1121_modem_system_write_infopage( const void* context, + const lr1121_modem_system_infopage_id_t info_page_id, + const uint16_t address, const uint32_t* data, + const uint8_t length ); + +/*! + * @brief Read data from an info page + * + * It is possible to cross from page 0 to 1 if (address + length >= 512) + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page where data are read + * @param [in] address Address within the info page (aligned on 32-bit data) + * @param [out] data Pointer to the data to read (data buffer shall be - at least - length words long) + * @param [in] length Number of 32-bit data to read (maximum value is 64) + * + * @returns Operation status + * + * @see lr1121_modem_system_erase_infopage, lr1121_modem_system_write_infopage + */ +lr1121_modem_response_code_t lr1121_modem_system_read_infopage( const void* context, + const lr1121_modem_system_infopage_id_t info_page_id, + const uint16_t address, uint32_t* data, + const uint8_t length ); + +/*! + * @brief Read and return the Unique Identifier of the LR1121 + * + * @param [in] context Chip implementation context + * @param [out] unique_identifier The buffer to be filled with the Unique Identifier of the LR1121. It is up to the + * application to ensure unique_identifier is long enough to hold the unique identifier + * + * @returns Operation status + * + * @see LR1121_MODEM_SYSTEM_UID_LENGTH + */ +lr1121_modem_response_code_t lr1121_modem_system_read_uid( const void* context, + lr1121_modem_system_uid_t unique_identifier ); + +/*! + * @brief Read and return the Join EUI of the LR1121 + * + * @param [in] context Chip implementation context + * @param [out] join_eui The buffer to be filled with Join EUI of the LR1121. It is up to the application to ensure + * join_eui is long enough to hold the join EUI + * + * @returns Operation status + * + * @see LR1121_MODEM_SYSTEM_JOIN_EUI_LENGTH + */ +lr1121_modem_response_code_t lr1121_modem_system_read_join_eui( const void* context, + lr1121_modem_system_join_eui_t join_eui ); + +/*! + * @brief Compute and return the PIN of the LR1121 based on factory default EUIs + * + * @remark Calling this command also triggers a derivation of network and application keys based on factory default EUIs + * + * @param [in] context Chip implementation context + * @param [out] pin The buffer to be filled with PIN of the LR1121. It is up to the application to ensure pin is long + * enough to hold the PIN + * + * @returns Operation status + * + * @see LR1121_MODEM_SYSTEM_PIN_LENGTH + */ +lr1121_modem_response_code_t lr1121_modem_system_read_pin( const void* context, lr1121_modem_system_pin_t pin ); + +/*! + * @brief Compute and return the PIN of the LR1121 based on EUIs provided as parameters + * + * @remark Calling this command also triggers a derivation of network and application keys based on EUIs provided as + * parameters + * + * @param [in] context Chip implementation context + * @param [in] device_eui Custom Device EUI + * @param [in] join_eui Custom Join EUI + * @param [in] rfu Parameter RFU - shall be set to 0x00 + * @param [out] pin The buffer to be filled with PIN of the LR1121. It is up to the application to ensure pin is long + * enough to hold the PIN + * + * @returns Operation status + * + * @see LR1121_MODEM_SYSTEM_PIN_LENGTH + */ +lr1121_modem_response_code_t lr1121_modem_system_read_pin_custom_eui( const void* context, + lr1121_modem_system_uid_t device_eui, + lr1121_modem_system_join_eui_t join_eui, + uint8_t rfu, lr1121_modem_system_pin_t pin ); + +/*! + * @brief Read and return a 32-bit random number + * + * @remark Radio operating mode must be set into standby. + * + * @param [in] context Chip implementation context + * @param [out] random_number 32-bit random number + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_get_random_number( const void* context, uint32_t* random_number ); + +/*! + * @brief Enable the CRC on SPI transactions + * + * @remark This command shall always be sent with a CRC (to both enable and disable the feature). The function does not + * take care of this additional byte - which is under the responsibility of the underlying HAL functions + * + * @param [in] context Chip implementation context + * @param [in] enable_crc CRC + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_enable_spi_crc( const void* context, bool enable_crc ); + +/*! + * @brief Configure the GPIO drive in sleep mode + * + * @remark GPIO stands for RF switch and IRQ line DIOs + * + * @note This command is available from firmware version 0x0306 + * + * @param [in] context Chip implementation context + * @param [in] enable_drive GPIO drive configuration (true: enabled / false: disabled) + * + * @returns Operation status + */ +lr1121_modem_response_code_t lr1121_modem_system_drive_dio_in_sleep_mode( const void* context, bool enable_drive ); + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_SYSTEM_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system_types.h new file mode 100755 index 0000000..badcede --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_modem_system_types.h @@ -0,0 +1,348 @@ +/*! + * @file lr1121_modem_system_types.h + * + * @brief System driver types for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_MODEM_SYSTEM_TYPES_H +#define LR1121_MODEM_SYSTEM_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Length of the LR1121 Unique Identifier in bytes + * + * The LR1121 Unique Identifiers is an 8 byte long buffer + */ +#define LR1121_MODEM_SYSTEM_UID_LENGTH ( 8 ) + +/** + * @brief Length of Join Unique Identifier in bytes + */ +#define LR1121_MODEM_SYSTEM_JOIN_EUI_LENGTH ( 8 ) + +/** + * @brief Length of PIN number in bytes + */ +#define LR1121_MODEM_SYSTEM_PIN_LENGTH ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief Fixed-length array to store a UID + */ +typedef uint8_t lr1121_modem_system_uid_t[LR1121_MODEM_SYSTEM_UID_LENGTH]; + +/** + * @brief Fixed-length array to store a joinEUI + */ +typedef uint8_t lr1121_modem_system_join_eui_t[LR1121_MODEM_SYSTEM_JOIN_EUI_LENGTH]; + +/** + * @brief Fixed-length array to store a PIN + */ +typedef uint8_t lr1121_modem_system_pin_t[LR1121_MODEM_SYSTEM_PIN_LENGTH]; + +/** + * @brief Type to store system interrupt flags + */ +typedef uint32_t lr1121_modem_system_irq_mask_t; + +/** + * @brief Interrupt flags + */ +enum lr1121_modem_system_irq_e +{ + LR1121_MODEM_SYSTEM_IRQ_NONE = ( 0 << 0 ), + LR1121_MODEM_SYSTEM_IRQ_TX_DONE = ( 1 << 2 ), + LR1121_MODEM_SYSTEM_IRQ_RX_DONE = ( 1 << 3 ), + LR1121_MODEM_SYSTEM_IRQ_PREAMBLE_DETECTED = ( 1 << 4 ), + LR1121_MODEM_SYSTEM_IRQ_SYNC_WORD_HEADER_VALID = ( 1 << 5 ), + LR1121_MODEM_SYSTEM_IRQ_HEADER_ERROR = ( 1 << 6 ), + LR1121_MODEM_SYSTEM_IRQ_CRC_ERROR = ( 1 << 7 ), + LR1121_MODEM_SYSTEM_IRQ_CAD_DONE = ( 1 << 8 ), + LR1121_MODEM_SYSTEM_IRQ_CAD_DETECTED = ( 1 << 9 ), + LR1121_MODEM_SYSTEM_IRQ_TIMEOUT = ( 1 << 10 ), + LR1121_MODEM_SYSTEM_IRQ_LR_FHSS_INTRA_PKT_HOP = ( 1 << 11 ), + LR1121_MODEM_SYSTEM_IRQ_EOL = ( 1 << 21 ), + LR1121_MODEM_SYSTEM_IRQ_CMD_ERROR = ( 1 << 22 ), + LR1121_MODEM_SYSTEM_IRQ_ERROR = ( 1 << 23 ), + LR1121_MODEM_SYSTEM_IRQ_FSK_LEN_ERROR = ( 1 << 24 ), + LR1121_MODEM_SYSTEM_IRQ_FSK_ADDR_ERROR = ( 1 << 25 ), + LR1121_MODEM_SYSTEM_IRQ_LORA_RX_TIMESTAMP = ( 1 << 27 ), + LR1121_MODEM_SYSTEM_IRQ_ALL_MASK = + LR1121_MODEM_SYSTEM_IRQ_TX_DONE | LR1121_MODEM_SYSTEM_IRQ_RX_DONE | LR1121_MODEM_SYSTEM_IRQ_PREAMBLE_DETECTED | + LR1121_MODEM_SYSTEM_IRQ_SYNC_WORD_HEADER_VALID | LR1121_MODEM_SYSTEM_IRQ_HEADER_ERROR | + LR1121_MODEM_SYSTEM_IRQ_CRC_ERROR | LR1121_MODEM_SYSTEM_IRQ_CAD_DONE | LR1121_MODEM_SYSTEM_IRQ_CAD_DETECTED | + LR1121_MODEM_SYSTEM_IRQ_TIMEOUT | LR1121_MODEM_SYSTEM_IRQ_LR_FHSS_INTRA_PKT_HOP | LR1121_MODEM_SYSTEM_IRQ_EOL | + LR1121_MODEM_SYSTEM_IRQ_CMD_ERROR | LR1121_MODEM_SYSTEM_IRQ_ERROR | LR1121_MODEM_SYSTEM_IRQ_FSK_LEN_ERROR | + LR1121_MODEM_SYSTEM_IRQ_FSK_ADDR_ERROR | LR1121_MODEM_SYSTEM_IRQ_LORA_RX_TIMESTAMP, +}; + +/** + * @brief Calibration flags + */ +enum lr1121_modem_system_calibration_e +{ + LR1121_MODEM_SYSTEM_CALIB_LF_RC_MASK = ( 1 << 0 ), + LR1121_MODEM_SYSTEM_CALIB_HF_RC_MASK = ( 1 << 1 ), + LR1121_MODEM_SYSTEM_CALIB_PLL_MASK = ( 1 << 2 ), + LR1121_MODEM_SYSTEM_CALIB_ADC_MASK = ( 1 << 3 ), + LR1121_MODEM_SYSTEM_CALIB_IMG_MASK = ( 1 << 4 ), + LR1121_MODEM_SYSTEM_CALIB_PLL_TX_MASK = ( 1 << 5 ), +}; + +/** + * @brief Type for calibration mask + * + * @see lr1121_modem_system_calibration_e + */ +typedef uint8_t lr1121_modem_system_cal_mask_t; + +/** + * @brief Error flags + */ +enum lr1121_modem_system_errors_e +{ + LR1121_MODEM_SYSTEM_ERRORS_LF_RC_CALIB_MASK = ( 1 << 0 ), + LR1121_MODEM_SYSTEM_ERRORS_HF_RC_CALIB_MASK = ( 1 << 1 ), + LR1121_MODEM_SYSTEM_ERRORS_ADC_CALIB_MASK = ( 1 << 2 ), + LR1121_MODEM_SYSTEM_ERRORS_PLL_CALIB_MASK = ( 1 << 3 ), + LR1121_MODEM_SYSTEM_ERRORS_IMG_CALIB_MASK = ( 1 << 4 ), + LR1121_MODEM_SYSTEM_ERRORS_HF_XOSC_START_MASK = ( 1 << 5 ), + LR1121_MODEM_SYSTEM_ERRORS_LF_XOSC_START_MASK = ( 1 << 6 ), + LR1121_MODEM_SYSTEM_ERRORS_PLL_LOCK_MASK = ( 1 << 7 ), +}; + +/** + * @brief Type for system errors mask + * + * @see lr1121_modem_system_errors_e + */ +typedef uint16_t lr1121_modem_system_errors_t; + +/** + * @brief Chip modes + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_CHIP_MODE_SLEEP = 0x00, + LR1121_MODEM_SYSTEM_CHIP_MODE_STBY_RC = 0x01, + LR1121_MODEM_SYSTEM_CHIP_MODE_STBY_XOSC = 0x02, + LR1121_MODEM_SYSTEM_CHIP_MODE_FS = 0x03, + LR1121_MODEM_SYSTEM_CHIP_MODE_RX = 0x04, + LR1121_MODEM_SYSTEM_CHIP_MODE_TX = 0x05, + LR1121_MODEM_SYSTEM_CHIP_MODE_LOC = 0x06, +} lr1121_modem_system_chip_modes_t; + +/** + * @brief Reset status + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_RESET_STATUS_CLEARED = 0x00, + LR1121_MODEM_SYSTEM_RESET_STATUS_ANALOG = 0x01, + LR1121_MODEM_SYSTEM_RESET_STATUS_EXTERNAL = 0x02, + LR1121_MODEM_SYSTEM_RESET_STATUS_SYSTEM = 0x03, + LR1121_MODEM_SYSTEM_RESET_STATUS_WATCHDOG = 0x04, + LR1121_MODEM_SYSTEM_RESET_STATUS_IOCD_RESTART = 0x05, + LR1121_MODEM_SYSTEM_RESET_STATUS_RTC_RESTART = 0x06, +} lr1121_modem_system_reset_status_t; + +/** + * @brief Command status + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_CMD_STATUS_FAIL = 0x00, + LR1121_MODEM_SYSTEM_CMD_STATUS_PERR = 0x01, + LR1121_MODEM_SYSTEM_CMD_STATUS_OK = 0x02, + LR1121_MODEM_SYSTEM_CMD_STATUS_DATA = 0x03, +} lr1121_modem_system_command_status_t; + +/** + * @brief Low-frequency clock modes + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_LFCLK_RC = 0x00, //!< (Default) + LR1121_MODEM_SYSTEM_LFCLK_XTAL = 0x01, + LR1121_MODEM_SYSTEM_LFCLK_EXT = 0x02 +} lr1121_modem_system_lfclk_cfg_t; + +/** + * @brief Regulator modes + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_REG_MODE_LDO = 0x00, //!< (Default) + LR1121_MODEM_SYSTEM_REG_MODE_DCDC = 0x01, +} lr1121_modem_system_reg_mode_t; + +/** + * @brief Info page ID + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_INFOPAGE_0 = 0x00, //!< Info page #0 + LR1121_MODEM_SYSTEM_INFOPAGE_1 = 0x01, //!< Info page #1 +} lr1121_modem_system_infopage_id_t; + +/** + * @brief RF switch configuration pin + */ +enum lr1121_modem_system_rfswitch_cfg_pin_e +{ + LR1121_MODEM_SYSTEM_RFSW0_HIGH = ( 1 << 0 ), + LR1121_MODEM_SYSTEM_RFSW1_HIGH = ( 1 << 1 ), + LR1121_MODEM_SYSTEM_RFSW2_HIGH = ( 1 << 2 ), + LR1121_MODEM_SYSTEM_RFSW3_HIGH = ( 1 << 3 ), + LR1121_MODEM_SYSTEM_RFSW4_HIGH = ( 1 << 4 ), +}; + +/** + * @brief RF switch configuration structure definition + */ +typedef struct lr1121_modem_system_rfswitch_cfg_s +{ + uint8_t enable; //!< Bitmask for DIO to control as RF switches + uint8_t standby; //!< Bitmask for DIO state while chip is in standby mode + uint8_t rx; //!< Bitmask for DIO state while chip is in reception mode + uint8_t tx; //!< Bitmask for DIO state while chip is in transmission mode + uint8_t tx_hp; //!< Bitmask for DIO state while chip is in high power transmission mode + uint8_t tx_hf; //!< Bitmask for DIO state while chip is in high frequency transmission mode +} lr1121_modem_system_rfswitch_cfg_t; + +/** + * @brief Stand by configuration values + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_STANDBY_CFG_RC = 0x00, + LR1121_MODEM_SYSTEM_STANDBY_CFG_XOSC = 0x01 +} lr1121_modem_system_standby_cfg_t; + +/** + * @brief TCXO supply voltage values + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_TCXO_CTRL_1_6V = 0x00, //!< Supply voltage = 1.6v + LR1121_MODEM_SYSTEM_TCXO_CTRL_1_7V = 0x01, //!< Supply voltage = 1.7v + LR1121_MODEM_SYSTEM_TCXO_CTRL_1_8V = 0x02, //!< Supply voltage = 1.8v + LR1121_MODEM_SYSTEM_TCXO_CTRL_2_2V = 0x03, //!< Supply voltage = 2.2v + LR1121_MODEM_SYSTEM_TCXO_CTRL_2_4V = 0x04, //!< Supply voltage = 2.4v + LR1121_MODEM_SYSTEM_TCXO_CTRL_2_7V = 0x05, //!< Supply voltage = 2.7v + LR1121_MODEM_SYSTEM_TCXO_CTRL_3_0V = 0x06, //!< Supply voltage = 3.0v + LR1121_MODEM_SYSTEM_TCXO_CTRL_3_3V = 0x07, //!< Supply voltage = 3.3v +} lr1121_modem_system_tcxo_supply_voltage_t; + +/** + * @brief Status register 1 structure definition + */ +typedef struct lr1121_modem_system_stat1_s +{ + lr1121_modem_system_command_status_t command_status; //!< Status of last command + bool is_interrupt_active; //!< Indicates at least one interrupt is active +} lr1121_modem_system_stat1_t; + +/** + * @brief Status register 2 structure definition + */ +typedef struct lr1121_modem_system_stat2_s +{ + lr1121_modem_system_reset_status_t reset_status; //!< Source of reset + lr1121_modem_system_chip_modes_t chip_mode; //!< Current mode the chip is running + bool is_running_from_flash; //!< Flag indicating if the chip is currently running from flash +} lr1121_modem_system_stat2_t; + +/** + * @brief Chip type values + */ +typedef enum +{ + LR1121_MODEM_SYSTEM_VERSION_TYPE_LR1121 = 0x03, +} lr1121_modem_system_version_type_t; + +/** + * @brief Version structure definition + */ +typedef struct lr1121_modem_system_version_s +{ + uint8_t hw; //!< Hardware field of system version + lr1121_modem_system_version_type_t type; //!< Type field of system version + uint16_t fw; //!< Software field of system version +} lr1121_modem_system_version_t; + +/** + * @brief Sleep configuration structure definition + */ +typedef struct lr1121_modem_system_sleep_cfg_s +{ + bool is_warm_start; //!< Keep configuration and state in retention memory, allowing warm start +} lr1121_modem_system_sleep_cfg_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR1121_MODEM_SYSTEM_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr1121_types.h b/components/esp_lora_1121/include/lr1121_modem/lr1121_types.h new file mode 100755 index 0000000..4a7b0ad --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr1121_types.h @@ -0,0 +1,75 @@ +/*! + * @file lr1121_types.h + * + * @brief Type definitions for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +#ifndef LR1121_TYPES_H +#define LR1121_TYPES_H + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief LR1121 status + */ +typedef enum lr1121_status_e +{ + LR1121_STATUS_OK = 0, //!< Operation terminated successfully + LR1121_STATUS_ERROR = 3, //!< Operation terminated with error +} lr1121_status_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#endif // LR1121_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_modem/lr_fhss_v1_base_types.h b/components/esp_lora_1121/include/lr1121_modem/lr_fhss_v1_base_types.h new file mode 100755 index 0000000..c6afffd --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_modem/lr_fhss_v1_base_types.h @@ -0,0 +1,127 @@ +/** + * @file lr_fhss_v1_base_types.h + * + * @brief Radio-independent LR-FHSS base type definitions, version 1 + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR_FHSS_V1_BASE_TYPES_H__ +#define LR_FHSS_V1_BASE_TYPES_H__ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief LR-FHSS modulation type + */ +typedef enum lr_fhss_v1_modulation_type_e +{ + LR_FHSS_V1_MODULATION_TYPE_GMSK_488 = 0, +} lr_fhss_v1_modulation_type_t; + +/** + * @brief LR-FHSS coding rate + */ +typedef enum lr_fhss_v1_cr_e +{ + LR_FHSS_V1_CR_5_6 = 0x00, + LR_FHSS_V1_CR_2_3 = 0x01, + LR_FHSS_V1_CR_1_2 = 0x02, + LR_FHSS_V1_CR_1_3 = 0x03, +} lr_fhss_v1_cr_t; + +/** + * @brief LR-FHSS grid + */ +typedef enum lr_fhss_v1_grid_e +{ + LR_FHSS_V1_GRID_25391_HZ = 0x00, + LR_FHSS_V1_GRID_3906_HZ = 0x01, +} lr_fhss_v1_grid_t; + +/** + * @brief LR-FHSS bandwidth + */ +typedef enum lr_fhss_v1_bw_e +{ + LR_FHSS_V1_BW_39063_HZ = 0x00, + LR_FHSS_V1_BW_85938_HZ = 0x01, + LR_FHSS_V1_BW_136719_HZ = 0x02, + LR_FHSS_V1_BW_183594_HZ = 0x03, + LR_FHSS_V1_BW_335938_HZ = 0x04, + LR_FHSS_V1_BW_386719_HZ = 0x05, + LR_FHSS_V1_BW_722656_HZ = 0x06, + LR_FHSS_V1_BW_773438_HZ = 0x07, + LR_FHSS_V1_BW_1523438_HZ = 0x08, + LR_FHSS_V1_BW_1574219_HZ = 0x09, +} lr_fhss_v1_bw_t; + +/** + * @brief LR-FHSS parameter structure + */ +typedef struct lr_fhss_v1_params_s +{ + const uint8_t* sync_word; /**< 4-byte sync word */ + lr_fhss_v1_modulation_type_t modulation_type; + lr_fhss_v1_cr_t cr; + lr_fhss_v1_grid_t grid; + lr_fhss_v1_bw_t bw; + bool enable_hopping; + uint8_t header_count; /**< Number of header blocks */ +} lr_fhss_v1_params_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#endif // LR_FHSS_V1_BASE_TYPES_H__ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_printers/lr1121_modem_printf_info.h b/components/esp_lora_1121/include/lr1121_printers/lr1121_modem_printf_info.h new file mode 100755 index 0000000..b40d7a1 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr1121_modem_printf_info.h @@ -0,0 +1,141 @@ +/** + * @file lr1121_modem_printf_info.h + * + * @brief Common Application Helper functions + * + * @copyright + * @parblock + * The Clear BSD License + * Copyright Semtech Corporation 2024. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * @endparblock + */ +#ifndef LR1121_MODEM_PRINTF_INFO_H +#define LR1121_MODEM_PRINTF_INFO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include +#include +#include + +#include "lr1121_modem/lr1121_modem_lorawan.h" +#include "lr1121_modem/lr1121_modem_modem.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/** + * @brief Prints the provided buffer in HEX + * + * @param [in] buffer Buffer to be printed + * @param [in] size Buffer size to be printed + */ +void print_hex_buffer( const uint8_t* buffer, uint8_t size ); + +/** + * @brief Prints the LoRaWAN keys + * + * @param [in] dev_eui Device EUI to be printed + * @param [in] join_eui Join EUI to be printed + * @param [in] use_internal_credentials specify if the internal credentials are used + */ +void print_lorawan_credentials( const uint8_t* dev_eui, const uint8_t* join_eui, const uint8_t* pin, + const bool use_internal_credentials ); + +/** + * @brief Prints the LoRaWAN version + * + * @param [in] modem_version Modem version to be printed + */ +void print_version( lr1121_modem_version_t modem_version ); + +/** + * @brief convert lr1121 modem-e status to string + */ +void modem_status_to_string( lr1121_modem_lorawan_status_t modem_status ); + +/** + * @brief Get the lorawan region from modem and print it + * + * @param [in] context Chip implementation context + * @param [out] modem_region The LoRaWAN region returned by the modem. This pointer can be NULL: in this case the region + * is only printed, and not returned to caller + */ +void get_and_print_lorawan_region_from_modem( const void* context, lr1121_modem_regions_t* modem_region ); + +/** + * @brief Prints the LoRaWAN region + * + * @param [in] region Region to be printed + */ +void print_lorawan_region( lr1121_modem_regions_t region ); + +/** + * @brief Prints the state of certification mode + * + * @param [in] certif_running State of certification mode + */ +void print_certification( lr1121_modem_certification_mode_t certif_running ); + +/** + * @brief Gets and prints the crashlog if the crashlog status bit is set + * + * @param [in] context Chip implementation context + */ +void get_and_print_crashlog( const void* context ); + +#ifdef __cplusplus +} +#endif + +#endif // APPS_UTILITIES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_bootloader_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_bootloader_types_str.h new file mode 100755 index 0000000..93f559a --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_bootloader_types_str.h @@ -0,0 +1,48 @@ +/*! + * @file lr11xx_bootloader_types_str.h + * + * @brief Printer helper functions for LR11xx bootloader types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_BOOTLOADER_TYPES_STR_H +#define LR11XX_BOOTLOADER_TYPES_STR_H +#include "lr11xx_driver/lr11xx_bootloader_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_bootloader_chip_modes_to_str( const lr11xx_bootloader_chip_modes_t value ); +const char* lr11xx_bootloader_reset_status_to_str( const lr11xx_bootloader_reset_status_t value ); +const char* lr11xx_bootloader_command_status_to_str( const lr11xx_bootloader_command_status_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_BOOTLOADER_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_crypto_engine_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_crypto_engine_types_str.h new file mode 100755 index 0000000..59ec333 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_crypto_engine_types_str.h @@ -0,0 +1,49 @@ +/*! + * @file lr11xx_crypto_engine_types_str.h + * + * @brief Printer helper functions for LR11xx crypto engine types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_CRYPTO_ENGINE_TYPES_STR_H +#define LR11XX_CRYPTO_ENGINE_TYPES_STR_H +#include "lr11xx_driver/lr11xx_crypto_engine_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_crypto_element_to_str( const lr11xx_crypto_element_t value ); +const char* lr11xx_crypto_status_to_str( const lr11xx_crypto_status_t value ); +const char* lr11xx_crypto_lorawan_version_to_str( const lr11xx_crypto_lorawan_version_t value ); +const char* lr11xx_crypto_keys_idx_to_str( const lr11xx_crypto_keys_idx_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_CRYPTO_ENGINE_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_lr_fhss_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_lr_fhss_types_str.h new file mode 100755 index 0000000..d73cd3a --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_lr_fhss_types_str.h @@ -0,0 +1,49 @@ +/*! + * @file lr11xx_lr_fhss_types_str.h + * + * @brief Printer helper functions for LR11xx LRFHSS types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_LR_FHSS_TYPES_STR_H +#define LR11XX_LR_FHSS_TYPES_STR_H +#include "lr11xx_driver/lr11xx_lr_fhss_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr_fhss_v1_modulation_type_to_str( const lr_fhss_v1_modulation_type_t value ); +const char* lr_fhss_v1_cr_to_str( const lr_fhss_v1_cr_t value ); +const char* lr_fhss_v1_grid_to_str( const lr_fhss_v1_grid_t value ); +const char* lr_fhss_v1_bw_to_str( const lr_fhss_v1_bw_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_LR_FHSS_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_printf_info.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_printf_info.h new file mode 100755 index 0000000..d850052 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_printf_info.h @@ -0,0 +1,14 @@ +#ifndef LR11XX_VER_TEMP_H +#define LR11XX_VER_TEMP_H +#include "lr11xx_driver/lr11xx_system.h" +#ifdef __cplusplus +extern "C" { +#endif + +void lora_print_version( const void* context ); +void lora_print_temp( const void* context ); +void lora_print_vbat( const void* context ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_VER_TEMP_H \ No newline at end of file diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_radio_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_radio_types_str.h new file mode 100755 index 0000000..7780d97 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_radio_types_str.h @@ -0,0 +1,70 @@ +/*! + * @file lr11xx_radio_types_str.h + * + * @brief Printer helper functions for LR11xx radio types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RADIO_TYPES_STR_H +#define LR11XX_RADIO_TYPES_STR_H +#include "lr11xx_driver/lr11xx_radio_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_radio_pa_selection_to_str( const lr11xx_radio_pa_selection_t value ); +const char* lr11xx_radio_gfsk_address_filtering_to_str( const lr11xx_radio_gfsk_address_filtering_t value ); +const char* lr11xx_radio_fallback_modes_to_str( const lr11xx_radio_fallback_modes_t value ); +const char* lr11xx_radio_ramp_time_to_str( const lr11xx_radio_ramp_time_t value ); +const char* lr11xx_radio_lora_network_type_to_str( const lr11xx_radio_lora_network_type_t value ); +const char* lr11xx_radio_lora_sf_to_str( const lr11xx_radio_lora_sf_t value ); +const char* lr11xx_radio_lora_bw_to_str( const lr11xx_radio_lora_bw_t value ); +const char* lr11xx_radio_lora_cr_to_str( const lr11xx_radio_lora_cr_t value ); +const char* lr11xx_radio_intermediary_mode_to_str( const lr11xx_radio_intermediary_mode_t value ); +const char* lr11xx_radio_gfsk_crc_type_to_str( const lr11xx_radio_gfsk_crc_type_t value ); +const char* lr11xx_radio_gfsk_dc_free_to_str( const lr11xx_radio_gfsk_dc_free_t value ); +const char* lr11xx_radio_gfsk_pkt_len_modes_to_str( const lr11xx_radio_gfsk_pkt_len_modes_t value ); +const char* lr11xx_radio_gfsk_preamble_detector_to_str( const lr11xx_radio_gfsk_preamble_detector_t value ); +const char* lr11xx_radio_lora_crc_to_str( const lr11xx_radio_lora_crc_t value ); +const char* lr11xx_radio_lora_pkt_len_modes_to_str( const lr11xx_radio_lora_pkt_len_modes_t value ); +const char* lr11xx_radio_lora_iq_to_str( const lr11xx_radio_lora_iq_t value ); +const char* lr11xx_radio_pkt_type_to_str( const lr11xx_radio_pkt_type_t value ); +const char* lr11xx_radio_pa_reg_supply_to_str( const lr11xx_radio_pa_reg_supply_t value ); +const char* lr11xx_radio_rx_duty_cycle_mode_to_str( const lr11xx_radio_rx_duty_cycle_mode_t value ); +const char* lr11xx_radio_gfsk_bw_to_str( const lr11xx_radio_gfsk_bw_t value ); +const char* lr11xx_radio_cad_exit_mode_to_str( const lr11xx_radio_cad_exit_mode_t value ); +const char* lr11xx_radio_gfsk_pulse_shape_to_str( const lr11xx_radio_gfsk_pulse_shape_t value ); +const char* lr11xx_radio_bpsk_pulse_shape_to_str( const lr11xx_radio_bpsk_pulse_shape_t value ); +const char* lr11xx_radio_lr_fhss_bitrate_to_str( const lr11xx_radio_lr_fhss_bitrate_t value ); +const char* lr11xx_radio_lr_fhss_pulse_shape_to_str( const lr11xx_radio_lr_fhss_pulse_shape_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_RADIO_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_rttof_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_rttof_types_str.h new file mode 100755 index 0000000..debc97c --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_rttof_types_str.h @@ -0,0 +1,46 @@ +/*! + * @file lr11xx_rttof_types_str.h + * + * @brief Printer helper functions for LR11xx RTToF types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RTTOF_TYPES_STR_H +#define LR11XX_RTTOF_TYPES_STR_H +#include "lr11xx_driver/lr11xx_rttof_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_rttof_result_type_to_str( const lr11xx_rttof_result_type_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_RTTOF_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_system_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_system_types_str.h new file mode 100755 index 0000000..bc23f5d --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_system_types_str.h @@ -0,0 +1,54 @@ +/*! + * @file lr11xx_system_types_str.h + * + * @brief Printer helper functions for LR11xx system types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_SYSTEM_TYPES_STR_H +#define LR11XX_SYSTEM_TYPES_STR_H +#include "lr11xx_driver/lr11xx_system_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_system_chip_modes_to_str( const lr11xx_system_chip_modes_t value ); +const char* lr11xx_system_reset_status_to_str( const lr11xx_system_reset_status_t value ); +const char* lr11xx_system_command_status_to_str( const lr11xx_system_command_status_t value ); +const char* lr11xx_system_lfclk_cfg_to_str( const lr11xx_system_lfclk_cfg_t value ); +const char* lr11xx_system_reg_mode_to_str( const lr11xx_system_reg_mode_t value ); +const char* lr11xx_system_infopage_id_to_str( const lr11xx_system_infopage_id_t value ); +const char* lr11xx_system_standby_cfg_to_str( const lr11xx_system_standby_cfg_t value ); +const char* lr11xx_system_tcxo_supply_voltage_to_str( const lr11xx_system_tcxo_supply_voltage_t value ); +const char* lr11xx_system_version_type_to_str( const lr11xx_system_version_type_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_SYSTEM_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr1121_printers/lr11xx_types_str.h b/components/esp_lora_1121/include/lr1121_printers/lr11xx_types_str.h new file mode 100755 index 0000000..fa25d27 --- /dev/null +++ b/components/esp_lora_1121/include/lr1121_printers/lr11xx_types_str.h @@ -0,0 +1,46 @@ +/*! + * @file lr11xx_types_str.h + * + * @brief Printer helper functions for LR11xx types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_TYPES_STR_H +#define LR11XX_TYPES_STR_H +#include "lr11xx_driver/lr11xx_types.h" +#ifdef __cplusplus +extern "C" { +#endif +const char* lr11xx_status_to_str( const lr11xx_status_t value ); +#ifdef __cplusplus +} +#endif +#endif // LR11XX_TYPES_STR_H diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader.h new file mode 100755 index 0000000..d0e695a --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader.h @@ -0,0 +1,213 @@ +/*! + * @file lr11xx_bootloader.h + * + * @brief Bootloader driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_BOOTLOADER_H +#define LR11XX_BOOTLOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_bootloader_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +typedef uint32_t lr11xx_bootloader_irq_mask_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Return the status registers and interrupt flags + * + * @remark To simplify system integration, this function does not actually execute the GetStatus command, which would + * require bidirectional SPI communication. It obtains the stat1, stat2, and irq_status values by performing an ordinary + * SPI read (which is required to send null/NOP bytes on the MOSI line). This is possible since the LR11XX returns these + * values automatically whenever a read that does not directly follow a response-carrying command is performed. Unlike + * with the GetStatus command, however, the reset status information is NOT cleared by this command. The function @ref + * lr11xx_bootloader_clear_reset_status_info may be used for this purpose when necessary. + * + * @param [in] context Chip implementation context + * @param [out] stat1 Content of status register 1 + * @param [out] stat2 Content of status register 2 + * @param [out] irq_status Interrupt flags + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_get_status( const void* context, lr11xx_bootloader_stat1_t* stat1, + lr11xx_bootloader_stat2_t* stat2, + lr11xx_bootloader_irq_mask_t* irq_status ); + +/*! + * @brief Clear the reset status information stored in stat2 + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_clear_reset_status_info( const void* context ); + +/*! + * @brief Return the version of the system (hardware and software) + * + * @param [in] context Chip implementation context + * @param [out] version Pointer to the structure holding the system version + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_get_version( const void* context, lr11xx_bootloader_version_t* version ); + +/*! + * @brief Erase the whole flash memory of the chip + * + * This function shall be called before any attempt to write a new firmware in flash memory + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_erase_flash( const void* context ); + +/*! + * @brief Write encrypted data in program flash memory of the chip + * + * This function shall be used when updating the encrypted flash content of the LR11XX. + * The encrypted flash payload to transfer shall be represented as an array of words (i.e. 4-byte values). + * + * Updating flash code of the chip with this function MUST respect the following constraints: + * - the complete flash image MUST be splitted into chunks of 64 words each, except the last one that can be shorter + * - the chunks MUST be sent to the chip in-order, starting with @p offset_in_byte = 0 + * + * @param [in] context Chip implementation context + * @param [in] offset_in_byte The offset from start register of flash in byte + * @param [in] buffer Buffer holding the encrypted content. Its size in words must be at least length + * @param [in] length_in_word Number of words (i.e. 4 bytes) in the buffer to transfer. MUST be 64 for all chunks except + * the last one where it can be lower. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_write_flash_encrypted( const void* context, const uint32_t offset_in_byte, + const uint32_t* buffer, const uint8_t length_in_word ); + +/*! + * @brief Write encrypted data in program flash memory of the chip + * + * This function shall be used when updating the encrypted flash content of the LR11XX. + * The encrypted flash payload to transfer shall be represented as an array of words (ie 4-byte values). + * + * @param [in] context Chip implementation context + * @param [in] offset_in_byte The offset from start register of flash in byte + * @param [in] buffer Buffer holding the encrypted content. Its size in words must be at least length + * @param [in] length_in_word Number of words (i.e. 4 bytes) in the buffer to transfer + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_write_flash_encrypted_full( const void* context, const uint32_t offset_in_byte, + const uint32_t* buffer, const uint32_t length_in_word ); + +/*! + * @brief Software reset of the chip. + * + * This method should be used to reboot the chip in a specified mode. + * Rebooting in flash mode presumes that the content in flash memory is not corrupted (i.e. the integrity check + * performed by the bootloader before executing the first instruction in flash is OK). + * + * @param [in] context Chip implementation context + * @param [in] stay_in_bootloader Selector to stay in bootloader or execute flash code after reboot. If true, the + * bootloader will not execute the flash code but activate SPI interface to allow firmware upgrade + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_reboot( const void* context, const bool stay_in_bootloader ); + +/*! + * @brief Returns the 4-byte PIN which can be used to claim a device on cloud services. + * + * @param [in] context Chip implementation context + * @param [out] pin Pointer to the array to be populated with the PIN + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_read_pin( const void* context, lr11xx_bootloader_pin_t pin ); + +/*! + * @brief Read and return the Chip EUI + * + * @param [in] context Chip implementation context + * @param [out] chip_eui The buffer to be filled with chip EUI of the LR11XX. It is up to the application to ensure + * chip_eui is long enough to hold the chip EUI + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_read_chip_eui( const void* context, lr11xx_bootloader_chip_eui_t chip_eui ); + +/*! + * @brief Read and return the Join EUI + * + * @param [in] context Chip implementation context + * @param [out] join_eui The buffer to be filled with Join EUI of the LR11XX. It is up to the application to ensure + * join_eui is long enough to hold the join EUI + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_bootloader_read_join_eui( const void* context, lr11xx_bootloader_join_eui_t join_eui ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_BOOTLOADER_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader_types.h new file mode 100755 index 0000000..257d019 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_bootloader_types.h @@ -0,0 +1,179 @@ +/*! + * @file lr11xx_bootloader_types.h + * + * @brief Bootloader driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_BOOTLOADER_TYPES_H +#define LR11XX_BOOTLOADER_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Length in byte of the LR11XX version blob + */ +#define LR11XX_BL_VERSION_LENGTH ( 4 ) + +/*! + * @brief Length in bytes of a PIN + */ +#define LR11XX_BL_PIN_LENGTH ( 4 ) + +/*! + * @brief Length in bytes of a chip EUI + */ +#define LR11XX_BL_CHIP_EUI_LENGTH ( 8 ) + +/*! + * @brief Length in bytes of a join EUI + */ +#define LR11XX_BL_JOIN_EUI_LENGTH ( 8 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Fixed-length array to store a PIN + */ +typedef uint8_t lr11xx_bootloader_pin_t[LR11XX_BL_PIN_LENGTH]; + +/*! + * @brief Fixed-length array to store a chipEUI + */ +typedef uint8_t lr11xx_bootloader_chip_eui_t[LR11XX_BL_CHIP_EUI_LENGTH]; + +/*! + * @brief Fixed-length array to store a joinEUI + */ +typedef uint8_t lr11xx_bootloader_join_eui_t[LR11XX_BL_JOIN_EUI_LENGTH]; + +/*! + * @brief Chip modes + */ +typedef enum lr11xx_bootloader_chip_modes_e +{ + LR11XX_BOOTLOADER_CHIP_MODE_SLEEP = 0x00, + LR11XX_BOOTLOADER_CHIP_MODE_STBY_RC = 0x01, + LR11XX_BOOTLOADER_CHIP_MODE_STBY_XOSC = 0x02, + LR11XX_BOOTLOADER_CHIP_MODE_FS = 0x03, + LR11XX_BOOTLOADER_CHIP_MODE_RX = 0x04, + LR11XX_BOOTLOADER_CHIP_MODE_TX = 0x05, + LR11XX_BOOTLOADER_CHIP_MODE_LOC = 0x06, +} lr11xx_bootloader_chip_modes_t; + +/*! + * @brief Reset status + */ +typedef enum lr11xx_bootloader_reset_status_e +{ + LR11XX_BOOTLOADER_RESET_STATUS_CLEARED = 0x00, + LR11XX_BOOTLOADER_RESET_STATUS_ANALOG = 0x01, + LR11XX_BOOTLOADER_RESET_STATUS_EXTERNAL = 0x02, + LR11XX_BOOTLOADER_RESET_STATUS_SYSTEM = 0x03, + LR11XX_BOOTLOADER_RESET_STATUS_WATCHDOG = 0x04, + LR11XX_BOOTLOADER_RESET_STATUS_IOCD_RESTART = 0x05, + LR11XX_BOOTLOADER_RESET_STATUS_RTC_RESTART = 0x06, +} lr11xx_bootloader_reset_status_t; + +/*! + * @brief Command status + */ +typedef enum lr11xx_bootloader_command_status_e +{ + LR11XX_BOOTLOADER_CMD_STATUS_FAIL = 0x00, + LR11XX_BOOTLOADER_CMD_STATUS_PERR = 0x01, + LR11XX_BOOTLOADER_CMD_STATUS_OK = 0x02, + LR11XX_BOOTLOADER_CMD_STATUS_DATA = 0x03, +} lr11xx_bootloader_command_status_t; + +/*! + * @brief Status register 1 structure definition + */ +typedef struct lr11xx_bootloader_stat1_s +{ + lr11xx_bootloader_command_status_t command_status; + bool is_interrupt_active; +} lr11xx_bootloader_stat1_t; + +/*! + * @brief Status register 2 structure definition + */ +typedef struct lr11xx_bootloader_stat2_s +{ + lr11xx_bootloader_reset_status_t reset_status; + lr11xx_bootloader_chip_modes_t chip_mode; + bool is_running_from_flash; +} lr11xx_bootloader_stat2_t; + +/*! + * @brief Bootloader version structure definition + */ +typedef struct lr11xx_bootloader_version_s +{ + uint8_t hw; + uint8_t type; + uint16_t fw; +} lr11xx_bootloader_version_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_BOOTLOADER_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine.h new file mode 100755 index 0000000..759e737 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine.h @@ -0,0 +1,342 @@ +/*! + * @file lr11xx_crypto_engine.h + * + * @brief Cryptographic engine driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_CRYPTO_ENGINE_H +#define LR11XX_CRYPTO_ENGINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr11xx_crypto_engine_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Select the crypto element to be used + * + * By default, the internal crypto engine is selected. It is not needed to call this command if one plans to use the + * internal crypto engine. + * + * @param [in] context Chip implementation context + * @param [in] element The type of crypto element to use + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_crypto_select( const void* context, const lr11xx_crypto_element_t element ); + +/*! + * @brief Set a key in the previously selected crypto element. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the key to be set + * @param [in] key The key to be set + * + * @returns Operation status + * + * @see lr11xx_crypto_derive_key + */ +lr11xx_status_t lr11xx_crypto_set_key( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const lr11xx_crypto_key_t key ); + +/*! + * @brief Derive a key previously set. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] src_key_id The identifier of the key to be derived + * @param [in] dest_key_id The identifier where the derived key will be stored after call to @ref + * lr11xx_crypto_store_to_flash + * @param [in] nonce The nonce to be used to perform the derivation + * + * @returns Operation status + * + * @see lr11xx_crypto_set_key + */ +lr11xx_status_t lr11xx_crypto_derive_key( const void* context, lr11xx_crypto_status_t* status, const uint8_t src_key_id, + const uint8_t dest_key_id, const lr11xx_crypto_nonce_t nonce ); + +/*! + * @brief Perform the needed operations to extract the payload from a join accept message. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] dec_key_id The identifier of the key used for message decryption + * @param [in] ver_key_id The identifier of the key used for MIC verification + * @param [in] lorawan_version LoRaWAN version to know the size of the header + * @param [in] header The header to compute (length linked to lorawan_version) + * @param [in] data The data to compute + * @param [in] length The length in bytes of the data to compute + * @param [out] data_out Placeholder for the decrypted data + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_crypto_process_join_accept( const void* context, lr11xx_crypto_status_t* status, + const uint8_t dec_key_id, const uint8_t ver_key_id, + const lr11xx_crypto_lorawan_version_t lorawan_version, + const uint8_t* header, const uint8_t* data, const uint8_t length, + uint8_t* data_out ); + +/*! + * @brief Compute an AES-CMAC. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the keyused for the computation + * @param [in] data The data to compute + * @param [in] length The length in bytes of the data to compute + * @param [out] mic Placeholder for the computed MIC (first 4 bytes of the AES-CMAC) + * + * @returns Operation status + * + * @see lr11xx_crypto_verify_aes_cmac + */ +lr11xx_status_t lr11xx_crypto_compute_aes_cmac( const void* context, lr11xx_crypto_status_t* status, + const uint8_t key_id, const uint8_t* data, const uint16_t length, + lr11xx_crypto_mic_t mic ); + +/*! + * @brief Compute an AES-CMAC and make a comparison with a value given as parameter. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the key to be used for the computation + * @param [in] data The data to compute + * @param [in] length The length in bytes of the data to compute + * @param [in] mic The MIC value (first 4 bytes of the CMAC) use for comparison + * + * @returns Operation status + * + * @see lr11xx_crypto_compute_aes_cmac + */ +lr11xx_status_t lr11xx_crypto_verify_aes_cmac( const void* context, lr11xx_crypto_status_t* status, + const uint8_t key_id, const uint8_t* data, const uint16_t length, + const lr11xx_crypto_mic_t mic ); + +/*! + * @brief Compute an AES encryption with a key ID specified in parameter. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the key to be used for the computation + * @param [in] data The data to encrypt + * @param [in] length The length in bytes of the data to encrypt - this value shall be a multiple of 16 + * @param [out] result A pointer to a data buffer that will be filled with the encrypted data. Values of this buffer are + * meaningful if and only if the return status is LR11XX_CRYPTO_STATUS_SUCCESS + * + * @returns Operation status + * + * @see lr11xx_crypto_set_key, lr11xx_crypto_derive_key + */ +lr11xx_status_t lr11xx_crypto_aes_encrypt_01( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ); + +/*! + * @brief Compute an AES encryption with a key ID specified in parameter. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the key to be used for the computation + * @param [in] data The data to encrypt + * @param [in] length The length in bytes of the data to encrypt - this value shall be a multiple of 16 + * @param [out] result A pointer to a data buffer that will be filled with the encrypted data. Values of this buffer are + * meaningful if and only if the return status is LR11XX_CRYPTO_STATUS_SUCCESS + * + * @returns Operation status + * + * @see lr11xx_crypto_set_key, lr11xx_crypto_derive_key + */ +lr11xx_status_t lr11xx_crypto_aes_encrypt( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ); + +/*! + * @brief Compute an AES decryption with a key ID specified in parameter. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] key_id The identifier of the key to be used for the computation + * @param [in] data The data to decrypt + * @param [in] length The length in bytes of the data to decrypt - this value shall be a multiple of 16 + * @param [out] result A pointer to a data buffer that will be filled with the decrypted data. Values of this buffer are + * meaningful if and only if the return status is LR11XX_CRYPTO_STATUS_SUCCESS + * + * @returns Operation status + * + * @see lr11xx_crypto_set_key, lr11xx_crypto_derive_key + */ +lr11xx_status_t lr11xx_crypto_aes_decrypt( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ); + +/*! + * @brief Store the crypto data (keys, parameters) from RAM into the flash memory. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * + * @returns Operation status + * + * @see lr11xx_crypto_restore_from_flash + */ +lr11xx_status_t lr11xx_crypto_store_to_flash( const void* context, lr11xx_crypto_status_t* status ); + +/*! + * @brief Restore the crypto data (keys, parameters) from flash memory into RAM. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * + * @returns Operation status + * + * @see lr11xx_crypto_store_to_flash + */ +lr11xx_status_t lr11xx_crypto_restore_from_flash( const void* context, lr11xx_crypto_status_t* status ); + +/*! + * @brief Set a specific parameter identified by param_id in the crypto RAM. + * + * This function does not store a parameter in the flash memory. The parameters shall be stored after using @ref + * lr11xx_crypto_store_to_flash command. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] param_id The identifier of the parameter to be set + * @param [in] parameter The parameter to be set + * + * @returns Operation status + * + * @see lr11xx_crypto_get_parameter + */ +lr11xx_status_t lr11xx_crypto_set_parameter( const void* context, lr11xx_crypto_status_t* status, + const uint8_t param_id, const lr11xx_crypto_param_t parameter ); + +/*! + * @brief Get a specific parameter identified by paramID from the crypto RAM. + * + * This function does not fetch a parameter from the flash memory. The parameters shall be restored before using @ref + * lr11xx_crypto_restore_from_flash command. + * + * @param [in] context Chip implementation context + * @param [out] status The status returned by the execution of this cryptographic function + * @param [in] param_id The identifier of the parameter to get + * @param [out] parameter The placeholder to store the parameter + * + * @returns Operation status + * + * @see lr11xx_crypto_set_parameter + */ +lr11xx_status_t lr11xx_crypto_get_parameter( const void* context, lr11xx_crypto_status_t* status, + const uint8_t param_id, lr11xx_crypto_param_t parameter ); + +/*! + * @brief Check if an encrypted firmware image is suitable for the transceiver on which the check is done + * + * @remark The result can be read by calling @ref lr11xx_crypto_get_check_encrypted_firmware_image_result + * + * @remark A user checks the suitability of a firmware image by calling this function with 64-word long chunk of data + * sent in-order (except for the last one that can be shorter). + * + * @param [in] context Chip implementation context + * @param [in] offset_in_byte Offset of data buffer in firmware image - has to be a multiple of 4 + * @param [in] data Buffer holding the encrypted content. Its size in words must be at least length + * @param [in] length_in_word Number of words (i.e. 4 bytes) in the buffer to transfer. This value must be in the range + * [0:64] + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_crypto_check_encrypted_firmware_image( const void* context, const uint32_t offset_in_byte, + const uint32_t* data, const uint8_t length_in_word ); + +/*! + * @brief Check if an encrypted firmware image is suitable for the transceiver on which the check is done + * + * @remark The result can be read by calling @ref lr11xx_crypto_get_check_encrypted_firmware_image_result + * + * @remark This function is developed on top of @ref lr11xx_crypto_check_encrypted_firmware_image and takes care of the + * whole firmware image transfer + * + * @param [in] context Chip implementation context + * @param [in] offset_in_byte Offset of data buffer in firmware image - has to be a multiple of 4 + * @param [in] data Buffer holding the encrypted content. Its size in words must be at least length + * @param [in] length_in_word Number of words (i.e. 4 bytes) in the buffer to transfer + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_crypto_check_encrypted_firmware_image_full( const void* context, const uint32_t offset_in_byte, + const uint32_t* data, + const uint32_t length_in_word ); + +/*! + * @brief Get the result of the encrypted firmware image check + * + * @param [in] context Chip implementation context + * @param [out] is_encrypted_fw_image_ok Result of the encrypted firmware image check + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_crypto_get_check_encrypted_firmware_image_result( const void* context, + bool* is_encrypted_fw_image_ok ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_CRYPTO_ENGINE_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine_types.h new file mode 100755 index 0000000..50e2b88 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_crypto_engine_types.h @@ -0,0 +1,199 @@ +/*! + * @file lr11xx_crypto_engine_types.h + * + * @brief Cryptographic engine driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_CRYPTO_ENGINE_TYPES_H +#define LR11XX_CRYPTO_ENGINE_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Length in bytes of a MIC + */ +#define LR11XX_CRYPTO_MIC_LENGTH 0x04 + +/*! + * @brief Length in bytes of a AES CMAC + */ +#define LR11XX_CRYPTO_AES_CMAC_LENGTH 0x10 + +/*! + * @brief Maximum length in bytes of data to be encrypted / decrypted + */ +#define LR11XX_CRYPTO_DATA_MAX_LENGTH 0x0100 + +/*! + * @brief Length in bytes of a key for AES computation + */ +#define LR11XX_CRYPTO_KEY_LENGTH 0x10 + +/*! + * @brief Length in bytes of a nonce + */ +#define LR11XX_CRYPTO_NONCE_LENGTH 0x10 + +/*! + * @brief Length in bytes of a crypto parameter + */ +#define LR11XX_CRYPTO_PARAMETER_LENGTH 0x04 + +/*! + * @brief Length in bytes of the status returned by an API + */ +#define LR11XX_CRYPTO_STATUS_LENGTH 0x01 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Fixed-length array to store an AES CMAC + */ +typedef uint8_t lr11xx_crypto_mic_t[LR11XX_CRYPTO_MIC_LENGTH]; + +/*! + * @brief Fixed-length array to store an AES CMAC + */ +typedef uint8_t lr11xx_crypto_aes_cmac_t[LR11XX_CRYPTO_AES_CMAC_LENGTH]; + +/*! + * @brief Fixed-length array to store a crypto key + */ +typedef uint8_t lr11xx_crypto_key_t[LR11XX_CRYPTO_KEY_LENGTH]; + +/*! + * @brief Fixed-length array to store a crypto nonce + */ +typedef uint8_t lr11xx_crypto_nonce_t[LR11XX_CRYPTO_NONCE_LENGTH]; + +/*! + * @brief Fixed-length array to store a crypto parameter + */ +typedef uint8_t lr11xx_crypto_param_t[LR11XX_CRYPTO_PARAMETER_LENGTH]; + +/*! + * @brief The supported crypto elements + */ +typedef enum +{ + LR11XX_CRYPTO_ELEMENT_CRYPTO_ENGINE = 0x00, //!< Internal crypto engine (default) + LR11XX_CRYPTO_ELEMENT_SECURE_ELEMENT = 0x01, //!< External secure element +} lr11xx_crypto_element_t; + +/*! + * @brief The status returned by the crypto API + */ +typedef enum +{ + LR11XX_CRYPTO_STATUS_SUCCESS = 0x00, //!< The API command was successful + LR11XX_CRYPTO_STATUS_ERROR_FAIL_CMAC = 0x01, //!< AES-CMAC invalid or comparison failed + LR11XX_CRYPTO_STATUS_ERROR_INVALID_KEY_ID = 0x03, //!< Invalid key ID (source, destination) + LR11XX_CRYPTO_STATUS_ERROR_BUFFER_SIZE = 0x05, //!< Invalid data buffer size + LR11XX_CRYPTO_STATUS_ERROR = 0x06, //!< Other error +} lr11xx_crypto_status_t; + +/*! + * @brief The supported LoRaWAN versions + */ +typedef enum +{ + LR11XX_CRYPTO_LORAWAN_VERSION_1_0_X = 0x00, + LR11XX_CRYPTO_LORAWAN_VERSION_1_1_X = 0x01, +} lr11xx_crypto_lorawan_version_t; + +/*! + * @brief Crypto keys table index definition. + */ +typedef enum lr11xx_crypto_keys_idx_e +{ + LR11XX_CRYPTO_KEYS_IDX_MOTHER_KEY = 1, + LR11XX_CRYPTO_KEYS_IDX_NWK_KEY = 2, + LR11XX_CRYPTO_KEYS_IDX_APP_KEY = 3, + LR11XX_CRYPTO_KEYS_IDX_J_S_ENC_KEY = 4, + LR11XX_CRYPTO_KEYS_IDX_J_S_INT_KEY = 5, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_0 = 6, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_1 = 7, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_2 = 8, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_3 = 9, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_4 = 10, + LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_5 = 11, + LR11XX_CRYPTO_KEYS_IDX_APP_S_KEY = 12, + LR11XX_CRYPTO_KEYS_IDX_F_NWK_S_INT_KEY = 13, + LR11XX_CRYPTO_KEYS_IDX_S_NWK_S_INT_KEY = 14, + LR11XX_CRYPTO_KEYS_IDX_NWK_S_ENC_KEY = 15, + LR11XX_CRYPTO_KEYS_IDX_RFU_0 = 16, + LR11XX_CRYPTO_KEYS_IDX_RFU_1 = 17, + LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_0 = 18, + LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_1 = 19, + LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_2 = 20, + LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_3 = 21, + LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_0 = 22, + LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_1 = 23, + LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_2 = 24, + LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_3 = 25, + LR11XX_CRYPTO_KEYS_IDX_GP0 = 26, + LR11XX_CRYPTO_KEYS_IDX_GP1 = 27, +} lr11xx_crypto_keys_idx_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_CRYPTO_ENGINE_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_driver_version.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_driver_version.h new file mode 100755 index 0000000..0411fa1 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_driver_version.h @@ -0,0 +1,90 @@ +/*! + * @file lr11xx_driver_version.h + * + * @brief Placeholder to keep the version of LR11XX driver. + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_DRIVER_VERSION_H +#define LR11XX_DRIVER_VERSION_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +#define LR11XX_DRIVER_VERSION_MAJOR 2 +#define LR11XX_DRIVER_VERSION_MINOR 4 +#define LR11XX_DRIVER_VERSION_PATCH 1 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Compare version information with current ones + * + * This macro expands to true boolean value if the version information provided in argument is compatible or + * retro-compatible with the version of this code base + */ +#define LR11XX_DRIVER_VERSION_CHECK( x, y, z ) \ + ( x == LR11XX_DRIVER_VERSION_MAJOR && \ + ( y < LR11XX_DRIVER_VERSION_MINOR || \ + ( y == LR11XX_DRIVER_VERSION_MINOR && z <= LR11XX_DRIVER_VERSION_PATCH ) ) ) + +const char* lr11xx_driver_version_get_version_string( void ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_DRIVER_VERSION_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss.h new file mode 100755 index 0000000..b591ea5 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss.h @@ -0,0 +1,757 @@ +/*! + * @file lr11xx_gnss.h + * + * @brief GNSS scan driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_GNSS_H +#define LR11XX_GNSS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_gnss_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Get the size of results + * + * This method returns the size in bytes of the results available in LR11XX result buffer. + * + * @param [in] context Chip implementation context + * @param [out] result_size Result size + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_result_size( const void* context, uint16_t* result_size ); + +/*! + * @brief Read GNSS results + * + * The GNSS results are pushed into a buffer directly. This buffer is provided by the application using the driver. It + * MUST be long enough to contains at least result_buffer_size bytes. + * + * @warning No check is done on result_buffer size. If this application provided buffer is too small, there will be a + * buffer overflow bug! + * + * @param [in] context Chip implementation context + * @param [out] result_buffer Application provided buffer to be filled with result + * @param [in] result_buffer_size The number of bytes to read from the LR11XX + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_results( const void* context, uint8_t* result_buffer, + const uint16_t result_buffer_size ); + +/*! + * @brief Update almanacs given as parameter + * + * @remark Note that information header and almanacs for all 128 SV (i.e. 129 20-byte long blocks) must be updated in a + * row for the whole operation to be successful. Therefore, this function must be called as many times as needed without + * any other operations in between. + * + * @param [in] context Chip implementation context + * @param [in] blocks Buffer containing at least (nb_of_blocks * LR11XX_GNSS_SINGLE_ALMANAC_WRITE_SIZE) bytes of almanac + * @param [in] nb_of_blocks Number of blocks to transfer + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_almanac_update( const void* context, const uint8_t* blocks, const uint8_t nb_of_blocks ); + +/*! + * @brief Read the almanac + * + * @param [in] context Chip implementation context + * @param [out] almanac_bytestream The bytestream of the almanac + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_almanac( const void* context, + lr11xx_gnss_almanac_full_read_bytestream_t almanac_bytestream ); + +/*! + * @brief Function to read the frequency search space around the Doppler frequency + * + * @param [in] radio Radio abstraction + * @param [out] freq_search_space Frequency search space configuration read from the chip + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_freq_search_space( const void* radio, + lr11xx_gnss_freq_search_space_t* freq_search_space ); + +/*! + * @brief Function to set the frequency search space around the Doppler frequency + * + * @param [in] radio Radio abstraction + * @param [in] freq_search_space Frequency search space configuration to be applied + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_set_freq_search_space( const void* radio, + const lr11xx_gnss_freq_search_space_t freq_search_space ); + +/*! + * @brief Get almanac age for a satellite + * + * @param [in] context Chip implementation context + * @param [in] sv_id ID of the satellite corresponding the to almanac requested + * @param [out] almanac_age Almanac age in days since last GPS time overlap + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_almanac_age_for_satellite( const void* context, const lr11xx_gnss_satellite_id_t sv_id, + uint16_t* almanac_age ); + +/*! + * @brief Push data received from solver to LR11XX + * + * @param [in] context Chip implementation context + * @param [in] payload Payload received from solver + * @param [in] payload_size Size of the payload received from solver (in bytes) + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_push_solver_msg( const void* context, const uint8_t* payload, const uint16_t payload_size ); + +/** + * @brief Return the theoretical number of visible satellites based on the given parameters. + * + * @param [in] context Chip implementation context + * @param [in] date The actual date of scan. Its format is the number of seconds elapsed since January the 6th 1980 + * 00:00:00 with leap seconds included. + * @param [in] assistance_position, latitude 12 bits and longitude 12 bits + * @param [in] constellation Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values + * @param [out] nb_visible_sv theoretical number of visible satellites + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_nb_visible_satellites( + const void* context, const lr11xx_gnss_date_t date, + const lr11xx_gnss_solver_assistance_position_t* assistance_position, + const lr11xx_gnss_constellation_t constellation, uint8_t* nb_visible_sv ); + +/** + * @brief Return the theoretical doppler information of theoretical visible satellites, this function shall be called + * after lr11xx_gnss_get_nb_visible_satellites function. + * + * @param [in] context Chip implementation context + * @param [in] nb_visible_satellites number of visible satellites returned by lr11xx_gnss_get_nb_visible_satellites + * function, + * @param [out] visible_satellite_id_doppler Doppler information of each satellite. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_visible_satellites( const void* context, const uint8_t nb_visible_satellites, + lr11xx_gnss_visible_satellite_t* visible_satellite_id_doppler ); + +/*! + * @brief Activate the GNSS scan constellation + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values + * + * @returns Operation status + * + * @see lr11xx_gnss_read_used_constellations + */ +lr11xx_status_t lr11xx_gnss_set_constellations_to_use( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask ); + +/*! + * @brief Read constellation used by the GNSS scanner from the almanac update configuration + * + * @param [in] context Chip implementation context + * @param [out] constellations_used Bit mask of the constellations used. See @ref lr11xx_gnss_constellation_t for the + * possible values + * + * @returns Operation status + * + * @see lr11xx_gnss_set_constellations_to_use + */ +lr11xx_status_t lr11xx_gnss_read_used_constellations( const void* context, + lr11xx_gnss_constellation_mask_t* constellations_used ); + +/*! + * @brief Activate the almanac update + * + * @param [in] context Chip implementation context + * @param [in] constellations_to_update Bit mask of the constellations to mark to update. See @ref + * lr11xx_gnss_constellation_t for the possible values + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_set_almanac_update( const void* context, + const lr11xx_gnss_constellation_mask_t constellations_to_update ); + +/*! + * @brief Function to read the almanac update configuration + * + * @param [in] context Chip implementation context + * @param [out] constellations_to_update Bit mask of the constellations to mark to update. See @ref + * lr11xx_gnss_constellation_t for the possible values + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_almanac_update( const void* context, + lr11xx_gnss_constellation_mask_t* constellations_to_update ); + +/*! + * @brief Function to read the GNSS firmware version + * + * @param [in] context Chip implementation context + * @param [in] version GNSS Firmware version currently running on the chip + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_firmware_version( const void* context, lr11xx_gnss_version_t* version ); + +/*! + * @brief Function to read the supported constellation, GPS or BEIDOU other constellations + * + * @param [in] context Chip implementation context + * @param [out] supported_constellations Bit mask of the constellations used. See @ref lr11xx_gnss_constellation_t for + * the possible values + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_supported_constellations( const void* context, + lr11xx_gnss_constellation_mask_t* supported_constellations ); + +/*! + * @brief Function to set the GNSS scan mode configuration + * + * @param [in] context Chip implementation context + * @param [in] scan_mode GNSS scan mode + * + * @returns Operation status + * + * @see lr11xx_gnss_scan_mode_t + */ +lr11xx_status_t lr11xx_gnss_set_scan_mode( const void* context, const lr11xx_gnss_scan_mode_t scan_mode ); + +/*! + * @brief Start the gnss scan + * + * @param [in] context Chip implementation context + * @param [in] effort_mode Effort mode @ref lr11xx_gnss_search_mode_t + * @param [in] gnss_input_parameters Bit mask indicating which information is added in the output payload @ref + * lr11xx_gnss_result_fields_e + * @param [in] nb_sat The expected number of satellite to provide. This value must be in the range [0:128] + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_scan( const void* context, const lr11xx_gnss_search_mode_t effort_mode, + const uint8_t gnss_input_parameters, const uint8_t nb_sat ); + +/*! + * @brief Function to set the assistance position. + * + * @param [in] context Chip implementation context + * @param [in] assistance_position, latitude 12 bits and longitude 12 bits + * + * @returns Operation status + * + * @see lr11xx_gnss_solver_assistance_position_t + */ +lr11xx_status_t lr11xx_gnss_set_assistance_position( + const void* context, const lr11xx_gnss_solver_assistance_position_t* assistance_position ); + +/*! + * @brief Function to read the assistance position. + * + * The assistance position read may be different from the one set beforehand with @ref + * lr11xx_gnss_set_assistance_position due to a scaling computation. + * + * @param [in] context Chip implementation context + * @param [in] assistance_position, latitude 12 bits and longitude 12 bits + * + * @returns Operation status + * + * @see lr11xx_gnss_solver_assistance_position_t + */ +lr11xx_status_t lr11xx_gnss_read_assistance_position( const void* context, + lr11xx_gnss_solver_assistance_position_t* assistance_position ); + +/*! + * @brief Host receives an update from the network or assembles itself the update message and send it to the LR11XX. + * + * @param [in] context Chip implementation context + * @param [in] dmc_msg buffer containing the update the network + * @param [in] dmc_msg_len length of this buffer + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_push_dmc_msg( const void* context, uint8_t* dmc_msg, uint16_t dmc_msg_len ); + +/*! + * @brief Get the GNSS context status + * + * This function returns the GNSS context status as a raw buffer. It is possible to use + * lr11xx_gnss_parse_context_status_buffer to obtain the details of the context status. + * + * @param [in] context Chip implementation context + * @param [out] context_status_buffer Pointer to a buffer to be filled with context status information. Must be at least + * 7 bytes long. It is up to the caller to ensure there is enough place in this buffer. + * + * @returns Operation status + * + * @see lr11xx_gnss_parse_context_status_buffer + */ +lr11xx_status_t lr11xx_gnss_get_context_status( const void* context, + lr11xx_gnss_context_status_bytestream_t context_status_buffer ); + +/*! + * @brief Get the number of detected satellites during last scan + * + * @param [in] context Chip implementation context + * @param [out] nb_detected_satellites Number of satellites detected + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_nb_detected_satellites( const void* context, uint8_t* nb_detected_satellites ); + +/*! + * @brief Get the satellites detected on last scan with their IDs, C/N (aka CNR) and doppler + * + * @note Doppler is returned with 6ppm accuracy. + * + * @param [in] context Chip implementation context + * @param [in] nb_detected_satellites Number of detected satellites on last scan (obtained by calling + * lr11xx_gnss_get_nb_detected_satellites) + * @param [out] detected_satellite_id_snr_doppler Pointer to an array of structures of size big enough to contain + * nb_detected_satellites elements + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_detected_satellites( + const void* context, const uint8_t nb_detected_satellites, + lr11xx_gnss_detected_satellite_t* detected_satellite_id_snr_doppler ); + +/*! + * @brief Read almanacs per satellite range + * + * @note Doppler is returned with 6ppm accuracy. + * + * @param [in] context Chip implementation context + * @param [in] sv_id_init Index of the satellite to start reading almanac from + * @param [in] n_sv Number of satellite almanac to read from sv_id_init + * @param [out] almanacs Pointer to an array to be filled by almanac data. It is up to the caller to ensure the + * available length of almanacs buffer is at least (n_sv * LR11XX_GNSS_SINGLE_ALMANAC_READ_SIZE) + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_almanac_per_satellites( const void* context, uint8_t sv_id_init, uint8_t n_sv, + uint8_t* almanacs ); + +/*! + * @brief Read RSSI on GNSS path + * + * This is a test function to read RSSI on GNSS path. + * + * @param [in] context Chip implementation context + * @param [out] rssi_gnss_dbm RSSI read on GNSS path in dbm + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_gnss_rssi_test( const void* context, int8_t* rssi_gnss_dbm ); + +/** + * @brief Parse a raw buffer of context status + * + * @param [in] context_status_bytestream The raw buffer of context status to parse. It is up to the caller to ensure the + * buffer is at least LR11XX_GNSS_CONTEXT_STATUS_LENGTH bytes long + * @param [out] context_status Pointer to a structure of lr11xx_gnss_context_status_t to be filled with information from + * context_status_bytestream + * + * @returns Operation status + * + * @see lr11xx_gnss_get_context_status + */ +lr11xx_status_t lr11xx_gnss_parse_context_status_buffer( + const lr11xx_gnss_context_status_bytestream_t context_status_bytestream, + lr11xx_gnss_context_status_t* context_status ); + +/** + * @brief Extract the destination from the result returned by a GNSS scan + * + * @param [in] result_buffer Pointer to the buffer holding the result + * @param [in] result_buffer_size Size of the result in byte + * @param [out] destination Destination of the result + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_result_destination( const uint8_t* result_buffer, const uint16_t result_buffer_size, + lr11xx_gnss_destination_t* destination ); + +/** + * @brief Helper function that computes the age of an almanac. + * + * This function does not call the LR11XX. + * The almanac age is computed based on the following elements: + * - almanac age as obtained from lr11xx_gnss_get_almanac_age_for_satellite + * - the number of days elapsed between Epoch (January 6th 1980) and the GPS rollover reference of the current + * almanac + * - the GPS date of today expressed in number of days elapsed since Epoch + * + * @remark It is important to use for nb_days_between_epoch_and_corresponding_gps_time_rollover the GPS time rollover + * corresponding to the reference of the almanac_date. This is especially true when current date is just after a GPS + * time rollover. + * + * @param [in] almanac_date Almanac date as obtained from lr11xx_gnss_get_almanac_age_for_satellite + * @param [in] nb_days_between_epoch_and_corresponding_gps_time_rollover Number of days elapsed between GPS Epoch and + * the GPS rollover corresponding to the almanac_date + * @param [in] nb_days_since_epoch Number of days elapsed between January 6th 1980 and now + * + * @returns Age of the almanac expressed in number of days between its start valid instant and now + */ +uint16_t lr11xx_gnss_compute_almanac_age( uint16_t almanac_date, + uint16_t nb_days_between_epoch_and_corresponding_gps_time_rollover, + uint16_t nb_days_since_epoch ); + +/*! + * @brief Start the time acquisition/domulation. + * + * @param [in] context Chip implementation context + * @param [in] effort_mode Effort mode @ref lr11xx_gnss_search_mode_t, note that LR11XX_GNSS_OPTION_HIGH_EFFORT is not + * supported here + * @param [in] option Fetch time option @ref lr11xx_gnss_fetch_time_option_t + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_fetch_time( const void* context, const lr11xx_gnss_search_mode_t effort_mode, + const lr11xx_gnss_fetch_time_option_t option ); +/*! + * @brief Read time from LR11XX. + * + * @param [in] context Chip implementation context + * @param [out] time Structure containing the time \ref lr11xx_gnss_time_t + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_time( const void* context, lr11xx_gnss_time_t* time ); + +/*! + * @brief Reset the internal time. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_reset_time( const void* context ); + +/*! + * @brief Reset the location and the history Doppler buffer. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_reset_position( const void* context ); + +/*! + * @brief Read the week number rollover. + * + * @param [in] context Chip implementation context + * @param [out] wn_rollover_status Week number rollover status \ref lr11xx_gnss_week_number_rollover_status_t + * @param [out] wn_number_rollover Week number rollover since 1980 + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_week_number_rollover( const void* context, + lr11xx_gnss_week_number_rollover_status_t* wn_rollover_status, + uint8_t* wn_number_rollover ); + +/*! + * @brief Read demod status. + * + * @param [in] context Chip implementation context + * @param [out] demod_status Demodulation status \ref lr11xx_gnss_demod_status_t + * @param [out] demod_info Demodulation info \ref lr11xx_gnss_demod_info_t + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_demod_status( const void* context, lr11xx_gnss_demod_status_t* demod_status, + lr11xx_gnss_demod_info_t* demod_info ); + +/*! + * @brief Read cumulative timing. + * + * @param [in] context Chip implementation context + * @param [out] cumulative_timing Cumulative timing status \ref lr11xx_gnss_cumulative_timing_t, The value of time is in + * counter of 32KhZ, to have it in second, the counter must be divided by 32768 + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_cumulative_timing( const void* context, + lr11xx_gnss_cumulative_timing_t* cumulative_timing ); + +/*! + * @brief Compute power consumption based on timings and instantaneous power consumption. + * + * @param [in] cumulative_timing Timings read from lr11xx_gnss_read_cumulative_timing API \ref + * lr11xx_gnss_cumulative_timing_t + * @param [in] instantaneous_power_consumption_ua Instantaneous power consumption associated to each timings \ref + * lr11xx_gnss_instantaneous_power_consumption_ua_t + * @param [out] power_consumption_nah Power consumption computed in nAh + * @param [out] power_consumption_nwh Power consumption computed in nWh + */ +void lr11xx_gnss_compute_power_consumption( + const lr11xx_gnss_cumulative_timing_t* cumulative_timing, + const lr11xx_gnss_instantaneous_power_consumption_ua_t* instantaneous_power_consumption_ua, + uint32_t* power_consumption_nah, uint32_t* power_consumption_nwh ); + +/*! + * @brief Set the GPS time. + * + * This command is to be used when the 32kHz clock feeding the LR11xx is turned off. + * The LR11xx needs the 32kHz clock to track the absolute time. However if the clock is turned off, it will attempt to + * get the absolute time from GNSS SV demodulation on next GNSS scan, which is power consuming. + * However, if the MCU has capability to keep the absolute time when 32kHz clock is turned off, then it can use this + * command to configure the LR11xx, so that the LR11xx is more power efficient when fetching time from SV signal. + * + * Typical usage is: + * 1. MCU get absolute GPS time from any (possibly not accurate) source (like LoRaWAN network for instance) + * 2. On next scan, the MCU turns on the 32kHz clock, uses lr11xx_gnss_set_time to set the time, with an accuracy that + * depends on its crystal drift, and start the scan + * 3. MCU reads the time from LR11xx (lr11xx_gnss_read_time) and stores it internally + * 4. MCU turns off 32kHz clock of the LR11xx + * + * @param [in] context Chip implementation context + * @param [in] time GPS time in sec from 6 January 1980 00:00:00 + * @param [in] time_accuracy Accuracy in millisecond of the time given. If set to 0, the accuracy of time given is + * considered to be unknown + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_set_time( const void* context, const uint32_t time, const uint16_t time_accuracy ); + +/*! + * @brief Configures the time delay in sec. If the time elapsed from last Assistance position update is larger than this + * delay and there is always no SV detected, LR11xx will reset the Assistance position and the GNSS scan switches from + * assisted scan to autonomous scan. + * + * @param [in] context Chip implementation context + * @param [in] delay Delay in second on 3 bytes + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_config_delay_reset_assistance_position( const void* context, const uint32_t delay ); + +/*! + * @brief Read the assisted position based on the internal doppler solver executed during lr11xx_gnss_scan or + * lr11xx_gnss_almanac_update_from_sat functions. + * + * @param [in] context Chip implementation context + * @param [out] results \ref lr11xx_gnss_doppler_solver_result_t + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_doppler_solver_result( const void* context, + lr11xx_gnss_doppler_solver_result_t* results ); + +/*! + * @brief Read the time delay in sec. If the time elapsed from last Assistance position update is larger than this + * delay and there is always no SV detected, LR11xx will reset the Assistance position and the GNSS scan switches from + * assisted scan to autonomous scan. + * + * @param [in] context Chip implementation context + * @param [out] delay Delay in second on 3 bytes + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_delay_reset_assistance_position( const void* context, uint32_t* delay ); + +/*! + * @brief This command launches one scan to download from satellite almanac parameters broadcasted in one page by one + * constellation. + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values + * @param [in] effort_mode Effort mode @ref lr11xx_gnss_search_mode_t, note that LR11XX_GNSS_OPTION_HIGH_EFFORT is not + * supported here + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_almanac_update_from_sat( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_search_mode_t effort_mode ); + +/*! + * @brief This command read the number of visible satellites and the time elapsed from last detected satellite list + * update of this constellation. + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values. Only one constellation shall be selected otherwise the command will return an error + * @param [out] nb_visible_sat number of visible satellites + * @param [out] time_elapsed elapsed from last sv list update in ms + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_keep_sync_status( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + uint8_t* nb_visible_sat, uint32_t* time_elapsed ); + +/*! + * @brief This command returns the actual state of almanac GPS and Beidou. + * + * @param [in] context Chip implementation context + * @param [in] almanac_status almanac status for GPS and Beidou @ref lr11xx_gnss_read_almanac_status_t + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_almanac_status( const void* context, + lr11xx_gnss_read_almanac_status_t* almanac_status ); + +/*! + * @brief Configures the almanac update period. + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values. Only one constellation shall be selected otherwise the command will return an error + * @param [in] sv_type sv type to configure. See @ref lr11xx_gnss_sv_type_t for + * the possible values. This parameter has no impact when constellation_mask is set to LR11XX_GNSS_GPS_MASK but is value + * must be a valid lr11xx_gnss_sv_type_t one + * @param [in] period delta in day computed between age of almanac in flash and current day and compared to this period + * to indicate to the application during a lr11xx_gnss_read_almanac_status if it must be downloaded + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_config_almanac_update_period( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_sv_type_t sv_type, const uint16_t period ); + +/*! + * @brief Read the almanac update period. + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values. Only one constellation shall be selected otherwise the command will return an error + * @param [in] sv_type sv type of satellites to read period from. See @ref lr11xx_gnss_sv_type_t for + * the possible values. This parameter has no impact when constellation_mask is set to LR11XX_GNSS_GPS_MASK but is value + * must be a valid lr11xx_gnss_sv_type_t one + * @param [out] period delta in day computed between age of almanac in flash and current day and compared to this period + * to indicate to the application during a lr11xx_gnss_read_almanac_status if it must be downloaded + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_almanac_update_period( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_sv_type_t sv_type, uint16_t* period ); + +/*! + * @brief Returns the list of satellite for the next keep sync scan. + * + * @param [in] context Chip implementation context + * @param [in] constellation_mask Bit mask of the constellations to use. See @ref lr11xx_gnss_constellation_t for + * the possible values. Only one constellation shall be selected otherwise the command will return an error + * @param [in] nb_sv_to_get Number of sv to read, the user must call lr11xx_gnss_read_keep_sync_status to know exactly + * the number of satellites in the list + * @param [out] sv_sync_list list of sync. It is up to the caller to ensure it is at least nb_sv_to_get byte long + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_get_sv_sync( const void* context, const lr11xx_gnss_constellation_mask_t constellation_mask, + const uint8_t nb_sv_to_get, uint8_t* sv_sync_list ); + +/*! + * @brief Configures the ability of the LR11xx to search almanac for each GPS satellites. + * + * @param [in] context Chip implementation context + * @param [in] gps_sat_activated_1_32 32-bit bit mask sat activated: sat 1-32 activated (default value: 0xFFFFFFFF) + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_set_gps_bit_mask_sat_activated( const void* context, + const uint32_t gps_sat_activated_1_32 ); + +/*! + * @brief Configures the ability of the LR11xx to search almanac for each Beidou satellites. + * + * @param [in] context Chip implementation context + * @param [in] beidou_sat_activated_1_32 32-bit bit mask sat activated: sat 1-32 activated (default value: 0xBFFCBFFF)) + * @param [in] beidou_sat_activated_33_63 32-bit bit mask sat activated: sat 33-63 activated (default value: 0xC0007FF)) + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_set_beidou_bit_mask_sat_activated( const void* context, + const uint32_t beidou_sat_activated_1_32, + const uint32_t beidou_sat_activated_33_63 ); + +/*! + * @brief Get the type of scan launched during the last scan + * + * @param [in] context Chip implementation context + * @param [out] last_scan_mode last scan launched. See @ref lr11xx_gnss_scan_mode_launched_t for + * the possible values. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_gnss_read_last_scan_mode_launched( const void* context, + lr11xx_gnss_scan_mode_launched_t* last_scan_mode ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_GNSS_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss_types.h new file mode 100755 index 0000000..e06c3dc --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_gnss_types.h @@ -0,0 +1,573 @@ +/*! + * @file lr11xx_gnss_types.h + * + * @brief GNSS scan driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_GNSS_TYPES_H +#define LR11XX_GNSS_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Maximal buffer size + */ +#define LR11XX_GNSS_MAX_SIZE_ARRAY 2820 //!< (128sv * 22bytes + 4bytes for CRC) + +/*! + * @brief Number of almanacs in full update payload + */ +#define LR11XX_GNSS_FULL_UPDATE_N_ALMANACS ( 128 ) + +/*! + * @brief Size of the almanac of a single satellite when reading + */ +#define LR11XX_GNSS_SINGLE_ALMANAC_READ_SIZE ( 22 ) + +/*! + * @brief Size of the almanac of a single satellite when writing + */ +#define LR11XX_GNSS_SINGLE_ALMANAC_WRITE_SIZE ( 20 ) + +/*! + * @brief Size of the almanac of the GNSS context status buffer + */ +#define LR11XX_GNSS_CONTEXT_STATUS_LENGTH ( 9 ) + +/*! + * @brief Size of the whole almanac when reading + */ +#define LR11XX_GNSS_FULL_ALMANAC_READ_BUFFER_SIZE \ + ( ( LR11XX_GNSS_FULL_UPDATE_N_ALMANACS * LR11XX_GNSS_SINGLE_ALMANAC_READ_SIZE ) + 4 ) + +#define LR11XX_GNSS_DMC_ALMANAC_UPDATE_POS ( 1U ) +#define LR11XX_GNSS_DMC_ALMANAC_UPDATE_GPS_MASK ( 0x01UL << LR11XX_GNSS_DMC_ALMANAC_UPDATE_POS ) +#define LR11XX_GNSS_DMC_ALMANAC_UPDATE_BEIDOU_MASK ( 0x02UL << LR11XX_GNSS_DMC_ALMANAC_UPDATE_POS ) + +#define LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_MSB_POS ( 0U ) +#define LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_MSB_MASK ( 0x01UL << LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_MSB_POS ) + +#define LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_LSB_POS ( 7U ) +#define LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_LSB_MASK ( 0x01UL << LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_LSB_POS ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Satellite ID type + */ +typedef uint8_t lr11xx_gnss_satellite_id_t; + +/*! + * @brief bit mask indicating which information is added in the output payload + */ +enum lr11xx_gnss_result_fields_e +{ + LR11XX_GNSS_RESULTS_DOPPLER_ENABLE_MASK = ( 1 << 0 ), //!< Add Doppler information if set + LR11XX_GNSS_RESULTS_DOPPLER_MASK = ( 1 << 1 ), //!< Add up to 14 Doppler if set - up to 7 if not. Valid if @ref + //!< LR11XX_GNSS_RESULTS_DOPPLER_ENABLE_MASK is set + LR11XX_GNSS_RESULTS_BIT_CHANGE_MASK = + ( 1 << 2 ), //!< Add bit change if set, LR11XX_GNSS_SCAN_MODE_3_SINGLE_SCAN_AND_5_FAST_SCANS mode only + LR11XX_GNSS_RESULTS_DEMODULATE_TIME_MASK = + ( 1 << 3 ), //!< Add time demodulation if set, LR11XX_GNSS_SCAN_MODE_3_SINGLE_SCAN_AND_5_FAST_SCANS mode only + LR11XX_GNSS_RESULTS_REMOVE_TIME_FROM_NAV_MASK = ( 1 << 4 ), //!< Remove time from NAV if set + LR11XX_GNSS_RESULTS_REMOVE_AP_FROM_NAV_MASK = ( 1 << 5 ), //!< Remove aiding position from NAV if set +}; + +/*! + * @brief Constellation identifiers + */ +typedef enum +{ + LR11XX_GNSS_GPS_MASK = 0x01, + LR11XX_GNSS_BEIDOU_MASK = 0x02, +} lr11xx_gnss_constellation_t; + +/*! + * @brief Bit mask of constellation configurations + * + * @see lr11xx_gnss_constellation_t + */ +typedef uint8_t lr11xx_gnss_constellation_mask_t; + +/*! + * @brief Search mode for GNSS scan + */ +typedef enum +{ + LR11XX_GNSS_OPTION_LOW_EFFORT = 0x00, //!< Search all requested satellites or fail, scan duration is low + LR11XX_GNSS_OPTION_MID_EFFORT = + 0x01, //!< Add additional search if not all satellites are found, scan duration is standard + LR11XX_GNSS_OPTION_HIGH_EFFORT = + 0x02, //!< Add additional search if not all satellites are found, scan duration is very high +} lr11xx_gnss_search_mode_t; + +/*! + * @brief GNSS response type indicates the destination: Host MCU, GNSS solver or GNSS DMC + */ +typedef enum +{ + LR11XX_GNSS_DESTINATION_HOST = 0x00, //!< Host MCU + LR11XX_GNSS_DESTINATION_SOLVER = 0x01, //!< GNSS Solver + LR11XX_GNSS_DESTINATION_DMC = 0x02, //!< GNSS DMC +} lr11xx_gnss_destination_t; + +/*! + * @brief Message to host indicating the status of the message + */ +typedef enum +{ + LR11XX_GNSS_HOST_OK = 0x00, + LR11XX_GNSS_HOST_UNEXPECTED_CMD = 0x01, + LR11XX_GNSS_HOST_UNIMPLEMENTED_CMD = 0x02, + LR11XX_GNSS_HOST_INVALID_PARAMETERS = 0x03, + LR11XX_GNSS_HOST_MESSAGE_SANITY_CHECK_ERROR = 0x04, + LR11XX_GNSS_HOST_IQ_CAPTURE_FAILS = 0x05, + LR11XX_GNSS_HOST_NO_TIME = 0x06, + LR11XX_GNSS_HOST_NO_SATELLITE_DETECTED = 0x07, + LR11XX_GNSS_HOST_ALMANAC_IN_FLASH_TOO_OLD = 0x08, + LR11XX_GNSS_HOST_ALMANAC_UPDATE_FAILS_CRC_ERROR = 0x09, + LR11XX_GNSS_HOST_ALMANAC_UPDATE_FAILS_FLASH_INTEGRITY_ERROR = 0x0A, + LR11XX_GNSS_HOST_ALMANAC_UPDATE_NOT_ALLOWED = 0x0C, + LR11XX_GNSS_HOST_ALMANAC_CRC_ERROR = 0x0D, + LR11XX_GNSS_HOST_ALMANAC_VERSION_NOT_SUPPORTED = 0x0E, + LR11XX_GNSS_HOST_NOT_ENOUGH_SV_DETECTED_TO_BUILD_A_NAV_MESSAGE = 0x10, + LR11XX_GNSS_HOST_TIME_DEMODULATION_FAIL = 0x11, + LR11XX_GNSS_HOST_ALMANAC_DEMODULATION_FAIL = 0x12, + LR11XX_GNSS_HOST_AT_LEAST_THE_DETECTED_SV_OF_ONE_CONSTELLATION_ARE_DEACTIVATED = 0x13, + LR11XX_GNSS_HOST_ASSISTANCE_POSITION_POSSIBLY_WRONG_BUT_FAILS_TO_UPDATE = 0x14, + LR11XX_GNSS_HOST_SCAN_ABORTED = 0x15, + LR11XX_GNSS_HOST_NAV_MESSAGE_CANNOT_BE_GENERATED_INTERVAL_GREATER_THAN_63_SEC = 0x16, +} lr11xx_gnss_message_host_status_t; + +/*! + * @brief Message to DMC operation code + */ +typedef enum +{ + LR11XX_GNSS_DMC_STATUS = 0x18, //!< Status message in payload +} lr11xx_gnss_message_dmc_opcode_t; + +/*! + * @brief GNSS single or double scan mode + */ +typedef enum +{ + LR11XX_GNSS_SCAN_MODE_0_SINGLE_SCAN_LEGACY = 0x00, //!< Generated NAV message format = NAV3 + LR11XX_GNSS_SCAN_MODE_3_SINGLE_SCAN_AND_5_FAST_SCANS = 0x03, //!< Generated NAV message format = NAV3 +} lr11xx_gnss_scan_mode_t; + +/*! + * @brief GNSS error codes + */ +typedef enum lr11xx_gnss_error_code_e +{ + LR11XX_GNSS_NO_ERROR = 0, + LR11XX_GNSS_ERROR_ALMANAC_TOO_OLD = 1, + LR11XX_GNSS_ERROR_UPDATE_CRC_MISMATCH = 2, + LR11XX_GNSS_ERROR_UPDATE_FLASH_MEMORY_INTEGRITY = 3, + LR11XX_GNSS_ERROR_ALMANAC_UPDATE_NOT_ALLOWED = 4, //!< Impossible to update more than one constellation at a time +} lr11xx_gnss_error_code_t; + +/*! + * @brief GNSS frequency search space + */ +typedef enum lr11xx_gnss_freq_search_space_e +{ + LR11XX_GNSS_FREQUENCY_SEARCH_SPACE_250_HZ = 0, + LR11XX_GNSS_FREQUENCY_SEARCH_SPACE_500_HZ = 1, + LR11XX_GNSS_FREQUENCY_SEARCH_SPACE_1_KHZ = 2, + LR11XX_GNSS_FREQUENCY_SEARCH_SPACE_2_KHZ = 3, +} lr11xx_gnss_freq_search_space_t; + +/*! + * @brief GNSS fetch time option + */ +typedef enum lr11xx_gnss_fetch_time_option_e +{ + LR11XX_GNSS_SEARCH_TOW = 0, //!< Fetch the time of week. This option can only be used either after a successful + //!< GNSS scan, or after a successful call to lr11xx_gnss_fetch_time with option + //!< LR11XX_GNSS_SEARCH_TOW_WN or LR11XX_GNSS_SEARCH_TOW_WN_ROLLOVER + LR11XX_GNSS_SEARCH_TOW_WN = 1, //!< Fetch the time of week and the week number + LR11XX_GNSS_SEARCH_TOW_WN_ROLLOVER = + 2, //!< Fetch the time of week, week number and week number rollover since 1980 +} lr11xx_gnss_fetch_time_option_t; + +/*! + * @brief GNSS time status + */ +typedef enum lr11xx_gnss_read_time_status_e +{ + LR11XX_GNSS_READ_TIME_STATUS_NO_ERROR = 0, + LR11XX_GNSS_READ_TIME_STATUS_32K_STOPPED = 1, + LR11XX_GNSS_READ_TIME_STATUS_WN_TOW_NOT_SET = 2 +} lr11xx_gnss_read_time_status_t; + +/*! + * @brief GNSS week number number rollover status + */ +typedef enum lr11xx_gnss_week_number_rollover_status_e +{ + LR11XX_GNSS_WN_ROLLOVER_ROLLOVER_NEVER_SET = 0, + LR11XX_GNSS_WN_ROLLOVER_ROLLOVER_SET_BY_SCAN = 1, +} lr11xx_gnss_week_number_rollover_status_t; + +/*! + * @brief GNSS demod status + */ +typedef enum lr11xx_gnss_demod_status_e +{ + LR11XX_GNSS_NO_DEMOD_BDS_ALMANAC_SV31_43 = -21, + LR11XX_GNSS_SV_SELECTED_FOR_DEMOD_LOST = -20, + LR11XX_GNSS_ALMANAC_DEMOD_ERROR = -19, + LR11XX_GNSS_WAKE_UP_AFTER_PREAMBLE = -18, + LR11XX_GNSS_20MS_REAL_TIME_FAILURE = -17, + LR11XX_GNSS_WAKE_UP_SYNC_FAILURE = -16, + LR11XX_GNSS_WEEK_NUMBER_NOT_VALIDATED = -15, + LR11XX_GNSS_NO_ACTIVATED_SAT_IN_SV_LIST = -14, + LR11XX_GNSS_SLEEP_TIME_TOO_LONG = -13, + LR11XX_GNSS_WRONG_TIME_OF_WEEK_DEMOD = -12, + LR11XX_GNSS_PREAMBLE_NOT_VALIDATED = -11, + LR11XX_GNSS_DEMOD_DISABLE = -10, + LR11XX_GNSS_DEMOD_EXTRACTION_FAILURE = -9, + LR11XX_GNSS_NO_BIT_CHANGE_FOUND_DURING_START_DEMOD = -8, + LR11XX_GNSS_NO_BIT_CHANGE_FOUND_DURING_MULTISCAN = -7, + LR11XX_GNSS_NO_SAT_FOUND = -6, + LR11XX_GNSS_WORD_SYNC_LOST = -5, + LR11XX_GNSS_NOT_ENOUGH_PARITY_CHECK_FOUND = -3, + LR11XX_GNSS_TOO_MANY_PARITY_CHECK_FOUND = -2, + LR11XX_GNSS_NO_PARITY_CHECK_FOUND = -1, + LR11XX_GNSS_WORD_SYNC_SEARCH_NOT_STARTED = 0, + LR11XX_GNSS_WORD_SYNC_POTENTIALLY_FOUND = 1, + LR11XX_GNSS_WORD_SYNC_FOUND = 2, + LR11XX_GNSS_TIME_OF_WEEK_FOUND = 3, + LR11XX_GNSS_WEEK_NUMBER_FOUND = 4, + LR11XX_GNSS_ALMANAC_FOUND_BUT_NO_SAVED = 5, + LR11XX_GNSS_HALF_ALMANAC_FOUND_AND_SAVED = 6, + LR11XX_GNSS_ALMANAC_FOUND_AND_SAVED = 7, +} lr11xx_gnss_demod_status_t; + +/*! + * @brief GNSS doppler solver error code + */ +typedef enum lr11xx_gnss_doppler_solver_error_code_e +{ + LR11XX_GNSS_DOPPLER_SOLVER_NO_ERROR = 0, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_RESIDUE_HIGH = 1, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_NOT_CONVERGED = 2, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_NOT_ENOUGH_SV = 3, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_ILL_MATRIX = 4, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_TIME_ERROR = 5, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_PARTIAL_ALMANAC_TOO_OLD = 6, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_NOT_CONSISTENT_WITH_HISTORY = 7, + LR11XX_GNSS_DOPPLER_SOLVER_ERROR_ALL_ALMANAC_TOO_OLD = 8, +} lr11xx_gnss_doppler_solver_error_code_t; + +/*! + * @brief GNSS almanac status + */ +typedef enum lr11xx_gnss_almanac_status_e +{ + LR11XX_GNSS_INTERNAL_ACCURACY_TOO_LOW = -4, + LR11XX_GNSS_NO_TIME_SET = -3, + LR11XX_GNSS_IMPOSSIBLE_TO_FIND_NEXT_TIME = -2, + LR11XX_GNSS_NO_PAGE_ID_KNOWN = -1, + LR11XX_GNSS_NO_SAT_TO_UPDATE = 0, + LR11XX_GNSS_AT_LEAST_ONE_SAT_MUST_BE_UPDATED = 1, +} lr11xx_gnss_almanac_status_t; + +/*! + * @brief GNSS SV type + */ +typedef enum lr11xx_gnss_sv_type_e +{ + LR11XX_GNSS_MEO_SAT = 0, + LR11XX_GNSS_IGSO_SAT = 1, +} lr11xx_gnss_sv_type_t; + +typedef enum +{ + LR11XX_GNSS_LAST_SCAN_MODE_ASSISTED = 3, + LR11XX_GNSS_LAST_SCAN_MODE_AUTONOMOUS_NO_TIME_NO_AP = 4, + LR11XX_GNSS_LAST_SCAN_MODE_AUTONOMOUS_NO_AP = 5, + LR11XX_GNSS_LAST_SCAN_FETCH_TIME_OR_DOPPLER_SOLVER = 6, + LR11XX_GNSS_LAST_SCAN_ALMANAC_UPDATE = 7, + LR11XX_GNSS_LAST_SCAN_KEEP_SYNC = 8, + LR11XX_GNSS_LAST_SCAN_ALMANAC_UPDATE_1_CONSTELLATION = 9, + LR11XX_GNSS_LAST_SCAN_ALMANAC_UPDATE_2_CONSTELLATIONS = 10, +} lr11xx_gnss_scan_mode_launched_t; + +/*! + * @brief GNSS time structure + */ +typedef struct lr11xx_gnss_time_s +{ + lr11xx_gnss_read_time_status_t error_code; + uint32_t gps_time_s; + uint32_t nb_us_in_s; + uint32_t time_accuracy; +} lr11xx_gnss_time_t; + +/*! + * @brief GNSS demod info structure + */ +typedef struct lr11xx_gnss_demod_info_s +{ + bool word_sync_found; //!< 0: no word synchronization found / 1: a word synchronization has been found + bool first_tow_found; //!< 0: no Time Of Week found / 1: a Time Of Week has been found + bool wn_demodulated; //!< 0: no Week number demodulated / 1: a Week Number has been demodulated + bool wn_found; //!< 0: no Week number found / 1: a Week Number has been found + bool sub1_found; //!< 0: subframe ID not found / 1: subframe ID found + bool sub4_found; //!< 0: subframe ID not found / 1: subframe ID found + bool sub5_found; //!< 0: subframe ID not found / 1: subframe ID found +} lr11xx_gnss_demod_info_t; + +/*! + * @brief GNSS cumulative_timing + */ +typedef struct lr11xx_gnss_cumulative_timing_s +{ + uint32_t init; + uint32_t phase1_gps_capture; + uint32_t phase1_gps_process; + uint32_t multiscan_gps_capture; + uint32_t multiscan_gps_process; + uint32_t multiscan_gps_sleep_32k; + uint32_t phase1_beidou_capture; + uint32_t phase1_beidou_process; + uint32_t multiscan_beidou_capture; + uint32_t multiscan_beidou_process; + uint32_t multiscan_beidou_sleep_32k; + uint32_t demod_capture; + uint32_t demod_process; + uint32_t demod_sleep_32k; + uint32_t demod_sleep_32m; + uint32_t total_gps_capture; + uint32_t total_gps_process; + uint32_t total_gps_sleep_32k; + uint32_t total_gps_sleep_32m; + uint32_t total_gps; + uint32_t total_beidou_capture; + uint32_t total_beidou_process; + uint32_t total_beidou_sleep_32k; + uint32_t total_beidou_sleep_32m; + uint32_t total_beidou; + uint32_t total_capture; + uint32_t total_process; + uint32_t total_sleep_32k; + uint32_t total_sleep_32m; + uint32_t total; + uint32_t last_capture_size_32k_cnt; + uint8_t constellation_demod; +} lr11xx_gnss_cumulative_timing_t; + +/*! + * @brief GNSS instantaneous power consumption in ua + */ +typedef struct lr11xx_gnss_instantaneous_power_consumption_ua_s +{ + uint16_t board_voltage_mv; + uint16_t init_ua; + uint16_t phase1_gps_capture_ua; + uint16_t phase1_gps_process_ua; + uint16_t multiscan_gps_capture_ua; + uint16_t multiscan_gps_process_ua; + uint16_t phase1_beidou_capture_ua; + uint16_t phase1_beidou_process_ua; + uint16_t multiscan_beidou_capture_ua; + uint16_t multiscan_beidou_process_ua; + uint16_t sleep_32k_ua; + uint16_t demod_sleep_32m_ua; +} lr11xx_gnss_instantaneous_power_consumption_ua_t; + +/*! + * @brief + */ +typedef struct lr11xx_gnss_doppler_solver_result_s +{ + lr11xx_gnss_doppler_solver_error_code_t error_code; + uint8_t nb_sv_used; + uint16_t one_shot_latitude; + uint16_t one_shot_longitude; + uint16_t one_shot_accuracy; + uint16_t one_shot_xtal_ppb; + uint16_t filtered_latitude; + uint16_t filtered_longitude; + uint16_t filtered_accuracy; + uint16_t filtered_xtal_ppb; +} lr11xx_gnss_doppler_solver_result_t; + +/*! + * @brief + */ +typedef struct lr11xx_gnss_read_almanac_status_s +{ + lr11xx_gnss_almanac_status_t status_gps; + uint32_t next_gps_time_sat_to_update; //!< Next gps time sat to update: give the duration in milliseconds before + //!< the next start subframe where to catch the new almanac + uint8_t next_gps_nb_subframe_to_demodulate; + uint8_t next_gps_sat_id_to_update_in_sub_4; //!< Next gps sat id to update in subframe 4: satellite number that can + //!< be demodulated in next subframe 4 + uint8_t next_gps_sat_id_to_update_in_sub_5; //!< Next gps sat id to update in subframe 5: satellite number that can + //!< be demodulated in next subframe 5 + uint8_t nb_sat_gps_to_update; //!< the number total gps and bds that needs almanac update + uint8_t next_gps_subframe_id_start; //!< Next gps subframe ID start: can be equal to 4, 5 or 0 + uint32_t sat_id_gps_to_update; //!< Sat id gps to update: bit mask indicating which sat id almanac must be updated. + //!< bit at 0 : almanac is already updated, bit at 1: almanac sat must be updated + uint32_t sat_id_gps_activated; //!< Sat id gps activated : bit mask indicating which sat id is activated . bit at 0 + //!< : sat id is not activated, bit at 1: sat id is activated + lr11xx_gnss_almanac_status_t status_beidou; + uint32_t next_beidou_time_sat_to_update; //!< Next beidou time sat to update: give the duration in milliseconds + //!< before the next start subframe where to catch the new almanac + uint8_t next_beidou_nb_subframe_to_demodulate; + uint8_t next_beidou_sat_id_to_update_in_sub_4; //!< Next beidou sat id to update in subframe 4: satellite number + //!< that can be demodulated in next subframe 4 + uint8_t next_beidou_sat_id_to_update_in_sub_5; //!< Next beidou sat id to update in subframe 5: satellite number + //!< that can be demodulated in next subframe 5 + uint8_t nb_sat_beidou_to_update; //!< the number total gps and bds that needs almanac update + uint8_t next_beidou_subframe_id_start; //!< Next beidou subframe ID start: can be equal to 4, 5 or 0 + uint32_t sat_id_beidou_to_update[2]; //!< Sat id beidou to update: bit mask indicating which sat id almanac must be + //!< updated. bit at 0 : almanac is already updated, bit at 1: almanac sat + //!< must be updated + uint32_t sat_id_beidou_activated[2]; //!< Sat id gps activated : bit mask indicating which sat id is activated . + //!< bit at 0 : sat id is not activated, bit at 1: sat id is activated + uint32_t sat_id_beidou_black_list[2]; //!< Sat id bds black list: bit mask indicating which bds sv does not + //!< broadcast the almanac + //!< bit at 0 : sat id is not black listed, bit at 1: sat id is black listed + uint8_t next_am_id; //!< Next AmID: For beidou only. Page 11-24 of subframe 5 are used to broadcast almanac of sat + //!< 31 to 63 +} lr11xx_gnss_read_almanac_status_t; + +/*! + * @brief Representation of absolute time for GNSS operations + * + * The GNSS absolute time is represented as a 32 bits word that is the number of seconds elapsed since January 6th + * 1980, 00:00:00 + * + * The GNSS absolute time must take into account the Leap Seconds between UTC time and GPS time. + */ +typedef uint32_t lr11xx_gnss_date_t; + +/*! + * @brief Buffer that holds data for all almanacs full update - when reading + */ +typedef uint8_t lr11xx_gnss_almanac_full_read_bytestream_t[LR11XX_GNSS_FULL_ALMANAC_READ_BUFFER_SIZE]; + +/*! + * @brief Buffer that holds data for context status + */ +typedef uint8_t lr11xx_gnss_context_status_bytestream_t[LR11XX_GNSS_CONTEXT_STATUS_LENGTH]; + +/*! + * @brief Assistance position. + */ +typedef struct lr11xx_gnss_solver_assistance_position_s +{ + float latitude; //!< Latitude 12 bits (latitude in degree * 2048/90) with resolution 0.044° + float longitude; //!< Longitude 12 bits (longitude in degree * 2048/180) with resolution 0.088° +} lr11xx_gnss_solver_assistance_position_t; + +/*! + * @brief Detected SV structure + */ +typedef struct lr11xx_gnss_detected_satellite_s +{ + lr11xx_gnss_satellite_id_t satellite_id; + int8_t cnr; //!< Carrier-to-noise ration (C/N) in dB + int16_t doppler; //!< SV doppler in Hz +} lr11xx_gnss_detected_satellite_t; + +/*! + * @brief Version structure of the LR11XX GNSS firmware + */ +typedef struct lr11xx_gnss_version_s +{ + uint8_t gnss_firmware; //!< Version of the firmware + uint8_t gnss_almanac; //!< Version of the almanac format +} lr11xx_gnss_version_t; + +/*! + * @brief Structure for GNSS context status + */ +typedef struct lr11xx_gnss_context_status_s +{ + uint8_t firmware_version; + uint32_t global_almanac_crc; + lr11xx_gnss_error_code_t error_code; + bool almanac_update_gps; + bool almanac_update_beidou; + lr11xx_gnss_freq_search_space_t freq_search_space; +} lr11xx_gnss_context_status_t; + +/*! + * @brief Structure for information about visible SV + */ +typedef struct lr11xx_gnss_visible_satellite_s +{ + lr11xx_gnss_satellite_id_t satellite_id; //!< SV ID + int16_t doppler; //!< SV doppler in Hz + int16_t doppler_error; //!< SV doppler error - step of 125Hz +} lr11xx_gnss_visible_satellite_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_GNSS_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_hal.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_hal.h new file mode 100755 index 0000000..55b9bc7 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_hal.h @@ -0,0 +1,211 @@ +/*! + * @file lr11xx_hal.h + * + * @brief Hardware Abstraction Layer (HAL) interface for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_HAL_H +#define LR11XX_HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/** + * @brief Write this to SPI bus while reading data, or as a dummy/placeholder + */ +#define LR11XX_NOP ( 0x00 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief LR11XX HAL status + */ +typedef enum lr11xx_hal_status_e +{ + LR11XX_HAL_STATUS_OK = 0, + LR11XX_HAL_STATUS_ERROR = 3, +} lr11xx_hal_status_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Radio data transfer - write + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [in] command_length Buffer size to be transmitted + * @param [in] data Pointer to the buffer to be transmitted + * @param [in] data_length Buffer size to be transmitted + * + * @returns Operation status + */ +lr11xx_hal_status_t lr11xx_hal_write( const void* context, const uint8_t* command, const uint16_t command_length, + const uint8_t* data, const uint16_t data_length ); + +/*! + * @brief Radio data transfer - read + * + * @remark This is a two-step radio read operation. It consists of writing the command, releasing then re-asserting the + * NSS line, then reading a discarded dummy byte followed by data_length bytes of response data from the transceiver. + * While reading the dummy bytes and the response data, the implementation of this function must ensure that only zero + * bytes (NOP) are written to the SPI bus. + * + * @param [in] context Radio implementation parameters + * @param [in] command Pointer to the buffer to be transmitted + * @param [in] command_length Buffer size to be transmitted + * @param [out] data Pointer to the buffer to be received + * @param [in] data_length Buffer size to be received + * + * @returns Operation status + * + * @remark Some hardware SPI implementations write arbitary values on the MOSI line while reading. If this is done on + * the LR11XX, non-zero values may be interpreted as commands. This driver does not exploit this functionality, and + * expects that zeros be sent on the MOSI line when this command is reading the command response data. + */ +lr11xx_hal_status_t lr11xx_hal_read( const void* context, const uint8_t* command, const uint16_t command_length, + uint8_t* data, const uint16_t data_length ); + +/*! + * @brief Direct read from the SPI bus + * + * @remark Unlike @ref lr11xx_hal_read, this is a simple direct SPI bus SS/read/nSS operation. While reading the + * response data, the implementation of this function must ensure that only zero bytes (NOP) are written to the SPI bus. + * + * @remark Formerly, that function depended on a lr11xx_hal_write_read API function, which required bidirectional SPI + * communication. Given that all other radio functionality can be implemented with unidirectional SPI, it has been + * decided to make this HAL API change to simplify implementation requirements. + * + * @remark Only required by the @ref lr11xx_system_get_status and @ref lr11xx_bootloader_get_status commands + * + * @param [in] context Radio implementation parameters + * @param [out] data Pointer to the buffer to be received + * @param [in] data_length Buffer size to be received + * + * @returns Operation status + */ +lr11xx_hal_status_t lr11xx_hal_direct_read( const void* context, uint8_t* data, const uint16_t data_length ); + +/*! + * @brief Reset the radio + * + * @param [in] context Radio implementation parameters + * + * @returns Operation status + */ +lr11xx_hal_status_t lr11xx_hal_reset( const void* context ); + +/*! + * @brief Wake the radio up. + * + * @param [in] context Radio implementation parameters + * + * @returns Operation status + */ +lr11xx_hal_status_t lr11xx_hal_wakeup( const void* context ); + +/*! + * @brief Abort a blocking command + * + * @param [in] context Radio implementation parameters + * + * @returns Operation status + */ +lr11xx_hal_status_t lr11xx_hal_abort_blocking_cmd( const void* context ); + +/*! + * @brief Return the computed CRC + * + * @param [in] initial_value initial value of the CRC + * @param [in] buffer Buffer containing data used to compute the CRC + * @param [in] length Length of buffer + * + * @returns CRC value + */ +inline static uint8_t lr11xx_hal_compute_crc( const uint8_t initial_value, const uint8_t* buffer, uint16_t length ) +{ + uint8_t crc = initial_value; + if (buffer == NULL) { + printf("Error: buffer is NULL!\n"); + return 0; + } + for( uint16_t i = 0; i < length; i++ ) + { + // printf("%d %d %d\r\n",i,length,sizeof(buffer) / sizeof(buffer[0])); + uint8_t extract = buffer[i]; + uint8_t sum; + + for( uint8_t j = 8; j > 0; j-- ) + { + sum = ( crc ^ extract ) & 0x01; + crc >>= 1; + + if( sum != 0 ) + { + crc ^= 0x65; + } + + extract >>= 1; + } + } + + return crc; +} + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_HAL_H diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss.h new file mode 100755 index 0000000..3b44f32 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss.h @@ -0,0 +1,138 @@ +/*! + * @file lr11xx_lr_fhss.h + * + * @brief LR_FHSS driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_LR_FHSS_H +#define LR11XX_LR_FHSS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_lr_fhss_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/** + * @brief Length, in bytes, of a LR-FHSS sync word + */ +#define LR_FHSS_SYNC_WORD_BYTES ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Initialize the LR_FHSS + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_lr_fhss_init( const void* context ); + +/** + * @brief Get the delay in microsecond between the last bit sent and the TX done interrupt + * + * @param [in] params lr11xx LR-FHSS parameter structure + * @param [in] payload_length Length of application-layer payload + * + * @returns Delay in microseconds + */ +uint16_t lr11xx_lr_fhss_get_bit_delay_in_us( const lr11xx_lr_fhss_params_t* params, uint16_t payload_length ); + +/*! + * @brief Configure a payload to be sent with LR_FHSS + * + * When calling this method, lr11xx_radio_set_lr_fhss_sync_word is implicitely called to configure the sync word. + * Note that the syncword must be 4 bytes long. + * + * @param [in] context Chip implementation context + * @param [in] lr_fhss_params Parameter configuration structure of the LRFHSS + * @param [in] hop_sequence_id Seed used to derive the hopping sequence pattern. Only the nine LSBs are taken into + * account + * @param [in] payload The payload to send. It is the responsibility of the caller to ensure that this references an + * array containing at least payload_length elements + * @param [in] payload_length The length of the payload + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_lr_fhss_build_frame( const void* context, const lr11xx_lr_fhss_params_t* lr_fhss_params, + uint16_t hop_sequence_id, const uint8_t* payload, uint8_t payload_length ); + +/*! + * @brief Get the time on air in ms for LR-FHSS transmission + * + * @param [in] params LR11XX LR-FHSS parameter structure + * @param [in] payload_length Length of application-layer payload + * + * @returns Time-on-air value in ms for LR-FHSS transmission + */ +uint32_t lr11xx_lr_fhss_get_time_on_air_in_ms( const lr11xx_lr_fhss_params_t* params, uint16_t payload_length ); + +/** + * @brief Return the number of hop sequences available using the given parameters + * + * @param [in] lr_fhss_params Parameter configuration structure of the LRFHSS + * + * @return Returns the number of valid hop sequences (512 or 384) + */ +unsigned int lr11xx_lr_fhss_get_hop_sequence_count( const lr11xx_lr_fhss_params_t* lr_fhss_params ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_LR_FHSS_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss_types.h new file mode 100755 index 0000000..2e37a06 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_lr_fhss_types.h @@ -0,0 +1,65 @@ +/*! + * @file lr11xx_lr_fhss_types.h + * + * @brief LR_FHSS types definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_LR_FHSS_TYPES_H +#define LR11XX_LR_FHSS_TYPES_H + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr_fhss_v1_base_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief LR FHSS parameter structure + */ +typedef struct +{ + lr_fhss_v1_params_t lr_fhss_params; //!< Base LR FHSS parameters + int8_t device_offset; // + * Special values Meaning + * 0x000000 RX single: LR11XX stays in RX mode until a + * packet is received, then switch to standby RC mode 0xFFFFFF + * RX continuous: LR11XX stays in RX mode even after reception of a + * packet + * + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for RX operation + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_rx_tx_fallback_mode + */ +lr11xx_status_t lr11xx_radio_set_rx_with_timeout_in_rtc_step( const void* context, const uint32_t timeout_in_rtc_step ); + +/*! + * @brief Start RX operations with a timeout in RTC step and configure the LNA LF0 mode + * + * This command sets the LR11XX to RX mode and configures the LNA LF0 mode. The radio must have been configured before + * using this command with @ref lr11xx_radio_set_pkt_type It internally calls lr11xx_radio_set_lna_mode. This command + * must be issued only for sub-GHz RX operations as it configures the LNA LF0, which is only used for sub-GHz Rx + * operations. + * + * By default, the timeout parameter allows to return automatically to standby RC mode if no packets have been received + * after a certain amount of time. This behavior can be altered by @ref lr11xx_radio_set_rx_tx_fallback_mode and @ref + * lr11xx_radio_auto_tx_rx. + * + * The timeout duration is obtained by: + * \f$ timeout\_duration\_ms = timeout \times \frac{1}{32.768} \f$ + * + * Maximal timeout value is 0xFFFFFF, which gives a maximal timeout of 511 seconds. + * + * The timeout argument can also have the following special values: + * + * + *
Special values Meaning
0x000000 RX single: LR11XX stays in RX mode until a + * packet is received, then switch to standby RC mode
0xFFFFFF + * RX continuous: LR11XX stays in RX mode even after reception of a + * packet + *
+ * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for RX operation + * @param [in] lna_mode Path to use for reception + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_rx_tx_fallback_mode + */ +lr11xx_status_t lr11xx_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( const void* context, + const uint32_t timeout_in_rtc_step, + lr11xx_radio_lna_mode_t lna_mode ); + +/*! + * @brief Start TX operations + * + * This command sets the LR11XX to TX mode. The radio must have been configured before using this command with @ref + * lr11xx_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if the packet has not been + * completely transmitted after a certain amount of time. This behavior can be altered by @ref + * lr11xx_radio_set_rx_tx_fallback_mode and @ref lr11xx_radio_auto_tx_rx. + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_ms The timeout configuration for TX operation + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_rx_tx_fallback_mode + */ +lr11xx_status_t lr11xx_radio_set_tx( const void* context, const uint32_t timeout_in_ms ); + +/*! + * @brief Start TX operations + * + * This command sets the LR11XX to TX mode. The radio must have been configured before using this command with @ref + * lr11xx_radio_set_pkt_type + * + * By default, the timeout parameter allows to return automatically to standby RC mode if the packet has not been + * completely transmitted after a certain amount of time. This behavior can be altered by @ref + * lr11xx_radio_set_rx_tx_fallback_mode and @ref lr11xx_radio_auto_tx_rx. + * + * The timeout duration is obtained by: + * \f$ timeout\_duration\_ms = timeout \times \frac{1}{32.768} \f$ + * + * Maximal value is 0xFFFFFF. + * + * If the timeout argument is 0, then no timeout is used. + * + * @param [in] context Chip implementation context + * @param [in] timeout_in_rtc_step The timeout configuration for TX operation + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_rx_tx_fallback_mode + */ +lr11xx_status_t lr11xx_radio_set_tx_with_timeout_in_rtc_step( const void* context, const uint32_t timeout_in_rtc_step ); + +/*! + * @brief Set the frequency for future radio operations. + * + * This commands does not set frequency for Wi-Fi and GNSS scan operations. + * + * @param [in] context Chip implementation context + * @param [in] freq_in_hz The frequency in Hz to set for radio operations + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_rf_freq( const void* context, const uint32_t freq_in_hz ); + +/*! + * @brief Configure automatic TX after RX or automatic RX after TX + * + * After issuing this command, using the command @ref SetTx will make the LR11XX doing the following: + * - Enter TX mode as usual + * - Enter configurable Intermediary mode during configurable delay + * - Enter RX mode + * + * Similarly, after a @ref SetRx command, the LR11XX will do the following: + * - Enter RX mode as usual + * - Enter configurable Intermediary mode during configurable delay + * - Enter TX mode + * + * In case delay is 0, the LR11XX does not enter Intermediary mode and directly enter the following mode. + * + * To disable this behavior, use this function with delay set to 0xFFFFFFFF. + * + * @param [in] context Chip implementation context + * @param [in] delay Time to spend in Intermediary mode expressed as steps of \f$\frac{1}{32.768 KHz}\f$ steps. + * @param [in] intermediary_mode The mode the LR11XX enters after first mode completion during delay time + * @param [in] timeout The timeout duration of the automatic RX or TX, expressed as steps of \f$ \frac{1}{32.768KHz} \f$ + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_auto_tx_rx( const void* context, const uint32_t delay, + const lr11xx_radio_intermediary_mode_t intermediary_mode, + const uint32_t timeout ); + +/*! + * @brief Set Channel Activity Detection configuration + * + * @param [in] context Chip implementation context + * @param [in] cad_params The structure defining CAD configuration + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_cad_params( const void* context, const lr11xx_radio_cad_params_t* cad_params ); + +/*! + * @brief Set the packet type + * + * @param [in] context Chip implementation context + * @param [in] pkt_type Packet type to set + * + * @returns Operation status + * + * @see lr11xx_radio_get_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_pkt_type( const void* context, const lr11xx_radio_pkt_type_t pkt_type ); + +/*! + * @brief Set the modulation parameters for GFSK packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_gfsk_mod_params( const void* context, + const lr11xx_radio_mod_params_gfsk_t* mod_params ); + +/*! + * @brief Set the modulation parameters for BPSK packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_bpsk_mod_params( const void* context, + const lr11xx_radio_mod_params_bpsk_t* mod_params ); + +/*! + * @brief Set the modulation parameters for LoRa packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_lora_mod_params( const void* context, + const lr11xx_radio_mod_params_lora_t* mod_params ); + +/*! + * @brief Set the modulation parameters for LR-FHSS + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] mod_params The structure of modulation configuration + * + * @returns Operation status + * + * @see lr11xx_lr_fhss_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_lr_fhss_mod_params( const void* context, + const lr11xx_radio_mod_params_lr_fhss_t* mod_params ); + +/*! + * @brief Set the packet parameters for GFSK packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_gfsk_mod_params + */ +lr11xx_status_t lr11xx_radio_set_gfsk_pkt_params( const void* context, + const lr11xx_radio_pkt_params_gfsk_t* pkt_params ); + +/*! + * @brief Set the packet parameters for BPSK packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_bpsk_mod_params + */ +lr11xx_status_t lr11xx_radio_set_bpsk_pkt_params( const void* context, + const lr11xx_radio_pkt_params_bpsk_t* pkt_params ); + +/*! + * @brief Set the packet parameters for LoRa packets + * + * The command @ref lr11xx_radio_set_pkt_type must be called prior this one. + * + * @param [in] context Chip implementation context + * @param [in] pkt_params The structure of packet configuration + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type, lr11xx_radio_set_lora_mod_params + */ +lr11xx_status_t lr11xx_radio_set_lora_pkt_params( const void* context, + const lr11xx_radio_pkt_params_lora_t* pkt_params ); + +/*! + * @brief Set the parameters for TX power and power amplifier ramp time + * + * The command @ref lr11xx_radio_set_pa_cfg must be called prior calling + * lr11xx_radio_set_tx_params. + * + * The range of possible TX output power values depends on PA selected with @ref lr11xx_radio_set_pa_cfg : + * - for LPA: power value goes from -17dBm to +14dBm (ie. from 0xEF to 0x0E) + * - for HPA: power value goes from -9dBm to +22dBm (ie. from 0xF7 to 0x16) + * + * Moreover, to use TX output power value higher than +10dBm, the @ref REGPASUPPLY_VBAT supply must have been selected + * with @ref lr11xx_radio_set_pa_cfg. + * + * @param [in] context Chip implementation context + * @param [in] pwr_in_dbm The TX output power in dBm + * @param [in] ramp_time The ramping time configuration for the PA + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_tx_params( const void* context, const int8_t pwr_in_dbm, + const lr11xx_radio_ramp_time_t ramp_time ); + +/*! + * @brief Sets the Node and Broadcast address used for GFSK + * + * This setting is used only when filtering is enabled. + * + * @param [in] context Chip implementation context + * @param [in] node_address The node address used as filter + * @param [in] broadcast_address The broadcast address used as filter + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_pkt_address( const void* context, const uint8_t node_address, + const uint8_t broadcast_address ); + +/*! + * @brief Alter the chip mode after successfull transmission or reception operation + * + * This setting is not used during Rx Duty Cycle mode or Auto Tx Rx. + * + * @param [in] context Chip implementation context + * @param [in] fallback_mode The chip mode to enter after successfull transmission or reception. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_rx_tx_fallback_mode( const void* context, + const lr11xx_radio_fallback_modes_t fallback_mode ); + +/*! + * @brief Configure and start a Rx Duty Cycle operation + * + * It executes the following steps: + * 1. Reception: enters reception state for duration defined by rx_period + * - If mode is LR11XX_RADIO_RX_DUTY_CYCLE_MODE_RX: it is standard RX mode + * - If mode is LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD (only in LoRa) : it is CAD operation + * 2. Depending on the over-the-air activity detection: + * - In case of positive over-the-air detection, the rx_period timeout is recomputed to the value + * \f$2 \times rx\_period + sleep\_period\f$ + * - If no air activity is detected, the LR11XX goes back to sleep mode with retention for a duration defined by + * sleep_period + * 3. On wake-up, the LR11XX restarts the process with the reception state. + * + * @remark If mode is configured to @ref LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD, then the CAD configuration used in step 1. + * is the one set from the last call to @ref lr11xx_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * @param [in] rx_period_in_ms The length of Rx period + * @param [in] sleep_period_in_ms The length of sleep period + * @param [in] mode The operation mode during Rx phase + * + * @returns Operation status + * + * @see lr11xx_radio_set_cad_params + */ +lr11xx_status_t lr11xx_radio_set_rx_duty_cycle( const void* context, const uint32_t rx_period_in_ms, + const uint32_t sleep_period_in_ms, + const lr11xx_radio_rx_duty_cycle_mode_t mode ); + +/*! + * @brief Configure and start a Rx Duty Cycle operation + * + * It executes the following steps: + * 1. Reception: enters reception state for duration defined by rx_period + * - If mode is LR11XX_RADIO_RX_DUTY_CYCLE_MODE_RX: it is standard RX mode + * - If mode is LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD (only in LoRa) : it is CAD operation + * 2. Depending on the over-the-air activity detection: + * - In case of positive over-the-air detection, the rx_period timeout is recomputed to the value + * \f$2 \times rx\_period + sleep\_period\f$ + * - If no air activity is detected, the LR11XX goes back to sleep mode with retention for a duration defined by + * sleep_period + * 3. On wake-up, the LR11XX restarts the process with the reception state. + * + * @remark If mode is configured to @ref LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD, then the CAD configuration used in step 1. + * is the one set from the last call to @ref lr11xx_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * @param [in] rx_period_in_rtc_step The length of Rx period + * @param [in] sleep_period_in_rtc_step The length of sleep period + * @param [in] mode The operation mode during Rx phase + * + * @returns Operation status + * + * @see lr11xx_radio_set_cad_params + */ +lr11xx_status_t lr11xx_radio_set_rx_duty_cycle_with_timings_in_rtc_step( const void* context, + const uint32_t rx_period_in_rtc_step, + const uint32_t sleep_period_in_rtc_step, + const lr11xx_radio_rx_duty_cycle_mode_t mode ); + +/*! + * @brief Set the Power Amplifier configuration + * + * It must be called prior using @ref lr11xx_radio_set_tx_params. + * + * @param [in] context Chip implementation context + * @param [in] pa_cfg The structure for PA configuration + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_pa_cfg( const void* context, const lr11xx_radio_pa_cfg_t* pa_cfg ); + +/*! + * @brief Define on which event the Rx timeout shall be stopped + * + * The two options are: + * - Syncword / Header detection + * - Preamble detection + * + * @param [in] context Chip implementation context + * @param [in] stop_timeout_on_preamble The choice of the event to be taken into account + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_stop_timeout_on_preamble( const void* context, const bool stop_timeout_on_preamble ); + +/*! + * @brief Start the CAD mode + * + * The LoRa packet type shall be selected before this function is called. The fallback mode is configured with + * lr11xx_radio_set_cad_params. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr11xx_radio_set_cad_params, lr11xx_radio_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_cad( const void* context ); + +/*! + * @brief Set the device into Tx continuous wave (RF tone). + * + * A packet type shall be selected before this function is called. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr11xx_radio_set_pkt_type + */ +lr11xx_status_t lr11xx_radio_set_tx_cw( const void* context ); + +/*! + * @brief Set the device into Tx continuous preamble (modulated signal). + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_tx_infinite_preamble( const void* context ); + +/*! + * @brief Configure the LoRa modem to issue a RX timeout after an exact number of symbols given in parameter if no LoRa + * modulation is detected + * + * @warning Values of nb_symbol higher than 255 are only valid for chip firmware equal to or more recent than 0x308. + * + * @param [in] context Chip implementation context + * @param [in] nb_symbol number of symbols to compute the timeout + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_lora_sync_timeout( const void* context, const uint16_t nb_symbol ); + +/*! + * @brief Configure the LoRa modem to issue a RX timeout after an exact number of symbols given in parameter if no LoRa + * modulation is detected + * + * @warning This command has been introduced in chip firware 0x0308 and is not available in earlier version + * + * @remark The number of symbol is computed as mantissa ^ (2*exponent + 1) + * + * @param [in] context Chip implementation context + * @param [in] mantissa Mantissa - from 0 to 31 - to compute the number of symbols of the timeout + * @param [in] exponent Exponent - from 0 to 7 - to compute the number of symbols of the timeout + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_lora_sync_timeout_with_mantissa_exponent( const void* context, const uint8_t mantissa, + const uint8_t exponent ); + +/*! + * @brief Configure the seed and the polynomial used to compute CRC in GFSK packet + * + * @param [in] context Chip implementation context + * @param [in] seed Seed used to compute the CRC value + * @param [in] polynomial Polynomial used to compute the CRC value + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_gfsk_crc_params( const void* context, const uint32_t seed, const uint32_t polynomial ); + +/*! + * @brief Configure the whitening seed used in GFSK packet + * + * @param [in] context Chip implementation context + * @param [in] seed Whitening seed value + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_gfsk_whitening_seed( const void* context, const uint16_t seed ); + +/*! + * @brief Configure the boost mode in reception + * + * @param [in] context Chip implementation context + * @param [in] enable_boost_mode Boost mode activation + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_cfg_rx_boosted( const void* context, const bool enable_boost_mode ); + +/*! + * @brief Set RSSI calibration table + * + * @param [in] context Chip implementation context + * @param [in] rssi_cal_table RSSI calibration table + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_set_rssi_calibration( const void* context, + const lr11xx_radio_rssi_calibration_table_t* rssi_cal_table ); + +/*! + * @brief Gets the radio bw parameter for a given bandwidth in Hz + * + * @param [in] bw_in_hz Requested GFSK Rx bandwidth + * @param [out] bw_parameter Radio parameter immediately above requested bw_in_hz + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_get_gfsk_rx_bandwidth( uint32_t bw_in_hz, lr11xx_radio_gfsk_bw_t* bw_parameter ); + +/** + * @brief Compute the numerator for LoRa time-on-air computation. + * + * @remark To get the actual time-on-air in seconds, this value has to be divided by the LoRa bandwidth in Hertz. + * + * @param [in] pkt_p Pointer to the structure holding the LoRa packet parameters + * @param [in] mod_p Pointer to the structure holding the LoRa modulation parameters + * + * @returns LoRa time-on-air numerator + */ +uint32_t lr11xx_radio_get_lora_time_on_air_numerator( const lr11xx_radio_pkt_params_lora_t* pkt_p, + const lr11xx_radio_mod_params_lora_t* mod_p ); + +/** + * @brief Get the actual value in Hertz of a given LoRa bandwidth + * + * @param [in] bw LoRa bandwidth parameter + * + * @returns Actual LoRa bandwidth in Hertz + */ +uint32_t lr11xx_radio_get_lora_bw_in_hz( lr11xx_radio_lora_bw_t bw ); + +/*! + * @brief Get the time on air in ms for LoRa transmission + * + * @param [in] pkt_p Pointer to a structure holding the LoRa packet parameters + * @param [in] mod_p Pointer to a structure holding the LoRa modulation parameters + * + * @returns Time-on-air value in ms for LoRa transmission + */ +uint32_t lr11xx_radio_get_lora_time_on_air_in_ms( const lr11xx_radio_pkt_params_lora_t* pkt_p, + const lr11xx_radio_mod_params_lora_t* mod_p ); + +/** + * @brief Compute the numerator for GFSK time-on-air computation. + * + * @remark To get the actual time-on-air in seconds, this value has to be divided by the GFSK bitrate in bits per + * second. + * + * @param [in] pkt_p Pointer to the structure holding the GFSK packet parameters + * + * @returns GFSK time-on-air numerator + */ +uint32_t lr11xx_radio_get_gfsk_time_on_air_numerator( const lr11xx_radio_pkt_params_gfsk_t* pkt_p ); + +/** + * @brief Get the time on air in ms for GFSK transmission + * + * @param [in] pkt_p Pointer to a structure holding the GFSK packet parameters + * @param [in] mod_p Pointer to a structure holding the GFSK modulation parameters + * + * @returns Time-on-air value in ms for GFSK transmission + */ +uint32_t lr11xx_radio_get_gfsk_time_on_air_in_ms( const lr11xx_radio_pkt_params_gfsk_t* pkt_p, + const lr11xx_radio_mod_params_gfsk_t* mod_p ); + +/** + * @brief Get the number of RTC steps for a given time in millisecond + * + * @param [in] time_in_ms Timeout in millisecond + * + * @returns Number of RTC steps + */ +uint32_t lr11xx_radio_convert_time_in_ms_to_rtc_step( uint32_t time_in_ms ); + +/*! + * @brief Configure the radio for Bluetooth® Low Energy Beaconing Compatibility. + * + * The caller shall ensure that the payload, if provided, follows the format of the Advertising physical channel PDU as + * defined in the Bluetooth® core specification. + * + * This automatically configures the syncword to 0x8e89bed6 and the 3-byte CRC (polynomial set to 0x100065b, seed set to + * 0x555555). + * + * @param [in] context Chip implementation context + * @param [in] channel_id BLE channel - allowed channels are 37, 38, 39 + * @param [in] buffer Array of bytes to be used as beacon payload (optional) + * @param [in] length Number of bytes in the @ref buffer array + * + * @returns Operation status + * + * @note As opposed to the function @ref lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility, this + * function only configures the radio interface for Bluetooth® Low Energy Beaconing Compatibility advertising. To + * actually start the transmission, the function @ref lr11xx_radio_set_tx must be called. + * @note The previously configured payload with @ref lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility or + * @ref lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility is sent if @p length is set to 0, except + * if a call to @ref lr11xx_regmem_write_buffer8, @ref lr11xx_lr_fhss_build_frame is done in between or @ref + * lr11xx_system_set_sleep with warm start disabled + * + * @sa lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility + * @sa lr11xx_radio_set_tx + */ +lr11xx_status_t lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility( const void* context, + const uint8_t channel_id, + const uint8_t* buffer, + const uint8_t length ); + +/** + * @brief Get the information from the last received LoRa packet header (if @ref LR11XX_RADIO_LORA_PKT_EXPLICIT) or the + * locally configured settings (if @ref LR11XX_RADIO_LORA_PKT_IMPLICIT) + * + * @remark This function can be called only if @ref LR11XX_RADIO_PKT_TYPE_LORA is selected with @ref + * lr11xx_radio_set_pkt_type + * + * @param [in] context Chip implementation context + * @param [out] is_crc_present CRC configuration + * @param [out] cr LoRa coding rate + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_get_lora_rx_info( const void* context, bool* is_crc_present, lr11xx_radio_lora_cr_t* cr ); + +/*! + * @brief Configure the radio for Bluetooth® Low Energy Beaconing Compatibility and send the given beacon on the desired + * channel. + * + * The caller shall ensure that the payload, if provided, follows the format of the Advertising physical channel PDU as + * defined in the Bluetooth® core specification. + * + * This automatically configures the syncword to 0x8e89bed6 and the 3-byte CRC (polynomial set to 0x100065b, seed set to + * 0x555555). + * + * @param [in] context Chip implementation context + * @param [in] channel_id BLE channel - allowed channels are 37, 38, 39 + * @param [in] buffer Array of bytes to be used as beacon payload (optional) + * @param [in] length Number of bytes in the @ref buffer array + * + * @returns Operation status + * + * @note This function combines the configuration for Bluetooth® Low Energy Beaconing Compatibility - done with @ref + * lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility) - and the actual transmission - done with @ref + * lr11xx_radio_set_tx. + * @note The previously configured payload with @ref lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility or + * @ref lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility is sent if @p length is set to 0, except + * if a call to @ref lr11xx_regmem_write_buffer8, @ref lr11xx_lr_fhss_build_frame is done in between or @ref + * lr11xx_system_set_sleep with warm start disabled + * + * @sa lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility + */ +lr11xx_status_t lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility( const void* context, + const uint8_t channel_id, + const uint8_t* buffer, + const uint8_t length ); + +/*! + * @brief Apply the workaround for the high ACP limitation + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_radio_apply_high_acp_workaround( const void* context ); + +/** + * @brief Get the mantissa and exponent for a given number of symbol + * + * @remark This function computes the [mantissa, exponent] duple which corresponds to nb_of_symb: the smallest + * value verifying both following conditions: + * - nb_of_symb >= nb_symbol; and + * - nb_of_symb = mant * 2 ^ (2 * exp + 1) + * + * @param [in] nb_symbol Number of symbols + * @param [out] mant Mantissa computed from nb_symb + * @param [out] ext Exponent computed from nb_symb + * + * @returns Number of symbols corresponding to the [mantissa, exponent] duple computed with the following formula: + * nb_of_symb = mant * 2 ^ (2 * exp + 1) + */ +uint16_t lr11xx_radio_convert_nb_symb_to_mant_exp( const uint16_t nb_symbol, uint8_t* mant, uint8_t* exp ); + +/** + * @brief Configure LNA LF0 mode + * + * @remark This function shall be called after each call to lr11xx_radio_set_rx or + * lr11xx_radio_set_rx_with_timeout_in_rtc_step to be taken into account. Helper functions + * lr11xx_radio_set_rx_on_lna_path or lr11xx_radio_set_rx_with_timeout_in_rtc_step_on_lna_path can be used instead. + * + * @param [in] context Chip implementation context + * @param [in] lna_mode Value to put in the register, enum type + * + * @returns Operation status + * + * @see lr11xx_radio_set_rx_on_lna_path, lr11xx_radio_set_rx_with_timeout_in_rtc_step_on_lna_path + */ +lr11xx_status_t lr11xx_radio_set_lna_mode( const void* context, lr11xx_radio_lna_mode_t lna_mode ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_RADIO_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_timings.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_timings.h new file mode 100755 index 0000000..6270d56 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_timings.h @@ -0,0 +1,95 @@ +/** + * @file lr11xx_radio_timings.h + * + * @brief LR11XX timing helper functions definition + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RADIO_TIMINGS_H +#define LR11XX_RADIO_TIMINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_radio_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/** + * @brief Get the time between the last bit sent (on Tx side) and the Rx done event (on Rx side) + * + * @param [in] mod_params Pointer to a structure holding the LoRa modulation parameters used for the computation + * + * @returns Delay in microsecond + */ +uint32_t lr11xx_radio_timings_get_delay_between_last_bit_sent_and_rx_done_in_us( + const lr11xx_radio_mod_params_lora_t* mod_params ); + +/** + * @brief Get the time between the last bit sent and the Tx done event + * + * @param [in] ramp_time Power amplifier ramp time + * + * @returns Delay in microsecond + */ +uint32_t lr11xx_radio_timings_get_delay_between_last_bit_sent_and_tx_done_in_us( + const lr11xx_radio_ramp_time_t ramp_time ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_RADIO_TIMINGS_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_types.h new file mode 100755 index 0000000..4794f41 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_radio_types.h @@ -0,0 +1,654 @@ +/*! + * @file lr11xx_radio_types.h + * + * @brief Radio driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RADIO_TYPES_H +#define LR11XX_RADIO_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Bit mask to set to indicate a LR-FHSS bitrate is defined in steps of 1/256 bit per seconds + */ +#define LR11XX_RADIO_LR_FHSS_BITRATE_DIVIDE_BY_256 ( 0x80000000 ) + +/*! + * @brief LR-FHSS bitrate value at 488.28125 bps defined as steps of 1/256 bitrate per seconds + */ +#define LR11XX_RADIO_LR_FHSS_BITRATE_IN_256_BPS_STEPS ( 125000 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Power Amplifier Selection values + * + * - Low-power Power Amplifier can reach up to 14dBm + * - High-power Power Amplifier can reach up to 22 dBm + */ +typedef enum +{ + LR11XX_RADIO_PA_SEL_LP = 0x00, //!< Low-power Power Amplifier + LR11XX_RADIO_PA_SEL_HP = 0x01, //!< High-power Power Amplifier + LR11XX_RADIO_PA_SEL_HF = 0x02, //!< High-frequency Power Amplifier +} lr11xx_radio_pa_selection_t; + +/*! + * @brief GFSK Address Filtering configurations + * + * If Address Filtering is enabled but a wrong address is received, therefore the reception is aborted and the address + * error flag of packet status is set. + */ +typedef enum +{ + LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE = 0x00, //!< Filter deactivated + LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_ADDRESS = 0x01, //!< Filter on Node Address + LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_AND_BROADCAST_ADDRESSES = + 0x02, //!< Filtering on Node and Broadcast addresses +} lr11xx_radio_gfsk_address_filtering_t; + +/*! + * @brief Chip mode after successfull transmission or reception + * + * Unused for RX duty cycle and AutoTxRx operations + */ +typedef enum +{ + LR11XX_RADIO_FALLBACK_STDBY_RC = 0x01, //!< Standby RC (Default) + LR11XX_RADIO_FALLBACK_STDBY_XOSC = 0x02, //!< Standby XOSC + LR11XX_RADIO_FALLBACK_FS = 0x03 //!< FS +} lr11xx_radio_fallback_modes_t; + +/*! + * @brief Ramping time for PA + * + * This parameter is the ramping time of the PA. A high value improves spectral quality. + */ +typedef enum +{ + LR11XX_RADIO_RAMP_16_US = 0x00, //!< 16 us Ramp Time + LR11XX_RADIO_RAMP_32_US = 0x01, //!< 32 us Ramp Time + LR11XX_RADIO_RAMP_48_US = 0x02, //!< 48 us Ramp Time (Default) + LR11XX_RADIO_RAMP_64_US = 0x03, //!< 64 us Ramp Time + LR11XX_RADIO_RAMP_80_US = 0x04, //!< 80 us Ramp Time + LR11XX_RADIO_RAMP_96_US = 0x05, //!< 96 us Ramp Time + LR11XX_RADIO_RAMP_112_US = 0x06, //!< 112 us Ramp Time + LR11XX_RADIO_RAMP_128_US = 0x07, //!< 128 us Ramp Time + LR11XX_RADIO_RAMP_144_US = 0x08, //!< 144 us Ramp Time + LR11XX_RADIO_RAMP_160_US = 0x09, //!< 160 us Ramp Time + LR11XX_RADIO_RAMP_176_US = 0x0A, //!< 176 us Ramp Time + LR11XX_RADIO_RAMP_192_US = 0x0B, //!< 192 us Ramp Time + LR11XX_RADIO_RAMP_208_US = 0x0C, //!< 208 us Ramp Time + LR11XX_RADIO_RAMP_240_US = 0x0D, //!< 240 us Ramp Time + LR11XX_RADIO_RAMP_272_US = 0x0E, //!< 272 us Ramp Time + LR11XX_RADIO_RAMP_304_US = 0x0F, //!< 304 us Ramp Time +} lr11xx_radio_ramp_time_t; + +/*! + * @brief LoRa network type configuration + */ +typedef enum +{ + LR11XX_RADIO_LORA_NETWORK_PRIVATE = 0x00, //!< LoRa private network + LR11XX_RADIO_LORA_NETWORK_PUBLIC = 0x01, //!< LoRa public network +} lr11xx_radio_lora_network_type_t; + +/*! + * @brief LoRa Spreading Factor configurations + */ +typedef enum +{ + LR11XX_RADIO_LORA_SF5 = 0x05, //!< Spreading Factor 5 + LR11XX_RADIO_LORA_SF6 = 0x06, //!< Spreading Factor 6 + LR11XX_RADIO_LORA_SF7 = 0x07, //!< Spreading Factor 7 + LR11XX_RADIO_LORA_SF8 = 0x08, //!< Spreading Factor 8 + LR11XX_RADIO_LORA_SF9 = 0x09, //!< Spreading Factor 9 + LR11XX_RADIO_LORA_SF10 = 0x0A, //!< Spreading Factor 10 + LR11XX_RADIO_LORA_SF11 = 0x0B, //!< Spreading Factor 11 + LR11XX_RADIO_LORA_SF12 = 0x0C, //!< Spreading Factor 12 +} lr11xx_radio_lora_sf_t; + +/*! + * @brief LoRa Bandwidth configurations + */ +typedef enum +{ + LR11XX_RADIO_LORA_BW_10 = 0x08, //!< Bandwidth 10.42 kHz + LR11XX_RADIO_LORA_BW_15 = 0x01, //!< Bandwidth 15.63 kHz + LR11XX_RADIO_LORA_BW_20 = 0x09, //!< Bandwidth 20.83 kHz + LR11XX_RADIO_LORA_BW_31 = 0x02, //!< Bandwidth 31.25 kHz + LR11XX_RADIO_LORA_BW_41 = 0x0A, //!< Bandwidth 41.67 kHz + LR11XX_RADIO_LORA_BW_62 = 0x03, //!< Bandwidth 62.50 kHz + LR11XX_RADIO_LORA_BW_125 = 0x04, //!< Bandwidth 125.00 kHz + LR11XX_RADIO_LORA_BW_250 = 0x05, //!< Bandwidth 250.00 kHz + LR11XX_RADIO_LORA_BW_500 = 0x06, //!< Bandwidth 500.00 kHz + LR11XX_RADIO_LORA_BW_200 = 0x0D, //!< Bandwidth 203.00 kHz, 2G4 and compatible with LR112x chips only + LR11XX_RADIO_LORA_BW_400 = 0x0E, //!< Bandwidth 406.00 kHz, 2G4 and compatible with LR112x chips only + LR11XX_RADIO_LORA_BW_800 = 0x0F, //!< Bandwidth 812.00 kHz, 2G4 and compatible with LR112x chips only +} lr11xx_radio_lora_bw_t; + +/*! + * @brief LoRa Coding Rate configurations + */ +typedef enum +{ + LR11XX_RADIO_LORA_NO_CR = 0x00, //!< No Coding Rate + LR11XX_RADIO_LORA_CR_4_5 = 0x01, //!< Coding Rate 4/5 Short Interleaver + LR11XX_RADIO_LORA_CR_4_6 = 0x02, //!< Coding Rate 4/6 Short Interleaver + LR11XX_RADIO_LORA_CR_4_7 = 0x03, //!< Coding Rate 4/7 Short Interleaver + LR11XX_RADIO_LORA_CR_4_8 = 0x04, //!< Coding Rate 4/8 Short Interleaver + LR11XX_RADIO_LORA_CR_LI_4_5 = 0x05, //!< Coding Rate 4/5 Long Interleaver + LR11XX_RADIO_LORA_CR_LI_4_6 = 0x06, //!< Coding Rate 4/6 Long Interleaver + LR11XX_RADIO_LORA_CR_LI_4_8 = 0x07, //!< Coding Rate 4/8 Long Interleaver +} lr11xx_radio_lora_cr_t; + +/*! + * @brief Values for intermediary mode + */ +typedef enum +{ + LR11XX_RADIO_MODE_SLEEP = 0x00, //!< Sleep / Not recommended with LR1110 FW from 0x0303 to 0x0307 and LR1120 FW + //!< 0x0101 in case of transition from Rx to Tx in LoRa + LR11XX_RADIO_MODE_STANDBY_RC = 0x01, //!< Standby RC + LR11XX_RADIO_MODE_STANDBY_XOSC = 0x02, //!< Standby XOSC + LR11XX_RADIO_MODE_FS = 0x03 //!< Frequency Synthesis +} lr11xx_radio_intermediary_mode_t; + +/*! + * @brief GFSK Cyclic Redundancy Check configurations + * + * If this value is set to something other than CRC_OFF, a CRC is automatically computed and added after the end of the + * payload on transmitter side. On receiver side, the CRC check is automatically processed. + */ +typedef enum +{ + LR11XX_RADIO_GFSK_CRC_OFF = 0x01, //!< CRC check deactivated + LR11XX_RADIO_GFSK_CRC_1_BYTE = 0x00, + LR11XX_RADIO_GFSK_CRC_2_BYTES = 0x02, + LR11XX_RADIO_GFSK_CRC_1_BYTE_INV = 0x04, + LR11XX_RADIO_GFSK_CRC_2_BYTES_INV = 0x06, +} lr11xx_radio_gfsk_crc_type_t; + +/*! + * @brief GFSK data whitening configurations + */ +typedef enum +{ + LR11XX_RADIO_GFSK_DC_FREE_OFF = 0x00, //!< Whitening deactivated + LR11XX_RADIO_GFSK_DC_FREE_WHITENING = 0x01, //!< Whitening enabled + LR11XX_RADIO_GFSK_DC_FREE_WHITENING_SX128X_COMP = 0x03, //!< Whitening enabled - SX128x compatibility +} lr11xx_radio_gfsk_dc_free_t; + +/*! + * @brief GFSK Header Type configurations + * + * This parameter indicates whether or not the payload length is sent and read over the air. + * + * If the payload length is known beforehand by both transmitter and receiver, therefore there is no need to send it + * over the air. Otherwise, setting this parameter to LR11XX_RADIO_GFSK_PKT_VAR_LEN will make the modem to automatically + * prepand a byte containing the payload length to the the payload on transmitter side. On receiver side, this first + * byte is read to set the payload length to read. + * + * This configuration is only available for GFSK packet types. + */ +typedef enum +{ + LR11XX_RADIO_GFSK_PKT_FIX_LEN = 0x00, //!< Payload length is not sent/read over the air + LR11XX_RADIO_GFSK_PKT_VAR_LEN = 0x01, //!< Payload length is sent/read over the air + LR11XX_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP = + 0x02, //!< Payload length is sent/read over the air - SX128x compatibility +} lr11xx_radio_gfsk_pkt_len_modes_t; + +/*! + * @brief GFSK Preamble Detector Length configurations + * + * This parameter sets the minimum length of preamble bits to be received to continue reception of incoming packet. If a + * packet with preamble length lower than this value is being received, the reception stops without generating IRQ. + * + * This parameter has no impact on TX operations. + */ +typedef enum +{ + LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_OFF = 0x00, + LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_8BITS = 0x04, + LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_16BITS = 0x05, + LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_24BITS = 0x06, + LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_32BITS = 0x07 +} lr11xx_radio_gfsk_preamble_detector_t; + +/*! + * @brief LoRa Cyclic Redundancy Check configurations + */ +typedef enum +{ + LR11XX_RADIO_LORA_CRC_OFF = 0x00, //!< CRC deactivated + LR11XX_RADIO_LORA_CRC_ON = 0x01, //!< CRC activated +} lr11xx_radio_lora_crc_t; + +/*! + * @brief LoRa Header type configurations + */ +typedef enum +{ + LR11XX_RADIO_LORA_PKT_EXPLICIT = 0x00, //!< Explicit header: transmitted over the air + LR11XX_RADIO_LORA_PKT_IMPLICIT = 0x01, //!< Implicit header: not transmitted over the air +} lr11xx_radio_lora_pkt_len_modes_t; + +/*! + * @brief LoRa IQ mode configurations + * + * LoRa IQ modes are mutually exclusives: a physical packet sent with standard IQ will not be received by a receiver + * configured with inverted IQ. + */ +typedef enum +{ + LR11XX_RADIO_LORA_IQ_STANDARD = 0x00, //!< IQ standard + LR11XX_RADIO_LORA_IQ_INVERTED = 0x01, //!< IQ inverted +} lr11xx_radio_lora_iq_t; + +/*! + * @brief Packet type values + */ +typedef enum +{ + LR11XX_RADIO_PKT_NONE = 0x00, //!< State after cold start, Wi-Fi or GNSS capture + LR11XX_RADIO_PKT_TYPE_GFSK = 0x01, //!< GFSK modulation + LR11XX_RADIO_PKT_TYPE_LORA = 0x02, //!< LoRa modulation + LR11XX_RADIO_PKT_TYPE_BPSK = 0x03, //!< BPSK modulation + LR11XX_RADIO_PKT_TYPE_LR_FHSS = 0x04, //!< LR-FHSS modulation + LR11XX_RADIO_PKT_TYPE_RTTOF = 0x05, //!< RTToF (Ranging) packet +} lr11xx_radio_pkt_type_t; + +/*! + * @brief Select power amplifier supply source + */ +typedef enum +{ + LR11XX_RADIO_PA_REG_SUPPLY_VREG = 0x00, //!< Power amplifier supplied by the main regulator + LR11XX_RADIO_PA_REG_SUPPLY_VBAT = 0x01 //!< Power amplifier supplied by the battery +} lr11xx_radio_pa_reg_supply_t; + +/*! + * @brief RX Duty Cycle Modes + */ +typedef enum +{ + LR11XX_RADIO_RX_DUTY_CYCLE_MODE_RX = 0x00, //!< LoRa/GFSK: Uses Rx for listening to packets + LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD = 0x01, //!< Only in LoRa: Uses CAD to listen for over-the-air activity +} lr11xx_radio_rx_duty_cycle_mode_t; + +/*! + * @brief GFSK Bandwidth configurations + */ +typedef enum +{ + LR11XX_RADIO_GFSK_BW_4800 = 0x1F, //!< Bandwidth 4.8 kHz DSB + LR11XX_RADIO_GFSK_BW_5800 = 0x17, //!< Bandwidth 5.8 kHz DSB + LR11XX_RADIO_GFSK_BW_7300 = 0x0F, //!< Bandwidth 7.3 kHz DSB + LR11XX_RADIO_GFSK_BW_9700 = 0x1E, //!< Bandwidth 9.7 kHz DSB + LR11XX_RADIO_GFSK_BW_11700 = 0x16, //!< Bandwidth 11.7 kHz DSB + LR11XX_RADIO_GFSK_BW_14600 = 0x0E, //!< Bandwidth 14.6 kHz DSB + LR11XX_RADIO_GFSK_BW_19500 = 0x1D, //!< Bandwidth 19.5 kHz DSB + LR11XX_RADIO_GFSK_BW_23400 = 0x15, //!< Bandwidth 23.4 kHz DSB + LR11XX_RADIO_GFSK_BW_29300 = 0x0D, //!< Bandwidth 29.3 kHz DSB + LR11XX_RADIO_GFSK_BW_39000 = 0x1C, //!< Bandwidth 39.0 kHz DSB + LR11XX_RADIO_GFSK_BW_46900 = 0x14, //!< Bandwidth 46.9 kHz DSB + LR11XX_RADIO_GFSK_BW_58600 = 0x0C, //!< Bandwidth 58.6 kHz DSB + LR11XX_RADIO_GFSK_BW_78200 = 0x1B, //!< Bandwidth 78.2 kHz DSB + LR11XX_RADIO_GFSK_BW_93800 = 0x13, //!< Bandwidth 93.8 kHz DSB + LR11XX_RADIO_GFSK_BW_117300 = 0x0B, //!< Bandwidth 117.3 kHz DSB + LR11XX_RADIO_GFSK_BW_156200 = 0x1A, //!< Bandwidth 156.2 kHz DSB + LR11XX_RADIO_GFSK_BW_187200 = 0x12, //!< Bandwidth 187.2 kHz DSB + LR11XX_RADIO_GFSK_BW_234300 = 0x0A, //!< Bandwidth 232.3 kHz DSB + LR11XX_RADIO_GFSK_BW_312000 = 0x19, //!< Bandwidth 312.0 kHz DSB + LR11XX_RADIO_GFSK_BW_373600 = 0x11, //!< Bandwidth 373.6 kHz DSB + LR11XX_RADIO_GFSK_BW_467000 = 0x09 //!< Bandwidth 467.0 kHz DSB +} lr11xx_radio_gfsk_bw_t; + +/*! + * @brief Possible automatic actions when Channel Activity Detection operations terminate + * + * For RADIO_EXIT_MODE_CAD_RX, LR11XX enters RX mode on activity detected. The timeout value for this RX operation is + * defined as: + * + * \f$ 31.25us \times timeout \f$ + * + * With \f$ timeout \f$ defined in RadioCadParams_t::timeout + * + * If the CAD operation is negative with RADIO_CAD_EXIT_MODE_RX or if CAD operation is positive with + * RADIO_CAD_EXIT_MODE_TX, therefore the LR11XX enters Standby RC mode. + */ +typedef enum +{ + LR11XX_RADIO_CAD_EXIT_MODE_STANDBYRC = 0x00, //!< Enter standby RC mode after CAD operation + LR11XX_RADIO_CAD_EXIT_MODE_RX = 0x01, //!< Enter in RX mode if an activity is detected + LR11XX_RADIO_CAD_EXIT_MODE_TX = 0x10, //!< Enter in TX mode if no activity is detected +} lr11xx_radio_cad_exit_mode_t; + +/*! + * @brief Pulse shape configurations + */ +typedef enum +{ + LR11XX_RADIO_GFSK_PULSE_SHAPE_OFF = 0x00, //!< No filter applied + LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_03 = 0x08, //!< Gaussian BT 0.3 + LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_05 = 0x09, //!< Gaussian BT 0.5 + LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_07 = 0x0A, //!< Gaussian BT 0.7 + LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_1 = 0x0B //!< Gaussian BT 1.0 +} lr11xx_radio_gfsk_pulse_shape_t; + +/*! + * @brief BPSK pulse shape configurations + */ +typedef enum +{ + LR11XX_RADIO_DBPSK_PULSE_SHAPE = 0x16, //!< Double OSR / RRC / BT 0.7 +} lr11xx_radio_bpsk_pulse_shape_t; + +/*! + * @brief LR-FHSS bitrate configurations + */ +typedef enum +{ + LR11XX_RADIO_LR_FHSS_BITRATE_488_BPS = + ( int ) ( LR11XX_RADIO_LR_FHSS_BITRATE_DIVIDE_BY_256 + + LR11XX_RADIO_LR_FHSS_BITRATE_IN_256_BPS_STEPS ), //!< 488.28215 bps +} lr11xx_radio_lr_fhss_bitrate_t; + +/*! + * @brief LR-FHSS pulse shape configurations + */ +typedef enum +{ + LR11XX_RADIO_LR_FHSS_PULSE_SHAPE_BT_1 = 0x0B //!< Gaussian BT 1.0 +} lr11xx_radio_lr_fhss_pulse_shape_t; + +/*! + * @brief Channel Activity Detection parameters + * + * Parameters detPeak and detMin are to be used for tuning the sensitivity of Channel Activity Detection. It depends on + * Spreading Factor, Bandwidth and symbolNum. + * + * For detPeak, the 5 MSBits are encoding the integer part, the 3 LSBits are encoding 1/8 of the decimal part. For + * instance, \f$detPeak = 50\f$ (= 0x32) leads to a ratio being \f$6 + 2 * 1/8 = 6.25\f$. + * + * detMin is unit free and represents the ratio between the minimal power of a correlation peak and measurement gain + * that can be considered as a peak detection. It helps to avoid detection on noise. Authorized values a from 0 to 181. + */ +typedef struct lr11xx_radio_cad_params_s +{ + uint8_t cad_symb_nb; //!< Number of symbols used for CAD detection + uint8_t cad_detect_peak; //!< Ratio for CAD between correlator peak and average + //!< (Default 0x32) + uint8_t cad_detect_min; //!< Minimum power of the correlation peak to be + //!< considered as a positive CAD (Default 0x0A) + lr11xx_radio_cad_exit_mode_t cad_exit_mode; //!< Automated action on CAD completion + uint32_t cad_timeout; //!< Value used to compute timeout +} lr11xx_radio_cad_params_t; + +/*! + * @brief Status of GFSK received packet + */ +typedef struct lr11xx_radio_pkt_status_gfsk_s +{ + int8_t rssi_sync_in_dbm; //!< RSSI value latched on detection of the last received packet Sync Address + int8_t rssi_avg_in_dbm; //!< RSSI averaged over the payload of the last received packet + uint8_t rx_len_in_bytes; //!< Length of the last received packet [Bytes] + bool is_addr_err; //!< Address filtering status. Asserted if received packet address does not match node address + //!< nor broadcast address + bool is_crc_err; //!< CRC status of the current packet (applicable only in RX, with CRC enabled) + bool is_len_err; //!< Asserted when the length of last received packet is greater than the maximal length + //!< (applicable only in RX with variable length packet) + bool is_abort_err; //!< Asserted when the current packet has been aborted (applicable in RX and TX) + bool is_received; //!< Asserted when packet reception is done (applicable in RX) + bool is_sent; //!< Asserted when packet transmission is done (applicable in TX) +} lr11xx_radio_pkt_status_gfsk_t; + +/*! + * @brief Status of received packet + */ +typedef struct lr11xx_radio_pkt_status_lora_s +{ + int8_t rssi_pkt_in_dbm; //!< Average RSSI over last received packet. + int8_t snr_pkt_in_db; //!< SNR estimated on last received packet. + int8_t signal_rssi_pkt_in_dbm; //!< RSSI of last packet latched after +} lr11xx_radio_pkt_status_lora_t; + +/*! + * @brief Length and offset of received packet + */ +typedef struct lr11xx_radio_rx_buffer_status_s +{ + uint8_t pld_len_in_bytes; //!< Length of received packet [Bytes] + uint8_t buffer_start_pointer; //!< Offset in the reception buffer of + //!< first byte received [Bytes] +} lr11xx_radio_rx_buffer_status_t; + +/*! + * @brief GFSK packet statistic structure + */ +typedef struct lr11xx_radio_stats_gfsk_s +{ + uint16_t nb_pkt_received; //!< Total number of received packets + uint16_t nb_pkt_crc_error; //!< Total number of received packets with CRC error + uint16_t nb_pkt_len_error; //!< Total number of received packets with a length error +} lr11xx_radio_stats_gfsk_t; + +/*! + * @brief LoRa packet statistic structure + */ +typedef struct lr11xx_radio_stats_lora_s +{ + uint16_t nb_pkt_received; //!< Total number of received packets + uint16_t nb_pkt_crc_error; //!< Total number of received packets with CRC error + uint16_t nb_pkt_header_error; //!< Total number of packets with header error + uint16_t nb_pkt_falsesync; //!< Total number of false sync +} lr11xx_radio_stats_lora_t; + +/*! + * @brief Modulation configuration for GFSK packet + */ +typedef struct lr11xx_radio_mod_params_gfsk_s +{ + uint32_t br_in_bps; //!< GFSK bitrate [bit/s] + lr11xx_radio_gfsk_pulse_shape_t pulse_shape; //!< GFSK pulse shape + lr11xx_radio_gfsk_bw_t bw_dsb_param; //!< GFSK bandwidth + uint32_t fdev_in_hz; //!< GFSK frequency deviation [Hz] +} lr11xx_radio_mod_params_gfsk_t; + +/*! + * @brief Modulation configuration for BPSK packet + */ +typedef struct lr11xx_radio_mod_params_bpsk_s +{ + uint32_t br_in_bps; //!< BPSK bitrate [bit/s] + lr11xx_radio_bpsk_pulse_shape_t pulse_shape; //!< BPSK pulse shape +} lr11xx_radio_mod_params_bpsk_t; + +/*! + * @brief Modulation configuration for LoRa packet + */ +typedef struct lr11xx_radio_mod_params_lora_s +{ + lr11xx_radio_lora_sf_t sf; //!< LoRa spreading factor + lr11xx_radio_lora_bw_t bw; //!< LoRa bandwidth + lr11xx_radio_lora_cr_t cr; //!< LoRa coding rate + uint8_t ldro; //!< LoRa LDRO +} lr11xx_radio_mod_params_lora_t; + +/*! + * @brief Modulation configuration for LR-FHSS packets + */ +typedef struct lr11xx_radio_mod_params_lr_fhss_s +{ + lr11xx_radio_lr_fhss_bitrate_t br_in_bps; //!< LR-FHSS bitrate + lr11xx_radio_lr_fhss_pulse_shape_t pulse_shape; //!< LR-FHSS pulse shape +} lr11xx_radio_mod_params_lr_fhss_t; + +/*! + * @brief Packet parameter configuration for GFSK packets + */ +typedef struct lr11xx_radio_pkt_params_gfsk_s +{ + uint16_t preamble_len_in_bits; //!< GFSK Preamble length [bits] + lr11xx_radio_gfsk_preamble_detector_t preamble_detector; //!< GFSK Preamble detection configuration + uint8_t sync_word_len_in_bits; //!< GFSK Syncword length [bits] + lr11xx_radio_gfsk_address_filtering_t address_filtering; //!< GFSK Address filtering/comparison configuration + lr11xx_radio_gfsk_pkt_len_modes_t header_type; //!< GFSK Header type configuration + uint8_t pld_len_in_bytes; //!< GFSK Payload length [bytes] + lr11xx_radio_gfsk_crc_type_t crc_type; //!< GFSK CRC configuration + lr11xx_radio_gfsk_dc_free_t dc_free; //!< GFSK Whitening configuration +} lr11xx_radio_pkt_params_gfsk_t; + +/*! + * @brief Packet parameter configuration for BPSK packets + */ +typedef struct lr11xx_radio_pkt_params_bpsk_s +{ + uint8_t pld_len_in_bytes; //!< Payload length [bytes] + uint16_t ramp_up_delay; //!< Delay to fine tune ramp-up time, if non-zero + uint16_t ramp_down_delay; //!< Delay to fine tune ramp-down time, if non-zero + uint16_t pld_len_in_bits; //!< If non-zero, used to ramp down PA before end of a payload with length that is not a + //!< multiple of 8. pld_len_in_bits <= pld_len_in_bytes * 8 +} lr11xx_radio_pkt_params_bpsk_t; + +/*! + * @brief Packet parameter configuration for LoRa packets + */ +typedef struct lr11xx_radio_pkt_params_lora_s +{ + uint16_t preamble_len_in_symb; //!< LoRa Preamble length [symbols] + lr11xx_radio_lora_pkt_len_modes_t header_type; //!< LoRa Header type configuration + uint8_t pld_len_in_bytes; //!< LoRa Payload length [bytes] + lr11xx_radio_lora_crc_t crc; //!< LoRa CRC configuration + lr11xx_radio_lora_iq_t iq; //!< LoRa IQ configuration +} lr11xx_radio_pkt_params_lora_t; + +/*! + * @brief Configuration of Power Amplifier + * + * @ref pa_duty_cycle controls the duty cycle of Power Amplifier according to: + * \f$ dutycycle = 0.2 + 0.04 \times pa_duty_cycle \f$ + * It can be used to adapt the TX multi-band operation using a single-matching network. + * + * The allowed duty cycle values for LPA are from 0.2 to 0.48 (by step of 0.04). Therefore possible values for + * pa_duty_cycle go from 0 to 7. + * + * The allowed duty cycle values for HPA go from 0.2 to 0.36 (by step of 0.04). Therefore in this case, the possible + * values for pa_duty_cycle go from 0 to 4. + * + * @ref pa_hp_sel controls the number of slices for HPA according to: \f$ \#slices = pa_hp_sel + 1 \f$ + */ +typedef struct lr11xx_radio_pa_cfg_s +{ + lr11xx_radio_pa_selection_t pa_sel; //!< Power Amplifier selection + lr11xx_radio_pa_reg_supply_t pa_reg_supply; //!< Power Amplifier regulator supply source + uint8_t pa_duty_cycle; //!< Power Amplifier duty cycle (Default 0x04) + uint8_t pa_hp_sel; //!< Number of slices for HPA (Default 0x07) +} lr11xx_radio_pa_cfg_t; + +/*! + * @brief RSSI calibration table + */ +typedef struct lr11xx_radio_rssi_calibration_table_s +{ + struct + { + uint8_t g4; + uint8_t g5; + uint8_t g6; + uint8_t g7; + uint8_t g8; + uint8_t g9; + uint8_t g10; + uint8_t g11; + uint8_t g12; + uint8_t g13; + uint8_t g13hp1; + uint8_t g13hp2; + uint8_t g13hp3; + uint8_t g13hp4; + uint8_t g13hp5; + uint8_t g13hp6; + uint8_t g13hp7; + } gain_tune; //!< Used to set gain tune value for RSSI calibration + + int16_t gain_offset; //!< Used to set gain offset value for RSSI calibration +} lr11xx_radio_rssi_calibration_table_t; + +/*! + * @brief Values to use to setup LNA LF0 configuration + * + * LNA can be configured in either of the 3 modes: Single N, Single P or differential (which is default) + * + */ +typedef enum +{ + LR11XX_RADIO_LNA_MODE_SINGLE_RFI_N_LF0 = 1, //!< Use only RFI_N_LF0 antenna + LR11XX_RADIO_LNA_MODE_SINGLE_RFI_P_LF0 = 2, //!< Use only RFI_P_LF0 antenna + LR11XX_RADIO_LNA_MODE_DIFFERENTIAL_LF0 = 3 //!< Configure LNA LF0 in differential mode (default) +} lr11xx_radio_lna_mode_t; +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_RADIO_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_regmem.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_regmem.h new file mode 100755 index 0000000..866a65e --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_regmem.h @@ -0,0 +1,207 @@ +/*! + * @file lr11xx_regmem.h + * + * @brief Register/memory driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_REGMEM_H +#define LR11XX_REGMEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/*! + * @brief Maximum number of words that can be written to / read from a LR11XX chip with regmem32 commands + */ +#define LR11XX_REGMEM_MAX_WRITE_READ_WORDS 64 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Write up to 64 words into register memory space of LR11XX. + * + * A word is 32-bit long. The writing operations write contiguously in register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start writing operation + * @param [in] data The buffer of words to write into memory. Its size must be enough to contain length words. + * @param [in] length Number of words to write into memory + * + * @returns Operation status + * + * @see lr11xx_regmem_read_regmem32 + */ +lr11xx_status_t lr11xx_regmem_write_regmem32( const void* context, const uint32_t address, const uint32_t* buffer, + const uint8_t length ); + +/*! + * @brief Read up to 64 words into register memory space of LR11XX. + * + * A word is 32-bit long. The reading operations read contiguously from register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start reading operation + * @param [in] length Number of words to read from memory + * @param [out] buffer Pointer to a words array to be filled with content from memory. Its size must be enough to + * contain at least length words. + * + * @returns Operation status + * + * @see lr11xx_regmem_write_regmem32 + */ +lr11xx_status_t lr11xx_regmem_read_regmem32( const void* context, const uint32_t address, uint32_t* buffer, + const uint8_t length ); + +/*! + * @brief Write bytes into register memory space of LR11XX. + * + * A byte is 8-bit long. The writing operations write contiguously in register memory, starting at the address provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start writing operation + * @param [in] data The buffer of bytes to write into memory. Its size must be enough to contain length bytes + * @param [in] length Number of bytes to write into memory + * + * @returns Operation status + * + * @see lr11xx_regmem_read_mem8 + */ +lr11xx_status_t lr11xx_regmem_write_mem8( const void* context, const uint32_t address, const uint8_t* buffer, + const uint8_t length ); + +/*! + * @brief Read bytes into register memory space of LR11XX. + * + * A byte is 8-bit long. The reading operations read contiguously from register memory, starting at the address + * provided. + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to start reading operation + * @param [in] length Number of bytes to read from memory + * @param [in] buffer Pointer to a byte array to be filled with content from memory. Its size must be enough to contain + * at least length bytes + * + * @returns Operation status + * + * @see lr11xx_regmem_write_mem8 + */ +lr11xx_status_t lr11xx_regmem_read_mem8( const void* context, const uint32_t address, uint8_t* buffer, + const uint8_t length ); + +/*! + * @brief Write bytes into radio TX buffer memory space of LR11XX. + * + * @param [in] context Chip implementation context + * @param [in] data The buffer of bytes to write into radio buffer. Its size must be enough to contain length bytes + * @param [in] length Number of bytes to write into radio buffer + * + * @returns Operation status + * + * @see lr11xx_regmem_read_buffer8 + */ +lr11xx_status_t lr11xx_regmem_write_buffer8( const void* context, const uint8_t* buffer, const uint8_t length ); + +/*! + * @brief Read bytes from radio RX buffer memory space of LR11XX. + * + * @param [in] context Chip implementation context + * @param [in] offset Memory offset to start reading + * @param [in] length Number of bytes to read from radio buffer + * @param [in] data Pointer to a byte array to be filled with content from radio buffer. Its size must be enough to + * contain at least length bytes + * + * @returns Operation status + * + * @see lr11xx_regmem_write_buffer8 + */ +lr11xx_status_t lr11xx_regmem_read_buffer8( const void* context, uint8_t* buffer, const uint8_t offset, + const uint8_t length ); + +/*! + * @brief Clear radio RX buffer + * + * Set to 0x00 all content of the radio RX buffer + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_regmem_clear_rxbuffer( const void* context ); + +/*! + * @brief Read-modify-write data at given register/memory address + * + * @param [in] context Chip implementation context + * @param [in] address The register memory address to be modified + * @param [in] mask The mask to be applied on read data + * @param [in] data The data to be written + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_regmem_write_regmem32_mask( const void* context, const uint32_t address, const uint32_t mask, + const uint32_t data ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_REGMEM_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof.h new file mode 100755 index 0000000..535c721 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof.h @@ -0,0 +1,201 @@ +/** + * @file lr11xx_rttof.h + * + * @brief Round-Trip Time of Flight (RTToF) driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2022. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RTTOF_H +#define LR11XX_RTTOF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr11xx_rttof_types.h" +#include "lr11xx_radio_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/** + * @brief Length in byte of the RTToF result + */ +#define LR11XX_RTTOF_RESULT_LENGTH ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTION PROTOTYPES --------------------------------------------- + */ + +/** + * @brief Set the RTToF address for this subordinate device. + * + * @param [in] context Chip implementation context + * @param [in] address 32-bit subordinate address (default is 0x00000019) + * @param [in] check_length Number of bytes to be checked when comparing the device's + * address with request address value contained in received + * RTToF frames (valid range 1..4, default is 4) + * + * @returns Operation status + * + * @note The address set by this function is only used in subordinate mode, that is, + * when receiving RTToF requests. While processing received request packets, + * the RTToF subordinate compares @p check_length bytes (LSB first) of + * the request address with its own address. Packets with non-matching request + * addresses are discarded. + */ +lr11xx_status_t lr11xx_rttof_set_address( const void* context, const uint32_t address, const uint8_t check_length ); + +/** + * @brief Set the RTToF address used for requests sent in manager mode. + * + * @param [in] context Chip implementation context + * @param [in] request_address 32-bit request address (default is 0x00000019) + * + * @returns Operation status + * + * @note The request address set by this function is only used in manager mode, + * that is, when sending RTToF requests. The @p request_address is copied + * into the corresponding field in the next RTToF request sent. + */ +lr11xx_status_t lr11xx_rttof_set_request_address( const void* context, const uint32_t request_address ); + +/** + * @brief Set the transceiver RX/TX delay indicator to be compensated during RTToF. + * + * The transceiver hardware induces a delay depending on the physical layer + * configuration (bandwidth, spreading factor). To achieve the desired RTToF + * accuracy, this delay needs to be compensated by a calibration value. + * + * @param [in] context Chip implementation context + * @param [in] delay_indicator Delay value corresponding to the used bandwidth and spreading factor + * + * @returns lr11xx_status_t Operation status + * + * @note The same delay_indicator value needs to be configured in both manager and subordinate devices. + */ +lr11xx_status_t lr11xx_rttof_set_rx_tx_delay_indicator( const void* context, const uint32_t delay_indicator ); + +/** + * @brief Configure RTToF specific parameters. + * + * It is recommended to always call this command when configuring the RTToF operation with @p nb_symbols = 15. + * This value balances the RTToF accuracy and power consumption. + * + * @param [in] context Chip implementation context + * @param [in] nb_symbols Number of symbols contained in responses sent by subordinates + * + * @returns lr11xx_status_t Operation status + * + * @note The RTToF parameters need to be configured in both manager and subordinate devices. + */ +lr11xx_status_t lr11xx_rttof_set_parameters( const void* context, const uint8_t nb_symbols ); + +/** + * @brief Get the RTToF result on the manager device. + * + * Retrieve the RTToF result item corresponding to the given item type @p type. + * + * @param [in] context Chip implementation context + * @param [in] type Result item type to be retrieved + * @param [out] result Result data buffer + * + * @returns lr11xx_status_t Operation status + * + * @note This function is only available on devices in manager mode after + * the RTToF is terminated. + */ +lr11xx_status_t lr11xx_rttof_get_raw_result( const void* context, const lr11xx_rttof_result_type_t type, + uint8_t result[LR11XX_RTTOF_RESULT_LENGTH] ); + +/** + * @brief Convert the raw distance result obtained from the device to a distance result [m]. + * + * This function is meaningful only to convert a RTToF result obtained by calling @p lr11xx_rttof_get_raw_result + * with type set to @p LR11XX_RTTOF_RESULT_TYPE_RAW + * + * @param [in] rttof_bw Bandwidth used during RTToF + * @param [in] raw_distance_buf Buffer containing the raw distance result + * + * @returns int32_t Distance result [m] + * + * @see lr11xx_rttof_get_raw_result + * + * @note The caller must ensure that the @p rttof_bw parameter is one of the supported ones, + * i.e., #LR11XX_RADIO_LORA_BW_125, #LR11XX_RADIO_LORA_BW_250, #LR11XX_RADIO_LORA_BW_500. + */ +int32_t lr11xx_rttof_distance_raw_to_meter( lr11xx_radio_lora_bw_t rttof_bw, + const uint8_t raw_distance_buf[LR11XX_RTTOF_RESULT_LENGTH] ); + +/** + * @brief Convert the raw RSSI result obtained from the device to an RSSI result. + * + * This function is meaningful only to convert a RTToF result obtained by calling @p lr11xx_rttof_get_raw_result + * with type set to @p LR11XX_RTTOF_RESULT_TYPE_RSSI + * + * @param [in] raw_rssi_buf Buffer containing the raw RSSI result + * + * @returns int8_t RSSI result [dBm] + * + * @see lr11xx_rttof_get_raw_result + */ +static inline int8_t lr11xx_rttof_rssi_raw_to_value( const uint8_t raw_rssi_buf[LR11XX_RTTOF_RESULT_LENGTH] ) +{ + // Only the last byte is meaningful + return -( int8_t )( raw_rssi_buf[3] >> 1 ); +} + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_RTTOF_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof_types.h new file mode 100755 index 0000000..a046a47 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_rttof_types.h @@ -0,0 +1,82 @@ +/** + * @file lr11xx_rttof_types.h + * + * @brief Round-Trip Time of Flight (RTToF) driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2022. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_RTTOF_TYPES_H +#define LR11XX_RTTOF_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief Round-Trip Time of Flight result types + */ +typedef enum lr11xx_rttof_result_type_e +{ + LR11XX_RTTOF_RESULT_TYPE_RAW = 0, ///< Raw distance result + LR11XX_RTTOF_RESULT_TYPE_RSSI, ///< RTToF RSSI +} lr11xx_rttof_result_type_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTION PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_RTTOF_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system.h new file mode 100755 index 0000000..a4d00f6 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system.h @@ -0,0 +1,594 @@ +/*! + * @file lr11xx_system.h + * + * @brief System driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_SYSTEM_H +#define LR11XX_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_system_types.h" +#include "lr11xx_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Frequency step in MHz used to compute the image calibration parameter + * + * @see lr11xx_system_calibrate_image_in_mhz + */ +#define LR11XX_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ 4 + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Reset the radio + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_reset( const void* context ); + +/** + * @brief Wake the radio up from sleep mode. + * + * @param [in] context Chip implementation context. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_wakeup( const void* context ); + +/** + * @brief Abort a blocking command. + * + * @param [in] context Chip implementation context. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_abort_blocking_cmd( const void* context ); + +/*! + * @brief Return stat1, stat2, and irq_status + * + * @param [in] context Chip implementation context + * @param [out] stat1 Pointer to a variable for holding stat1. Can be NULL. + * @param [out] stat2 Pointer to a variable for holding stat2. Can be NULL. + * @param [out] irq_status Pointer to a variable for holding irq_status. Can be NULL. + * + * @returns Operation status + * + * @remark To simplify system integration, this function does not actually execute the GetStatus command, which would + * require bidirectional SPI communication. It obtains the stat1, stat2, and irq_status values by performing an ordinary + * SPI read (which is required to send null/NOP bytes on the MOSI line). This is possible since the LR11XX returns these + * values automatically whenever a read that does not directly follow a response-carrying command is performed. + * Unlike with the GetStatus command, however, the reset status information is NOT cleared by this command. The function + * @ref lr11xx_system_clear_reset_status_info may be used for this purpose when necessary. + */ +lr11xx_status_t lr11xx_system_get_status( const void* context, lr11xx_system_stat1_t* stat1, + lr11xx_system_stat2_t* stat2, lr11xx_system_irq_mask_t* irq_status ); + +/*! + * @brief Clear the reset status information stored in stat2 + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_clear_reset_status_info( const void* context ); + +/*! + * @brief Return irq_status + * + * @param [in] context Chip implementation context + * @param [out] irq_status irq_status status variable + * + * @returns Operation status + */ +static inline lr11xx_status_t lr11xx_system_get_irq_status( const void* context, lr11xx_system_irq_mask_t* irq_status ) +{ + return lr11xx_system_get_status( context, 0, 0, irq_status ); +} + +/*! + * @brief Return the version of the system (hardware and software) + * + * @param [in] context Chip implementation context + * @param [out] version Pointer to the structure holding the system version + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_get_version( const void* context, lr11xx_system_version_t* version ); + +/*! + * @brief Return the system errors + * + * Errors may be fixed following: + * - calibration error can be fixed by attempting another RC calibration; + * - XOsc related errors may be due to hardware problems, can be fixed by reset; + * - PLL lock related errors can be due to not-locked PLL, or by attempting to use an out-of-band frequency, can be + * fixed by executing a PLL calibration, or by using other frequencies. + * + * @param [in] context Chip implementation context + * @param [out] errors Pointer to a value holding error flags + * + * @returns Operation status + * + * @see lr11xx_system_calibrate, lr11xx_system_calibrate_image, lr11xx_system_clear_errors + */ +lr11xx_status_t lr11xx_system_get_errors( const void* context, uint16_t* errors ); + +/*! + * @brief Clear all error flags pending. + * + * This function cannot be used to clear flags individually. + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr11xx_system_get_errors + */ +lr11xx_status_t lr11xx_system_clear_errors( const void* context ); + +/*! + * @brief lr11xx_system_calibrate the requested blocks + * + * This function can be called in any mode of the chip. + * + * The chip will return to standby RC mode on exit. Potential calibration issues can be read out with + * lr11xx_system_get_errors command. + * + * @param [in] context Chip implementation context + * @param [in] calib_param Structure holding the reference to blocks to be calibrated + * + * @returns Operation status + * + * @see lr11xx_system_get_errors + */ +lr11xx_status_t lr11xx_system_calibrate( const void* context, const uint8_t calib_param ); + +/*! + * @brief Configure the regulator mode to be used in specific modes + * + * This function shall only be called in standby RC mode. + * + * The reg_mode parameter defines if the DC-DC converter is switched on in the following modes: STANDBY XOSC, FS, RX, TX + * and RX_CAPTURE. + * + * @param [in] context Chip implementation context + * @param [in] reg_mode Regulator mode configuration + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_set_reg_mode( const void* context, const lr11xx_system_reg_mode_t reg_mode ); + +/*! + * @brief Launch an image calibration valid for all frequencies inside an interval, in steps + * + * This function can be called in any mode of the chip. + * + * The chip will return to standby RC mode on exit. Potential calibration issues can be read out with + * lr11xx_system_get_errors command. + * + * The frequencies given in parameters are defined in 4MHz step (Eg. 900MHz corresponds to 0xE1). If freq1 = freq2, only + * one calibration is performed. + * + * @param [in] context Chip implementation context + * @param [in] freq1 Image calibration interval lower bound, in steps + * @param [in] freq2 Image calibration interval upper bound, in steps + * + * @remark freq1 must be less than or equal to freq2 + * + * @returns Operation status + * + * @see lr11xx_system_get_errors + */ +lr11xx_status_t lr11xx_system_calibrate_image( const void* context, const uint8_t freq1, const uint8_t freq2 ); + +/*! + * @brief Launch an image calibration valid for all frequencies inside an interval, in MHz + * + * @remark This function relies on @ref lr11xx_system_calibrate_image + * + * @param [in] context Chip implementation context + * @param [in] freq1_in_mhz Image calibration interval lower bound, in MHz + * @param [in] freq2_in_mhz Image calibration interval upper bound, in MHz + * + * @remark freq1 must be less than or equal to freq2 + * + * @returns Operation status + * + * @see lr11xx_system_calibrate_image + */ +lr11xx_status_t lr11xx_system_calibrate_image_in_mhz( const void* context, const uint16_t freq1_in_mhz, + const uint16_t freq2_in_mhz ); + +/*! + * @brief Set the RF switch configurations for each RF setup + * + * This function shall only be called in standby RC mode. + * + * By default, no DIO is used to control a RF switch. All DIOs are set in High-Z mode. + * + * @param [in] context Chip implementation context + * @param [in] rf_switch_cfg Pointer to a structure that holds the switches configuration + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_set_dio_as_rf_switch( const void* context, + const lr11xx_system_rfswitch_cfg_t* rf_switch_cfg ); + +/*! + * @brief Set which interrupt signals are redirected to the dedicated DIO pin + * + * By default, no interrupt signal is redirected. + * + * The dedicated DIO pin will remain asserted until all redirected interrupt signals are cleared with a call to + * lr11xx_system_clear_irq_status. + * + * @param [in] context Chip implementation context + * @param [in] irqs_to_enable_dio1 Variable that holds the interrupt mask for dio1 + * @param [in] irqs_to_enable_dio2 Variable that holds the interrupt mask for dio2 + * + * @returns Operation status + * + * @see lr11xx_system_clear_irq_status + */ +lr11xx_status_t lr11xx_system_set_dio_irq_params( const void* context, + const lr11xx_system_irq_mask_t irqs_to_enable_dio1, + const lr11xx_system_irq_mask_t irqs_to_enable_dio2 ); + +/*! + * @brief Clear requested bits in the internal pending interrupt register + * + * @param [in] context Chip implementation context + * @param [in] irqs_to_clear Variable that holds the interrupts to be cleared + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_clear_irq_status( const void* context, const lr11xx_system_irq_mask_t irqs_to_clear ); + +/** + * @brief This helper function clears any radio irq status flags that are set and returns the flags that were cleared. + * + * @param [in] context Chip implementation context. + * @param [out] irq Pointer to a variable for holding the system interrupt status. Can be NULL. + * + * @returns Operation status + * + * @see lr11xx_system_get_irq_status, lr11xx_system_clear_irq_status + */ +lr11xx_status_t lr11xx_system_get_and_clear_irq_status( const void* context, lr11xx_system_irq_mask_t* irq ); + +/*! + * @brief Defines which clock is used as Low Frequency (LF) clock + * + * @param [in] context Chip implementation context + * @param [in] lfclock_cfg Low frequency clock configuration + * @param [in] wait_for_32k_ready Tells the radio if it has to check if 32k source is ready before driving busy low + * + * @returns Operation status + * + * @see lr11xx_system_calibrate, lr11xx_system_calibrate_image + */ +lr11xx_status_t lr11xx_system_cfg_lfclk( const void* context, const lr11xx_system_lfclk_cfg_t lfclock_cfg, + const bool wait_for_32k_ready ); + +/*! + * @brief Enable and configure TCXO supply voltage and detection timeout + * + * This function shall only be called in standby RC mode. + * + * The timeout parameter is the maximum time the firmware waits for the TCXO to be ready. The timeout duration is given + * by: \f$ timeout\_duration\_us = timeout \times 30.52 \f$ + * + * The TCXO mode can be disabled by setting timeout parameter to 0. + * + * @param [in] context Chip implementation context + * @param [in] tune Supply voltage value + * @param [in] timeout Gating time before which the radio starts its Rx / Tx operation + * + * @returns Operation status + * + * @see lr11xx_system_calibrate, lr11xx_system_calibrate_image + */ +lr11xx_status_t lr11xx_system_set_tcxo_mode( const void* context, const lr11xx_system_tcxo_supply_voltage_t tune, + const uint32_t timeout ); + +/*! + * @brief Software reset of the chip. + * + * This function should be used to reboot the chip in a specified mode. Rebooting in flash mode presumes that the + * content in flash memory is not corrupted (i.e. the integrity check performed by the bootloader before executing the + * first instruction in flash is OK). + * + * @param [in] context Chip implementation context + * @param [in] stay_in_bootloader Selector to stay in bootloader or execute flash code after reboot. If true, the + * bootloader will not execute the flash code but activate SPI interface to allow firmware upgrade + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_reboot( const void* context, const bool stay_in_bootloader ); + +/*! + * @brief Returns the value of Vbat + * + * Vbat value (in V) is a function of Vana (typ. 1.35V) using the following + * formula: \f$ Vbat_{V} = (5 \times \frac{Vbat}{255} - 1) \times Vana \f$ + * + * @param [in] context Chip implementation context + * @param [out] vbat A pointer to the Vbat value + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_get_vbat( const void* context, uint8_t* vbat ); + +/*! + * @brief Returns the value of Temp + * + * The temperature (in °C) is a function of Vana (typ. 1.35V), Vbe25 (Vbe voltage @ 25°C, typ. 0.7295V) and VbeSlope + * (typ. -1.7mV/°C) using the following formula: + * \f$ Temperature_{°C} = (\frac{Temp(10:0)}{2047} \times Vana - Vbe25) \times \frac{1000}{VbeSlope} + 25 \f$ + * + * @remark If a TCXO is used, make sure to configure it with @ref lr11xx_system_set_tcxo_mode before calling this + * function + * + * @param [in] context Chip implementation context + * @param [out] temp A pointer to the Temp value + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_get_temp( const void* context, uint16_t* temp ); + +/*! + * @brief Set the device into Sleep or Deep Sleep Mode + * + * The sleep_cfg parameter defines in which sleep mode the device is put and if it wakes up after a given time on the + * RTC event. + * + * The sleep_time parameter is taken into account only when RtcTimeout = 1. It sets the sleep time in number of clock + * cycles: \f$ sleep\_time\_ms = sleep_time \times \frac{1}{32.768} \f$ + * + * @param [in] context Chip implementation context + * @param [in] sleep_cfg Sleep mode configuration + * @param [in] sleep_time Value of the RTC timeout (if RtcTimeout = 1) + * + * @returns Operation status + * + * @see lr11xx_system_set_standby, lr11xx_system_set_fs + */ +lr11xx_status_t lr11xx_system_set_sleep( const void* context, const lr11xx_system_sleep_cfg_t sleep_cfg, + const uint32_t sleep_time ); + +/*! + * @brief Set the device into the requested Standby mode + * + * @param [in] context Chip implementation context + * @param [in] standby_cfg Stand by mode configuration (RC or XOSC) + * + * @returns Operation status + * + * @see lr11xx_system_set_sleep, lr11xx_system_set_fs + */ +lr11xx_status_t lr11xx_system_set_standby( const void* context, const lr11xx_system_standby_cfg_t standby_cfg ); + +/*! + * @brief Set the device into Frequency Synthesis (FS) mode + * + * @param [in] context Chip implementation context + * + * @returns Operation status + * + * @see lr11xx_system_set_standby, lr11xx_system_set_sleep + */ +lr11xx_status_t lr11xx_system_set_fs( const void* context ); + +/*! + * @brief Erase an info page + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page to be erased. Only LR11XX_SYSTEM_INFOPAGE_1 is allowed. + * + * @returns Operation status + * + * @see lr11xx_system_write_infopage, lr11xx_system_read_infopage + */ +lr11xx_status_t lr11xx_system_erase_infopage( const void* context, const lr11xx_system_infopage_id_t info_page_id ); + +/*! + * @brief Write data in an info page + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page where data are written. Only LR11XX_SYSTEM_INFOPAGE_1 is allowed. + * @param [in] address Address within the info page (aligned on 32-bit data) + * @param [in] data Pointer to the data to write (data buffer shall be - at least - length words long) + * @param [in] length Number of 32-bit data to write (maximum value is 64) + * + * @returns Operation status + * + * @see lr11xx_system_erase_infopage, lr11xx_system_read_infopage + */ +lr11xx_status_t lr11xx_system_write_infopage( const void* context, const lr11xx_system_infopage_id_t info_page_id, + const uint16_t address, const uint32_t* data, const uint8_t length ); + +/*! + * @brief Read data from an info page + * + * It is possible to cross from page 0 to 1 if (address + length >= 512) + * + * @param [in] context Chip implementation context + * @param [in] info_page_id Info page where data are read + * @param [in] address Address within the info page (aligned on 32-bit data) + * @param [out] data Pointer to the data to read (data buffer shall be - at least - length words long) + * @param [in] length Number of 32-bit data to read (maximum value is 64) + * + * @returns Operation status + * + * @see lr11xx_system_erase_infopage, lr11xx_system_write_infopage + */ +lr11xx_status_t lr11xx_system_read_infopage( const void* context, const lr11xx_system_infopage_id_t info_page_id, + const uint16_t address, uint32_t* data, const uint8_t length ); + +/*! + * @brief Read and return the Unique Identifier of the LR11XX + * + * @param [in] context Chip implementation context + * @param [out] unique_identifier The buffer to be filled with the Unique Identifier of the LR11XX. It is up to the + * application to ensure unique_identifier is long enough to hold the unique identifier + * + * @returns Operation status + * + * @see LR11XX_SYSTEM_UID_LENGTH + */ +lr11xx_status_t lr11xx_system_read_uid( const void* context, lr11xx_system_uid_t unique_identifier ); + +/*! + * @brief Read and return the Join EUI of the LR11XX + * + * @param [in] context Chip implementation context + * @param [out] join_eui The buffer to be filled with Join EUI of the LR11XX. It is up to the application to ensure + * join_eui is long enough to hold the join EUI + * + * @returns Operation status + * + * @see LR11XX_SYSTEM_JOIN_EUI_LENGTH + */ +lr11xx_status_t lr11xx_system_read_join_eui( const void* context, lr11xx_system_join_eui_t join_eui ); + +/*! + * @brief Compute and return the PIN of the LR11XX based on factory default EUIs + * + * @remark Calling this command also triggers a derivation of network and application keys (available as @ref + * LR11XX_CRYPTO_KEYS_IDX_NWK_KEY and @ref LR11XX_CRYPTO_KEYS_IDX_APP_KEY) based on factory default EUIs + * + * @param [in] context Chip implementation context + * @param [out] pin The buffer to be filled with PIN of the LR11XX. It is up to the application to ensure pin is long + * enough to hold the PIN + * + * @returns Operation status + * + * @see LR11XX_SYSTEM_PIN_LENGTH + */ +lr11xx_status_t lr11xx_system_read_pin( const void* context, lr11xx_system_pin_t pin ); + +/*! + * @brief Compute and return the PIN of the LR11XX based on EUIs provided as parameters + * + * @remark Calling this command also triggers a derivation of network and application keys (available as @ref + * LR11XX_CRYPTO_KEYS_IDX_NWK_KEY and @ref LR11XX_CRYPTO_KEYS_IDX_APP_KEY) based on EUIs provided as parameters + * + * @param [in] context Chip implementation context + * @param [in] device_eui Custom Device EUI + * @param [in] join_eui Custom Join EUI + * @param [in] rfu Parameter RFU - shall be set to 0x00 + * @param [out] pin The buffer to be filled with PIN of the LR11XX. It is up to the application to ensure pin is long + * enough to hold the PIN + * + * @returns Operation status + * + * @see LR11XX_SYSTEM_PIN_LENGTH + */ +lr11xx_status_t lr11xx_system_read_pin_custom_eui( const void* context, lr11xx_system_uid_t device_eui, + lr11xx_system_join_eui_t join_eui, uint8_t rfu, + lr11xx_system_pin_t pin ); + +/*! + * @brief Read and return a 32-bit random number + * + * @remark Radio operating mode must be set into standby. + * + * @param [in] context Chip implementation context + * @param [out] random_number 32-bit random number + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_get_random_number( const void* context, uint32_t* random_number ); + +/*! + * @brief Enable the CRC on SPI transactions + * + * @remark This command shall always be sent with a CRC (to both enable and disable the feature). The function does not + * take care of this additional byte - which is under the responsibility of the underlying HAL functions + * + * @param [in] context Chip implementation context + * @param [in] enable_crc CRC + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_enable_spi_crc( const void* context, bool enable_crc ); + +/*! + * @brief Configure the GPIO drive in sleep mode + * + * @remark GPIO stands for RF switch and IRQ line DIOs + * + * @note This command is available from firmware version 0x0306 + * + * @param [in] context Chip implementation context + * @param [in] enable_drive GPIO drive configuration (true: enabled / false: disabled) + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_system_drive_dio_in_sleep_mode( const void* context, bool enable_drive ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_SYSTEM_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system_types.h new file mode 100755 index 0000000..74cef85 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_system_types.h @@ -0,0 +1,349 @@ +/*! + * @file lr11xx_system_types.h + * + * @brief System driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_SYSTEM_TYPES_H +#define LR11XX_SYSTEM_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/*! + * @brief Length in byte of the LR11XX version blob + */ +#define LR11XX_SYSTEM_VERSION_LENGTH ( 4 ) + +/*! + * @brief Length of the LR11XX Unique Identifier in bytes + * + * The LR11XX Unique Identifiers is an 8 byte long buffer + */ +#define LR11XX_SYSTEM_UID_LENGTH ( 8 ) +#define LR11XX_SYSTEM_JOIN_EUI_LENGTH ( 8 ) +#define LR11XX_SYSTEM_PIN_LENGTH ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief Fixed-length array to store a UID + */ +typedef uint8_t lr11xx_system_uid_t[LR11XX_SYSTEM_UID_LENGTH]; + +/** + * @brief Fixed-length array to store a joinEUI + */ +typedef uint8_t lr11xx_system_join_eui_t[LR11XX_SYSTEM_JOIN_EUI_LENGTH]; + +/** + * @brief Fixed-length array to store a PIN + */ +typedef uint8_t lr11xx_system_pin_t[LR11XX_SYSTEM_PIN_LENGTH]; + +/** + * @brief Type to store system interrupt flags + */ +typedef uint32_t lr11xx_system_irq_mask_t; + +/** + * @brief Interrupt flags + */ +enum lr11xx_system_irq_e +{ + LR11XX_SYSTEM_IRQ_NONE = ( 0 << 0 ), + LR11XX_SYSTEM_IRQ_TX_DONE = ( 1 << 2 ), + LR11XX_SYSTEM_IRQ_RX_DONE = ( 1 << 3 ), + LR11XX_SYSTEM_IRQ_PREAMBLE_DETECTED = ( 1 << 4 ), + LR11XX_SYSTEM_IRQ_SYNC_WORD_HEADER_VALID = ( 1 << 5 ), + LR11XX_SYSTEM_IRQ_HEADER_ERROR = ( 1 << 6 ), + LR11XX_SYSTEM_IRQ_CRC_ERROR = ( 1 << 7 ), + LR11XX_SYSTEM_IRQ_CAD_DONE = ( 1 << 8 ), + LR11XX_SYSTEM_IRQ_CAD_DETECTED = ( 1 << 9 ), + LR11XX_SYSTEM_IRQ_TIMEOUT = ( 1 << 10 ), + LR11XX_SYSTEM_IRQ_LR_FHSS_INTRA_PKT_HOP = ( 1 << 11 ), + LR11XX_SYSTEM_IRQ_RTTOF_REQ_VALID = ( 1 << 14 ), + LR11XX_SYSTEM_IRQ_RTTOF_REQ_DISCARDED = ( 1 << 15 ), + LR11XX_SYSTEM_IRQ_RTTOF_RESP_DONE = ( 1 << 16 ), + LR11XX_SYSTEM_IRQ_RTTOF_EXCH_VALID = ( 1 << 17 ), + LR11XX_SYSTEM_IRQ_RTTOF_TIMEOUT = ( 1 << 18 ), + LR11XX_SYSTEM_IRQ_GNSS_SCAN_DONE = ( 1 << 19 ), + LR11XX_SYSTEM_IRQ_WIFI_SCAN_DONE = ( 1 << 20 ), + LR11XX_SYSTEM_IRQ_EOL = ( 1 << 21 ), + LR11XX_SYSTEM_IRQ_CMD_ERROR = ( 1 << 22 ), + LR11XX_SYSTEM_IRQ_ERROR = ( 1 << 23 ), + LR11XX_SYSTEM_IRQ_FSK_LEN_ERROR = ( 1 << 24 ), + LR11XX_SYSTEM_IRQ_FSK_ADDR_ERROR = ( 1 << 25 ), + LR11XX_SYSTEM_IRQ_LORA_RX_TIMESTAMP = + ( 1 << 27 ), //!< Available since firmware LR1110 0x0308 / LR1120 0x0102 / LR1121 0x0102 + LR11XX_SYSTEM_IRQ_ALL_MASK = + LR11XX_SYSTEM_IRQ_TX_DONE | LR11XX_SYSTEM_IRQ_RX_DONE | LR11XX_SYSTEM_IRQ_PREAMBLE_DETECTED | + LR11XX_SYSTEM_IRQ_SYNC_WORD_HEADER_VALID | LR11XX_SYSTEM_IRQ_HEADER_ERROR | LR11XX_SYSTEM_IRQ_CRC_ERROR | + LR11XX_SYSTEM_IRQ_CAD_DONE | LR11XX_SYSTEM_IRQ_CAD_DETECTED | LR11XX_SYSTEM_IRQ_TIMEOUT | + LR11XX_SYSTEM_IRQ_LR_FHSS_INTRA_PKT_HOP | LR11XX_SYSTEM_IRQ_RTTOF_REQ_VALID | + LR11XX_SYSTEM_IRQ_RTTOF_REQ_DISCARDED | LR11XX_SYSTEM_IRQ_RTTOF_RESP_DONE | LR11XX_SYSTEM_IRQ_RTTOF_EXCH_VALID | + LR11XX_SYSTEM_IRQ_RTTOF_TIMEOUT | LR11XX_SYSTEM_IRQ_GNSS_SCAN_DONE | LR11XX_SYSTEM_IRQ_WIFI_SCAN_DONE | + LR11XX_SYSTEM_IRQ_EOL | LR11XX_SYSTEM_IRQ_CMD_ERROR | LR11XX_SYSTEM_IRQ_ERROR | + LR11XX_SYSTEM_IRQ_FSK_LEN_ERROR | LR11XX_SYSTEM_IRQ_FSK_ADDR_ERROR | LR11XX_SYSTEM_IRQ_LORA_RX_TIMESTAMP, +}; + +/** + * @brief Calibration flags + */ +enum lr11xx_system_calibration_e +{ + LR11XX_SYSTEM_CALIB_LF_RC_MASK = ( 1 << 0 ), + LR11XX_SYSTEM_CALIB_HF_RC_MASK = ( 1 << 1 ), + LR11XX_SYSTEM_CALIB_PLL_MASK = ( 1 << 2 ), + LR11XX_SYSTEM_CALIB_ADC_MASK = ( 1 << 3 ), + LR11XX_SYSTEM_CALIB_IMG_MASK = ( 1 << 4 ), + LR11XX_SYSTEM_CALIB_PLL_TX_MASK = ( 1 << 5 ), +}; + +typedef uint8_t lr11xx_system_cal_mask_t; + +/** + * @brief Error flags + */ +enum lr11xx_system_errors_e +{ + LR11XX_SYSTEM_ERRORS_LF_RC_CALIB_MASK = ( 1 << 0 ), + LR11XX_SYSTEM_ERRORS_HF_RC_CALIB_MASK = ( 1 << 1 ), + LR11XX_SYSTEM_ERRORS_ADC_CALIB_MASK = ( 1 << 2 ), + LR11XX_SYSTEM_ERRORS_PLL_CALIB_MASK = ( 1 << 3 ), + LR11XX_SYSTEM_ERRORS_IMG_CALIB_MASK = ( 1 << 4 ), + LR11XX_SYSTEM_ERRORS_HF_XOSC_START_MASK = ( 1 << 5 ), + LR11XX_SYSTEM_ERRORS_LF_XOSC_START_MASK = ( 1 << 6 ), + LR11XX_SYSTEM_ERRORS_PLL_LOCK_MASK = ( 1 << 7 ), +}; + +typedef uint16_t lr11xx_system_errors_t; + +/** + * @brief Chip modes + */ +typedef enum +{ + LR11XX_SYSTEM_CHIP_MODE_SLEEP = 0x00, + LR11XX_SYSTEM_CHIP_MODE_STBY_RC = 0x01, + LR11XX_SYSTEM_CHIP_MODE_STBY_XOSC = 0x02, + LR11XX_SYSTEM_CHIP_MODE_FS = 0x03, + LR11XX_SYSTEM_CHIP_MODE_RX = 0x04, + LR11XX_SYSTEM_CHIP_MODE_TX = 0x05, + LR11XX_SYSTEM_CHIP_MODE_LOC = 0x06, +} lr11xx_system_chip_modes_t; + +/** + * @brief Reset status + */ +typedef enum +{ + LR11XX_SYSTEM_RESET_STATUS_CLEARED = 0x00, + LR11XX_SYSTEM_RESET_STATUS_ANALOG = 0x01, + LR11XX_SYSTEM_RESET_STATUS_EXTERNAL = 0x02, + LR11XX_SYSTEM_RESET_STATUS_SYSTEM = 0x03, + LR11XX_SYSTEM_RESET_STATUS_WATCHDOG = 0x04, + LR11XX_SYSTEM_RESET_STATUS_IOCD_RESTART = 0x05, + LR11XX_SYSTEM_RESET_STATUS_RTC_RESTART = 0x06, +} lr11xx_system_reset_status_t; + +/** + * @brief Command status + */ +typedef enum +{ + LR11XX_SYSTEM_CMD_STATUS_FAIL = 0x00, + LR11XX_SYSTEM_CMD_STATUS_PERR = 0x01, + LR11XX_SYSTEM_CMD_STATUS_OK = 0x02, + LR11XX_SYSTEM_CMD_STATUS_DATA = 0x03, +} lr11xx_system_command_status_t; + +/** + * @brief Low-frequency clock modes + */ +typedef enum +{ + LR11XX_SYSTEM_LFCLK_RC = 0x00, //!< (Default) + LR11XX_SYSTEM_LFCLK_XTAL = 0x01, + LR11XX_SYSTEM_LFCLK_EXT = 0x02 +} lr11xx_system_lfclk_cfg_t; + +/** + * @brief Regulator modes + */ +typedef enum +{ + LR11XX_SYSTEM_REG_MODE_LDO = 0x00, //!< (Default) + LR11XX_SYSTEM_REG_MODE_DCDC = 0x01, +} lr11xx_system_reg_mode_t; + +/** + * @brief Info page ID + */ +typedef enum +{ + LR11XX_SYSTEM_INFOPAGE_0 = 0x00, //!< Info page #0 + LR11XX_SYSTEM_INFOPAGE_1 = 0x01, //!< Info page #1 +} lr11xx_system_infopage_id_t; + +/** + * @brief RF switch configuration pin + */ +enum lr11xx_system_rfswitch_cfg_pin_e +{ + LR11XX_SYSTEM_RFSW0_HIGH = ( 1 << 0 ), + LR11XX_SYSTEM_RFSW1_HIGH = ( 1 << 1 ), + LR11XX_SYSTEM_RFSW2_HIGH = ( 1 << 2 ), + LR11XX_SYSTEM_RFSW3_HIGH = ( 1 << 3 ), + LR11XX_SYSTEM_RFSW4_HIGH = ( 1 << 4 ), +}; + +/** + * @brief RF switch configuration structure definition + */ +typedef struct lr11xx_system_rfswitch_cfg_s +{ + uint8_t enable; + uint8_t standby; + uint8_t rx; + uint8_t tx; + uint8_t tx_hp; + uint8_t tx_hf; + uint8_t gnss; + uint8_t wifi; +} lr11xx_system_rfswitch_cfg_t; + +/** + * @brief Stand by configuration values + */ +typedef enum +{ + LR11XX_SYSTEM_STANDBY_CFG_RC = 0x00, + LR11XX_SYSTEM_STANDBY_CFG_XOSC = 0x01 +} lr11xx_system_standby_cfg_t; + +/** + * @brief TCXO supply voltage values + */ +typedef enum +{ + LR11XX_SYSTEM_TCXO_CTRL_1_6V = 0x00, //!< Supply voltage = 1.6v + LR11XX_SYSTEM_TCXO_CTRL_1_7V = 0x01, //!< Supply voltage = 1.7v + LR11XX_SYSTEM_TCXO_CTRL_1_8V = 0x02, //!< Supply voltage = 1.8v + LR11XX_SYSTEM_TCXO_CTRL_2_2V = 0x03, //!< Supply voltage = 2.2v + LR11XX_SYSTEM_TCXO_CTRL_2_4V = 0x04, //!< Supply voltage = 2.4v + LR11XX_SYSTEM_TCXO_CTRL_2_7V = 0x05, //!< Supply voltage = 2.7v + LR11XX_SYSTEM_TCXO_CTRL_3_0V = 0x06, //!< Supply voltage = 3.0v + LR11XX_SYSTEM_TCXO_CTRL_3_3V = 0x07, //!< Supply voltage = 3.3v +} lr11xx_system_tcxo_supply_voltage_t; + +/** + * @brief Status register 1 structure definition + */ +typedef struct lr11xx_system_stat1_s +{ + lr11xx_system_command_status_t command_status; + bool is_interrupt_active; +} lr11xx_system_stat1_t; + +/** + * @brief Status register 2 structure definition + */ +typedef struct lr11xx_system_stat2_s +{ + lr11xx_system_reset_status_t reset_status; + lr11xx_system_chip_modes_t chip_mode; + bool is_running_from_flash; +} lr11xx_system_stat2_t; + +/** + * @brief Chip type values + */ +typedef enum +{ + LR11XX_SYSTEM_VERSION_TYPE_LR1110 = 0x01, + LR11XX_SYSTEM_VERSION_TYPE_LR1120 = 0x02, + LR11XX_SYSTEM_VERSION_TYPE_LR1121 = 0x03, +} lr11xx_system_version_type_t; + +/** + * @brief Version structure definition + */ +typedef struct lr11xx_system_version_s +{ + uint8_t hw; + lr11xx_system_version_type_t type; + uint16_t fw; +} lr11xx_system_version_t; + +/** + * @brief Sleep configuration structure definition + */ +typedef struct lr11xx_system_sleep_cfg_s +{ + bool is_warm_start; + bool is_rtc_timeout; +} lr11xx_system_sleep_cfg_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_SYSTEM_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_types.h new file mode 100755 index 0000000..be52d7a --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_types.h @@ -0,0 +1,76 @@ +/*! + * @file lr11xx_types.h + * + * @brief Type definitions for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_TYPES_H +#define LR11XX_TYPES_H + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +#define LR11XX_CMD_LENGTH_MAX ( 512 ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief LR11XX status + */ +typedef enum lr11xx_status_e +{ + LR11XX_STATUS_OK = 0, + LR11XX_STATUS_ERROR = 3, +} lr11xx_status_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#endif // LR11XX_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi.h new file mode 100755 index 0000000..63238e7 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi.h @@ -0,0 +1,628 @@ +/*! + * @file lr11xx_wifi.h + * + * @brief Wi-Fi passive scan driver definition for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_WIFI_H +#define LR11XX_WIFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_regmem.h" +#include "lr11xx_wifi_types.h" +#include "lr11xx_types.h" +#include "lr11xx_system_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +#ifndef LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK +/*! + * @brief The number of results max to fetch per SPI communication with the chip + * + * This macro is used by the internals of the driver to size the internal + * buffers of the driver used in the *read results* functions. + * + * It can be defined externally at compile time, or just before including this file. + * + * Its value can be programmatically obtained at runtime by calling lr11xx_wifi_get_nb_results_max_per_chunk() function. + * + * Its default value is set to the maximum number of results saved by LR11XX chip. + * + * @warning Its value must be in the range [1,32] (inclusive). Defining out of this range leads to undefined behavior. + */ +#define LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK LR11XX_WIFI_MAX_RESULTS +#endif // LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +/*! + * @brief Start a Wi-Fi passive scan operation + * + * During the complete passive scan operation, the LR11XX remains busy and cannot receive any commands. Using this + * command **DOES** reset the results already obtained by previous passive scan operations. + * + * The result can be read at the end of the passive scan issuing the command lr11xx_wifi_get_nb_results (to get the + * number of results to read) and lr11xx_wifi_read_basic_complete_results or + * lr11xx_wifi_read_basic_mac_type_channel_results to actually get the result bytes. + * + * @param [in] context Chip implementation context + * @param [in] signal_type The type of Wi-Fi Signals to scan for. If LR11XX_WIFI_TYPE_SCAN_B_G_N is selected, the LR11XX + * already starts by scanning all selected channels for Wi-Fi signals B. Then the LR11XX scans all selected channels for + * Wi-Fi signals G/N. + * @param [in] channels Mask of the Wi-Fi channels to scan + * @param [in] scan_mode Scan mode to execute + * @param [in] max_results The maximal number of results to gather. When this limit is reached, the passive scan + * automatically stop. Range of allowed values is [1:32]. Note that value 0 is forbidden. + * @param [in] nb_scan_per_channel The number of internal scan sequences per channel scanned. Range of accepted values + * is [1:255]. Note that value 0 is forbidden. + * @param [in] timeout_in_ms The maximal duration of a single preamble search. Expressed in ms. Range of allowed values + * is [1:65535]. Note that value 0 is forbidden. + * @param [in] abort_on_timeout If true, the beacon search jumps to next configured Wi-Fi channel (or stop if there is + * no more channel to scan) as soon as a search timeout is encountered + * + * @returns Operation status + * + * @see lr11xx_wifi_read_basic_complete_results, lr11xx_wifi_read_basic_mac_type_channel_results + */ +lr11xx_status_t lr11xx_wifi_scan( const void* context, const lr11xx_wifi_signal_type_scan_t signal_type, + const lr11xx_wifi_channel_mask_t channels, const lr11xx_wifi_mode_t scan_mode, + const uint8_t max_results, const uint8_t nb_scan_per_channel, + const uint16_t timeout_in_ms, const bool abort_on_timeout ); + +/*! + * @brief Start a Wi-Fi passive scan for country codes extraction + * + * This command starts a Wi-Fi passive scan operation for Beacons and Probe Responses on Wi-Fi type B only. It is to be + * used to extract the Country Code fields. + * + * During the passive scan, the results are filtered to keep only single MAC addresses. + * + * @param [in] context Chip implementation context + * @param [in] channels_mask Mask of the Wi-Fi channels to scan + * @param [in] nb_max_results The maximum number of country code to gather. When this limit is reached, the passive scan + * automatically stops. Maximal value is 32 + * @param [in] nb_scan_per_channel Maximal number of scan attempts per channel. Maximal value is 255 + * @param [in] timeout_in_ms The maximal duration of a single beacon search. Expressed in ms. Maximal value is 65535 ms + * @param [in] abort_on_timeout If true, the beacon search jumps to next configured Wi-Fi channel (or stop if there is + * no more channel to scan) as soon as a search timeout is encountered + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_search_country_code( const void* context, const lr11xx_wifi_channel_mask_t channels_mask, + const uint8_t nb_max_results, const uint8_t nb_scan_per_channel, + const uint16_t timeout_in_ms, const bool abort_on_timeout ); + +/*! + * @brief Start a Wi-Fi passive scan operation with duration stop conditions + * + * This passive scan API does not require the number of scan per channel, so + * that it searches for Wi-Fi signals until it finds one, or until the + * exhaustion of timeout_per_scan_ms or timeout_per_channel_ms. + * + * The maximal duration of a scan is determined by the number of channels to scan times the timeout_per_channel_ms + * configured. However, this duration may be exceeded depending on the crystal drift of the clock source and on the + * instant the last Wi-Fi signal is detected by the device. + * Therefore the maximal duration of a Wi-Fi scan with this API is provided by the following equations: + * + * For signal type being `LR11XX_WIFI_TYPE_SCAN_B`, `LR11XX_WIFI_TYPE_SCAN_G` or `LR11XX_WIFI_TYPE_SCAN_N`: + * + * \f$ T_{max} = N_{channel} \times ((1 + Xtal_{precision})timeout\_per\_channel + T_{offset} ) \f$ + * + * \f$ Xtal_{precision} \f$ depends on the crystal used as clock source. + * If the clock source is configured with 32kHz internal RC, then \f$ Xtal_{precision} = 1/100 \f$ + * + * \f$ T_{offset} \f$ depends on the \f$ signal\_type \f$ and the \f$scan\_mode\f$ selected: + * + * - LR11XX_WIFI_TYPE_SCAN_B: + * - if \f$scan\_mode != LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: 2.31 ms + * - if \f$scan\_mode == LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: 9.59 ms + * - LR11XX_WIFI_TYPE_SCAN_G: + * - if \f$scan\_mode != LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: 52.55 ms + * - if \f$scan\_mode == LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: N/A + * + * For signal type being `LR11XX_WIFI_TYPE_SCAN_B_G_N`: + * + * \f$ T_{max} = 2 \times N_{channel} \times (1 + Xtal_{precision})timeout\_per\_channel + T_{offset} \f$ + * + * \f$ T_{offset} \f$ depends on the \f$scan\_mode\f$ selected: + * - \f$scan\_mode != LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: 54.86 ms + * - \f$scan\_mode == LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$: 9.59 ms. + * + * @note With \f$scan\_mode != LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$ the T_offset is actually the worst case of + * Wi-Fi type B and Wi-Fi type G/N. Moreover, the Wi-Fi types G and N are scanned within the same steps (it is not two + * different scans). So the T_offset is the addition of 2.31 + 52.55 = 54.86. + * + * @note With \f$scan\_mode == LR11XX\_WIFI\_SCAN\_MODE\_FULL\_BEACON\f$, only Wi-Fi types B can be scanned. So scans + * for Wi-Fi types G/N are silently discarded. Therefore the T_offset is the same as for scan with Wi-Fi type B. + * + * @param [in] context Chip implementation context + * @param [in] signal_type The type of Wi-Fi Signals to scan for. If LR11XX_WIFI_TYPE_SCAN_B_G_N is selected, the LR11XX + * already starts by scanning all selected channels for Wi-Fi signals B. Then the LR11XX scans all selected channels for + * Wi-Fi signals G/N. + * @param [in] channels Mask of the Wi-Fi channels to scan + * @param [in] scan_mode Scan mode to execute + * @param [in] max_results The maximal number of results to gather. When this + * limit is reached, the passive scan automatically stop. Maximal value is 32 + * @param [in] timeout_per_channel_ms The time to spend scanning one channel. Expressed in ms. Value 0 is forbidden and + * will result in the raise of WIFI_SCAN_DONE interrupt, with stat1.command_status being set to + * LR11XX_SYSTEM_CMD_STATUS_PERR + * @param [in] timeout_per_scan_ms The maximal time to spend in preamble detection for each single scan. The time spent + * on preamble search is reset at each new preamble search. If the time spent on preamble search reach this timeout, the + * scan on the current channel stops and start on next channel. If set to 0, the command will keep listening until + * exhaustion of timeout_per_channel_ms or until nb_max_results is reached. Expressed in ms. Range of allowed values is + * [0:65535]. + * + * @returns Operation status + * + * @see lr11xx_wifi_read_basic_results, lr11xx_wifi_read_extended_results + */ +lr11xx_status_t lr11xx_wifi_scan_time_limit( const void* context, const lr11xx_wifi_signal_type_scan_t signal_type, + const lr11xx_wifi_channel_mask_t channels, + const lr11xx_wifi_mode_t scan_mode, const uint8_t max_results, + const uint16_t timeout_per_channel_ms, + const uint16_t timeout_per_scan_ms ); + +/*! + * @brief Start a Wi-Fi passive scan for country codes extraction with duration stop conditions + * + * This command starts a Wi-Fi passive scan operation for Beacons and Probe Responses on Wi-Fi type B only. It is to be + * used to extract the Country Code fields. + * This passive scan API does not require the number of scan per channel, so that it searches for Wi-Fi signals until it + * finds one, or until the exhaustion of timeout_per_scan_ms or timeout_per_channel_ms. + * + * The maximal duration of a scan is determined by the number of channels to scan times the timeout_per_channel_ms + * configured. However, this duration may be exceeded depending on the crystal drift of the clock source and on the + * instant the last Wi-Fi signal is detected by the device. + * Therefore the maximal duration of a Wi-Fi scan with this API is provided by the following equation: + * + * \f$ T_{max} = N_{channel} \times ((1 + Xtal_{precision})timeout\_per\_channel + T_{offset} ) \f$ + * + * \f$ Xtal_{precision} \f$ depends on the crystal used as clock source. + * If the clock source is configured with 32kHz internal RC, then \f$ Xtal_{precision} = 1/100 \f$ + * + * \f$ T_{offset} \f$ is always the same: 9.59 ms. + * + * @param [in] context Chip implementation context + * @param [in] channels_mask Mask of the Wi-Fi channels to scan + * @param [in] nb_max_results The maximum number of country code to gather. When this limit is reached, the passive scan + * automatically stops. Maximal value is 32 + * @param [in] timeout_per_channel_ms The time to spend scanning one channel. Expressed in ms. Value 0 is forbidden and + * will result in the raise of WIFI_SCAN_DONE interrupt, with stat1.command_status being set to + * LR11XX_SYSTEM_CMD_STATUS_PERR + * @param [in] timeout_per_scan_ms The maximal time to spend in preamble detection for each single scan. The time spent + * on preamble search is reset at each new preamble search. If the time spent on preamble search reach this timeout, the + * scan on the current channel stops and start on next channel. If set to 0, the command will keep listening until + * exhaustion of timeout_per_channel_ms or until nb_max_results is reached. Expressed in ms. Range of allowed values is + * [0:65535]. + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_search_country_code_time_limit( const void* context, + const lr11xx_wifi_channel_mask_t channels_mask, + const uint8_t nb_max_results, + const uint16_t timeout_per_channel_ms, + const uint16_t timeout_per_scan_ms ); + +/*! + * @brief Returns the number of results currently available in LR11XX + * + * It can be called before lr11xx_wifi_read_basic_complete_results or lr11xx_wifi_read_basic_mac_type_channel_results to + * know the number of results. + * + * @param [in] context Chip implementation context + * @param [out] nb_results The number of results available in the LR11XX + * + * @returns Operation status + * + * @see lr11xx_wifi_read_basic_complete_results, lr11xx_wifi_read_basic_mac_type_channel_results + */ +lr11xx_status_t lr11xx_wifi_get_nb_results( const void* context, uint8_t* nb_results ); + +/*! + * @brief Read basic complete results + * + * This function can be used to fetch all results in a row, or one after the other. + * It corresponds to result format @ref ::LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE. + * + * An example of usage to fetch all results in a row is: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_basic_complete_result_t all_results[LR11XX_WIFI_MAX_RESULTS] = {0}; + * lr11xx_wifi_read_basic_complete_results(&radio, 0, nb_results, all_results); + * \endcode + * + * On the other hand, fetching result one after the other: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_basic_complete_result_t single_results = {0}; + * for(uint8_t index_result = 0; index_result < nb_results; index_result++){ + * lr11xx_wifi_read_basic_complete_results(&radio, index_result, 1, &single_results); + * // Do something with single_results + * } + * \endcode + * + * @remark This result fetching function **MUST** be used only if the scan function call was made with Scan Mode set to + * @ref ::LR11XX_WIFI_SCAN_MODE_BEACON or @ref ::LR11XX_WIFI_SCAN_MODE_BEACON_AND_PKT. + * Refer to @ref lr11xx_wifi_are_scan_mode_result_format_compatible to know which scan mode and result format are + * compatible. + * + * @param [in] radio Radio abstraction + * @param [in] start_result_index Result index from which starting to fetch the results + * @param [in] nb_results Number of results to fetch + * @param [out] results Pointer to an array of result structures to populate. It is up to the caller to ensure this + * array can hold at least nb_results elements. + * + * @returns Operation status + * + * @see lr11xx_wifi_are_scan_mode_result_format_compatible, lr11xx_wifi_read_basic_mac_type_channel_results, + * lr11xx_wifi_read_extended_full_results + */ +lr11xx_status_t lr11xx_wifi_read_basic_complete_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_basic_complete_result_t* results ); + +/*! + * @brief Read basic MAC, Wi-Fi type and channel results + * + * This function can be used to fetch all results in a row, or one after the other. + * It corresponds to result format @ref ::LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL. + * + * An example of usage to fetch all results in a row is: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_basic_mac_type_channel_result_t all_results[LR11XX_WIFI_MAX_RESULTS] = {0}; + * lr11xx_wifi_read_basic_mac_type_channel_results(&radio, 0, nb_results, all_results); + * \endcode + * + * On the other hand, fetching result one after the other: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_basic_mac_type_channel_result_t single_results = {0}; + * for(uint8_t index_result = 0; index_result < nb_results; index_result++){ + * lr11xx_wifi_read_basic_mac_type_channel_results(&radio, index_result, 1, &single_results); + * // Do something with single_results + * } + * \endcode + * + * @remark This result fetching function **MUST** be used only if the scan function call was made with Scan Mode set to + * @ref ::LR11XX_WIFI_SCAN_MODE_BEACON or @ref ::LR11XX_WIFI_SCAN_MODE_BEACON_AND_PKT. + * Refer to @ref lr11xx_wifi_are_scan_mode_result_format_compatible to know which scan mode and result format are + * compatible. + * + * @param [in] radio Radio abstraction + * @param [in] start_result_index Result index from which starting to fetch the results + * @param [in] nb_results Number of results to fetch + * @param [out] results Pointer to an array of result structures to populate. It is up to the caller to ensure this + * array can hold at least nb_results elements. + * + * @returns Operation status + * + * @see lr11xx_wifi_are_scan_mode_result_format_compatible, lr11xx_wifi_read_basic_complete_results, + * lr11xx_wifi_read_extended_full_results + */ +lr11xx_status_t lr11xx_wifi_read_basic_mac_type_channel_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_basic_mac_type_channel_result_t* results ); + +/*! + * @brief Read extended complete results + * + * This function can be used to fetch all results in a row, or one after the other. + * It corresponds to result format @ref ::LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL. + * + * An example of usage to fetch all results in a row is: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_extended_full_result_t all_results[LR11XX_WIFI_MAX_RESULTS] = {0}; + * lr11xx_wifi_read_extended_full_results(&radio, 0, nb_results, all_results); + * \endcode + * + * On the other hand, fetching result one after the other: + * \code{.cpp} + * uint8_t nb_results = 0; + * lr11xx_wifi_get_nb_results(&radio, &nb_results); + * lr11xx_wifi_extended_full_result_t single_results = {0}; + * for(uint8_t index_result = 0; index_result < nb_results; index_result++){ + * lr11xx_wifi_read_extended_full_results(&radio, index_result, 1, &single_results); + * // Do something with single_results + * } + * \endcode + * + * @remark This result fetching function **MUST** be used only if the scan function call was made with Scan Mode set to + * @ref ::LR11XX_WIFI_SCAN_MODE_FULL_BEACON. + * Refer to @ref lr11xx_wifi_are_scan_mode_result_format_compatible to know which scan mode and result format are + * compatible. + * + * @param [in] radio Radio abstraction + * @param [in] start_result_index Result index from which starting to fetch the results + * @param [in] nb_results Number of results to fetch + * @param [out] results Pointer to an array of result structures to populate. It is up to the caller to ensure this + * array can hold at least nb_results elements. + * + * @returns Operation status + * + * @see lr11xx_wifi_are_scan_mode_result_format_compatible, lr11xx_wifi_read_basic_complete_results, + * lr11xx_wifi_read_basic_mac_type_channel_results + */ +lr11xx_status_t lr11xx_wifi_read_extended_full_results( const void* radio, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_extended_full_result_t* results ); + +/*! + * @brief Reset the internal counters of cumulative timing + * + * @param [in] context Chip implementation context + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_reset_cumulative_timing( const void* context ); + +/*! + * @brief Read the internal counters of cumulative timing + * + * @param [in] context Chip implementation context + * @param [out] timing A pointer to the cumulative timing structure to populate + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_read_cumulative_timing( const void* context, lr11xx_wifi_cumulative_timings_t* timing ); + +/*! + * @brief Get size of country code search results + * + * @param [in] context Chip implementation context + * @param [out] nb_country_code_results Number of country results to read + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_get_nb_country_code_results( const void* context, uint8_t* nb_country_code_results ); + +/*! + * @brief Read country code results + * + * The total number of country code results to read is obtained from a previous call to + * lr11xx_wifi_get_nb_country_code_results + * + * @param [in] context Chip implementation context + * @param [in] start_result_index The result index to start reading results from + * @param [in] nb_country_results Number of country code results to read + * @param [out] country_code_results An array of lr11xx_wifi_country_code_t to be filled. It is up to the application to + * ensure this array is big enough to hold nb_country_results elements + * + * @returns Operation status + * + * @see lr11xx_wifi_get_nb_country_code_results, lr11xx_wifi_search_country_code + */ +lr11xx_status_t lr11xx_wifi_read_country_code_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_country_results, + lr11xx_wifi_country_code_t* country_code_results ); + +/*! + * @brief Configure the timestamp used to discriminate mobile access points from gateways. + * + * This filtering is based on the hypothesis that mobile access points have timestamp shorter than gateways. + * + * @param [in] context Chip implementation context + * @param [in] timestamp_in_s Timestamp value in second + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_cfg_timestamp_ap_phone( const void* context, uint32_t timestamp_in_s ); + +/*! + * @brief Get the internal wifi firmware version + * + * @param [in] context Chip implementation context + * @param [out] wifi_version The wifi version structure populated with version numbers + * + * @returns Operation status + */ +lr11xx_status_t lr11xx_wifi_read_version( const void* context, lr11xx_wifi_version_t* wifi_version ); + +/*! + * @brief Retreive channel information from channel info byte + * + * This method is to be called with on the WiFi channel info byte of a scan result. + * + * As the WiFi passive scan allows to get Access Point MAC address from Packet WiFi frames, it is possible that the + * frame does not comes from the Access Point, but from a device. In that case, the RSSI reported by LR11XX is the one + * of the frame received from the device and not from the Access Point. The rssi_validity flag allows to detect that + * case. + * + * It is possible for an Access Point to be a mobile AP, which is of low interest for location purpose. The LR11XX tries + * to detect mobile AP based on Access Point up time and set the flag mac_origin_estimation accordingly. + * + * @param [in] channel_info The channel info byte to retrieve channel information from. It is obtained from WiFi + * passive scan result + * @param [out] channel The channel of the scanned mac address + * @param [out] rssi_validity The validity of the scanned MAC address + * @param [out] mac_origin_estimation Indicates the estimation of MAC address origin by LR11XX + * + * @see lr11xx_wifi_read_basic_complete_results, lr11xx_wifi_read_basic_mac_type_channel_results, + * lr11xx_wifi_cfg_timestamp_ap_phone + */ +void lr11xx_wifi_parse_channel_info( const lr11xx_wifi_channel_info_byte_t channel_info, lr11xx_wifi_channel_t* channel, + bool* rssi_validity, lr11xx_wifi_mac_origin_t* mac_origin_estimation ); + +/*! + * @brief Helper method to retrieve channel from channel info byte + * + * @param [in] channel_info The chanel info byte from passive scan result + * + * @returns The channel of scanned MAC address + * + * @see lr11xx_wifi_parse_channel_info + */ +lr11xx_wifi_channel_t lr11xx_wifi_extract_channel_from_info_byte( const lr11xx_wifi_channel_info_byte_t channel_info ); + +/*! + * @brief Retrieve the Frame Type, Frame Subtype, To/From DS fields from a frame info byte + * + * This method is intended to be called on the channel info byte of a passive scan result structure. + * + * The from_ds/to_ds (Distribution Station) fields have the following meaning: + * + * + * + * + *
to_ds value from_ds value Meaning
False False Frame was between two Stations + *
True False Frame was from Station to + * Access Point
False True Frame was sent + * from Access Point or Distribution Stations
True + * True Mesh network only, frame was between Stations
+ * + * @param [in] frame_type_info The frame info byte from passive scan result + * @param [out] frame_type The Frame Type of the received frame + * @param [out] frame_sub_type The Frame SubType of the frame received + * @param [out] to_ds to_ds field of the frame received + * @param [out] from_ds from_ds field of the frame received + */ +void lr11xx_wifi_parse_frame_type_info( const lr11xx_wifi_frame_type_info_byte_t frame_type_info, + lr11xx_wifi_frame_type_t* frame_type, + lr11xx_wifi_frame_sub_type_t* frame_sub_type, bool* to_ds, bool* from_ds ); + +/*! + * @brief Retrieve the data rate information from data rate info byte + * + * This method is intended to be called on a data rate info byte of a passive scan result structure. + * + * @param [in] data_rate_info The data rate info byte from a passive scan result + * @param [out] wifi_signal_type The wifi signal type of the scanned frame + * @param [out] wifi_data_rate The data rate of the scanned frame + */ +void lr11xx_wifi_parse_data_rate_info( const lr11xx_wifi_datarate_info_byte_t data_rate_info, + lr11xx_wifi_signal_type_result_t* wifi_signal_type, + lr11xx_wifi_datarate_t* wifi_data_rate ); + +/*! + * @brief Return the maximal number of results to read per SPI communication + * + * This function **DOES NOT** communicates with the LR11XX. It returns the driver maximal number of Wi-Fi results it can + * retrieve per SPI communication. + * + * @remark It is a driver limitation, not a LR11XX limitation, that avoid allocating temporary buffers of size too big + * when reading Wi-Fi passive scan results. + * + * @returns The maximal number of results to fetch per SPI calls + * + * @see LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK + */ +uint8_t lr11xx_wifi_get_nb_results_max_per_chunk( void ); + +/*! + * @brief Helper method to retrieve the signal type from data rate info byte + * + * @param [in] data_rate_info The data rate info byte from a passive scan result + * + * @returns The Signal Type of the scanned frame + */ +lr11xx_wifi_signal_type_result_t lr11xx_wifi_extract_signal_type_from_data_rate_info( + const lr11xx_wifi_datarate_info_byte_t data_rate_info ); + +/*! + * @brief Helper function to check if a buffer is a well-formed UTF-8 byte sequence + * + * @param [in] buffer The buffer holding the bytes to be analyzed + * @param [in] length The number of bytes in the buffer + * + * @returns The result of the check + */ +bool lr11xx_wifi_is_well_formed_utf8_byte_sequence( const uint8_t* buffer, const uint8_t length ); + +/*! + * @brief Check that Wi-Fi scan mode and result format are compatible + * + * The possible combination of Wi-Fi scan modes and result format are the following: + * + * + *
Scan Mode Type/Sub-type selected Corresponding read result function + *
@ref ::LR11XX_WIFI_SCAN_MODE_BEACON Management/Beacon and Management/Probe Response + * @ref lr11xx_wifi_read_basic_complete_results, @ref lr11xx_wifi_read_basic_mac_type_channel_results
+ * @ref ::LR11XX_WIFI_SCAN_MODE_BEACON_AND_PKT Some from Management, Control and Data Types
+ * @ref ::LR11XX_WIFI_SCAN_MODE_FULL_BEACON Management/Beacon and Management/Probe Response @ref + * lr11xx_wifi_read_extended_full_results
@ref ::LR11XX_WIFI_SCAN_MODE_UNTIL_SSID Management/Beacon and + * Management/Probe Response - until SSID field + *
+ * + * @param scan_mode The scan mode used when calling the scan API + * @param result_format The result format used when calling the read result API + * @retval true The scan mode and result format are compatible + * @retval false The scan mode and result format are not compatible. + */ +bool lr11xx_wifi_are_scan_mode_result_format_compatible( lr11xx_wifi_mode_t scan_mode, + lr11xx_wifi_result_format_t result_format ); + +/** + * @brief Compute the power consumption in nAh based on the cumulative timing. + * + * @param [in] regulator The regulator used during last Wi-Fi passive scan + * @param [in] timing Cumulative timing structure to use for computation + * + * @returns Current consumption in nAh + */ +uint32_t lr11xx_wifi_get_consumption_nah( lr11xx_system_reg_mode_t regulator, lr11xx_wifi_cumulative_timings_t timing ); + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_WIFI_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi_types.h new file mode 100755 index 0000000..44cc244 --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr11xx_wifi_types.h @@ -0,0 +1,410 @@ +/*! + * @file lr11xx_wifi_types.h + * + * @brief Wi-Fi passive scan driver types for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR11XX_WIFI_TYPES_H +#define LR11XX_WIFI_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +#define LR11XX_WIFI_MAC_ADDRESS_LENGTH ( 6 ) +#define LR11XX_WIFI_MAX_RESULTS ( 32 ) +#define LR11XX_WIFI_RESULT_SSID_LENGTH ( 32 ) +#define LR11XX_WIFI_MAX_COUNTRY_CODE ( 32 ) +#define LR11XX_WIFI_STR_COUNTRY_CODE_SIZE ( 2 ) + +#define LR11XX_WIFI_CHANNEL_1_POS ( 0U ) //!< Channel at frequency 2.412 GHz +#define LR11XX_WIFI_CHANNEL_1_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_1_POS ) +#define LR11XX_WIFI_CHANNEL_2_POS ( 1U ) //!< Channel at frequency 2.417 GHz +#define LR11XX_WIFI_CHANNEL_2_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_2_POS ) +#define LR11XX_WIFI_CHANNEL_3_POS ( 2U ) //!< Channel at frequency 2.422 GHz +#define LR11XX_WIFI_CHANNEL_3_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_3_POS ) +#define LR11XX_WIFI_CHANNEL_4_POS ( 3U ) //!< Channel at frequency 2.427 GHz +#define LR11XX_WIFI_CHANNEL_4_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_4_POS ) +#define LR11XX_WIFI_CHANNEL_5_POS ( 4U ) //!< Channel at frequency 2.432 GHz +#define LR11XX_WIFI_CHANNEL_5_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_5_POS ) +#define LR11XX_WIFI_CHANNEL_6_POS ( 5U ) //!< Channel at frequency 2.437 GHz +#define LR11XX_WIFI_CHANNEL_6_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_6_POS ) +#define LR11XX_WIFI_CHANNEL_7_POS ( 6U ) //!< Channel at frequency 2.442 GHz +#define LR11XX_WIFI_CHANNEL_7_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_7_POS ) +#define LR11XX_WIFI_CHANNEL_8_POS ( 7U ) //!< Channel at frequency 2.447 GHz +#define LR11XX_WIFI_CHANNEL_8_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_8_POS ) +#define LR11XX_WIFI_CHANNEL_9_POS ( 8U ) //!< Channel at frequency 2.452 GHz +#define LR11XX_WIFI_CHANNEL_9_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_9_POS ) +#define LR11XX_WIFI_CHANNEL_10_POS ( 9U ) //!< Channel at frequency 2.457 GHz +#define LR11XX_WIFI_CHANNEL_10_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_10_POS ) +#define LR11XX_WIFI_CHANNEL_11_POS ( 10U ) //!< Channel at frequency 2.462 GHz +#define LR11XX_WIFI_CHANNEL_11_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_11_POS ) +#define LR11XX_WIFI_CHANNEL_12_POS ( 11U ) //!< Channel at frequency 2.467 GHz +#define LR11XX_WIFI_CHANNEL_12_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_12_POS ) +#define LR11XX_WIFI_CHANNEL_13_POS ( 12U ) //!< Channel at frequency 2.472 GHz +#define LR11XX_WIFI_CHANNEL_13_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_13_POS ) +#define LR11XX_WIFI_CHANNEL_14_POS ( 13U ) //!< Channel at frequency 2.484 GHz +#define LR11XX_WIFI_CHANNEL_14_MASK ( 0x01UL << LR11XX_WIFI_CHANNEL_14_POS ) + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/*! + * @brief Type to store a Wi-Fi channel mask + */ +typedef uint16_t lr11xx_wifi_channel_mask_t; + +/*! + * @brief Type to store a Wi-Fi channel info byte + */ +typedef uint8_t lr11xx_wifi_channel_info_byte_t; + +/*! + * @brief Type to store a Wi-Fi datarate info byte + */ +typedef uint8_t lr11xx_wifi_datarate_info_byte_t; + +/*! + * @brief Type to store a Wi-Fi frame type info byte + */ +typedef uint8_t lr11xx_wifi_frame_type_info_byte_t; + +/*! + * @brief Type to store a Wi-Fi frame sub_type + */ +typedef uint8_t lr11xx_wifi_frame_sub_type_t; + +/*! + * @brief Wi-Fi FCS info byte + */ +typedef struct lr11xx_wifi_fcs_info_byte_s +{ + bool is_fcs_ok; //!< True if the LR11XX has checked the FCS and the check succeeded + bool is_fcs_checked; //!< True if the LR11XX has checked the FCS +} lr11xx_wifi_fcs_info_byte_t; + +/*! + * @brief Type to store a MAC address + */ +typedef uint8_t lr11xx_wifi_mac_address_t[LR11XX_WIFI_MAC_ADDRESS_LENGTH]; + +/*! + * @brief Type to store the Country Code + */ +typedef uint8_t lr11xx_wifi_country_code_str_t[LR11XX_WIFI_STR_COUNTRY_CODE_SIZE]; + +/*! + * @brief Wi-Fi Channels index + */ +typedef enum +{ + LR11XX_WIFI_NO_CHANNEL = 0x00, + LR11XX_WIFI_CHANNEL_1 = 0x01, //!< Channel at frequency 2.412 GHz + LR11XX_WIFI_CHANNEL_2 = 0x02, //!< Channel at frequency 2.417 GHz + LR11XX_WIFI_CHANNEL_3 = 0x03, //!< Channel at frequency 2.422 GHz + LR11XX_WIFI_CHANNEL_4 = 0x04, //!< Channel at frequency 2.427 GHz + LR11XX_WIFI_CHANNEL_5 = 0x05, //!< Channel at frequency 2.432 GHz + LR11XX_WIFI_CHANNEL_6 = 0x06, //!< Channel at frequency 2.437 GHz + LR11XX_WIFI_CHANNEL_7 = 0x07, //!< Channel at frequency 2.442 GHz + LR11XX_WIFI_CHANNEL_8 = 0x08, //!< Channel at frequency 2.447 GHz + LR11XX_WIFI_CHANNEL_9 = 0x09, //!< Channel at frequency 2.452 GHz + LR11XX_WIFI_CHANNEL_10 = 0x0A, //!< Channel at frequency 2.457 GHz + LR11XX_WIFI_CHANNEL_11 = 0x0B, //!< Channel at frequency 2.462 GHz + LR11XX_WIFI_CHANNEL_12 = 0x0C, //!< Channel at frequency 2.467 GHz + LR11XX_WIFI_CHANNEL_13 = 0x0D, //!< Channel at frequency 2.472 GHz + LR11XX_WIFI_CHANNEL_14 = 0x0E, //!< Channel at frequency 2.484 GHz + LR11XX_WIFI_ALL_CHANNELS = 0x0F, +} lr11xx_wifi_channel_t; + +/*! + * @brief WiFi theoretical Datarates + */ +typedef enum +{ + LR11XX_WIFI_DATARATE_1_MBPS = 1, + LR11XX_WIFI_DATARATE_2_MBPS = 2, + LR11XX_WIFI_DATARATE_6_MBPS = 3, + LR11XX_WIFI_DATARATE_9_MBPS = 4, + LR11XX_WIFI_DATARATE_12_MBPS = 5, + LR11XX_WIFI_DATARATE_18_MBPS = 6, + LR11XX_WIFI_DATARATE_24_MBPS = 7, + LR11XX_WIFI_DATARATE_36_MBPS = 8, + LR11XX_WIFI_DATARATE_48_MBPS = 9, + LR11XX_WIFI_DATARATE_54_MBPS = 10, + LR11XX_WIFI_DATARATE_6_5_MBPS = 11, + LR11XX_WIFI_DATARATE_13_MBPS = 12, + LR11XX_WIFI_DATARATE_19_5_MBPS = 13, + LR11XX_WIFI_DATARATE_26_MBPS = 14, + LR11XX_WIFI_DATARATE_39_MBPS = 15, + LR11XX_WIFI_DATARATE_52_MBPS = 16, + LR11XX_WIFI_DATARATE_58_MBPS = 17, + LR11XX_WIFI_DATARATE_65_MBPS = 18, + LR11XX_WIFI_DATARATE_7_2_MBPS = 19, + LR11XX_WIFI_DATARATE_14_4_MBPS = 20, + LR11XX_WIFI_DATARATE_21_7_MBPS = 21, + LR11XX_WIFI_DATARATE_28_9_MBPS = 22, + LR11XX_WIFI_DATARATE_43_3_MBPS = 23, + LR11XX_WIFI_DATARATE_57_8_MBPS = 24, + LR11XX_WIFI_DATARATE_65_2_MBPS = 25, + LR11XX_WIFI_DATARATE_72_2_MBPS = 26, +} lr11xx_wifi_datarate_t; + +/*! + * @brief WiFi Frame Types + */ +typedef enum +{ + LR11XX_WIFI_FRAME_TYPE_MANAGEMENT = 0x00, + LR11XX_WIFI_FRAME_TYPE_CONTROL = 0x01, + LR11XX_WIFI_FRAME_TYPE_DATA = 0x02, +} lr11xx_wifi_frame_type_t; + +/*! + * @brief The WiFi MAC address origin + * + * @see lr11xx_wifi_parse_channel_info for details about the MAC address origin estimation of the LR11XX + */ +typedef enum +{ + LR11XX_WIFI_ORIGIN_BEACON_FIX_AP = 1, //!< MAC address extracted from a packet coming from a fix Access Point + LR11XX_WIFI_ORIGIN_BEACON_MOBILE_AP = 2, //!< MAC address extracted from a packet coming from a mobile Access Point + LR11XX_WIFI_ORIGIN_UNKNOWN = 3, //!< Impossible to determine the origin of the packet the MAC is extracted from +} lr11xx_wifi_mac_origin_t; + +/*! + * @brief Wi-Fi signal type for passive scanning configuration + * + * Note it is not possible to configure the WiFi passive scanning to search Wi-Fi type N GreenField. Only Wi-Fi type N + * Mixed Mode can be scanned by LR11XX. + * + * @warning ::LR11XX_WIFI_TYPE_SCAN_G and ::LR11XX_WIFI_TYPE_SCAN_N configurations are implemented the same way, and + * both will scan Wi-Fi type G **AND** Wi-Fi type N. + */ +typedef enum +{ + LR11XX_WIFI_TYPE_SCAN_B = 0x01, //!< Wi-Fi B + LR11XX_WIFI_TYPE_SCAN_G = 0x02, //!< Wi-Fi G + LR11XX_WIFI_TYPE_SCAN_N = 0x03, //!< Wi-Fi N + LR11XX_WIFI_TYPE_SCAN_B_G_N = 0x04, //!< Wi-Fi B and Wi-Fi G/N +} lr11xx_wifi_signal_type_scan_t; + +/*! + * @brief Wi-Fi signal type for passive scan results + * + * Note that the Wi-Fi N detected is Wi-Fi N Mixed mode, and not GreenField. + */ +typedef enum +{ + LR11XX_WIFI_TYPE_RESULT_B = 0x01, //!< WiFi B + LR11XX_WIFI_TYPE_RESULT_G = 0x02, //!< WiFi G + LR11XX_WIFI_TYPE_RESULT_N = 0x03, //!< WiFi N +} lr11xx_wifi_signal_type_result_t; + +/*! + * @brief Wi-Fi scan mode + * + * When the LR11XX receives a Wi-Fi frame, it starts demodulating it. Depending on the scan mode selected, only some + * Wi-Fi frame type/sub-types are to be kept. The demodulation step is stopped as soon as the LR11XX detects the current + * Wi-Fi frame is not of the required type/sub-types. This saves scan time and consumption. + * + * A Wi-Fi frame is never completely demodulated. The ::LR11XX_WIFI_SCAN_MODE_FULL_BEACON uses a special configuration + * allowing to demodulate more fields (until Frame Check Sequence field), at a price of higher scan duration and higher + * consumption. + * + * @note Not all results formats are available depending on the scan mode selected. Refer to + * @ref lr11xx_wifi_are_scan_mode_result_format_compatible to know which result formats are available depending on scan + * mode selected. + * + * @see lr11xx_wifi_are_scan_mode_result_format_compatible + */ +typedef enum +{ + LR11XX_WIFI_SCAN_MODE_BEACON = + 1, //!< Exposes Beacons and Probe Responses Access Points frames until Period Beacon field (Basic result) + LR11XX_WIFI_SCAN_MODE_BEACON_AND_PKT = + 2, //!< Exposes some Management Access Points frames until Period Beacon field, and some other packets frame + //!< until third Mac Address field (Basic result) + LR11XX_WIFI_SCAN_MODE_FULL_BEACON = + 4, //!< Exposes Beacons and Probes Responses Access Points frames until Frame Check Sequence (FCS) field + //!< (Extended result). In this mode, only signal type LR11XX_WIFI_TYPE_SCAN_B is executed and other signal + //!< types are silently discarded. + LR11XX_WIFI_SCAN_MODE_UNTIL_SSID = 5, //!< Exposes Beacons and Probes Responses Access Points frames until the end + //!< of SSID field (Extended result) - available since firmware 0x0306 +} lr11xx_wifi_mode_t; + +/*! + * @brief Cumulative timings + * + * This structure is representing the cumulative time spent in the different modes of Wi-Fi passive scanning procedure. + * All timings are provided in [us]. + * */ +typedef struct lr11xx_wifi_cumulative_timings_s +{ + uint32_t rx_detection_us; //!< Cumulative time spent during NFE or TOA + uint32_t rx_correlation_us; //!< Cumulative time spent during preamble detection + uint32_t rx_capture_us; //!< Cumulative time spent during signal acquisition + uint32_t demodulation_us; //!< Cumulative time spent during software demodulation +} lr11xx_wifi_cumulative_timings_t; + +/*! + * @brief Basic complete result structure + * + * The beacon period is expressed in TU (Time Unit). 1 TU is 1024 microseconds. + */ +typedef struct lr11xx_wifi_basic_complete_result_s +{ + lr11xx_wifi_datarate_info_byte_t data_rate_info_byte; + lr11xx_wifi_channel_info_byte_t channel_info_byte; + int8_t rssi; + lr11xx_wifi_frame_type_info_byte_t frame_type_info_byte; + lr11xx_wifi_mac_address_t mac_address; + int16_t phi_offset; + uint64_t timestamp_us; //!< Indicate the up-time of the Access Point transmitting the Beacon [us] + uint16_t beacon_period_tu; +} lr11xx_wifi_basic_complete_result_t; + +/*! + * @brief Basic MAC, type, channel result structure + */ +typedef struct lr11xx_wifi_basic_mac_type_channel_result_s +{ + lr11xx_wifi_datarate_info_byte_t data_rate_info_byte; + lr11xx_wifi_channel_info_byte_t channel_info_byte; + int8_t rssi; + lr11xx_wifi_mac_address_t mac_address; +} lr11xx_wifi_basic_mac_type_channel_result_t; + +/*! + * @brief Extended full result structure + * + * @note The beacon period is expressed in TU (Time Unit). 1 TU is 1024 microseconds. + * + * @remark When used with @ref ::LR11XX_WIFI_SCAN_MODE_UNTIL_SSID, the following field are always set to 0: + * - field is_fcs_ok and is_fcs_checked in fcs_check_byte structure + * - current_channel + * - country_code + * - io_regulation + */ +typedef struct +{ + lr11xx_wifi_datarate_info_byte_t data_rate_info_byte; + lr11xx_wifi_channel_info_byte_t channel_info_byte; + int8_t rssi; + uint8_t rate; //!< Rate index + uint16_t service; //!< Service value + uint16_t length; //!< Length of MPDU (in microseconds for WiFi B, bytes for WiFi G) + uint16_t frame_control; //!< Frame Control structure + lr11xx_wifi_mac_address_t mac_address_1; + lr11xx_wifi_mac_address_t mac_address_2; + lr11xx_wifi_mac_address_t mac_address_3; + uint64_t timestamp_us; //!< Indicate the up-time of the Access Point + //!< transmitting the Beacon [us] + uint16_t beacon_period_tu; + uint16_t seq_control; //!< Sequence Control value + uint8_t ssid_bytes[LR11XX_WIFI_RESULT_SSID_LENGTH]; //!< Service Set + //!< IDentifier + lr11xx_wifi_channel_t current_channel; //!< Current channel indicated in the Wi-Fi frame + lr11xx_wifi_country_code_str_t country_code; //!< Country Code + uint8_t io_regulation; //!< Input Output Regulation + lr11xx_wifi_fcs_info_byte_t fcs_check_byte; //!< Frame Check Sequence info + int16_t phi_offset; +} lr11xx_wifi_extended_full_result_t; + +/*! + * @brief Wi-Fi scan result formats + * + * @note Result format to use depends on the scan mode selected when calling @ref lr11xx_wifi_scan or @ref + * lr11xx_wifi_scan_time_limit API. Refer to @ref lr11xx_wifi_are_scan_mode_result_format_compatible to know which + * result formats are available depending on scan mode selected. + * + * @see lr11xx_wifi_are_scan_mode_result_format_compatible + */ +typedef enum +{ + LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE, //!< Basic complete result format: @ref + //!< lr11xx_wifi_basic_complete_result_t + LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL, //!< Basic MAC/type/channel result format: @ref + //!< lr11xx_wifi_basic_mac_type_channel_result_t + LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL, //!< Extended full result format: @ref lr11xx_wifi_extended_full_result_t +} lr11xx_wifi_result_format_t; + +/*! + * @brief Wi-Fi country code structure + */ +typedef struct lr11xx_wifi_country_code_s +{ + lr11xx_wifi_country_code_str_t country_code; + uint8_t io_regulation; //!< Input Output Regulation + lr11xx_wifi_channel_info_byte_t channel_info_byte; + lr11xx_wifi_mac_address_t mac_address; +} lr11xx_wifi_country_code_t; + +/*! + * @brief Wi-Fi firmware version + */ +typedef struct lr11xx_wifi_version_s +{ + uint8_t major; + uint8_t minor; +} lr11xx_wifi_version_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif // LR11XX_WIFI_TYPES_H + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/include/lr11xx_driver/lr_fhss_v1_base_types.h b/components/esp_lora_1121/include/lr11xx_driver/lr_fhss_v1_base_types.h new file mode 100755 index 0000000..c6afffd --- /dev/null +++ b/components/esp_lora_1121/include/lr11xx_driver/lr_fhss_v1_base_types.h @@ -0,0 +1,127 @@ +/** + * @file lr_fhss_v1_base_types.h + * + * @brief Radio-independent LR-FHSS base type definitions, version 1 + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR_FHSS_V1_BASE_TYPES_H__ +#define LR_FHSS_V1_BASE_TYPES_H__ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC MACROS ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC CONSTANTS -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC TYPES ------------------------------------------------------------ + */ + +/** + * @brief LR-FHSS modulation type + */ +typedef enum lr_fhss_v1_modulation_type_e +{ + LR_FHSS_V1_MODULATION_TYPE_GMSK_488 = 0, +} lr_fhss_v1_modulation_type_t; + +/** + * @brief LR-FHSS coding rate + */ +typedef enum lr_fhss_v1_cr_e +{ + LR_FHSS_V1_CR_5_6 = 0x00, + LR_FHSS_V1_CR_2_3 = 0x01, + LR_FHSS_V1_CR_1_2 = 0x02, + LR_FHSS_V1_CR_1_3 = 0x03, +} lr_fhss_v1_cr_t; + +/** + * @brief LR-FHSS grid + */ +typedef enum lr_fhss_v1_grid_e +{ + LR_FHSS_V1_GRID_25391_HZ = 0x00, + LR_FHSS_V1_GRID_3906_HZ = 0x01, +} lr_fhss_v1_grid_t; + +/** + * @brief LR-FHSS bandwidth + */ +typedef enum lr_fhss_v1_bw_e +{ + LR_FHSS_V1_BW_39063_HZ = 0x00, + LR_FHSS_V1_BW_85938_HZ = 0x01, + LR_FHSS_V1_BW_136719_HZ = 0x02, + LR_FHSS_V1_BW_183594_HZ = 0x03, + LR_FHSS_V1_BW_335938_HZ = 0x04, + LR_FHSS_V1_BW_386719_HZ = 0x05, + LR_FHSS_V1_BW_722656_HZ = 0x06, + LR_FHSS_V1_BW_773438_HZ = 0x07, + LR_FHSS_V1_BW_1523438_HZ = 0x08, + LR_FHSS_V1_BW_1574219_HZ = 0x09, +} lr_fhss_v1_bw_t; + +/** + * @brief LR-FHSS parameter structure + */ +typedef struct lr_fhss_v1_params_s +{ + const uint8_t* sync_word; /**< 4-byte sync word */ + lr_fhss_v1_modulation_type_t modulation_type; + lr_fhss_v1_cr_t cr; + lr_fhss_v1_grid_t grid; + lr_fhss_v1_bw_t bw; + bool enable_hopping; + uint8_t header_count; /**< Number of header blocks */ +} lr_fhss_v1_params_t; + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS PROTOTYPES --------------------------------------------- + */ + +#endif // LR_FHSS_V1_BASE_TYPES_H__ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/esp_lora_1121.c b/components/esp_lora_1121/src/esp_lora_1121.c new file mode 100755 index 0000000..51efff6 --- /dev/null +++ b/components/esp_lora_1121/src/esp_lora_1121.c @@ -0,0 +1,112 @@ +#include "esp_lora_1121.h" + + +void lora_init_io_context(const void *context,int cs,int reset,int busy,int irq) +{ + ((lr1121_t *)context)->cs = cs; + ((lr1121_t *)context)->reset = reset; + ((lr1121_t *)context)->irq = irq; + ((lr1121_t *)context)->busy = busy; +} + +void lora_init_io(const void *context) +{ + //Set the output pin + gpio_config_t io_conf = {}; + io_conf.intr_type = GPIO_INTR_DISABLE; // Disable interrupts for this pin + if (((lr1121_t *)context)->cs >= 0) { + io_conf.pin_bit_mask = 1ULL << ((lr1121_t *)context)->cs; + if (((lr1121_t *)context)->reset >= 0) { + io_conf.pin_bit_mask |= 1ULL << ((lr1121_t *)context)->reset; // Select the GPIO pin using a bitmask + } + io_conf.mode = GPIO_MODE_INPUT_OUTPUT; // Set pin as input + io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // Enable internal pull-up resistor + gpio_config(&io_conf); // Apply the configuration + } + + //Set the input pin + io_conf.pin_bit_mask = 0; + if (((lr1121_t *)context)->busy >= 0) { + io_conf.pin_bit_mask |= 1ULL << ((lr1121_t *)context)->busy; + } + if (((lr1121_t *)context)->irq >= 0) { + io_conf.pin_bit_mask |= 1ULL << ((lr1121_t *)context)->irq; // Select the GPIO pin using a bitmask + } + if (io_conf.pin_bit_mask) { + io_conf.mode = GPIO_MODE_INPUT; // Set pin as input + io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // Enable internal pull-up resistor + gpio_config(&io_conf); // Apply the configuration + } + + if (((lr1121_t *)context)->cs >= 0) { + gpio_set_level(((lr1121_t *)context)->cs, 1); // Set the GPIO pin level + } + if (((lr1121_t *)context)->reset >= 0) { + gpio_set_level(((lr1121_t *)context)->reset, 1); // Set the GPIO pin level + } +} + +void lora_init_irq(const void *context, gpio_isr_t handler) +{ + if (handler == NULL || ((lr1121_t *)context)->irq < 0) { + return; + } + // Zero-initialize the GPIO configuration structure + gpio_config_t io_conf = {}; + io_conf.intr_type = GPIO_INTR_POSEDGE; // Trigger on negative edge (falling edge) + io_conf.mode = GPIO_MODE_INPUT; // Set pin as input mode + io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // Disable pull-down + io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // Enable pull-up resistor + if (((lr1121_t *)context)->irq < 0) { + return; + } + io_conf.pin_bit_mask = 1ULL << ((lr1121_t *)context)->irq; // Select the GPIO pin using a bitmask + + gpio_config(&io_conf); // Apply the configuration + + // Install the GPIO interrupt service if not already installed + gpio_install_isr_service(0); // Pass 0 for default ISR flags + + // Register the interrupt handler for the specified pin + gpio_isr_handler_add(((lr1121_t *)context)->irq, handler, (void *)((lr1121_t *)context)->irq); +} + +void lora_spi_init(const void* context, spi_device_handle_t spi) +{ + ((lr1121_t *)context)->spi = spi; +} + +void lora_spi_write_bytes(const void* context,const uint8_t *wirte,const uint16_t wirte_length) +{ + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + t.length = wirte_length * 8; // Length is in bits + t.tx_buffer = wirte; + + ESP_ERROR_CHECK(spi_device_transmit(((lr1121_t *)context)->spi, &t)); +} + +void lora_spi_read_bytes(const void* context, uint8_t *read,const uint16_t read_length) +{ + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + t.length = read_length * 8; // Length is in bits + t.rx_buffer = read; + + ESP_ERROR_CHECK(spi_device_transmit(((lr1121_t *)context)->spi, &t)); +} + + +lr1121_modem_response_code_t lr1121_modem_board_event_flush( const void* context ) +{ + lr1121_modem_response_code_t modem_response_code = LR1121_MODEM_RESPONSE_CODE_OK; + lr1121_modem_event_fields_t event_fields; + + do + { + modem_response_code = lr1121_modem_get_event( context, &event_fields ); + } while( modem_response_code != LR1121_MODEM_RESPONSE_CODE_NO_EVENT ); + + return modem_response_code; +} + diff --git a/components/esp_lora_1121/src/lr1121_common/lr1121_common.c b/components/esp_lora_1121/src/lr1121_common/lr1121_common.c new file mode 100755 index 0000000..542cb48 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_common/lr1121_common.c @@ -0,0 +1,837 @@ +#include "lr1121_common.h" +#include +#include +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + + static const lr11xx_radio_rssi_calibration_table_t smtc_shield_lr11xx_common_rssi_calibration_table_below_600mhz = { + .gain_offset = 0, + .gain_tune = { .g4 = 12, + .g5 = 12, + .g6 = 14, + .g7 = 0, + .g8 = 1, + .g9 = 3, + .g10 = 4, + .g11 = 4, + .g12 = 3, + .g13 = 6, + .g13hp1 = 6, + .g13hp2 = 6, + .g13hp3 = 6, + .g13hp4 = 6, + .g13hp5 = 6, + .g13hp6 = 6, + .g13hp7 = 6 }, +}; + +static const lr11xx_radio_rssi_calibration_table_t + smtc_shield_lr11xx_common_rssi_calibration_table_from_600mhz_to_2ghz = { + .gain_offset = 0, + .gain_tune = { .g4 = 2, + .g5 = 2, + .g6 = 2, + .g7 = 3, + .g8 = 3, + .g9 = 4, + .g10 = 5, + .g11 = 4, + .g12 = 4, + .g13 = 6, + .g13hp1 = 5, + .g13hp2 = 5, + .g13hp3 = 6, + .g13hp4 = 6, + .g13hp5 = 6, + .g13hp6 = 7, + .g13hp7 = 6 }, + }; + +static const lr11xx_radio_rssi_calibration_table_t smtc_shield_lr11xx_common_rssi_calibration_table_above_2ghz = { + .gain_offset = 2030, + .gain_tune = { .g4 = 6, + .g5 = 7, + .g6 = 6, + .g7 = 4, + .g8 = 3, + .g9 = 4, + .g10 = 14, + .g11 = 12, + .g12 = 14, + .g13 = 12, + .g13hp1 = 12, + .g13hp2 = 12, + .g13hp3 = 12, + .g13hp4 = 8, + .g13hp5 = 8, + .g13hp6 = 9, + .g13hp7 = 9 }, +}; + +const lr11xx_system_rfswitch_cfg_t smtc_shield_lr11xx_common_rf_switch_cfg = { + .enable = LR11XX_SYSTEM_RFSW0_HIGH | LR11XX_SYSTEM_RFSW1_HIGH , + .standby = 0, + .rx = LR11XX_SYSTEM_RFSW0_HIGH, + .tx = LR11XX_SYSTEM_RFSW1_HIGH, + .tx_hp = LR11XX_SYSTEM_RFSW1_HIGH, + .tx_hf = 0, + .gnss = 0, + .wifi = 0, +}; + +const smtc_shield_lr11xx_lfclk_cfg_t smtc_shield_lr11xx_common_lfclk_cfg = { + .lf_clk_cfg = LR11XX_SYSTEM_LFCLK_XTAL, + .wait_32k_ready = true, +}; + +const smtc_shield_lr11xx_pa_pwr_cfg_t smtc_shield_lr1121mb1gis_pa_pwr_cfg_table[SMTC_SHIELD_LR11XX_MAX_PWR - SMTC_SHIELD_LR11XX_MIN_PWR + 1] = { + { // Expected output power = -9dBm + .power = -9, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -8dBm + .power = -8, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -7dBm + .power = -7, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -6dBm + .power = -6, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -5dBm + .power = -5, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -4dBm + .power = -4, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -3dBm + .power = -3, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -2dBm + .power = -2, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = -1dBm + .power = -1, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 0dBm + .power = 0, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 1dBm + .power = 1, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 2dBm + .power = 2, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 3dBm + .power = 3, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 4dBm + .power = 4, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 5dBm + .power = 5, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 6dBm + .power = 6, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 7dBm + .power = 7, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 8dBm + .power = 8, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 9dBm + .power = 9, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 10dBm + .power = 10, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 11dBm + .power = 11, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 12dBm + .power = 12, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 13dBm + .power = 13, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 14dBm + .power = 14, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 15dBm + .power = 15, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 16dBm + .power = 16, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 17dBm + .power = 17, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 18dBm + .power = 18, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 19dBm + .power = 19, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 20dBm + .power = 20, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 21dBm + .power = 21, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, + { // Expected output power = 22dBm + .power = 22, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HP, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VBAT, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x07, + }, + }, +}; + +const smtc_shield_lr11xx_pa_pwr_cfg_t smtc_shield_lr1121mb1gis_pa_pwr_hf_cfg_table[SMTC_SHIELD_LR112X_MAX_PWR_HF - SMTC_SHIELD_LR112X_MIN_PWR_HF + 1] = { + { // Expected output power = -18dBm + .power = -18, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -17dBm + .power = -17, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -16dBm + .power = -17, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -15dBm + .power = -16, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -14dBm + .power = -15, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -13dBm + .power = -14, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -12dBm + .power = -13, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -11dBm + .power = -12, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x05, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -10dBm + .power = -10, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -9dBm + .power = -9, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -8dBm + .power = -8, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -7dBm + .power = -7, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -6dBm + .power = -6, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -5dBm + .power = -5, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -4dBm + .power = -4, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -3dBm + .power = -3, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -2dBm + .power = -2, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x03, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = -1dBm + .power = -1, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x05, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 0dBm + .power = 0, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x04, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 1dBm + .power = 2, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 2dBm + .power = 2, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x00, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 3dBm + .power = 4, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 4dBm + .power = 5, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 5dBm + .power = 6, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 6dBm + .power = 7, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 7dBm + .power = 8, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 8dBm + .power = 9, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 9dBm + .power = 10, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 10dBm + .power = 11, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x05, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 11dBm + .power = 12, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x03, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 12dBm + .power = 13, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x07, + .pa_hp_sel = 0x00, + }, + }, + { // Expected output power = 13dBm + .power = 13, + .pa_config = { + .pa_sel = LR11XX_RADIO_PA_SEL_HF, + .pa_reg_supply = LR11XX_RADIO_PA_REG_SUPPLY_VREG, + .pa_duty_cycle = 0x00, + .pa_hp_sel = 0x00, + }, + }, +}; + + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC VARIABLES -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +const lr11xx_radio_rssi_calibration_table_t* smtc_shield_lr11xx_get_rssi_calibration_table( + const uint32_t rf_freq_in_hz ) +{ + if( rf_freq_in_hz < 600000000 ) + { + return &smtc_shield_lr11xx_common_rssi_calibration_table_below_600mhz; + } + else if( ( 600000000 <= rf_freq_in_hz ) && ( rf_freq_in_hz <= 2000000000 ) ) + { + return &smtc_shield_lr11xx_common_rssi_calibration_table_from_600mhz_to_2ghz; + } + else + { + return &smtc_shield_lr11xx_common_rssi_calibration_table_above_2ghz; + } +} + +const lr11xx_system_rfswitch_cfg_t* smtc_shield_lr11xx_common_get_rf_switch_cfg( void ) +{ + return &smtc_shield_lr11xx_common_rf_switch_cfg; +} + +lr11xx_system_reg_mode_t smtc_shield_lr11xx_common_get_reg_mode( void ) +{ + return LR11XX_SYSTEM_REG_MODE_DCDC; +} + +const smtc_shield_lr11xx_lfclk_cfg_t* smtc_shield_lr11xx_common_get_lfclk_cfg( void ) +{ + return &smtc_shield_lr11xx_common_lfclk_cfg; +} + +const smtc_shield_lr11xx_pa_pwr_cfg_t* smtc_shield_lr1121mb1gis_get_pa_pwr_cfg( const uint32_t rf_freq_in_hz, + int8_t expected_output_pwr_in_dbm ) +{ + if( ( SMTC_SHIELD_LR11XX_SUBGHZ_FREQ_MIN <= rf_freq_in_hz ) && + ( rf_freq_in_hz <= SMTC_SHIELD_LR11XX_SUBGHZ_FREQ_MAX ) ) + { + if( ( SMTC_SHIELD_LR11XX_MIN_PWR <= expected_output_pwr_in_dbm ) && + ( expected_output_pwr_in_dbm <= SMTC_SHIELD_LR11XX_MAX_PWR ) ) + { + return &( + smtc_shield_lr1121mb1gis_pa_pwr_cfg_table[expected_output_pwr_in_dbm - SMTC_SHIELD_LR11XX_MIN_PWR] ); + } + } + else if( ( ( SMTC_SHIELD_LR112X_2GHZ_FREQ_MIN <= rf_freq_in_hz ) && + ( rf_freq_in_hz <= SMTC_SHIELD_LR112X_2GHZ_FREQ_MAX ) ) || + ( ( SMTC_SHIELD_LR112X_2_4GHZ_FREQ_MIN <= rf_freq_in_hz ) && + ( rf_freq_in_hz <= SMTC_SHIELD_LR112X_2_4GHZ_FREQ_MAX ) ) ) + { + if( ( SMTC_SHIELD_LR112X_MIN_PWR_HF <= expected_output_pwr_in_dbm ) && + ( expected_output_pwr_in_dbm <= SMTC_SHIELD_LR112X_MAX_PWR_HF ) ) + { + return &( smtc_shield_lr1121mb1gis_pa_pwr_hf_cfg_table[expected_output_pwr_in_dbm - + SMTC_SHIELD_LR112X_MIN_PWR_HF] ); + } + } + + return NULL; +} + +/*! + * @brief A function to get the value for low data rate optimization setting + * + * @param [in] sf LoRa Spreading Factor + * @param [in] bw LoRa Bandwidth + */ +const uint8_t smtc_shield_lr11xx_common_compute_lora_ldro( const lr11xx_radio_lora_sf_t sf, const lr11xx_radio_lora_bw_t bw ) +{ + switch( bw ) + { + case LR11XX_RADIO_LORA_BW_500: + return 0; + + case LR11XX_RADIO_LORA_BW_250: + if( sf == LR11XX_RADIO_LORA_SF12 ) + { + return 1; + } + else + { + return 0; + } + + case LR11XX_RADIO_LORA_BW_800: + case LR11XX_RADIO_LORA_BW_400: + case LR11XX_RADIO_LORA_BW_200: + case LR11XX_RADIO_LORA_BW_125: + if( ( sf == LR11XX_RADIO_LORA_SF12 ) || ( sf == LR11XX_RADIO_LORA_SF11 ) ) + { + return 1; + } + else + { + return 0; + } + + case LR11XX_RADIO_LORA_BW_62: + if( ( sf == LR11XX_RADIO_LORA_SF12 ) || ( sf == LR11XX_RADIO_LORA_SF11 ) || ( sf == LR11XX_RADIO_LORA_SF10 ) ) + { + return 1; + } + else + { + return 0; + } + + case LR11XX_RADIO_LORA_BW_41: + if( ( sf == LR11XX_RADIO_LORA_SF12 ) || ( sf == LR11XX_RADIO_LORA_SF11 ) || ( sf == LR11XX_RADIO_LORA_SF10 ) || + ( sf == LR11XX_RADIO_LORA_SF9 ) ) + { + return 1; + } + else + { + return 0; + } + + case LR11XX_RADIO_LORA_BW_31: + case LR11XX_RADIO_LORA_BW_20: + case LR11XX_RADIO_LORA_BW_15: + case LR11XX_RADIO_LORA_BW_10: + // case LR11XX_RADIO_LORA_BW_7: + return 1; + + default: + return 0; + } +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_bsp.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_bsp.c new file mode 100755 index 0000000..a304d4d --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_bsp.c @@ -0,0 +1,472 @@ +/*! + * @file lr1121_modem_bsp.c + * + * @brief BSP driver implementation for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include "lr1121_modem_bsp.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/*! + * @brief Power config block length + */ +#define LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH ( 5 ) + +#define LR1121_MODEM_TX_POWER_CONSUMPTION_SIZE_BYTE ( 5 ) + +#define LR1121_MODEM_GET_TX_POWER_OFFSET_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_TX_POWER_OFFSET_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_OUTPUT_POWER_CONFIG_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_OUTPUT_POWER_CONFIG_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_RF_OUTPUT_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_RF_OUTPUT_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_CRYSTAL_ERROR_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CRYSTAL_ERROR_CMD_LENGTH ( 3 + 4 ) +#define LR1121_MODEM_GET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH ( 3 + 2 ) +#define LR1121_MODEM_GET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH ( 3 + 8 ) +#define LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH ( 3 ) + +#define LR1121_MODEM_MODEM_GET_OUTPUT_POWER_CONFIG_RBUFFER_LENGTH \ + ( LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS * LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH ) +#define LR1121_MODEM_GET_TX_POWER_CONSUMPTION_RBUFFER_LENGTH \ + ( LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS * LR1121_MODEM_TX_POWER_CONSUMPTION_SIZE_BYTE ) +#define LR1121_MODEM_GET_RX_POWER_CONSUMPTION_RBUFFER_LENGTH ( 8 ) + +#define LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA_DBUFFER_MAX_LENGTH \ + ( LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS * LR1121_MODEM_TX_POWER_CONSUMPTION_SIZE_BYTE ) +#define LR1121_MODEM_SET_TX_OUTPUT_POWER_CONFIGURATION_DBUFFER_MAX_LENGTH \ + ( LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH * LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operation code command + */ +enum +{ + LR1121_MODEM_GET_TX_POWER_OFFSET_CMD = 0x00, + LR1121_MODEM_SET_TX_POWER_OFFSET_CMD = 0x01, + LR1121_MODEM_GET_OUTPUT_POWER_CONFIG_CMD = 0x02, + LR1121_MODEM_SET_OUTPUT_POWER_CONFIG_CMD = 0x03, + LR1121_MODEM_GET_RF_OUTPUT_CMD = 0x04, + LR1121_MODEM_SET_RF_OUTPUT_CMD = 0x05, + LR1121_MODEM_GET_CRYSTAL_ERROR_CMD = 0x06, + LR1121_MODEM_SET_CRYSTAL_ERROR_CMD = 0x07, + LR1121_MODEM_GET_XOSC_CAPA_TRIM_A_B = 0x08, + LR1121_MODEM_SET_XOSC_CAPA_TRIM_A_B = 0x09, + LR1121_MODEM_GET_TX_POWER_CONSUMPTION_UA = 0x0A, + LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA = 0x0B, + LR1121_MODEM_GET_LORA_RX_POWER_CONSUMPTION_UA = 0x0C, + LR1121_MODEM_SET_LORA_RX_POWER_CONSUMPTION_UA = 0x0D, + LR1121_MODEM_GET_GFSK_RX_POWER_CONSUMPTION_UA = 0x0E, + LR1121_MODEM_SET_GFSK_RX_POWER_CONSUMPTION_UA = 0x0F, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +static uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ); + +static lr1121_modem_response_code_t lr1121_modem_get_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption, uint8_t opcode ); + +static lr1121_modem_response_code_t lr1121_modem_set_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption, uint8_t opcode ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_get_tx_power_offset( const void* context, int8_t* tx_power_offset ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_TX_POWER_OFFSET_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_GET_TX_POWER_OFFSET_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_TX_POWER_OFFSET_CMD_LENGTH, ( uint8_t* ) tx_power_offset, sizeof( int8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_tx_power_offset( const void* context, const int8_t tx_power_offset ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_TX_POWER_OFFSET_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_SET_TX_POWER_OFFSET_CMD, + ( uint8_t ) tx_power_offset, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_TX_POWER_OFFSET_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_set_output_power_config( + const void* context, const lr1121_modem_output_power_config_t* output_power_configs, + uint8_t n_output_power_configs ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_OUTPUT_POWER_CONFIG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_SET_OUTPUT_POWER_CONFIG_CMD, + }; + + // Array of maximal size is allocated + uint8_t dbuffer[LR1121_MODEM_SET_TX_OUTPUT_POWER_CONFIGURATION_DBUFFER_MAX_LENGTH] = { 0 }; + + for( uint8_t index_power_config = 0; index_power_config < n_output_power_configs; index_power_config++ ) + { + const lr1121_modem_output_power_config_t local_power_config = output_power_configs[index_power_config]; + const uint8_t local_dbuffer_index = index_power_config * LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH; + + dbuffer[local_dbuffer_index] = local_power_config.expected_power; + dbuffer[local_dbuffer_index + 1] = local_power_config.configured_power; + dbuffer[local_dbuffer_index + 2] = + ( uint8_t )( ( local_power_config.pa_supply & 0x0F ) | ( local_power_config.pa_sel << 4 ) ); + dbuffer[local_dbuffer_index + 3] = + ( ( local_power_config.pa_duty_cycle & 0x0F ) << 4 ) | ( local_power_config.pa_hp_sel & 0x0F ); + dbuffer[local_dbuffer_index + 4] = ( uint8_t ) local_power_config.pa_ramp_time; + } + + const uint8_t dbuffer_size = n_output_power_configs * LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH; + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_OUTPUT_POWER_CONFIG_CMD_LENGTH, dbuffer, dbuffer_size ); +} + +lr1121_modem_response_code_t lr1121_modem_get_output_power_config( + const void* context, lr1121_modem_output_power_config_list_t output_power_config ) +{ + uint8_t rbuffer[LR1121_MODEM_MODEM_GET_OUTPUT_POWER_CONFIG_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_OUTPUT_POWER_CONFIG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_GET_OUTPUT_POWER_CONFIG_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_OUTPUT_POWER_CONFIG_CMD_LENGTH, rbuffer, + LR1121_MODEM_MODEM_GET_OUTPUT_POWER_CONFIG_RBUFFER_LENGTH ); + + for( uint8_t i = 0; i < LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS; i++ ) + { + const uint8_t local_rbuffer_index = i * LR1121_MODEM_OUTPUT_POWER_CONFIG_BLOCK_LENGTH; + + output_power_config[i].expected_power = rbuffer[local_rbuffer_index]; + output_power_config[i].configured_power = rbuffer[local_rbuffer_index + 1]; + output_power_config[i].pa_supply = ( lr1121_modem_pa_reg_supply_t )( rbuffer[local_rbuffer_index + 2] & 0x0F ); + output_power_config[i].pa_sel = + ( lr1121_modem_output_power_configuration_pa_sel_t )( ( rbuffer[local_rbuffer_index + 2] >> 4 ) & 0x0F ); + output_power_config[i].pa_duty_cycle = ( rbuffer[local_rbuffer_index + 3] & 0xF0 ) >> 4; + output_power_config[i].pa_hp_sel = rbuffer[local_rbuffer_index + 3] & 0x0F; + output_power_config[i].pa_ramp_time = ( lr1121_modem_ramp_time_t )( rbuffer[local_rbuffer_index + 4] ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_rf_output( const void* context, + const lr1121_modem_bsp_radio_pa_selection_t output ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_RF_OUTPUT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_SET_RF_OUTPUT_CMD, + ( uint8_t ) output, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_RF_OUTPUT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_rf_output( const void* context, + const lr1121_modem_bsp_radio_pa_selection_t* output ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_RF_OUTPUT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_GET_RF_OUTPUT_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_RF_OUTPUT_CMD_LENGTH, ( uint8_t* ) output, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_get_crystal_error( const void* context, uint32_t* crystal_error_ppm ) +{ + uint8_t rbuffer[sizeof( uint32_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_CRYSTAL_ERROR_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_GET_CRYSTAL_ERROR_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CRYSTAL_ERROR_CMD_LENGTH, rbuffer, sizeof( uint32_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *crystal_error_ppm = ( ( uint32_t ) rbuffer[0] << 24 ) + ( ( uint32_t ) rbuffer[1] << 16 ) + + ( ( uint32_t ) rbuffer[2] << 8 ) + ( ( uint32_t ) rbuffer[3] ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_crystal_error( const void* context, const uint32_t crystal_error_ppm ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CRYSTAL_ERROR_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_SET_CRYSTAL_ERROR_CMD, + ( uint8_t )( crystal_error_ppm >> 24 ), + ( uint8_t )( crystal_error_ppm >> 16 ), + ( uint8_t )( crystal_error_ppm >> 8 ), + ( uint8_t ) crystal_error_ppm, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_CRYSTAL_ERROR_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_xosc_capa_trim_a_b( const void* context, uint8_t* capa_trim_a, + uint8_t* capa_trim_b ) +{ + uint8_t rbuffer[sizeof( uint16_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_GET_XOSC_CAPA_TRIM_A_B, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *capa_trim_a = rbuffer[0]; + *capa_trim_b = rbuffer[1]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_xosc_capa_trim_a_b( const void* context, const uint8_t capa_trim_a, + const uint8_t capa_trim_b ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_BSP >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_BSP, + LR1121_MODEM_SET_XOSC_CAPA_TRIM_A_B, + capa_trim_a, + capa_trim_b, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_XOSC_CAPA_TRIM_A_B_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_tx_power_consumption_ua( + const void* context, lr1121_modem_tx_power_consumption_list_t consumption_per_power ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_BSP >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_BSP & 0xFF, + LR1121_MODEM_GET_TX_POWER_CONSUMPTION_UA, + }; + + uint8_t rbuffer[LR1121_MODEM_GET_TX_POWER_CONSUMPTION_RBUFFER_LENGTH] = { 0 }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_TX_POWER_CONSUMPTION_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + for( uint8_t index_power = 0; index_power < LR1121_MODEM_NB_OUTPUT_POWER_CONFIG_BLOCKS; index_power++ ) + { + lr1121_modem_tx_power_consumption_value_t* local_value = &consumption_per_power[index_power]; + local_value->tx_power_dbm = rbuffer[index_power * 5]; + local_value->consumed_power_ua = + ( rbuffer[index_power * 5 + 1] << 24 ) + ( rbuffer[index_power * 5 + 2] << 16 ) + + ( rbuffer[index_power * 5 + 3] << 8 ) + ( rbuffer[index_power * 5 + 4] << 0 ); + } + } + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_tx_power_consumption_ua( + const void* context, const lr1121_modem_tx_power_consumption_value_t* consumption_per_power, + uint8_t n_consumption_per_power ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_BSP >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_BSP & 0xFF, + LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA, + }; + + // Array of maximal size is allocated + uint8_t dbuffer[LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA_DBUFFER_MAX_LENGTH] = { 0 }; + + for( uint8_t power_table_index = 0; power_table_index < n_consumption_per_power; power_table_index++ ) + { + const lr1121_modem_tx_power_consumption_value_t local_consumption_value = + consumption_per_power[power_table_index]; + const uint8_t local_dbuffer_index = power_table_index * LR1121_MODEM_TX_POWER_CONSUMPTION_SIZE_BYTE; + + dbuffer[local_dbuffer_index] = local_consumption_value.tx_power_dbm; + dbuffer[local_dbuffer_index + 1] = ( uint8_t )( local_consumption_value.consumed_power_ua >> 24 ); + dbuffer[local_dbuffer_index + 2] = ( uint8_t )( local_consumption_value.consumed_power_ua >> 16 ); + dbuffer[local_dbuffer_index + 3] = ( uint8_t )( local_consumption_value.consumed_power_ua >> 8 ); + dbuffer[local_dbuffer_index + 4] = ( uint8_t ) local_consumption_value.consumed_power_ua; + } + + // Number of meaningful bytes from dbuffer to transmit to the chip + const uint8_t dbuffer_size = n_consumption_per_power * LR1121_MODEM_TX_POWER_CONSUMPTION_SIZE_BYTE; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_TX_POWER_CONSUMPTION_UA_CMD_LENGTH, dbuffer, dbuffer_size ); +} + +lr1121_modem_response_code_t lr1121_modem_get_lora_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption ) +{ + return lr1121_modem_get_rx_power_consumption_ua( context, rx_consumption, + LR1121_MODEM_GET_LORA_RX_POWER_CONSUMPTION_UA ); +} + +lr1121_modem_response_code_t lr1121_modem_set_lora_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption ) +{ + return lr1121_modem_set_rx_power_consumption_ua( context, rx_consumption, + LR1121_MODEM_SET_LORA_RX_POWER_CONSUMPTION_UA ); +} + +lr1121_modem_response_code_t lr1121_modem_get_gfsk_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption ) +{ + return lr1121_modem_get_rx_power_consumption_ua( context, rx_consumption, + LR1121_MODEM_GET_GFSK_RX_POWER_CONSUMPTION_UA ); +} + +lr1121_modem_response_code_t lr1121_modem_set_gfsk_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption ) +{ + return lr1121_modem_set_rx_power_consumption_ua( context, rx_consumption, + LR1121_MODEM_SET_GFSK_RX_POWER_CONSUMPTION_UA ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ) +{ + return ( ( ( uint32_t ) value[0] ) << 24 ) + ( ( ( uint32_t ) value[1] ) << 16 ) + + ( ( ( uint32_t ) value[2] ) << 8 ) + ( ( ( uint32_t ) value[3] ) ); +} + +lr1121_modem_response_code_t lr1121_modem_get_rx_power_consumption_ua( + const void* context, lr1121_modem_rx_power_consumption_t* rx_consumption, uint8_t opcode ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_BSP >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_BSP & 0xFF, + opcode, + }; + + uint8_t rbuffer[LR1121_MODEM_GET_RX_POWER_CONSUMPTION_RBUFFER_LENGTH] = { 0 }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_RX_POWER_CONSUMPTION_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + rx_consumption->consumption_rx_boosted_off_ua = lr1121_uint8_to_uint32( rbuffer ); + rx_consumption->consumption_rx_boosted_on_ua = lr1121_uint8_to_uint32( rbuffer + 4 ); + } + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_rx_power_consumption_ua( + const void* context, const lr1121_modem_rx_power_consumption_t* rx_consumption, uint8_t opcode ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_BSP >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_BSP & 0xFF, + opcode, + ( uint8_t )( rx_consumption->consumption_rx_boosted_off_ua >> 24 ), + ( uint8_t )( rx_consumption->consumption_rx_boosted_off_ua >> 16 ), + ( uint8_t )( rx_consumption->consumption_rx_boosted_off_ua >> 8 ), + ( uint8_t ) rx_consumption->consumption_rx_boosted_off_ua, + ( uint8_t )( rx_consumption->consumption_rx_boosted_on_ua >> 24 ), + ( uint8_t )( rx_consumption->consumption_rx_boosted_on_ua >> 16 ), + ( uint8_t )( rx_consumption->consumption_rx_boosted_on_ua >> 8 ), + ( uint8_t ) rx_consumption->consumption_rx_boosted_on_ua, + }; + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_RX_POWER_CONSUMPTION_UA_CMD_LENGTH, 0, 0 ); +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_driver_version.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_driver_version.c new file mode 100755 index 0000000..bb1b298 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_driver_version.c @@ -0,0 +1,83 @@ +/** + * @file lr1121_modem_driver_version.c + * + * @brief Implementation of the get version function + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_driver_version.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +const char* lr1121_modem_driver_version_get_version_string( void ) +{ + return ( const char* ) LR1121_MODEM_DRIVER_VERSION; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_helper.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_helper.c new file mode 100755 index 0000000..a04d7a2 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_helper.c @@ -0,0 +1,170 @@ +/*! + * @file lr1121_modem_helper.c + * + * @brief helper functions implementation for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_helper.h" +#include "lr1121_modem_common.h" +#include "lr1121_modem_modem.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_helper_status_t lr1121_modem_helper_get_event_data( const void* context, + lr1121_modem_event_t* modem_event ) +{ + lr1121_modem_helper_status_t status = LR1121_MODEM_HELPER_STATUS_ERROR; + lr1121_modem_event_fields_t event_fields = { 0 }; + + const lr1121_modem_response_code_t modem_response_code = lr1121_modem_get_event( context, &event_fields ); + + if( modem_response_code == LR1121_MODEM_RESPONSE_CODE_OK ) + { + status = LR1121_MODEM_HELPER_STATUS_OK; + modem_event->event_type = event_fields.event_type; + modem_event->missed_events = event_fields.missed_events_count; + + switch( modem_event->event_type ) + { + case LR1121_MODEM_LORAWAN_EVENT_RESET: + modem_event->event_data.reset.count = event_fields.data; + break; + case LR1121_MODEM_LORAWAN_EVENT_TX_DONE: + modem_event->event_data.txdone.status = ( lr1121_modem_tx_done_event_t )( event_fields.data >> 8 ); + break; + case LR1121_MODEM_LORAWAN_EVENT_LINK_CHECK: + modem_event->event_data.link_check.status = ( lr1121_modem_link_check_event_t )( event_fields.data >> 8 ); + break; + case LR1121_MODEM_LORAWAN_EVENT_LORAWAN_MAC_TIME: + modem_event->event_data.mac_time.status = ( lr1121_modem_mac_time_event_t )( event_fields.data >> 8 ); + break; + case LR1121_MODEM_LORAWAN_EVENT_CLASS_B_PING_SLOT_INFO: + modem_event->event_data.ping_slot_info.status = + ( lr1121_modem_class_b_ping_slot_info_t )( event_fields.data >> 8 ); + break; + case LR1121_MODEM_LORAWAN_EVENT_CLASS_B_STATUS: + modem_event->event_data.ping_slot_status.status = + ( lr1121_modem_class_b_ping_slot_status_t )( event_fields.data >> 8 ); + break; + case LR1121_MODEM_LORAWAN_EVENT_NEW_MULTICAST_SESSION_CLASS_C: + { + modem_event->event_data.new_multicast_class_c_groupid.mc_group_id = ( uint8_t )( event_fields.data >> 8 ); + break; + } + case LR1121_MODEM_LORAWAN_EVENT_NEW_MULTICAST_SESSION_CLASS_B: + { + modem_event->event_data.new_multicast_class_b_groupid.mc_group_id = ( uint8_t )( event_fields.data >> 8 ); + break; + } + case LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_DYNAMIC: + { + modem_event->event_data.relay_tx_dynamic_status.status = + ( lr1121_modem_relay_tx_dynamic_status_t )( event_fields.data >> 8 ); + break; + } + case LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_MODE: + { + modem_event->event_data.relay_tx_mode_status.status = + ( lr1121_modem_relay_tx_mode_status_t )( event_fields.data >> 8 ); + break; + } + case LR1121_MODEM_LORAWAN_EVENT_RELAY_TX_SYNC: + { + modem_event->event_data.relay_tx_sync_status.status = + ( lr1121_modem_relay_tx_sync_status_t )( event_fields.data >> 8 ); + break; + } + case LR1121_MODEM_LORAWAN_EVENT_FUOTA_DONE: + { + modem_event->event_data.fuota_status.status = + ( lr1121_modem_fuota_status_t )( event_fields.data >> 8 ) & 0x00FF; + break; + } + case LR1121_MODEM_LORAWAN_EVENT_TEST_MODE: + { + modem_event->event_data.test_mode_status.status = + ( lr1121_modem_test_mode_status_t )( event_fields.data >> 8 ) & 0x00FF; + break; + } + case LR1121_MODEM_LORAWAN_EVENT_REGIONAL_DUTY_CYCLE: + { + modem_event->event_data.regional_duty_cycle_status.status = + ( lr1121_modem_regional_duty_cycle_status_t )( ( uint8_t )( event_fields.data >> 8 ) ); + break; + } + default: + break; + } + } + + return status; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lorawan.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lorawan.c new file mode 100755 index 0000000..c1f746c --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lorawan.c @@ -0,0 +1,1401 @@ +/*! + * @file lr1121_modem_lorawan.c + * + * @brief LoRaWAN driver implementation for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include "lr1121_modem_lorawan.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR1121_MODEM_GET_LORAWAN_VERSION_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_DEV_EUI_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_DEV_EUI_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_JOIN_EUI_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_JOIN_EUI_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_NWK_KEY_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_APP_KEY_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_DERIVE_KEYS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_CLASS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CLASS_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_REGION_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_REGION_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_JOIN_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_LEAVE_NETWORK_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_NEXT_TX_MAX_PAYLOAD_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_REQUEST_TX_CMD_LENGTH ( 3 + 2 ) +#define LR1121_MODEM_REQUEST_EMPTY_TX_CMD_LENGTH ( 3 + 3 ) +#define LR1121_MODEM_EMERGENCY_TX_CMD_LENGTH ( 3 + 2 ) +#define LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_DOWNLINK_DATA_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_DOWNLINK_METADATA_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_NETWORK_TYPE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_NETWORK_TYPE_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_CERTIFICATION_MODE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CERTIFICATION_MODE_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_DUTY_CYCLE_STATUS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_AVAILABLE_DATA_RATE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_ADR_PROFILE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_ADR_PROFILE_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_SET_JOIN_DATA_RATE_DISTRIBUTION_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_NB_TRANS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_NB_TRANS_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH ( 3 + 2 ) +#define LR1121_MODEM_GET_LBT_STATE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_LBT_STATE_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_LBT_PARAMS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_LBT_PARAMS_CMD_LENGTH ( 3 + 10 ) +#define LR1121_MODEM_GET_CSMA_STATE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CSMA_STATE_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_CSMA_PARAMS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CSMA_PARAMS_CMD_LENGTH ( 3 + 3 ) +#define LR1121_MODEM_LORAWAN_MAC_REQUEST_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_LORAWAN_MAC_TIME_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_LINK_CHECK_DATA_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_BATTERY_LEVEL_CMD_LENGTH ( 3 + 2 ) +#define LR1121_MODEM_GET_CLASS_B_PING_SLOT_PERIODICITY_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_CLASS_B_PING_SLOT_PERIODICITY_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_SET_MULTICAST_GROUP_CONFIG_CMD_LENGTH ( 3 + 37 ) +#define LR1121_MODEM_START_SESSION_MULTICAST_CLASS_C_CMD_LENGTH ( 3 + 6 ) +#define LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_C_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_C_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_START_SESSION_MULTICAST_CLASS_B_CMD_LENGTH ( 3 + 7 ) +#define LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_B_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_B_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_START_ALC_SYNC_SERVICE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_STOP_ALC_SYNC_SERVICE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_ALC_SYNC_GET_TIME_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_ALC_SYNC_TRIG_REQUEST_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_FUOTA_GET_FILE_FRAGMENT_CMD_LENGTH ( 3 + 8 ) + +#define LR1121_MODEM_GET_LORAWAN_VERSION_RBUFFER_LENGTH ( 8 ) +#define LR1121_MODEM_DEV_EUI_BUFFER_LENGTH ( 8 ) +#define LR1121_MODEM_JOIN_EUI_BUFFER_LENGTH ( 8 ) +#define LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_RBUFFER_LENGTH ( 2 ) +#define LR1121_MODEM_DOWNLINK_METADATA_RBUFFER_LENGTH ( 11 ) +#define LR1121_MODEM_LBT_PARAMS_RBUFFER_LENGTH ( 10 ) +#define LR1121_MODEM_CSMA_PARAMS_RBUFFER_LENGTH ( 3 ) +#define LR1121_MODEM_GET_LORAWAN_MAC_TIME_RBUFFER_LENGTH ( 8 ) +#define LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_RBUFFER_LENGTH ( 6 ) +#define LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_RBUFFER_LENGTH ( 4 ) +#define LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_RBUFFER_LENGTH ( 6 ) +#define LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_RBUFFER_LENGTH ( 8 ) +#define LR1121_MODEM_ALC_SYNC_GET_TIME_RBUFFER_LENGTH ( 4 ) +#define LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_RBUFFER_LENGTH ( 8 ) + +#define LR1121_MODEM_NWKSKEY_LENGTH ( 16 ) +#define LR1121_MODEM_APPSKEY_LENGTH ( 16 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operation code command + */ +enum +{ + LR1121_MODEM_GET_LORAWAN_VERSION_CMD = 0x00, + LR1121_MODEM_GET_DEV_EUI_CMD = 0x01, + LR1121_MODEM_SET_DEV_EUI_CMD = 0x02, + LR1121_MODEM_GET_JOIN_EUI_CMD = 0x03, + LR1121_MODEM_SET_JOIN_EUI_CMD = 0x04, + LR1121_MODEM_SET_NWK_KEY_CMD = 0x05, + LR1121_MODEM_SET_APP_KEY_CMD = 0x06, + LR1121_MODEM_DERIVE_KEYS_CMD = 0x07, + LR1121_MODEM_GET_CLASS_CMD = 0x08, + LR1121_MODEM_SET_CLASS_CMD = 0x09, + LR1121_MODEM_GET_REGION_CMD = 0x0B, + LR1121_MODEM_SET_REGION_CMD = 0x0C, + LR1121_MODEM_JOIN_CMD = 0x0D, + LR1121_MODEM_LEAVE_NETWORK_CMD = 0x0E, + LR1121_MODEM_GET_NEXT_TX_MAX_PAYLOAD_CMD = 0x11, + LR1121_MODEM_REQUEST_TX_CMD = 0x12, + LR1121_MODEM_REQUEST_EMPTY_TX_CMD = 0x13, + LR1121_MODEM_EMERGENCY_TX_CMD = 0x14, + LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_CMD = 0x15, + LR1121_MODEM_GET_DOWNLINK_DATA_CMD = 0x16, + LR1121_MODEM_GET_DOWNLINK_METADATA_CMD = 0x17, + LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_CMD = 0x18, + LR1121_MODEM_GET_NETWORK_TYPE_CMD = 0x19, + LR1121_MODEM_SET_NETWORK_TYPE_CMD = 0x1A, + LR1121_MODEM_GET_CERTIFICATION_MODE_CMD = 0x1B, + LR1121_MODEM_SET_CERTIFICATION_MODE_CMD = 0x1C, + LR1121_MODEM_GET_DUTY_CYCLE_STATUS_CMD = 0x1D, + LR1121_MODEM_GET_AVAILABLE_DATA_RATE_CMD = 0x1F, + LR1121_MODEM_GET_ADR_PROFILE_CMD = 0x20, + LR1121_MODEM_SET_ADR_PROFILE_CMD = 0x21, + LR1121_MODEM_SET_JOIN_DATA_RATE_DISTRIBUTION_CMD = 0x22, + LR1121_MODEM_GET_NB_TRANS_CMD = 0x23, + LR1121_MODEM_SET_NB_TRANS_CMD = 0x24, + LR1121_MODEM_GET_ADR_ACK_LIMIT_DELAY_CMD = 0x25, + LR1121_MODEM_SET_ADR_ACK_LIMIT_DELAY_CMD = 0x26, + LR1121_MODEM_GET_LBT_STATE_CMD = 0x27, + LR1121_MODEM_SET_LBT_STATE_CMD = 0x28, + LR1121_MODEM_GET_LBT_PARAMS_CMD = 0x29, + LR1121_MODEM_SET_LBT_PARAMS_CMD = 0x2A, + LR1121_MODEM_GET_CSMA_STATE_CMD = 0x2B, + LR1121_MODEM_SET_CSMA_STATE_CMD = 0x2C, + LR1121_MODEM_GET_CSMA_PARAMS_CMD = 0x2D, + LR1121_MODEM_SET_CSMA_PARAMS_CMD = 0x2E, + LR1121_MODEM_LORAWAN_MAC_REQUEST_CMD = 0x2F, + LR1121_MODEM_GET_LORAWAN_MAC_TIME_CMD = 0x30, + LR1121_MODEM_GET_LINK_CHECK_DATA_CMD = 0x31, + LR1121_MODEM_SET_BATTERY_LEVEL_CMD = 0x32, + LR1121_MODEM_GET_CLASS_B_PING_SLOT_PERIODICITY_CMD = 0x34, + LR1121_MODEM_SET_CLASS_B_PING_SLOT_PERIODICITY_CMD = 0x35, + LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_CMD = 0x36, + LR1121_MODEM_SET_MULTICAST_GROUP_CONFIG_CMD = 0x37, + LR1121_MODEM_START_SESSION_MULTICAST_CLASS_C_CMD = 0x38, + LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_CMD = 0x39, + LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_C_CMD = 0x3A, + LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_C_CMD = 0x3B, + LR1121_MODEM_START_SESSION_MULTICAST_CLASS_B_CMD = 0x3C, + LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_CMD = 0x3D, + LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_B_CMD = 0x3E, + LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_B_CMD = 0x3F, + LR1121_MODEM_START_ALC_SYNC_SERVICE_CMD = 0x42, + LR1121_MODEM_STOP_ALC_SYNC_SERVICE_CMD = 0x43, + LR1121_MODEM_ALC_SYNC_GET_TIME_CMD = 0x44, + LR1121_MODEM_ALC_SYNC_TRIG_REQUEST_CMD = 0X45, + LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_CMD = 0x46, + LR1121_MODEM_FUOTA_GET_FILE_FRAGMENT_CMD = 0x47, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/** + * @brief Helper function that convert an array of uint8_t into a uint32_t single value + * + * @warning It is up to the caller to ensure that value points to an array of at least sizeof(uint32_t) elements. + * + * @param [in] value Array of uint8_t to be translated into a uint32_t + * + * @returns 32-bit value + */ +static uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ); + +/** + * @brief Compute CRC32 + * + * @param [in,out] pcrc Pointer to the CRC. Used as initial value and as output value + * @param buf The buffer to compute the CRC on. It is up to the caller to ensure it is at least @ref len byte long + * @param len Length of buffer to compute the CRC on + */ +static void lr1121_modem_fuota_crc32( uint32_t* pcrc, const uint8_t* buf, uint32_t len ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_get_lorawan_version( const void* context, + lr1121_modem_lorawan_version_t* lorawan_version ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_LORAWAN_VERSION_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_LORAWAN_VERSION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LORAWAN_VERSION_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LORAWAN_VERSION_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_LORAWAN_VERSION_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + lorawan_version->lorawan_major = rbuffer[0]; + lorawan_version->lorawan_minor = rbuffer[1]; + lorawan_version->lorawan_patch = rbuffer[2]; + lorawan_version->lorawan_revision = rbuffer[3]; + lorawan_version->rp_major = rbuffer[4]; + lorawan_version->rp_minor = rbuffer[5]; + lorawan_version->rp_patch = rbuffer[6]; + lorawan_version->rp_revision = rbuffer[7]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_dev_eui( const void* context, lr1121_modem_dev_eui_t dev_eui ) +{ + uint8_t rbuffer[LR1121_MODEM_DEV_EUI_BUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_DEV_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_DEV_EUI_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_DEV_EUI_CMD_LENGTH, rbuffer, LR1121_MODEM_DEV_EUI_BUFFER_LENGTH ); + + for( uint8_t i = 0; i < LR1121_MODEM_DEV_EUI_BUFFER_LENGTH; i++ ) + { + dev_eui[i] = rbuffer[i]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_dev_eui( const void* context, const lr1121_modem_dev_eui_t dev_eui ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_DEV_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_DEV_EUI_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_DEV_EUI_CMD_LENGTH, dev_eui, LR1121_MODEM_DEV_EUI_BUFFER_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_get_join_eui( const void* context, lr1121_modem_join_eui_t join_eui ) +{ + uint8_t rbuffer[LR1121_MODEM_JOIN_EUI_BUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_JOIN_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_JOIN_EUI_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_JOIN_EUI_CMD_LENGTH, rbuffer, LR1121_MODEM_JOIN_EUI_BUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + for( uint8_t i = 0; i < LR1121_MODEM_JOIN_EUI_BUFFER_LENGTH; i++ ) + { + join_eui[i] = rbuffer[i]; + } + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_join_eui( const void* context, const lr1121_modem_join_eui_t join_eui ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_JOIN_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_JOIN_EUI_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_JOIN_EUI_CMD_LENGTH, join_eui, LR1121_MODEM_JOIN_EUI_BUFFER_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_set_nwk_key( const void* context, const lr1121_modem_nwk_key_t nwk_key ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_NWK_KEY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_NWK_KEY_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_NWK_KEY_CMD_LENGTH, nwk_key, LR1121_MODEM_NWK_KEY_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_set_app_key( const void* context, const lr1121_modem_app_key_t app_key ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_APP_KEY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_APP_KEY_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_APP_KEY_CMD_LENGTH, app_key, LR1121_MODEM_APP_KEY_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_derive_keys( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_DERIVE_KEYS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_DERIVE_KEYS_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_DERIVE_KEYS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_class( const void* context, lr1121_modem_classes_t* modem_class ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_CLASS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_CLASS_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( context, cbuffer, LR1121_MODEM_GET_CLASS_CMD_LENGTH, + ( uint8_t* ) modem_class, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_class( const void* context, const lr1121_modem_classes_t modem_class ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CLASS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_CLASS_CMD, + ( uint8_t ) modem_class, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, LR1121_MODEM_SET_CLASS_CMD_LENGTH, + 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_region( const void* context, lr1121_modem_regions_t* region ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_REGION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_REGION_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( context, cbuffer, LR1121_MODEM_GET_REGION_CMD_LENGTH, + ( uint8_t* ) region, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_region( const void* context, const lr1121_modem_regions_t region ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_REGION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_REGION_CMD, + ( uint8_t ) region, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_REGION_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_join( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_JOIN_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_LORAWAN & 0xFF, + LR1121_MODEM_JOIN_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, LR1121_MODEM_JOIN_CMD_LENGTH, 0, + 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_leave_network( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_LEAVE_NETWORK_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_LORAWAN & 0xFF, + LR1121_MODEM_LEAVE_NETWORK_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_LEAVE_NETWORK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_next_tx_max_payload( const void* context, uint8_t* tx_max_payload ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_NEXT_TX_MAX_PAYLOAD_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_NEXT_TX_MAX_PAYLOAD_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_NEXT_TX_MAX_PAYLOAD_CMD_LENGTH, tx_max_payload, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_request_tx( const void* context, const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type, const uint8_t* data, + const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_REQUEST_TX_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_LORAWAN & 0xFF, + LR1121_MODEM_REQUEST_TX_CMD, + port, + ( uint8_t ) uplink_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_REQUEST_TX_CMD_LENGTH, data, length ); +} + +lr1121_modem_response_code_t lr1121_modem_request_empty_tx( const void* context, bool is_fport_populated, + const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_REQUEST_EMPTY_TX_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_REQUEST_EMPTY_TX_CMD, + ( is_fport_populated ? 0x01 : 0x00 ), + port, + ( uint8_t ) uplink_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_REQUEST_EMPTY_TX_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_emergency_tx( const void* context, const uint8_t port, + const lr1121_modem_uplink_type_t uplink_type, + const uint8_t* data, const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_EMERGENCY_TX_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_EMERGENCY_TX_CMD, + port, + ( uint8_t ) uplink_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_EMERGENCY_TX_CMD_LENGTH, data, length ); +} + +lr1121_modem_response_code_t lr1121_modem_get_downlink_data_size( const void* context, uint8_t* downlink_data_size, + uint8_t* remaining_downlinks ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_CMD, + }; + + uint8_t rbuffer[LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_RBUFFER_LENGTH] = { 0x00 }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_DOWNLINK_DATA_SIZE_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *downlink_data_size = rbuffer[0]; + *remaining_downlinks = rbuffer[1]; + } + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_downlink_data( const void* context, uint8_t* buffer, + uint8_t downlink_data_size ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_DOWNLINK_DATA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_DOWNLINK_DATA_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_DOWNLINK_DATA_CMD_LENGTH, buffer, downlink_data_size ); +} + +lr1121_modem_response_code_t lr1121_modem_get_downlink_metadata( const void* context, + lr1121_modem_downlink_metadata_t* metadata ) +{ + uint8_t rbuffer[LR1121_MODEM_DOWNLINK_METADATA_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_DOWNLINK_METADATA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_DOWNLINK_METADATA_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_DOWNLINK_METADATA_CMD_LENGTH, rbuffer, + LR1121_MODEM_DOWNLINK_METADATA_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + metadata->stack_id = rbuffer[0]; + metadata->rssi = ( int16_t )( ( int8_t ) rbuffer[1] - 64 ); + metadata->snr_integer = ( ( int8_t ) rbuffer[2] ) >> 2; + metadata->snr_quarter = rbuffer[2] & 0x03; + metadata->window = ( lr1121_modem_downlink_window_t ) rbuffer[3]; + metadata->fport = rbuffer[4]; + metadata->fpending_bit = rbuffer[5]; + metadata->frequency_hz = lr1121_uint8_to_uint32( rbuffer + 6 ); + metadata->datarate = rbuffer[10]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_lost_connection_counter( const void* context, + uint16_t* lost_connection_counter, + uint32_t* lost_connection_since_sec ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_LOST_CONNECTION_COUNTER_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *lost_connection_counter = ( ( uint16_t ) rbuffer[0] << 8 ) + ( ( uint16_t ) rbuffer[1] ); + *lost_connection_since_sec = lr1121_uint8_to_uint32( rbuffer + 2 ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_network_type( const void* context, + lr1121_modem_network_type_t* network_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_NETWORK_TYPE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_NETWORK_TYPE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_NETWORK_TYPE_CMD_LENGTH, ( uint8_t* ) network_type, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_network_type( const void* context, + const lr1121_modem_network_type_t network_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_NETWORK_TYPE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_NETWORK_TYPE_CMD, + ( uint8_t ) network_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_NETWORK_TYPE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_certification_mode( const void* context, + lr1121_modem_certification_mode_t* enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_CERTIFICATION_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_CERTIFICATION_MODE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CERTIFICATION_MODE_CMD_LENGTH, ( uint8_t* ) enable, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_certification_mode( const void* context, + const lr1121_modem_certification_mode_t enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CERTIFICATION_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_CERTIFICATION_MODE_CMD, + ( uint8_t ) enable, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_CERTIFICATION_MODE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_duty_cycle_status( const void* context, int32_t* duty_cycle ) +{ + uint8_t rbuffer[sizeof( int32_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_DUTY_CYCLE_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_DUTY_CYCLE_STATUS_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_DUTY_CYCLE_STATUS_CMD_LENGTH, rbuffer, sizeof( int32_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *duty_cycle = lr1121_uint8_to_uint32( rbuffer ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_available_data_rate( const void* context, uint16_t* available_data_rate ) +{ + uint8_t rbuffer[sizeof( uint16_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_AVAILABLE_DATA_RATE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_AVAILABLE_DATA_RATE_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_AVAILABLE_DATA_RATE_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *available_data_rate = ( ( uint16_t ) rbuffer[0] << 8 ) + rbuffer[1]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_adr_profile( const void* context, + lr1121_modem_adr_profiles_t* adr_profile ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_ADR_PROFILE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_ADR_PROFILE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_ADR_PROFILE_CMD_LENGTH, ( uint8_t* ) adr_profile, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_adr_profile( const void* context, + const lr1121_modem_adr_profiles_t adr_profile, + const uint8_t* adr_custom_list ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_ADR_PROFILE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_ADR_PROFILE_CMD, + ( uint8_t ) adr_profile, + }; + + const uint8_t data_length = ( adr_profile == LR1121_MODEM_ADR_PROFILE_CUSTOM ) ? 16 : 0; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_ADR_PROFILE_CMD_LENGTH, adr_custom_list, data_length ); +} + +lr1121_modem_response_code_t lr1121_modem_set_join_data_rate_distribution( + const void* context, const uint8_t distribution[LR1121_MODEM_DATARATE_DISTRIBUTION_LENGTH] ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_JOIN_DATA_RATE_DISTRIBUTION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_JOIN_DATA_RATE_DISTRIBUTION_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_JOIN_DATA_RATE_DISTRIBUTION_CMD_LENGTH, distribution, + LR1121_MODEM_DATARATE_DISTRIBUTION_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_get_nb_trans( const void* context, uint8_t* nb_trans ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_NB_TRANS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_NB_TRANS_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_NB_TRANS_CMD_LENGTH, ( uint8_t* ) nb_trans, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_nb_trans( const void* context, const uint8_t nb_trans ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_NB_TRANS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_NB_TRANS_CMD, + nb_trans, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_NB_TRANS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_adr_ack_limit_delay( const void* context, uint8_t* limit, uint8_t* delay ) +{ + uint8_t rbuffer[sizeof( uint16_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_ADR_ACK_LIMIT_DELAY_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *limit = rbuffer[0]; + *delay = rbuffer[1]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_adr_ack_limit_delay( const void* context, const uint8_t limit, + const uint8_t delay ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_ADR_ACK_LIMIT_DELAY_CMD, + limit, + delay, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_ADR_ACK_LIMIT_DELAY_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_lbt_state( const void* context, lr1121_modem_lbt_mode_t* enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_LBT_STATE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LBT_STATE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LBT_STATE_CMD_LENGTH, ( uint8_t* ) enable, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_lbt_state( const void* context, const lr1121_modem_lbt_mode_t enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_LBT_STATE_CMD_LENGTH] = { + ( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ) & 0xFF, + LR1121_MODEM_GROUP_ID_LORAWAN & 0xFF, + LR1121_MODEM_SET_LBT_STATE_CMD, + enable, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_LBT_STATE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_set_lbt_params( const void* context, const uint32_t duration, + const int16_t threshold, const uint32_t bandwidth ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_LBT_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_LBT_PARAMS_CMD, + ( uint8_t )( duration >> 24 ), + ( uint8_t )( duration >> 16 ), + ( uint8_t )( duration >> 8 ), + ( uint8_t )( duration ), + ( uint8_t )( threshold >> 8 ), + ( uint8_t )( threshold ), + ( uint8_t )( bandwidth >> 24 ), + ( uint8_t )( bandwidth >> 16 ), + ( uint8_t )( bandwidth >> 8 ), + ( uint8_t )( bandwidth ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_LBT_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_lbt_params( const void* context, uint32_t* duration, int16_t* threshold, + uint32_t* bandwidth ) +{ + uint8_t rbuffer[LR1121_MODEM_LBT_PARAMS_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_LBT_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LBT_PARAMS_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LBT_PARAMS_CMD_LENGTH, rbuffer, LR1121_MODEM_LBT_PARAMS_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *duration = lr1121_uint8_to_uint32( rbuffer ); + + *threshold = ( ( uint32_t ) rbuffer[4] << 8 ) + ( ( uint32_t ) rbuffer[5] ); + + *bandwidth = lr1121_uint8_to_uint32( rbuffer + 6 ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_csma_state( const void* context, lr1121_modem_csma_mode_t* enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_CSMA_STATE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_CSMA_STATE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CSMA_STATE_CMD_LENGTH, ( uint8_t* ) enable, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_csma_state( const void* context, const lr1121_modem_csma_mode_t enable ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CSMA_STATE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_CSMA_STATE_CMD, + enable, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_CSMA_STATE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_set_csma_params( const void* context, const uint8_t max_channel_change, + const lr1121_modem_csma_backoff_mode_t backoff_enable, + const uint8_t nb_backoff_max ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CSMA_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_CSMA_PARAMS_CMD, + max_channel_change, + ( uint8_t ) backoff_enable, + nb_backoff_max, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_CSMA_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_csma_params( const void* context, uint8_t* max_channel_change, + uint8_t* backoff_enable, uint8_t* nb_backoff_max ) +{ + uint8_t rbuffer[LR1121_MODEM_CSMA_PARAMS_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_CSMA_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_CSMA_PARAMS_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CSMA_PARAMS_CMD_LENGTH, rbuffer, LR1121_MODEM_CSMA_PARAMS_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *max_channel_change = rbuffer[0]; + *backoff_enable = rbuffer[1]; + *nb_backoff_max = rbuffer[2]; + } + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_mac_request_tx( const void* context, + const lr1121_modem_mac_request_bitmask_t mac_request ) +{ + const uint8_t cbuffer[LR1121_MODEM_LORAWAN_MAC_REQUEST_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_LORAWAN_MAC_REQUEST_CMD, + ( uint8_t ) mac_request, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_LORAWAN_MAC_REQUEST_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_lorawan_mac_time( const void* context, uint32_t* gps_time_sec, + uint32_t* gps_fractionnal_sec ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_LORAWAN_MAC_TIME_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_LORAWAN_MAC_TIME_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LORAWAN_MAC_TIME_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LORAWAN_MAC_TIME_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_LORAWAN_MAC_TIME_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *gps_time_sec = lr1121_uint8_to_uint32( rbuffer ); + *gps_fractionnal_sec = lr1121_uint8_to_uint32( rbuffer + 4 ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_link_check_data( const void* context, uint8_t* margin, + uint8_t* gateway_count ) +{ + uint8_t rbuffer[sizeof( uint16_t )] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_LINK_CHECK_DATA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_LINK_CHECK_DATA_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LINK_CHECK_DATA_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *margin = rbuffer[0]; + *gateway_count = rbuffer[1]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_battery_level( + const void* context, const lr1121_modem_battery_level_source_value_t modem_vs_user, uint8_t value ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_BATTERY_LEVEL_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_BATTERY_LEVEL_CMD, + ( uint8_t ) modem_vs_user, + value, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_BATTERY_LEVEL_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_class_b_ping_slot_periodicity( + const void* context, lr1121_modem_class_b_ping_slot_t* ping_slot_periodicity ) + +{ + const uint8_t cbuffer[LR1121_MODEM_GET_CLASS_B_PING_SLOT_PERIODICITY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_CLASS_B_PING_SLOT_PERIODICITY_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_LINK_CHECK_DATA_CMD_LENGTH, ( uint8_t* ) ping_slot_periodicity, + sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_class_b_ping_slot_periodicity( + const void* context, const lr1121_modem_class_b_ping_slot_t ping_slot_periodicity ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_CLASS_B_PING_SLOT_PERIODICITY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_SET_CLASS_B_PING_SLOT_PERIODICITY_CMD, + ( uint8_t ) ping_slot_periodicity, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_CLASS_B_PING_SLOT_PERIODICITY_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_multicast_group_config( const void* context, const uint8_t mc_group_id, + uint32_t* mc_group_address ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_CMD, + mc_group_id, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_MULTICAST_GROUP_CONFIG_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *mc_group_address = lr1121_uint8_to_uint32( rbuffer ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_multicast_group_config( const void* context, const uint8_t mc_group_id, + const uint32_t mc_group_address, + const uint8_t* mc_nwkskey, + const uint8_t* mc_appskey ) +{ + uint8_t cbuffer[LR1121_MODEM_SET_MULTICAST_GROUP_CONFIG_CMD_LENGTH]; + + cbuffer[0] = ( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ) & 0xFF; + cbuffer[1] = LR1121_MODEM_GROUP_ID_LORAWAN & 0xFF; + cbuffer[2] = LR1121_MODEM_SET_MULTICAST_GROUP_CONFIG_CMD; + + cbuffer[3] = mc_group_id; + + cbuffer[4] = mc_group_address >> 24; + cbuffer[5] = mc_group_address >> 16; + cbuffer[6] = mc_group_address >> 8; + cbuffer[7] = mc_group_address; + + for( uint8_t i = 0; i < LR1121_MODEM_NWKSKEY_LENGTH; i++ ) + { + cbuffer[8 + i] = mc_nwkskey[i]; + } + + for( uint8_t i = 0; i < LR1121_MODEM_APPSKEY_LENGTH; i++ ) + { + cbuffer[24 + i] = mc_appskey[i]; + } + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SET_MULTICAST_GROUP_CONFIG_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_start_session_multicast_class_c( const void* context, + const uint8_t mc_group_id, + const uint32_t downlink_frequency, + const uint8_t downlink_data_rate ) +{ + const uint8_t cbuffer[LR1121_MODEM_START_SESSION_MULTICAST_CLASS_C_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_START_SESSION_MULTICAST_CLASS_C_CMD, + mc_group_id, + downlink_frequency >> 24, + downlink_frequency >> 16, + downlink_frequency >> 8, + downlink_frequency, + downlink_data_rate, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_START_SESSION_MULTICAST_CLASS_C_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_multicast_class_c_session_status( + const void* context, const uint8_t mc_group_id, + lr1121_modem_multicast_class_c_status_t* lr1121_modem_multicast_class_c_status ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_CMD, + mc_group_id, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_MULTICAST_CLASS_C_SESSION_STATUS_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + lr1121_modem_multicast_class_c_status->is_session_started = rbuffer[0]; + lr1121_modem_multicast_class_c_status->downlink_frequency = lr1121_uint8_to_uint32( rbuffer + 1 ); + lr1121_modem_multicast_class_c_status->downlink_datarate = rbuffer[5]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_stop_session_multicast_class_c( const void* context, + const uint8_t mc_group_id ) +{ + const uint8_t cbuffer[LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_C_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_C_CMD, + mc_group_id, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_C_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_stop_all_session_multicast_class_c( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_C_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_C_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_C_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_start_session_multicast_class_b( + const void* context, const uint8_t mc_group_id, const uint32_t downlink_frequency, const uint8_t downlink_data_rate, + const lr1121_modem_class_b_ping_slot_t ping_slot ) +{ + const uint8_t cbuffer[LR1121_MODEM_START_SESSION_MULTICAST_CLASS_B_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_START_SESSION_MULTICAST_CLASS_B_CMD, + mc_group_id, + downlink_frequency >> 24, + downlink_frequency >> 16, + downlink_frequency >> 8, + downlink_frequency, + downlink_data_rate, + ping_slot, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_START_SESSION_MULTICAST_CLASS_B_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_multicast_class_b_session_status( + const void* context, const uint8_t mc_group_id, + lr1121_modem_multicast_class_b_status_t* lr1121_modem_multicast_class_b_status ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_CMD, + mc_group_id, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_CMD_LENGTH, rbuffer, + LR1121_MODEM_GET_MULTICAST_CLASS_B_SESSION_STATUS_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + lr1121_modem_multicast_class_b_status->is_session_started = rbuffer[0]; + lr1121_modem_multicast_class_b_status->downlink_frequency = lr1121_uint8_to_uint32( rbuffer + 1 ); + lr1121_modem_multicast_class_b_status->downlink_datarate = rbuffer[5]; + lr1121_modem_multicast_class_b_status->is_session_waiting_for_beacon = rbuffer[6]; + lr1121_modem_multicast_class_b_status->ping_slot_periodicity = rbuffer[7]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_stop_session_multicast_class_b( const void* context, + const uint8_t mc_group_id ) +{ + const uint8_t cbuffer[LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_B_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_B_CMD, + mc_group_id, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_STOP_SESSION_MULTICAST_CLASS_B_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_stop_all_session_multicast_class_b( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_B_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_B_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_STOP_ALL_SESSION_MULTICAST_CLASS_B_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_alc_sync_start_service( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_START_ALC_SYNC_SERVICE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_START_ALC_SYNC_SERVICE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_START_ALC_SYNC_SERVICE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_alc_sync_stop_service( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_STOP_ALC_SYNC_SERVICE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_STOP_ALC_SYNC_SERVICE_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_STOP_ALC_SYNC_SERVICE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_alc_sync_get_time( const void* context, uint32_t* alc_sync_epoch_time ) +{ + uint8_t rbuffer[LR1121_MODEM_ALC_SYNC_GET_TIME_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_ALC_SYNC_GET_TIME_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_ALC_SYNC_GET_TIME_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_ALC_SYNC_GET_TIME_CMD_LENGTH, rbuffer, + LR1121_MODEM_ALC_SYNC_GET_TIME_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *alc_sync_epoch_time = lr1121_uint8_to_uint32( rbuffer ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_alc_sync_trig_request( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_ALC_SYNC_TRIG_REQUEST_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_ALC_SYNC_TRIG_REQUEST_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_ALC_SYNC_TRIG_REQUEST_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_fuota_get_file_size_crc( const void* context, uint32_t* file_size, + uint32_t* file_crc ) +{ + uint8_t rbuffer[LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_CMD_LENGTH, rbuffer, + LR1121_MODEM_FUOTA_GET_FILE_SIZE_CRC_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *file_size = lr1121_uint8_to_uint32( rbuffer ); + *file_crc = lr1121_uint8_to_uint32( rbuffer + 4 ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_fuota_read_file_fragment( const void* context, uint32_t base_address, + uint16_t fragment_size, uint8_t* fragment ) +{ + const uint8_t cbuffer[LR1121_MODEM_FUOTA_GET_FILE_FRAGMENT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_LORAWAN >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_LORAWAN, + LR1121_MODEM_FUOTA_GET_FILE_FRAGMENT_CMD, + ( uint8_t )( base_address >> 24 ), + ( uint8_t )( base_address >> 16 ), + ( uint8_t )( base_address >> 8 ), + ( uint8_t ) base_address, + 0x00, + 0x00, + ( uint8_t )( fragment_size >> 8 ), + ( uint8_t ) fragment_size, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_FUOTA_GET_FILE_FRAGMENT_CMD_LENGTH, fragment, fragment_size ); +} + +bool lr1121_modem_fuota_check_crc( const uint8_t* file, uint32_t file_size, uint32_t expected_crc ) +{ + uint32_t crc = 0; // This is used as both initial CRC value, and computed CRC value. It is important here to be + // init'd to 0 for the CRC computation + lr1121_modem_fuota_crc32( &crc, file, file_size ); + return ( crc == expected_crc ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ) +{ + return ( ( ( uint32_t ) value[0] ) << 24 ) + ( ( ( uint32_t ) value[1] ) << 16 ) + + ( ( ( uint32_t ) value[2] ) << 8 ) + ( ( ( uint32_t ) value[3] ) ); +} + +void lr1121_modem_fuota_crc32( uint32_t* pcrc, const uint8_t* buf, uint32_t len ) +{ + uint32_t crc = ~( *pcrc ); + while( len-- != 0 ) + { + const uint32_t byte = *buf++; + crc = crc ^ byte; + for( uint8_t i = 0; i < 8; i++ ) + { + const uint32_t mask = -( crc & 1 ); + crc = ( crc >> 1 ) ^ ( 0xEDB88320 & mask ); + } + } + *pcrc = ~crc; +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lr_fhss.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lr_fhss.c new file mode 100755 index 0000000..7dbf678 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_lr_fhss.c @@ -0,0 +1,226 @@ +/*! + * @file lr1121_modem_lr_fhss.c + * + * @brief LR_FHSS driver implementation for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_lr_fhss.h" +#include "lr1121_modem_hal.h" +#include "lr1121_modem_radio.h" +#include "lr1121_modem_radio_types.h" +#include "lr_fhss_v1_base_types.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +#define LR1121_MODEM_LR_FHSS_BUILD_FRAME_LENGTH ( 2 + 9 ) +#define LR1121_MODEM_LR_FHSS_HEADER_BITS ( 114 ) +#define LR1121_MODEM_LR_FHSS_FRAG_BITS ( 48 ) +#define LR1121_MODEM_LR_FHSS_BLOCK_PREAMBLE_BITS ( 2 ) +#define LR1121_MODEM_LR_FHSS_BLOCK_BITS ( LR1121_MODEM_LR_FHSS_FRAG_BITS + LR1121_MODEM_LR_FHSS_BLOCK_PREAMBLE_BITS ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for radio-related operations + */ +enum +{ + LR1121_MODEM_LR_FHSS_BUILD_FRAME_OC = 0x022C, +}; + +/*! + * @brief Hopping enable/disabled enumerations for \ref lr1121_modem_lr_fhss_build_frame + */ +typedef enum +{ + LR1121_MODEM_LR_FHSS_HOPPING_DISABLE = 0x00, + LR1121_MODEM_LR_FHSS_HOPPING_ENABLE = 0x01, +} lr1121_modem_lr_fhss_hopping_configuration_t; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Get the bit count and block count for a LR-FHSS frame + * + * @param [in] params Parameter structure + * @param [in] payload_length Length of physical payload, in bytes + * + * @returns Length of physical payload, in bits + */ + +static uint16_t lr1121_modem_lr_fhss_get_nb_bits( const lr_fhss_v1_params_t* params, uint16_t payload_length ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_lr_fhss_init( const void* context ) +{ + const lr1121_modem_response_code_t set_packet_type_status = + lr1121_modem_radio_set_pkt_type( context, LR1121_MODEM_RADIO_PKT_TYPE_LR_FHSS ); + if( set_packet_type_status != LR1121_MODEM_RESPONSE_CODE_OK ) + { + return set_packet_type_status; + } + + const lr1121_modem_radio_mod_params_lr_fhss_t mod_lr_fhss = { + .br_in_bps = LR1121_MODEM_RADIO_LR_FHSS_BITRATE_488_BPS, + .pulse_shape = LR1121_MODEM_RADIO_LR_FHSS_PULSE_SHAPE_BT_1, + }; + + const lr1121_modem_response_code_t set_modulation_param_status = + lr1121_modem_radio_set_lr_fhss_mod_params( context, &mod_lr_fhss ); + return set_modulation_param_status; +} + +uint16_t lr1121_modem_lr_fhss_get_bit_delay_in_us( const lr1121_modem_lr_fhss_params_t* params, + uint16_t payload_length ) +{ + const uint16_t nb_bits = lr1121_modem_lr_fhss_get_nb_bits( &( params->lr_fhss_params ), payload_length ); + + const uint8_t nb_padding_bits = 1 + ( ( 32768 - nb_bits ) & 0x07 ); + + return 1600 + nb_padding_bits * 2048; +} + +lr1121_modem_response_code_t lr1121_modem_lr_fhss_build_frame( const void* context, + const lr1121_modem_lr_fhss_params_t* lr_fhss_params, + uint16_t hop_sequence_id, const uint8_t* payload, + uint8_t payload_length ) +{ + // Since the build_frame command is last, it is possible to check status through stat1 + + lr1121_modem_response_code_t status = + lr1121_modem_radio_set_lr_fhss_sync_word( context, lr_fhss_params->lr_fhss_params.sync_word ); + if( status != LR1121_MODEM_RESPONSE_CODE_OK ) + { + return status; + } + + const uint8_t cbuffer[LR1121_MODEM_LR_FHSS_BUILD_FRAME_LENGTH] = { + ( uint8_t )( LR1121_MODEM_LR_FHSS_BUILD_FRAME_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_LR_FHSS_BUILD_FRAME_OC >> 0 ), + ( uint8_t ) lr_fhss_params->lr_fhss_params.header_count, + ( uint8_t ) lr_fhss_params->lr_fhss_params.cr, + ( uint8_t ) lr_fhss_params->lr_fhss_params.modulation_type, + ( uint8_t ) lr_fhss_params->lr_fhss_params.grid, + ( uint8_t )( lr_fhss_params->lr_fhss_params.enable_hopping ? LR1121_MODEM_LR_FHSS_HOPPING_ENABLE + : LR1121_MODEM_LR_FHSS_HOPPING_DISABLE ), + ( uint8_t ) lr_fhss_params->lr_fhss_params.bw, + ( uint8_t )( hop_sequence_id >> 8 ), + ( uint8_t )( hop_sequence_id >> 0 ), + ( uint8_t ) lr_fhss_params->device_offset, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_LR_FHSS_BUILD_FRAME_LENGTH, payload, payload_length ); +} + +uint32_t lr1121_modem_lr_fhss_get_time_on_air_in_ms( const lr1121_modem_lr_fhss_params_t* params, + uint16_t payload_length ) +{ + // Multiply by 1000 / 488.28125, or equivalently 256/125, rounding up + return ( ( lr1121_modem_lr_fhss_get_nb_bits( ¶ms->lr_fhss_params, payload_length ) << 8 ) + 124 ) / 125; +} + +unsigned int lr1121_modem_lr_fhss_get_hop_sequence_count( const lr1121_modem_lr_fhss_params_t* lr_fhss_params ) +{ + if( ( lr_fhss_params->lr_fhss_params.grid == LR_FHSS_V1_GRID_25391_HZ ) || + ( ( lr_fhss_params->lr_fhss_params.grid == LR_FHSS_V1_GRID_3906_HZ ) && + ( lr_fhss_params->lr_fhss_params.bw < LR_FHSS_V1_BW_335938_HZ ) ) ) + { + return 384; + } + return 512; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION --------------------------------------------- + */ + +uint16_t lr1121_modem_lr_fhss_get_nb_bits( const lr_fhss_v1_params_t* params, uint16_t payload_length ) +{ + uint16_t length_bits = ( payload_length + 2 ) * 8 + 6; + switch( params->cr ) + { + case LR_FHSS_V1_CR_5_6: + length_bits = ( ( length_bits * 6 ) + 4 ) / 5; + break; + + case LR_FHSS_V1_CR_2_3: + length_bits = length_bits * 3 / 2; + break; + + case LR_FHSS_V1_CR_1_2: + length_bits = length_bits * 2; + break; + + case LR_FHSS_V1_CR_1_3: + length_bits = length_bits * 3; + break; + } + + uint16_t payload_bits = ( length_bits / LR1121_MODEM_LR_FHSS_FRAG_BITS ) * LR1121_MODEM_LR_FHSS_BLOCK_BITS; + uint16_t last_block_bits = length_bits % LR1121_MODEM_LR_FHSS_FRAG_BITS; + if( last_block_bits > 0 ) + { + payload_bits += last_block_bits + 2; + } + + return LR1121_MODEM_LR_FHSS_HEADER_BITS * params->header_count + payload_bits; +} diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_modem.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_modem.c new file mode 100755 index 0000000..13abaaf --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_modem.c @@ -0,0 +1,672 @@ +/*! + * @file lr1121_modem_modem.c + * + * @brief modem driver implementation for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include "lr1121_modem_modem.h" +#include "lr1121_modem_common.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR1121_MODEM_FACTORY_RESET_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_VERSION_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_STATUS_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_CHARGE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_RESET_CHARGE_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_EVENT_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_SUSPEND_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_GET_SUSPEND_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SET_ALARM_TIMER_CMD_LENGTH ( 3 + 4 ) +#define LR1121_MODEM_CLEAR_ALARM_TIMER_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_ALARM_REMAINING_TIME_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_GET_CRASHLOG_CMD_LENGTH ( 3 ) + +#define LR1121_MODEM_TEST_MODE_TST_START_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_TEST_MODE_TST_NOP_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_TEST_MODE_TST_TX_LORA_CMD_LENGTH ( 3 + 25 ) +#define LR1121_MODEM_TEST_MODE_TST_TX_FSK_CMD_LENGTH ( 3 + 15 ) +#define LR1121_MODEM_TEST_MODE_TST_TX_LR_FHSS_CMD_LENGTH ( 3 + 19 ) +#define LR1121_MODEM_TEST_MODE_TST_TX_CONT_CMD_LENGTH ( 3 + 10 ) +#define LR1121_MODEM_TEST_MODE_TST_CW_CMD_LENGTH ( 3 + 6 ) +#define LR1121_MODEM_TEST_MODE_TST_RX_LORA_CONT_CMD_LENGTH ( 3 + 8 ) +#define LR1121_MODEM_TEST_MODE_TST_RX_FSK_CONT_CMD_LENGTH ( 3 + 5 ) +#define LR1121_MODEM_TEST_MODE_TST_READ_PKT_COUNTER_RX_CONT_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_TEST_MODE_TST_RSSI_SUBGHZ_CMD_LENGTH ( 3 + 11 ) +#define LR1121_MODEM_TEST_MODE_TST_RADIO_RST_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_TEST_MODE_TST_EXIT_CMD_LENGTH ( 3 + 1 ) +#define LR1121_MODEM_TEST_MODE_TST_TX_SINGLE_PREAM_CMD_LENGTH ( 3 + 12 ) +#define LR1121_MODEM_TEST_MODE_READ_RSSI_CMD_LENGTH ( 3 + 1 ) + +#define LR1121_MODEM_GET_CHARGE_RBUFFER_LENGTH ( 320 ) +#define LR1121_MODEM_GET_CRASHLOG_RBUFFER_LENGTH ( 243 ) +#define LR1121_MODEM_GET_VERSION_RBUFFER_LENGTH ( 9 ) +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operation code command + */ +enum +{ + LR1121_MODEM_FACTORY_RESET_CMD = 0x00, + LR1121_MODEM_GET_VERSION_CMD = 0x01, + LR1121_MODEM_GET_STATUS_CMD = 0x02, + LR1121_MODEM_GET_CHARGE_CMD = 0x03, + LR1121_MODEM_GET_EVENT_CMD = 0x04, + LR1121_MODEM_TEST_CMD = 0x05, + LR1121_MODEM_GET_SUSPEND_MODEM_COM_CMD = 0x06, + LR1121_MODEM_SET_SUSPEND_MODEM_COM_CMD = 0x07, + LR1121_MODEM_SET_ALARM_TIMER_CMD = 0x08, + LR1121_MODEM_CLEAR_ALARM_TIMER_CMD = 0x09, + LR1121_MODEM_GET_ALARM_REMAINING_TIME_CMD = 0x0A, + LR1121_MODEM_GET_CRASHLOG_CMD = 0x0B, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/*! + * @brief Radio test mode type + */ +typedef enum +{ + LR1121_MODEM_TEST_MODE_TST_START = 0x00, + LR1121_MODEM_TEST_MODE_TST_EXIT = 0x01, + LR1121_MODEM_TEST_MODE_TST_NOP = 0x02, + LR1121_MODEM_TEST_MODE_TST_TX_LORA = 0x03, + LR1121_MODEM_TEST_MODE_TST_TX_FSK = 0x04, + LR1121_MODEM_TEST_MODE_TST_TX_LR_FHSS = 0x05, + LR1121_MODEM_TEST_MODE_TST_TX_CW = 0x06, + LR1121_MODEM_TEST_MODE_TST_RX_LORA_CONT = 0x07, + LR1121_MODEM_TEST_MODE_TST_RX_FSK_CONT = 0x08, + LR1121_MODEM_TEST_MODE_TST_READ_RX_PKT_COUNTER_RX_CONT = 0x09, + LR1121_MODEM_TEST_MODE_TST_RSSI_SUBGHZ = 0x0A, + LR1121_MODEM_TEST_MODE_READ_RSSI = 0x0B, + LR1121_MODEM_TEST_MODE_TST_RADIO_RST = 0x0E, + LR1121_MODEM_TEST_MODE_TST_READ_REGISTER = 0x0F, + LR1121_MODEM_TEST_MODE_TST_WRITE_REGISTER = 0x10, +} lr1121_modem_test_mode_t; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Helper function that convert an array of uint8_t into a uint32_t single value + * + * @warning It is up to the caller to ensure that value points to an array of at least sizeof(uint32_t) elements. + * + * @param [in] value Array of uint8_t to be translated into a uint32_t + * + * @returns 32-bit value + */ +static uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ); + +static void lr1121_parse_charge_hook_id( const uint8_t* buffer, uint8_t hook_id, lr1121_modem_consumption_details_t* hook ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_factory_reset( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_FACTORY_RESET_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_FACTORY_RESET_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write_without_rc( + context, cbuffer, LR1121_MODEM_FACTORY_RESET_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_modem_version( const void* context, + lr1121_modem_version_t* modem_version ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_VERSION_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_VERSION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_VERSION_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_VERSION_CMD_LENGTH, rbuffer, LR1121_MODEM_GET_VERSION_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + modem_version->use_case = rbuffer[0]; + modem_version->modem_major = rbuffer[1]; + modem_version->modem_minor = rbuffer[2]; + modem_version->modem_patch = rbuffer[3]; + modem_version->lbm_major = rbuffer[5]; + modem_version->lbm_minor = rbuffer[6]; + modem_version->lbm_patch = rbuffer[7]; + } + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_status( const void* context, + lr1121_modem_lorawan_status_bitmask_t* status ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_STATUS_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( context, cbuffer, LR1121_MODEM_GET_STATUS_CMD_LENGTH, + ( uint8_t* ) status, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_get_charge( const void* context, lr1121_modem_charge_t* charge ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_CHARGE_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_CHARGE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_CHARGE_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CHARGE_CMD_LENGTH, rbuffer, LR1121_MODEM_GET_CHARGE_RBUFFER_LENGTH ); + + lr1121_parse_charge_hook_id( rbuffer, 0, &charge->suspend ); + lr1121_parse_charge_hook_id( rbuffer, 1, &charge->class_b_beacon ); + lr1121_parse_charge_hook_id( rbuffer, 2, &charge->lr1mac_stack ); + lr1121_parse_charge_hook_id( rbuffer, 3, &charge->lbt ); + lr1121_parse_charge_hook_id( rbuffer, 4, &charge->cad ); + lr1121_parse_charge_hook_id( rbuffer, 5, &charge->class_b_ping_slot ); + lr1121_parse_charge_hook_id( rbuffer, 6, &charge->test_mode ); + lr1121_parse_charge_hook_id( rbuffer, 7, &charge->direct_rp_access ); + lr1121_parse_charge_hook_id( rbuffer, 8, &charge->relay_tx ); + lr1121_parse_charge_hook_id( rbuffer, 9, &charge->class_c ); + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_event( const void* context, lr1121_modem_event_fields_t* event_fields ) +{ + uint8_t rbuffer[sizeof( uint32_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_EVENT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_EVENT_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_EVENT_CMD_LENGTH, rbuffer, sizeof( uint32_t ) ); + + event_fields->event_type = ( lr1121_modem_lorawan_event_type_t ) rbuffer[0]; + event_fields->missed_events_count = rbuffer[1]; + event_fields->data = ( ( uint16_t ) rbuffer[2] << 8 ) + ( ( uint16_t ) rbuffer[3] ); + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_set_suspend( const void* context, const lr1121_modem_suspend_t suspend ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_SUSPEND_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_SET_SUSPEND_MODEM_COM_CMD, + suspend, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_SUSPEND_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_suspend( const void* context, lr1121_modem_suspend_t* suspend ) +{ + const uint8_t cbuffer[LR1121_MODEM_GET_SUSPEND_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_SUSPEND_MODEM_COM_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_SUSPEND_CMD_LENGTH, ( uint8_t* ) suspend, sizeof( uint8_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_set_alarm_timer( const void* context, uint32_t seconds ) +{ + const uint8_t cbuffer[LR1121_MODEM_SET_ALARM_TIMER_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_SET_ALARM_TIMER_CMD, + ( uint8_t )( seconds >> 24 ), + ( uint8_t )( seconds >> 16 ), + ( uint8_t )( seconds >> 8 ), + ( uint8_t ) seconds, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SET_ALARM_TIMER_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_clear_alarm_timer( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_CLEAR_ALARM_TIMER_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_CLEAR_ALARM_TIMER_CMD, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_CLEAR_ALARM_TIMER_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_get_alarm_remaining_time( const void* context, uint32_t* remaining_time ) +{ + uint8_t rbuffer[sizeof( uint32_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_ALARM_REMAINING_TIME_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_ALARM_REMAINING_TIME_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_ALARM_REMAINING_TIME_CMD_LENGTH, rbuffer, sizeof( uint32_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *remaining_time = ( ( uint32_t ) rbuffer[0] << 24 ) + ( ( uint32_t ) rbuffer[1] << 16 ) + + ( ( uint32_t ) rbuffer[2] << 8 ) + ( ( uint32_t ) rbuffer[3] ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_get_crashlog( const void* context, lr1121_modem_crashlog_status_t* status, + uint8_t* crashlog ) +{ + uint8_t rbuffer[LR1121_MODEM_GET_CRASHLOG_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_GET_CRASHLOG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_GET_CRASHLOG_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_GET_CRASHLOG_CMD_LENGTH, rbuffer, LR1121_MODEM_GET_CRASHLOG_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *status = ( lr1121_modem_crashlog_status_t ) rbuffer[0]; + + for( uint8_t i = 0; i < LR1121_MODEM_GET_CRASHLOG_RBUFFER_LENGTH - 1; i++ ) + { + crashlog[i] = rbuffer[1 + i]; + } + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_test_mode_start( const void* context ) +{ + const uint8_t test_msg[8] = { 'T', 'E', 'S', 'T', 'T', 'E', 'S', 'T' }; + + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_START_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_START, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_START_CMD_LENGTH, test_msg, 8 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_exit( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_EXIT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_EXIT, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_TEST_MODE_TST_EXIT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_nop( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_NOP_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_NOP, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_TEST_MODE_TST_NOP_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_tx_lora( + const void* context, uint32_t frequency, int8_t tx_power, uint8_t payload_length, + lr1121_modem_tst_mode_lora_sf_t sf, lr1121_modem_tst_mode_lora_bw_t bw, lr1121_modem_tst_mode_lora_cr_t cr, + bool is_iq_inverted, bool is_crc_enabled, lr1121_modem_tst_mode_lora_packet_header_mode_t header_mode, + uint32_t preamble_length, uint32_t number_of_tx, uint32_t delay_ms ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_TX_LORA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_TX_LORA, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t ) tx_power, + payload_length, + ( uint8_t ) sf, + ( uint8_t ) bw, + ( uint8_t ) cr, + ( uint8_t )( is_iq_inverted ? 0x01 : 0x00 ), + ( uint8_t )( is_crc_enabled ? 0x01 : 0x00 ), + ( uint8_t ) header_mode, + ( uint8_t )( preamble_length >> 24 ), + ( uint8_t )( preamble_length >> 16 ), + ( uint8_t )( preamble_length >> 8 ), + ( uint8_t ) preamble_length, + ( uint8_t )( number_of_tx >> 24 ), + ( uint8_t )( number_of_tx >> 16 ), + ( uint8_t )( number_of_tx >> 8 ), + ( uint8_t ) number_of_tx, + ( uint8_t )( delay_ms >> 24 ), + ( uint8_t )( delay_ms >> 16 ), + ( uint8_t )( delay_ms >> 8 ), + ( uint8_t ) delay_ms, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_TX_LORA_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_tx_fsk( const void* context, uint32_t frequency, int8_t tx_power, + uint8_t payload_length, uint32_t number_of_tx, + uint32_t delay_ms ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_TX_FSK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_TX_FSK, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t ) tx_power, + payload_length, + ( uint8_t )( number_of_tx >> 24 ), + ( uint8_t )( number_of_tx >> 16 ), + ( uint8_t )( number_of_tx >> 8 ), + ( uint8_t ) number_of_tx, + ( uint8_t )( delay_ms >> 24 ), + ( uint8_t )( delay_ms >> 16 ), + ( uint8_t )( delay_ms >> 8 ), + ( uint8_t ) delay_ms, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_TX_FSK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_tx_lr_fhss( const void* context, uint32_t frequency, int8_t tx_power, + uint8_t payload_length, + lr1121_modem_tst_mode_lr_fhss_grid_t grid, + lr1121_modem_tst_mode_lr_fhss_bw_t bw, + lr1121_modem_tst_mode_lr_fhss_cr_t cr, uint32_t number_of_tx, + uint32_t delay_ms, bool is_hopping_enabled ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_TX_LR_FHSS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_TX_LR_FHSS, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t ) tx_power, + payload_length, + ( uint8_t ) grid, + ( uint8_t ) bw, + ( uint8_t ) cr, + ( uint8_t )( number_of_tx >> 24 ), + ( uint8_t )( number_of_tx >> 16 ), + ( uint8_t )( number_of_tx >> 8 ), + ( uint8_t ) number_of_tx, + ( uint8_t )( delay_ms >> 24 ), + ( uint8_t )( delay_ms >> 16 ), + ( uint8_t )( delay_ms >> 8 ), + ( uint8_t ) delay_ms, + is_hopping_enabled ? 0x01 : 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_TX_LR_FHSS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_tx_cw( const void* context, uint32_t frequency, int8_t tx_power ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_CW_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_TX_CW, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t ) tx_power, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_TEST_MODE_TST_CW_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_rx_lora_cont( const void* context, uint32_t frequency, + lr1121_modem_tst_mode_lora_sf_t sf, + lr1121_modem_tst_mode_lora_bw_t bw, + lr1121_modem_tst_mode_lora_cr_t cr ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_RX_LORA_CONT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_RX_LORA_CONT, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t ) sf, + ( uint8_t ) bw, + ( uint8_t ) cr, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_RX_LORA_CONT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_rx_fsk_cont( const void* context, uint32_t frequency ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_RX_FSK_CONT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_RX_FSK_CONT, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_RX_FSK_CONT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_read_packet_counter_rx_cont( const void* context, + uint32_t* rx_packet_counter ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_READ_PKT_COUNTER_RX_CONT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_READ_RX_PKT_COUNTER_RX_CONT, + }; + + uint8_t rbuffer[sizeof( uint32_t )] = { 0 }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_READ_PKT_COUNTER_RX_CONT_CMD_LENGTH, rbuffer, sizeof( uint32_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *rx_packet_counter = ( ( uint32_t ) rbuffer[0] << 24 ) + ( ( uint32_t ) rbuffer[1] << 16 ) + + ( ( uint32_t ) rbuffer[2] << 8 ) + ( ( uint32_t ) rbuffer[3] ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_test_rssi_subghz( const void* context, uint32_t frequency, uint16_t time_ms, + uint32_t bw_hz ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_RSSI_SUBGHZ_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_RSSI_SUBGHZ, + ( uint8_t )( ( frequency & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( frequency & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( frequency & 0x0000FF00 ) >> 8 ), + ( uint8_t )( frequency & 0x000000FF ), + ( uint8_t )( time_ms >> 8 ), + ( uint8_t )( time_ms ), + ( uint8_t )( ( bw_hz & 0xFF000000 ) >> 24 ), + ( uint8_t )( ( bw_hz & 0x00FF0000 ) >> 16 ), + ( uint8_t )( ( bw_hz & 0x0000FF00 ) >> 8 ), + ( uint8_t )( bw_hz & 0x000000FF ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_RSSI_SUBGHZ_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_test_read_rssi( const void* context, int16_t* rssi ) +{ + uint8_t rbuffer[sizeof( uint8_t )] = { 0x00 }; + + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_READ_RSSI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_READ_RSSI, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_TEST_MODE_READ_RSSI_CMD_LENGTH, rbuffer, sizeof( uint8_t ) ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *rssi = ( int16_t )( ( int8_t ) rbuffer[0] - 64 ); + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_test_radio_rst( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_TEST_MODE_TST_RADIO_RST_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_MODEM >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_MODEM, + LR1121_MODEM_TEST_CMD, + LR1121_MODEM_TEST_MODE_TST_RADIO_RST, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_TEST_MODE_TST_RADIO_RST_CMD_LENGTH, 0, 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ) +{ + return ( ( ( uint32_t ) value[0] ) << 24 ) + ( ( ( uint32_t ) value[1] ) << 16 ) + + ( ( ( uint32_t ) value[2] ) << 8 ) + ( ( ( uint32_t ) value[3] ) ); +} + +void lr1121_parse_charge_hook_id( const uint8_t* buffer, uint8_t hook_id, lr1121_modem_consumption_details_t* hook ) +{ + hook->tx_last_toa_ms = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 0 ); + hook->rx_last_toa_ms = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 4 ); + hook->tx_cumulated_toa_ms = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 8 ); + hook->rx_cumulated_toa_ms = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 12 ); + hook->none_consumption_ms = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 16 ); + hook->tx_consumption_ma = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 20 ); + hook->rx_consumption_ma = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 24 ); + hook->none_consumption_ma = lr1121_uint8_to_uint32( buffer + 32 * hook_id + 28 ); +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio.c new file mode 100755 index 0000000..063d20a --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio.c @@ -0,0 +1,1303 @@ +/*! + * @file lr1121_modem_radio.c + * + * @brief Radio driver implementation for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_radio.h" +#include "lr1121_modem_regmem.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR1121_MODEM_RADIO_RESET_STATS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_GET_STATS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_GET_PKT_TYPE_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_GET_PKT_STATUS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_GET_RSSI_INST_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH ( 2 + LR1121_MODEM_RADIO_GFSK_SYNC_WORD_LENGTH ) +#define LR1121_MODEM_RADIO_SET_LORA_PUBLIC_NETWORK_CMD_LENGTH ( 2 + 8 ) +#define LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH ( 2 + 0 ) +#define LR1121_MODEM_RADIO_SET_RX_CMD_LENGTH ( 2 + 3 ) +#define LR1121_MODEM_RADIO_SET_TX_CMD_LENGTH ( 2 + 3 ) +#define LR1121_MODEM_RADIO_SET_RF_FREQUENCY_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_RADIO_SET_AUTO_TX_RX_CMD_LENGTH ( 2 + 7 ) +#define LR1121_MODEM_RADIO_SET_CAD_PARAMS_CMD_LENGTH ( 2 + 7 ) +#define LR1121_MODEM_RADIO_SET_PKT_TYPE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH ( 2 + 10 ) +#define LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH ( 2 + 5 ) +#define LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH ( 2 + 5 ) +#define LR1121_MODEM_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH ( 2 + 9 ) +#define LR1121_MODEM_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH ( 2 + 7 ) +#define LR1121_MODEM_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH ( 2 + 6 ) +#define LR1121_MODEM_RADIO_SET_TX_PARAMS_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_RADIO_SET_PKT_ADDRESS_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH ( 2 + 7 ) +#define LR1121_MODEM_RADIO_SET_PA_CFG_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_SET_CAD_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_SET_TX_CW_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH ( 2 + 8 ) +#define LR1121_MODEM_RADIO_SET_GFSK_WHITENING_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_RADIO_SET_RX_BOOSTED_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_LENGTH ( 2 + 11 ) +#define LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_GET_LORA_RX_INFO_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH ( 2 + 1 ) + +/** + * @brief Internal RTC frequency + */ +#define LR1121_MODEM_RTC_FREQ_IN_HZ 32768UL + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for radio-related operations + */ +enum +{ + LR1121_MODEM_RADIO_RESET_STATS_OC = 0x0200, + LR1121_MODEM_RADIO_GET_STATS_OC = 0x0201, + LR1121_MODEM_RADIO_GET_PKT_TYPE_OC = 0x0202, + LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_OC = 0x0203, + LR1121_MODEM_RADIO_GET_PKT_STATUS_OC = 0x0204, + LR1121_MODEM_RADIO_GET_RSSI_INST_OC = 0x0205, + LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_OC = 0x0206, + LR1121_MODEM_RADIO_SET_LORA_PUBLIC_NETWORK_OC = 0x0208, + LR1121_MODEM_RADIO_SET_RX_OC = 0x0209, + LR1121_MODEM_RADIO_SET_TX_OC = 0x020A, + LR1121_MODEM_RADIO_SET_RF_FREQUENCY_OC = 0x020B, + LR1121_MODEM_RADIO_AUTOTXRX_OC = 0x020C, + LR1121_MODEM_RADIO_SET_CAD_PARAMS_OC = 0x020D, + LR1121_MODEM_RADIO_SET_PKT_TYPE_OC = 0x020E, + LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC = 0x020F, + LR1121_MODEM_RADIO_SET_PKT_PARAM_OC = 0x0210, + LR1121_MODEM_RADIO_SET_TX_PARAMS_OC = 0x0211, + LR1121_MODEM_RADIO_SET_PKT_ADRS_OC = 0x0212, + LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_OC = 0x0213, + LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_OC = 0x0214, + LR1121_MODEM_RADIO_SET_PA_CFG_OC = 0x0215, + LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC = 0x0217, + LR1121_MODEM_RADIO_SET_CAD_OC = 0x0218, + LR1121_MODEM_RADIO_SET_TX_CW_OC = 0x0219, + LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_OC = 0x021A, + LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_OC = 0x021B, + LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_OC = 0x0224, + LR1121_MODEM_RADIO_SET_GFSK_WHITENING_PARAMS_OC = 0x0225, + LR1121_MODEM_RADIO_SET_RX_BOOSTED_OC = 0x0227, + LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_OC = 0x0229, + LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_OC = 0x022B, + LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_OC = 0x022D, + LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC = 0x022E, + LR1121_MODEM_RADIO_GET_LORA_RX_INFO_OC = 0x0230, + LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC = 0x0231, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Get the CRC length in byte from the corresponding GFSK radio parameter + * + * @param [in] crc_type GFSK CRC parameter + * + * @returns CRC length in byte + */ +static inline uint32_t lr1121_modem_radio_get_gfsk_crc_len_in_bytes( lr1121_modem_radio_gfsk_crc_type_t crc_type ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_radio_reset_stats( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_RESET_STATS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_RESET_STATS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_RESET_STATS_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_RESET_STATS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_stats( const void* context, + lr1121_modem_radio_stats_gfsk_t* stats ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_STATS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_STATS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_STATS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( lr1121_modem_radio_stats_gfsk_t )] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_STATS_CMD_LENGTH, rbuffer, sizeof( lr1121_modem_radio_stats_gfsk_t ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + stats->nb_pkt_received = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + stats->nb_pkt_crc_error = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + stats->nb_pkt_len_error = ( ( uint16_t ) rbuffer[4] << 8 ) + ( uint16_t ) rbuffer[5]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_stats( const void* context, + lr1121_modem_radio_stats_lora_t* stats ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_STATS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_STATS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_STATS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( lr1121_modem_radio_stats_lora_t )] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_STATS_CMD_LENGTH, rbuffer, sizeof( lr1121_modem_radio_stats_lora_t ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + stats->nb_pkt_received = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + stats->nb_pkt_crc_error = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + stats->nb_pkt_header_error = ( ( uint16_t ) rbuffer[4] << 8 ) + ( uint16_t ) rbuffer[5]; + stats->nb_pkt_falsesync = ( ( uint16_t ) rbuffer[6] << 8 ) + ( uint16_t ) rbuffer[7]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_pkt_type( const void* context, + lr1121_modem_radio_pkt_type_t* pkt_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_PKT_TYPE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_TYPE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_TYPE_OC >> 0 ), + }; + uint8_t pkt_type_raw = 0; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_PKT_TYPE_CMD_LENGTH, &pkt_type_raw, 1 ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *pkt_type = ( lr1121_modem_radio_pkt_type_t ) pkt_type_raw; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_rx_buffer_status( + const void* context, lr1121_modem_radio_rx_buffer_status_t* rx_buffer_status ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( *rx_buffer_status )] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH, rbuffer, sizeof( *rx_buffer_status ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + rx_buffer_status->pld_len_in_bytes = rbuffer[0]; + rx_buffer_status->buffer_start_pointer = rbuffer[1]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_pkt_status( const void* context, + lr1121_modem_radio_pkt_status_gfsk_t* pkt_status ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_PKT_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_STATUS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[4] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_PKT_STATUS_CMD_LENGTH, rbuffer, 4 ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + pkt_status->rssi_sync_in_dbm = -( int8_t )( rbuffer[0] >> 1 ); + pkt_status->rssi_avg_in_dbm = -( int8_t )( rbuffer[1] >> 1 ); + pkt_status->rx_len_in_bytes = rbuffer[2]; + pkt_status->is_addr_err = ( ( rbuffer[3] & 0x20 ) != 0 ) ? true : false; + pkt_status->is_crc_err = ( ( rbuffer[3] & 0x10 ) != 0 ) ? true : false; + pkt_status->is_len_err = ( ( rbuffer[3] & 0x08 ) != 0 ) ? true : false; + pkt_status->is_abort_err = ( ( rbuffer[3] & 0x04 ) != 0 ) ? true : false; + pkt_status->is_received = ( ( rbuffer[3] & 0x02 ) != 0 ) ? true : false; + pkt_status->is_sent = ( ( rbuffer[3] & 0x01 ) != 0 ) ? true : false; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_pkt_status( const void* context, + lr1121_modem_radio_pkt_status_lora_t* pkt_status ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_PKT_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_STATUS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_PKT_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[3] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_PKT_STATUS_CMD_LENGTH, rbuffer, 3 ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + pkt_status->rssi_pkt_in_dbm = -( int8_t )( rbuffer[0] >> 1 ); + pkt_status->snr_pkt_in_db = ( ( ( int8_t ) rbuffer[1] ) + 2 ) >> 2; + pkt_status->signal_rssi_pkt_in_dbm = -( int8_t )( rbuffer[2] >> 1 ); + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_rssi_inst( const void* context, int8_t* rssi_in_dbm ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_RSSI_INST_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_RSSI_INST_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_RSSI_INST_OC >> 0 ), + }; + uint8_t rssi = 0; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_RSSI_INST_CMD_LENGTH, &rssi, sizeof( rssi ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *rssi_in_dbm = -( int8_t )( rssi >> 1 ); + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_sync_word( + const void* context, const uint8_t gfsk_sync_word[LR1121_MODEM_RADIO_GFSK_SYNC_WORD_LENGTH] ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_OC >> 0 ), + gfsk_sync_word[0], + gfsk_sync_word[1], + gfsk_sync_word[2], + gfsk_sync_word[3], + gfsk_sync_word[4], + gfsk_sync_word[5], + gfsk_sync_word[6], + gfsk_sync_word[7], + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_word( const void* context, const uint8_t sync_word ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_OC >> 0 ), + sync_word, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_public_network( + const void* context, const lr1121_modem_radio_lora_network_type_t network_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_LORA_PUBLIC_NETWORK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_PUBLIC_NETWORK_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_PUBLIC_NETWORK_OC >> 0 ), + ( uint8_t ) network_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lr_fhss_sync_word( + const void* context, const uint8_t sync_word[LR1121_MODEM_RADIO_LR_FHSS_SYNC_WORD_LENGTH] ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH, sync_word, + LR1121_MODEM_RADIO_LR_FHSS_SYNC_WORD_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx( const void* context, const uint32_t timeout_in_ms ) +{ + const uint32_t timeout_in_rtc_step = lr1121_modem_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr1121_modem_radio_set_rx_with_timeout_in_rtc_step( context, timeout_in_rtc_step ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_and_lna_mode( const void* context, const uint32_t timeout_in_ms, + lr1121_modem_radio_lna_mode_t lna_mode ) +{ + const uint32_t timeout_in_rtc_step = lr1121_modem_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( context, timeout_in_rtc_step, lna_mode ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_with_timeout_in_rtc_step( const void* context, + const uint32_t timeout_in_ms ) +{ + return lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( + context, timeout_in_ms, LR1121_MODEM_RADIO_LNA_MODE_DIFFERENTIAL_LF0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( + const void* context, const uint32_t timeout, lr1121_modem_radio_lna_mode_t lna_mode ) +{ + lr1121_modem_response_code_t status = LR1121_MODEM_RESPONSE_CODE_NOT_INITIALIZED; + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RX_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_OC >> 0 ), + ( uint8_t )( timeout >> 16 ), + ( uint8_t )( timeout >> 8 ), + ( uint8_t )( timeout >> 0 ), + }; + + do + { + status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_RX_CMD_LENGTH, 0, 0 ); + if( status != LR1121_MODEM_RESPONSE_CODE_OK ) + { + break; + } + + if( ( lna_mode == LR1121_MODEM_RADIO_LNA_MODE_SINGLE_RFI_P_LF0 ) || + ( lna_mode == LR1121_MODEM_RADIO_LNA_MODE_SINGLE_RFI_N_LF0 ) ) + { + status = lr1121_modem_radio_set_lna_mode( context, lna_mode ); + if( status != LR1121_MODEM_RESPONSE_CODE_OK ) + { + break; + } + } + + } while( 0 ); + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_tx( const void* context, const uint32_t timeout_in_ms ) +{ + const uint32_t timeout_in_rtc_step = lr1121_modem_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr1121_modem_radio_set_tx_with_timeout_in_rtc_step( context, timeout_in_rtc_step ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_with_timeout_in_rtc_step( const void* context, + const uint32_t timeout_in_rtc_step ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_TX_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_OC >> 8 ), ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_OC >> 0 ), + ( uint8_t )( timeout_in_rtc_step >> 16 ), ( uint8_t )( timeout_in_rtc_step >> 8 ), + ( uint8_t )( timeout_in_rtc_step >> 0 ), + }; + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_TX_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rf_freq( const void* context, const uint32_t freq_in_hz ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RF_FREQUENCY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RF_FREQUENCY_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RF_FREQUENCY_OC >> 0 ), + ( uint8_t )( freq_in_hz >> 24 ), + ( uint8_t )( freq_in_hz >> 16 ), + ( uint8_t )( freq_in_hz >> 8 ), + ( uint8_t )( freq_in_hz >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_RF_FREQUENCY_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_auto_tx_rx( + const void* context, const uint32_t delay, const lr1121_modem_radio_intermediary_mode_t intermediary_mode, + const uint32_t timeout ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_AUTO_TX_RX_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_AUTOTXRX_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_AUTOTXRX_OC >> 0 ), + ( uint8_t )( delay >> 16 ), + ( uint8_t )( delay >> 8 ), + ( uint8_t )( delay ), + ( uint8_t ) intermediary_mode, + ( uint8_t )( timeout >> 16 ), + ( uint8_t )( timeout >> 8 ), + ( uint8_t )( timeout ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_AUTO_TX_RX_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_cad_params( const void* context, + const lr1121_modem_radio_cad_params_t* cad_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_CAD_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_CAD_PARAMS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_CAD_PARAMS_OC >> 0 ), + cad_params->cad_symb_nb, + cad_params->cad_detect_peak, + cad_params->cad_detect_min, + ( uint8_t ) cad_params->cad_exit_mode, + ( uint8_t )( cad_params->cad_timeout >> 16 ), + ( uint8_t )( cad_params->cad_timeout >> 8 ), + ( uint8_t )( cad_params->cad_timeout ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_CAD_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_pkt_type( const void* context, + const lr1121_modem_radio_pkt_type_t pkt_type ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PKT_TYPE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_TYPE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_TYPE_OC >> 0 ), + ( uint8_t ) pkt_type, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_PKT_TYPE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_mod_params( + const void* context, const lr1121_modem_radio_mod_params_gfsk_t* mod_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t )( mod_params->br_in_bps >> 24 ), + ( uint8_t )( mod_params->br_in_bps >> 16 ), + ( uint8_t )( mod_params->br_in_bps >> 8 ), + ( uint8_t )( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + ( uint8_t ) mod_params->bw_dsb_param, + ( uint8_t )( mod_params->fdev_in_hz >> 24 ), + ( uint8_t )( mod_params->fdev_in_hz >> 16 ), + ( uint8_t )( mod_params->fdev_in_hz >> 8 ), + ( uint8_t )( mod_params->fdev_in_hz >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_bpsk_mod_params( + const void* context, const lr1121_modem_radio_mod_params_bpsk_t* mod_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t )( mod_params->br_in_bps >> 24 ), + ( uint8_t )( mod_params->br_in_bps >> 16 ), + ( uint8_t )( mod_params->br_in_bps >> 8 ), + ( uint8_t )( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_mod_params( + const void* context, const lr1121_modem_radio_mod_params_lora_t* mod_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t ) mod_params->sf, + ( uint8_t ) mod_params->bw, + ( uint8_t ) mod_params->cr, + ( uint8_t ) mod_params->ldro, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lr_fhss_mod_params( + const void* radio, const lr1121_modem_radio_mod_params_lr_fhss_t* mod_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t )( mod_params->br_in_bps >> 24 ), + ( uint8_t )( mod_params->br_in_bps >> 16 ), + ( uint8_t )( mod_params->br_in_bps >> 8 ), + ( uint8_t )( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + radio, cbuffer, LR1121_MODEM_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_gfsk_t* pkt_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 0 ), + ( uint8_t )( pkt_params->preamble_len_in_bits >> 8 ), + ( uint8_t )( pkt_params->preamble_len_in_bits >> 0 ), + ( uint8_t )( pkt_params->preamble_detector ), + pkt_params->sync_word_len_in_bits, + ( uint8_t )( pkt_params->address_filtering ), + ( uint8_t )( pkt_params->header_type ), + pkt_params->pld_len_in_bytes, + ( uint8_t )( pkt_params->crc_type ), + ( uint8_t )( pkt_params->dc_free ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_bpsk_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_bpsk_t* pkt_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 0 ), + pkt_params->pld_len_in_bytes, + ( uint8_t )( pkt_params->ramp_up_delay >> 8 ), + ( uint8_t )( pkt_params->ramp_up_delay >> 0 ), + ( uint8_t )( pkt_params->ramp_down_delay >> 8 ), + ( uint8_t )( pkt_params->ramp_down_delay >> 0 ), + ( uint8_t )( pkt_params->pld_len_in_bits >> 8 ), + ( uint8_t )( pkt_params->pld_len_in_bits >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_pkt_params( + const void* context, const lr1121_modem_radio_pkt_params_lora_t* pkt_params ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_PARAM_OC >> 0 ), + ( uint8_t )( pkt_params->preamble_len_in_symb >> 8 ), + ( uint8_t )( pkt_params->preamble_len_in_symb >> 0 ), + ( uint8_t )( pkt_params->header_type ), + pkt_params->pld_len_in_bytes, + ( uint8_t )( pkt_params->crc ), + ( uint8_t )( pkt_params->iq ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_params( const void* context, const int8_t pwr_in_dbm, + const lr1121_modem_radio_ramp_time_t ramp_time ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_TX_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_PARAMS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_PARAMS_OC >> 0 ), + ( uint8_t ) pwr_in_dbm, + ( uint8_t ) ramp_time, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_TX_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_pkt_address( const void* context, const uint8_t node_address, + const uint8_t broadcast_address ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PKT_ADDRESS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_ADRS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PKT_ADRS_OC >> 0 ), + node_address, + broadcast_address, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_PKT_ADDRESS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_tx_fallback_mode( + const void* context, const lr1121_modem_radio_fallback_modes_t fallback_mode ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_OC >> 0 ), + fallback_mode, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_duty_cycle( const void* context, const uint32_t rx_period_in_ms, + const uint32_t sleep_period_in_ms, + const lr1121_modem_radio_rx_duty_cycle_mode_t mode ) +{ + const uint32_t rx_period_in_rtc_step = lr1121_modem_radio_convert_time_in_ms_to_rtc_step( rx_period_in_ms ); + const uint32_t sleep_period_in_rtc_step = lr1121_modem_radio_convert_time_in_ms_to_rtc_step( sleep_period_in_ms ); + + return lr1121_modem_radio_set_rx_duty_cycle_with_timings_in_rtc_step( context, rx_period_in_rtc_step, + sleep_period_in_rtc_step, mode ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rx_duty_cycle_with_timings_in_rtc_step( + const void* context, const uint32_t rx_period_in_rtc_step, const uint32_t sleep_period_in_rtc_step, + const lr1121_modem_radio_rx_duty_cycle_mode_t mode ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_OC >> 0 ), + ( uint8_t )( rx_period_in_rtc_step >> 16 ), + ( uint8_t )( rx_period_in_rtc_step >> 8 ), + ( uint8_t )( rx_period_in_rtc_step >> 0 ), + ( uint8_t )( sleep_period_in_rtc_step >> 16 ), + ( uint8_t )( sleep_period_in_rtc_step >> 8 ), + ( uint8_t )( sleep_period_in_rtc_step >> 0 ), + ( uint8_t ) mode, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_pa_cfg( const void* context, + const lr1121_modem_radio_pa_cfg_t* pa_cfg ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_PA_CFG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_PA_CFG_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_PA_CFG_OC >> 0 ), + ( uint8_t ) pa_cfg->pa_sel, + ( uint8_t ) pa_cfg->pa_reg_supply, + pa_cfg->pa_duty_cycle, + pa_cfg->pa_hp_sel, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_PA_CFG_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_stop_timeout_on_preamble( const void* context, + const bool stop_timeout_on_preamble ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC >> 0 ), + ( uint8_t ) stop_timeout_on_preamble, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_cad( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_CAD_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_CAD_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_CAD_OC >> 0 ), + }; + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_CAD_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_cw( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_TX_CW_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_CW_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_CW_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_TX_CW_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_tx_infinite_preamble( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_OC >> 0 ), + }; + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_timeout( const void* context, const uint16_t nb_symbol ) +{ + if( nb_symbol <= 255 ) + { + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 0 ), + nb_symbol, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH, 0, 0 ); + } + else + { + uint8_t exp; + uint8_t mant; + + lr1121_modem_radio_convert_nb_symb_to_mant_exp( nb_symbol, &mant, &exp ); + + return lr1121_modem_radio_set_lora_sync_timeout_with_mantissa_exponent( context, mant, exp ); + } +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lora_sync_timeout_with_mantissa_exponent( const void* context, + const uint8_t mantissa, + const uint8_t exponent ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 0 ), + mantissa << 3 | exponent, + 0x01, + }; + + if( ( mantissa > 31 ) || ( exponent > 7 ) ) + { + return LR1121_MODEM_RESPONSE_CODE_INVALID; + } + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_crc_params( const void* context, const uint32_t seed, + const uint32_t polynomial ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_OC >> 0 ), + ( uint8_t )( seed >> 24 ), + ( uint8_t )( seed >> 16 ), + ( uint8_t )( seed >> 8 ), + ( uint8_t )( seed >> 0 ), + ( uint8_t )( polynomial >> 24 ), + ( uint8_t )( polynomial >> 16 ), + ( uint8_t )( polynomial >> 8 ), + ( uint8_t )( polynomial >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_gfsk_whitening_seed( const void* context, const uint16_t seed ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_GFSK_WHITENING_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_WHITENING_PARAMS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_GFSK_WHITENING_PARAMS_OC >> 0 ), + ( uint8_t )( seed >> 8 ), + ( uint8_t )( seed >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_GFSK_WHITENING_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_cfg_rx_boosted( const void* context, const bool enable_boost_mode ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RX_BOOSTED_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_BOOSTED_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RX_BOOSTED_OC >> 0 ), + ( enable_boost_mode == true ) ? 0x01 : 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_RADIO_SET_RX_BOOSTED_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_rssi_calibration( + const void* context, const lr1121_modem_radio_rssi_calibration_table_t* rssi_cal_table ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_OC >> 0 ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g5 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g4 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g7 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g6 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g9 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g8 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g11 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g10 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g13 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g12 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g13hp2 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp1 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g13hp4 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp3 & 0x0F ) ), + ( uint8_t )( ( ( rssi_cal_table->gain_tune.g13hp6 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp5 & 0x0F ) ), + ( uint8_t )( rssi_cal_table->gain_tune.g13hp7 & 0x0F ), + ( uint8_t )( rssi_cal_table->gain_offset >> 8 ), + ( uint8_t )( rssi_cal_table->gain_offset >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RADIO_SET_RSSI_CALIBRATION_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_gfsk_rx_bandwidth( uint32_t bw_in_hz, + lr1121_modem_radio_gfsk_bw_t* bw_parameter ) +{ + if( bw_in_hz <= 4800 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_4800; + } + else if( bw_in_hz <= 5800 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_5800; + } + else if( bw_in_hz <= 7300 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_7300; + } + else if( bw_in_hz <= 9700 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_9700; + } + else if( bw_in_hz <= 11700 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_11700; + } + else if( bw_in_hz <= 14600 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_14600; + } + else if( bw_in_hz <= 19500 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_19500; + } + else if( bw_in_hz <= 23400 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_23400; + } + else if( bw_in_hz <= 29300 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_29300; + } + else if( bw_in_hz <= 39000 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_39000; + } + else if( bw_in_hz <= 46900 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_46900; + } + else if( bw_in_hz <= 58600 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_58600; + } + else if( bw_in_hz <= 78200 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_78200; + } + else if( bw_in_hz <= 93800 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_93800; + } + else if( bw_in_hz <= 117300 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_117300; + } + else if( bw_in_hz <= 156200 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_156200; + } + else if( bw_in_hz <= 187200 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_187200; + } + else if( bw_in_hz <= 234300 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_234300; + } + else if( bw_in_hz <= 312000 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_312000; + } + else if( bw_in_hz <= 373600 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_373600; + } + else if( bw_in_hz <= 467000 ) + { + *bw_parameter = LR1121_MODEM_RADIO_GFSK_BW_467000; + } + else + { + return LR1121_MODEM_RESPONSE_CODE_INVALID; + } + + return LR1121_MODEM_RESPONSE_CODE_OK; +} + +uint32_t lr1121_modem_radio_get_lora_time_on_air_numerator( const lr1121_modem_radio_pkt_params_lora_t* pkt_p, + const lr1121_modem_radio_mod_params_lora_t* mod_p ) +{ + const int32_t pld_len_in_bytes = pkt_p->pld_len_in_bytes; + const int32_t sf = mod_p->sf; + const bool pld_is_fix = pkt_p->header_type == LR1121_MODEM_RADIO_LORA_PKT_IMPLICIT; + + int32_t fine_synch = ( sf <= 6 ) ? 1 : 0; + bool long_interleaving = ( mod_p->cr > 4 ); + + int32_t total_bytes_nb = pld_len_in_bytes + ( ( pkt_p->crc == LR1121_MODEM_RADIO_LORA_CRC_ON ) ? 2 : 0 ); + int32_t tx_bits_symbol = sf - 2 * ( mod_p->ldro != 0 ? 1 : 0 ); + + int32_t ceil_numerator; + int32_t ceil_denominator; + + uint32_t intermed; + + int32_t symbols_nb_data; + int32_t tx_infobits_header; + int32_t tx_infobits_payload; + + if( long_interleaving ) + { + const int32_t fec_rate_numerator = 4; + const int32_t fec_rate_denominator = ( mod_p->cr + ( mod_p->cr == 7 ? 1 : 0 ) ); + + if( pld_is_fix ) + { + int32_t tx_bits_symbol_start = sf - 2 + 2 * fine_synch; + if( 8 * total_bytes_nb * fec_rate_denominator <= 7 * fec_rate_numerator * tx_bits_symbol_start ) + { + ceil_numerator = 8 * total_bytes_nb * fec_rate_denominator; + ceil_denominator = fec_rate_numerator * tx_bits_symbol_start; + } + else + { + int32_t tx_codedbits_header = tx_bits_symbol_start * 8; + ceil_numerator = 8 * fec_rate_numerator * tx_bits_symbol + 8 * total_bytes_nb * fec_rate_denominator - + fec_rate_numerator * tx_codedbits_header; + ceil_denominator = fec_rate_numerator * tx_bits_symbol; + } + } + else + { + tx_infobits_header = ( sf * 4 + fine_synch * 8 - 28 ) & ~0x07; + if( tx_infobits_header < 8 * total_bytes_nb ) + { + if( tx_infobits_header > 8 * pld_len_in_bytes ) + { + tx_infobits_header = 8 * pld_len_in_bytes; + } + } + tx_infobits_payload = 8 * total_bytes_nb - tx_infobits_header; + if( tx_infobits_payload < 0 ) + { + tx_infobits_payload = 0; + } + + ceil_numerator = tx_infobits_payload * fec_rate_denominator + 8 * fec_rate_numerator * tx_bits_symbol; + ceil_denominator = fec_rate_numerator * tx_bits_symbol; + } + } + else + { + tx_infobits_header = sf * 4 + fine_synch * 8 - 8; + + if( !pld_is_fix ) + { + tx_infobits_header -= 20; + } + + tx_infobits_payload = 8 * total_bytes_nb - tx_infobits_header; + + if( tx_infobits_payload < 0 ) tx_infobits_payload = 0; + + ceil_numerator = tx_infobits_payload; + ceil_denominator = 4 * tx_bits_symbol; + } + + symbols_nb_data = ( ( ceil_numerator + ceil_denominator - 1 ) / ceil_denominator ); + if( !long_interleaving ) + { + symbols_nb_data = symbols_nb_data * ( mod_p->cr + 4 ) + 8; + } + intermed = pkt_p->preamble_len_in_symb + 4 + 2 * fine_synch + symbols_nb_data; + + return ( uint32_t )( ( 4 * intermed + 1 ) * ( 1 << ( sf - 2 ) ) ) - 1; +} + +uint32_t lr1121_modem_radio_get_lora_bw_in_hz( lr1121_modem_radio_lora_bw_t bw ) +{ + uint32_t bw_in_hz = 0; + + switch( bw ) + { + case LR1121_MODEM_RADIO_LORA_BW_10: + bw_in_hz = 10417UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_15: + bw_in_hz = 15625UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_20: + bw_in_hz = 20833UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_31: + bw_in_hz = 31250UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_41: + bw_in_hz = 41667UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_62: + bw_in_hz = 62500UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_125: + bw_in_hz = 125000UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_250: + bw_in_hz = 250000UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_500: + bw_in_hz = 500000UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_200: + bw_in_hz = 203000UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_400: + bw_in_hz = 406000UL; + break; + case LR1121_MODEM_RADIO_LORA_BW_800: + bw_in_hz = 812000UL; + break; + } + + return bw_in_hz; +} + +uint32_t lr1121_modem_radio_get_lora_time_on_air_in_ms( const lr1121_modem_radio_pkt_params_lora_t* pkt_p, + const lr1121_modem_radio_mod_params_lora_t* mod_p ) +{ + uint32_t numerator = 1000U * lr1121_modem_radio_get_lora_time_on_air_numerator( pkt_p, mod_p ); + uint32_t denominator = lr1121_modem_radio_get_lora_bw_in_hz( mod_p->bw ); + // Perform integral ceil() + return ( numerator + denominator - 1 ) / denominator; +} + +uint32_t lr1121_modem_radio_get_gfsk_time_on_air_numerator( const lr1121_modem_radio_pkt_params_gfsk_t* pkt_p ) +{ + uint8_t header_len_in_bits; + + switch( pkt_p->header_type ) + { + case LR1121_MODEM_RADIO_GFSK_PKT_FIX_LEN: + { + header_len_in_bits = 0; + break; + } + case LR1121_MODEM_RADIO_GFSK_PKT_VAR_LEN: + { + header_len_in_bits = 8; + break; + } + case LR1121_MODEM_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP: + { + header_len_in_bits = 9; + break; + } + default: + { + return 0; + } + } + + return pkt_p->preamble_len_in_bits + header_len_in_bits + pkt_p->sync_word_len_in_bits + + ( ( pkt_p->pld_len_in_bytes + + ( pkt_p->address_filtering == LR1121_MODEM_RADIO_GFSK_ADDRESS_FILTERING_DISABLE ? 0 : 1 ) + + lr1121_modem_radio_get_gfsk_crc_len_in_bytes( pkt_p->crc_type ) ) + << 3 ); +} + +uint32_t lr1121_modem_radio_get_gfsk_time_on_air_in_ms( const lr1121_modem_radio_pkt_params_gfsk_t* pkt_p, + const lr1121_modem_radio_mod_params_gfsk_t* mod_p ) +{ + uint32_t numerator = 1000U * lr1121_modem_radio_get_gfsk_time_on_air_numerator( pkt_p ); + uint32_t denominator = mod_p->br_in_bps; + + // Perform integral ceil() + return ( numerator + denominator - 1 ) / denominator; +} + +uint32_t lr1121_modem_radio_convert_time_in_ms_to_rtc_step( uint32_t time_in_ms ) +{ + return ( uint32_t )( time_in_ms * LR1121_MODEM_RTC_FREQ_IN_HZ / 1000 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_cfg_bluetooth_low_energy_beaconning_compatibility( + const void* context, const uint8_t channel_id, const uint8_t* buffer, const uint8_t length ) +{ + const uint8_t command[LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC >> 0 ), + channel_id, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, command, LR1121_MODEM_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH, buffer, + length ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_get_lora_rx_info( const void* context, bool* is_crc_present, + lr1121_modem_radio_lora_cr_t* cr ) +{ + const uint8_t cbuffer[LR1121_MODEM_RADIO_GET_LORA_RX_INFO_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_GET_LORA_RX_INFO_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_GET_LORA_RX_INFO_OC >> 0 ), + }; + uint8_t rbuffer = 0; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RADIO_GET_LORA_RX_INFO_CMD_LENGTH, &rbuffer, 1 ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *is_crc_present = ( ( ( rbuffer & ( 0x01 << 4 ) ) != 0 ) ) ? true : false; + *cr = ( lr1121_modem_radio_lora_cr_t )( rbuffer & 0x07 ); + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility( + const void* context, const uint8_t channel_id, const uint8_t* buffer, const uint8_t length ) +{ + const uint8_t command[LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC >> 0 ), + channel_id, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, command, LR1121_MODEM_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH, buffer, + length ); +} + +uint16_t lr1121_modem_radio_convert_nb_symb_to_mant_exp( const uint16_t nb_symbol, uint8_t* mant, uint8_t* exp ) +{ + uint8_t exp_loc = 0; + uint16_t mant_loc = ( nb_symbol + 1 ) >> 1; + + while( mant_loc > 31 ) + { + mant_loc = ( mant_loc + 3 ) >> 2; + exp_loc++; + } + + *mant = ( uint8_t ) mant_loc; + *exp = exp_loc; + + return mant_loc << ( 2 * exp_loc + 1 ); +} + +lr1121_modem_response_code_t lr1121_modem_radio_set_lna_mode( const void* context, + lr1121_modem_radio_lna_mode_t lna_config ) +{ + return lr1121_modem_regmem_write_regmem32_mask( context, 0x00F3008C, 0xF0, lna_config << 4 ); +} +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static inline uint32_t lr1121_modem_radio_get_gfsk_crc_len_in_bytes( lr1121_modem_radio_gfsk_crc_type_t crc_type ) +{ + switch( crc_type ) + { + case LR1121_MODEM_RADIO_GFSK_CRC_OFF: + return 0; + case LR1121_MODEM_RADIO_GFSK_CRC_1_BYTE: + return 1; + case LR1121_MODEM_RADIO_GFSK_CRC_2_BYTES: + return 2; + case LR1121_MODEM_RADIO_GFSK_CRC_1_BYTE_INV: + return 1; + case LR1121_MODEM_RADIO_GFSK_CRC_2_BYTES_INV: + return 2; + } + + return 0; +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio_timings.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio_timings.c new file mode 100755 index 0000000..6890645 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_radio_timings.c @@ -0,0 +1,234 @@ +/** + * @file lr1121_modem_radio_timings.c + * + * @brief LR1121 timing helper functions implementation + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_radio_timings.h" +#include "lr1121_modem_radio.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/** + * @brief Time in microsecond taken by the chip to process the Rx done interrupt + */ +#define RX_DONE_IRQ_PROCESSING_TIME_IN_US 74 + +/** + * @brief Time in microsecond taken by the chip to process the Tx done interrupt + */ +#define TX_DONE_IRQ_PROCESSING_TIME_IN_US 111 + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/** + * @brief Get the power amplifier ramp time for a given power amplifier ramp time parameter + * + * @param [in] ramp_time Power amplifier ramp time parameter + * + * @returns Ramp time in microsecond + */ +static uint32_t lr1121_modem_radio_timings_get_pa_ramp_time_in_us( const lr1121_modem_radio_ramp_time_t ramp_time ); + +/** + * @brief Get the LoRa reception input delay + * + * @param [in] bw LoRa bandwidth + * + * @returns LoRa reception input delay in microsecond + */ +static uint32_t lr1121_modem_radio_timings_get_lora_rx_input_delay_in_us( lr1121_modem_radio_lora_bw_t bw ); + +/** + * @brief Get the LoRa symbol time + * + * @param [in] bw LoRa bandwidth + * @param [in] sf LoRa spreading factor + * + * @returns LoRa symbol time in microsecond + */ +static uint32_t lr1121_modem_radio_timings_get_lora_symb_time_in_us( const lr1121_modem_radio_lora_sf_t sf, + const lr1121_modem_radio_lora_bw_t bw ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +uint32_t lr1121_modem_radio_timings_get_delay_between_last_bit_sent_and_rx_done_in_us( + const lr1121_modem_radio_mod_params_lora_t* mod_params ) +{ + return lr1121_modem_radio_timings_get_lora_rx_input_delay_in_us( mod_params->bw ) + + 2 * lr1121_modem_radio_timings_get_lora_symb_time_in_us( mod_params->sf, mod_params->bw ) + + RX_DONE_IRQ_PROCESSING_TIME_IN_US; +} + +uint32_t lr1121_modem_radio_timings_get_delay_between_last_bit_sent_and_tx_done_in_us( + const lr1121_modem_radio_ramp_time_t ramp_time ) +{ + return lr1121_modem_radio_timings_get_pa_ramp_time_in_us( ramp_time ) + TX_DONE_IRQ_PROCESSING_TIME_IN_US; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static uint32_t lr1121_modem_radio_timings_get_pa_ramp_time_in_us( const lr1121_modem_radio_ramp_time_t ramp_time ) +{ + switch( ramp_time ) + { + case LR1121_MODEM_RADIO_RAMP_16_US: + { + return 16; + } + case LR1121_MODEM_RADIO_RAMP_32_US: + { + return 32; + } + case LR1121_MODEM_RADIO_RAMP_48_US: + { + return 48; + } + case LR1121_MODEM_RADIO_RAMP_64_US: + { + return 64; + } + case LR1121_MODEM_RADIO_RAMP_80_US: + { + return 80; + } + case LR1121_MODEM_RADIO_RAMP_96_US: + { + return 96; + } + case LR1121_MODEM_RADIO_RAMP_112_US: + { + return 112; + } + case LR1121_MODEM_RADIO_RAMP_128_US: + { + return 128; + } + case LR1121_MODEM_RADIO_RAMP_144_US: + { + return 144; + } + case LR1121_MODEM_RADIO_RAMP_160_US: + { + return 160; + } + case LR1121_MODEM_RADIO_RAMP_176_US: + { + return 176; + } + case LR1121_MODEM_RADIO_RAMP_192_US: + { + return 192; + } + case LR1121_MODEM_RADIO_RAMP_208_US: + { + return 208; + } + case LR1121_MODEM_RADIO_RAMP_240_US: + { + return 240; + } + case LR1121_MODEM_RADIO_RAMP_272_US: + { + return 272; + } + case LR1121_MODEM_RADIO_RAMP_304_US: + { + return 304; + } + default: + return 0; + } +} + +static uint32_t lr1121_modem_radio_timings_get_lora_rx_input_delay_in_us( lr1121_modem_radio_lora_bw_t bw ) +{ + switch( bw ) + { + case LR1121_MODEM_RADIO_LORA_BW_500: + { + return 16; + } + case LR1121_MODEM_RADIO_LORA_BW_250: + { + return 31; + } + case LR1121_MODEM_RADIO_LORA_BW_125: + { + return 57; + } + default: + { + return 0; + } + } +} + +static uint32_t lr1121_modem_radio_timings_get_lora_symb_time_in_us( const lr1121_modem_radio_lora_sf_t sf, + const lr1121_modem_radio_lora_bw_t bw ) +{ + return ( 1 << ( uint8_t ) sf ) * 1000000 / lr1121_modem_radio_get_lora_bw_in_hz( bw ); +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_regmem.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_regmem.c new file mode 100755 index 0000000..1f43591 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_regmem.c @@ -0,0 +1,332 @@ +/*! + * @file lr1121_modem_regmem.c + * + * @brief Register/memory driver implementation for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_regmem.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH 2 +#define LR1121_MODEM_REGMEM_WRITE_REGMEM32_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_REGMEM_READ_REGMEM32_CMD_LENGTH ( 2 + 4 + 1 ) +#define LR1121_MODEM_REGMEM_WRITE_MEM8_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_REGMEM_READ_MEM8_CMD_LENGTH ( 2 + 4 + 1 ) +#define LR1121_MODEM_REGMEM_WRITE_BUFFER8_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_REGMEM_READ_BUFFER8_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH ( 2 + 4 + 4 + 4 ) + +#define LR1121_MODEM_REGMEM_BUFFER_SIZE_MAX ( 256 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for register and memory related operations + */ +enum +{ + LR1121_MODEM_REGMEM_WRITE_REGMEM32_OC = 0x0105, + LR1121_MODEM_REGMEM_READ_REGMEM32_OC = 0x0106, + LR1121_MODEM_REGMEM_WRITE_MEM8_OC = 0x0107, + LR1121_MODEM_REGMEM_READ_MEM8_OC = 0x0108, + LR1121_MODEM_REGMEM_WRITE_BUFFER8_OC = 0x0109, + LR1121_MODEM_REGMEM_READ_BUFFER8_OC = 0x010A, + LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_OC = 0x010B, + LR1121_MODEM_REGMEM_WRITE_REGMEM32_MASK_OC = 0x010C, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Helper function that fill both cbuffer with opcode and memory address + * + * It is typically used in read/write regmem32 functions. + * + * @warning It is up to the caller to ensure cbuffer is big enough to contain opcode and address! + */ +static void lr1121_modem_regmem_fill_cbuffer_opcode_address( uint8_t* cbuffer, uint16_t opcode, uint32_t address ); + +/*! + * @brief Helper function that fill both cbuffer with opcode memory address, and data length to read + * + * It is typically used in read functions. + * + * @warning It is up to the caller to ensure cbuffer is big enough to contain opcode and address! + */ +static void lr1121_modem_regmem_fill_cbuffer_opcode_address_length( uint8_t* cbuffer, uint16_t opcode, uint32_t address, + uint8_t length ); + +/*! + * @brief Helper function that fill both cbuffer with data + * + * It is typically used in write write regmem32 functions. + * + * @warning It is up to the caller to ensure cdata is big enough to contain all data! + */ +static void lr1121_modem_regmem_fill_cdata( uint8_t* cdata, const uint32_t* data, uint8_t data_length ); + +/*! + * @brief Helper function that fill both cbuffer and cdata buffers with opcode, memory address and data + * + * It is typically used to factorize and write regmem32 operations. Behind the scene it calls the other helpers + * lr1121_modem_regmem_fill_cbuffer_opcode_address and lr1121_modem_regmem_fill_cdata. + * + * @warning It is up to the caller to ensure cbuffer and cdata are big enough to contain their respective information! + */ +static void lr1121_modem_regmem_fill_cbuffer_cdata_opcode_address_data( uint8_t* cbuffer, uint8_t* cdata, + uint16_t opcode, uint32_t address, + const uint32_t* data, uint8_t data_length ); + +/*! + * @brief Helper function that convert an array of uint8_t into an array of uint32_t + * + * Typically used in the read function returning uint32_t array. + * + * @warning It is up to the caller to ensure the raw_buffer is of length at least "out_buffer_length * + * sizeof(uint32_t)"! + */ +static void lr1121_modem_regmem_fill_out_buffer_from_raw_buffer( uint32_t* out_buffer, const uint8_t* raw_buffer, + uint8_t out_buffer_length ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_regmem_write_regmem32( const void* context, const uint32_t address, + const uint32_t* buffer, const uint8_t length ) +{ + uint8_t cbuffer[LR1121_MODEM_REGMEM_WRITE_REGMEM32_CMD_LENGTH]; + uint8_t cdata[LR1121_MODEM_REGMEM_BUFFER_SIZE_MAX]; + + if( length > LR1121_MODEM_REGMEM_MAX_WRITE_READ_WORDS ) + { + return LR1121_MODEM_RESPONSE_CODE_BAD_SIZE; + } + + lr1121_modem_regmem_fill_cbuffer_cdata_opcode_address_data( cbuffer, cdata, LR1121_MODEM_REGMEM_WRITE_REGMEM32_OC, + address, buffer, length ); + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_REGMEM_WRITE_REGMEM32_CMD_LENGTH, cdata, length * sizeof( uint32_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_read_regmem32( const void* context, const uint32_t address, + uint32_t* buffer, const uint8_t length ) +{ + uint8_t cbuffer[LR1121_MODEM_REGMEM_READ_REGMEM32_CMD_LENGTH] = { 0 }; + + if( length > LR1121_MODEM_REGMEM_MAX_WRITE_READ_WORDS ) + { + return LR1121_MODEM_RESPONSE_CODE_BAD_SIZE; + } + + lr1121_modem_regmem_fill_cbuffer_opcode_address_length( cbuffer, LR1121_MODEM_REGMEM_READ_REGMEM32_OC, address, + length ); + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_REGMEM_READ_REGMEM32_CMD_LENGTH, ( uint8_t* ) buffer, + length * sizeof( uint32_t ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + lr1121_modem_regmem_fill_out_buffer_from_raw_buffer( buffer, ( const uint8_t* ) buffer, length ); + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_regmem_write_mem8( const void* context, const uint32_t address, + const uint8_t* buffer, const uint8_t length ) +{ + uint8_t cbuffer[LR1121_MODEM_REGMEM_WRITE_MEM8_CMD_LENGTH]; + + lr1121_modem_regmem_fill_cbuffer_opcode_address( cbuffer, LR1121_MODEM_REGMEM_WRITE_MEM8_OC, address ); + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_REGMEM_WRITE_MEM8_CMD_LENGTH, buffer, length ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_read_mem8( const void* context, const uint32_t address, + uint8_t* buffer, const uint8_t length ) +{ + uint8_t cbuffer[LR1121_MODEM_REGMEM_READ_MEM8_CMD_LENGTH]; + + lr1121_modem_regmem_fill_cbuffer_opcode_address_length( cbuffer, LR1121_MODEM_REGMEM_READ_MEM8_OC, address, + length ); + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_REGMEM_READ_MEM8_CMD_LENGTH, buffer, length ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_write_buffer8( const void* context, const uint8_t* buffer, + const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_REGMEM_WRITE_BUFFER8_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_REGMEM_WRITE_BUFFER8_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_REGMEM_WRITE_BUFFER8_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_REGMEM_WRITE_BUFFER8_CMD_LENGTH, buffer, length ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_read_buffer8( const void* context, uint8_t* buffer, + const uint8_t offset, const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_REGMEM_READ_BUFFER8_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_REGMEM_READ_BUFFER8_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_REGMEM_READ_BUFFER8_OC >> 0 ), + offset, + length, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_REGMEM_READ_BUFFER8_CMD_LENGTH, buffer, length ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_clear_rxbuffer( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_regmem_write_regmem32_mask( const void* context, const uint32_t address, + const uint32_t mask, const uint32_t data ) +{ + uint8_t cbuffer[LR1121_MODEM_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH]; + + lr1121_modem_regmem_fill_cbuffer_opcode_address( cbuffer, LR1121_MODEM_REGMEM_WRITE_REGMEM32_MASK_OC, address ); + + cbuffer[6] = ( uint8_t )( mask >> 24 ); + cbuffer[7] = ( uint8_t )( mask >> 16 ); + cbuffer[8] = ( uint8_t )( mask >> 8 ); + cbuffer[9] = ( uint8_t )( mask >> 0 ); + + cbuffer[10] = ( uint8_t )( data >> 24 ); + cbuffer[11] = ( uint8_t )( data >> 16 ); + cbuffer[12] = ( uint8_t )( data >> 8 ); + cbuffer[13] = ( uint8_t )( data >> 0 ); + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH, 0, 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +void lr1121_modem_regmem_fill_cbuffer_opcode_address( uint8_t* cbuffer, uint16_t opcode, uint32_t address ) +{ + cbuffer[0] = ( uint8_t )( opcode >> 8 ); + cbuffer[1] = ( uint8_t )( opcode >> 0 ); + + cbuffer[2] = ( uint8_t )( address >> 24 ); + cbuffer[3] = ( uint8_t )( address >> 16 ); + cbuffer[4] = ( uint8_t )( address >> 8 ); + cbuffer[5] = ( uint8_t )( address >> 0 ); +} + +void lr1121_modem_regmem_fill_cbuffer_opcode_address_length( uint8_t* cbuffer, uint16_t opcode, uint32_t address, + uint8_t length ) +{ + lr1121_modem_regmem_fill_cbuffer_opcode_address( cbuffer, opcode, address ); + cbuffer[6] = length; +} + +void lr1121_modem_regmem_fill_cdata( uint8_t* cdata, const uint32_t* data, uint8_t data_length ) +{ + for( uint16_t index = 0; index < data_length; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t )( data[index] >> 24 ); + cdata_local[1] = ( uint8_t )( data[index] >> 16 ); + cdata_local[2] = ( uint8_t )( data[index] >> 8 ); + cdata_local[3] = ( uint8_t )( data[index] >> 0 ); + } +} + +void lr1121_modem_regmem_fill_cbuffer_cdata_opcode_address_data( uint8_t* cbuffer, uint8_t* cdata, uint16_t opcode, + uint32_t address, const uint32_t* data, + uint8_t data_length ) +{ + lr1121_modem_regmem_fill_cbuffer_opcode_address( cbuffer, opcode, address ); + lr1121_modem_regmem_fill_cdata( cdata, data, data_length ); +} + +void lr1121_modem_regmem_fill_out_buffer_from_raw_buffer( uint32_t* out_buffer, const uint8_t* raw_buffer, + uint8_t out_buffer_length ) +{ + for( uint8_t out_index = 0; out_index < out_buffer_length; out_index++ ) + { + const uint8_t* raw_buffer_local = &raw_buffer[out_index * 4]; + + out_buffer[out_index] = ( ( uint32_t ) raw_buffer_local[0] << 24 ) + + ( ( uint32_t ) raw_buffer_local[1] << 16 ) + ( ( uint32_t ) raw_buffer_local[2] << 8 ) + + ( ( uint32_t ) raw_buffer_local[3] << 0 ); + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_relay.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_relay.c new file mode 100755 index 0000000..ca6dfea --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_relay.c @@ -0,0 +1,159 @@ +/*! + * @file lr1121_modem_relay.c + * + * @brief Relay driver implementation for LR1121 modem + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr1121_modem_relay.h" +#include +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +#define LR1121_MODEM_RELAY_GET_TX_CONFIG_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_RELAY_SET_TX_CONFIG_RBUFFER_LENGTH ( 3 + 14 ) + +#define LR1121_MODEM_RELAY_GET_TX_CONFIG_RBUFFER_LENGTH ( 14 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operation code command + */ +enum +{ + LR1121_MODEM_RELAY_GET_TX_CONFIG_CMD = 0x00, + LR1121_MODEM_RELAY_SET_TX_CONFIG_CMD = 0x01, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +static uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_relay_get_tx_config( const void* context, + lr1121_modem_relay_tx_configuration_t* configuration ) +{ + uint8_t rbuffer[LR1121_MODEM_RELAY_GET_TX_CONFIG_RBUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR1121_MODEM_RELAY_GET_TX_CONFIG_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_RELAY >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_RELAY, + LR1121_MODEM_RELAY_GET_TX_CONFIG_CMD, + }; + + const lr1121_modem_response_code_t rc = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_RELAY_GET_TX_CONFIG_CMD_LENGTH, rbuffer, + LR1121_MODEM_RELAY_GET_TX_CONFIG_RBUFFER_LENGTH ); + + if( rc == LR1121_MODEM_RESPONSE_CODE_OK ) + { + configuration->wor_second_channel_frequency_hz = lr1121_uint8_to_uint32( rbuffer + 0 ); + configuration->wor_ack_second_channel_frequency_hz = lr1121_uint8_to_uint32( rbuffer + 4 ); + configuration->wor_second_channel_datarate = rbuffer[8]; + configuration->wor_second_channel_enable = rbuffer[9]; + configuration->backoff_behavior = rbuffer[10]; + configuration->activation = ( lr1121_modem_relay_activation_t ) rbuffer[11]; + configuration->smart_level = ( lr1121_modem_relay_smart_level_t ) rbuffer[12]; + configuration->missed_ack_to_unsynchronized_threshold = rbuffer[13]; + } + + return rc; +} + +lr1121_modem_response_code_t lr1121_modem_relay_set_tx_config( + const void* context, const lr1121_modem_relay_tx_configuration_t* configuration ) +{ + const uint8_t cbuffer[LR1121_MODEM_RELAY_SET_TX_CONFIG_RBUFFER_LENGTH] = { + ( uint8_t )( LR1121_MODEM_GROUP_ID_RELAY >> 8 ), + ( uint8_t ) LR1121_MODEM_GROUP_ID_RELAY, + LR1121_MODEM_RELAY_SET_TX_CONFIG_CMD, + ( uint8_t )( configuration->wor_second_channel_frequency_hz >> 24 ), + ( uint8_t )( configuration->wor_second_channel_frequency_hz >> 16 ), + ( uint8_t )( configuration->wor_second_channel_frequency_hz >> 8 ), + ( uint8_t ) configuration->wor_second_channel_frequency_hz, + ( uint8_t )( configuration->wor_ack_second_channel_frequency_hz >> 24 ), + ( uint8_t )( configuration->wor_ack_second_channel_frequency_hz >> 16 ), + ( uint8_t )( configuration->wor_ack_second_channel_frequency_hz >> 8 ), + ( uint8_t ) configuration->wor_ack_second_channel_frequency_hz, + configuration->wor_second_channel_datarate, + configuration->wor_second_channel_enable, + configuration->backoff_behavior, + ( uint8_t ) configuration->activation, + ( uint8_t ) configuration->smart_level, + configuration->missed_ack_to_unsynchronized_threshold, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_RELAY_SET_TX_CONFIG_RBUFFER_LENGTH, 0, 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint32_t lr1121_uint8_to_uint32( const uint8_t value[4] ) +{ + return ( ( ( uint32_t ) value[0] ) << 24 ) + ( ( ( uint32_t ) value[1] ) << 16 ) + + ( ( ( uint32_t ) value[2] ) << 8 ) + ( ( ( uint32_t ) value[3] ) ); +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_system.c b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_system.c new file mode 100755 index 0000000..7221c23 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem/lr1121_modem_system.c @@ -0,0 +1,699 @@ +/*! + * @file lr1121_modem_system.c + * + * @brief System driver implementation for LR1121 + * + * @copyright Copyright Semtech Corporation 2024. All rights reserved. + * + * @license{The Clear BSD License + * @par + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * @par + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE.} + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +#include "lr1121_modem_system.h" +#include "lr1121_modem_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/*! + * @brief Length in byte of the LR1121 version blob + */ +#define LR1121_MODEM_SYSTEM_VERSION_LENGTH ( 4 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR1121_MODEM_SYSTEM_GET_VERSION_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_GET_ERRORS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_CLEAR_ERRORS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_CALIBRATE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_SET_REGMODE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH ( 2 + 2 ) +#define LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH ( 2 + 8 ) +#define LR1121_MODEM_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH ( 2 + 8 ) +#define LR1121_MODEM_SYSTEM_CLEAR_IRQ_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_SYSTEM_CFG_LFCLK_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_SET_TCXO_MODE_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_SYSTEM_REBOOT_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_GET_VBAT_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_GET_TEMP_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_SET_SLEEP_CMD_LENGTH ( 2 + 5 ) +#define LR1121_MODEM_SYSTEM_SET_STANDBY_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_SET_FS_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH ( 2 + 1 ) +#define LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH ( 2 + 3 ) +#define LR1121_MODEM_SYSTEM_READ_INFOPAGE_CMD_LENGTH ( 2 + 4 ) +#define LR1121_MODEM_SYSTEM_READ_UID_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_READ_JOIN_EUI_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_READ_PIN_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH ( LR1121_MODEM_SYSTEM_READ_PIN_CMD_LENGTH + 17 ) +#define LR1121_MODEM_SYSTEM_GET_RANDOM_CMD_LENGTH ( 2 ) +#define LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH ( 3 ) +#define LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH ( 3 ) + +#define LR1121_MODEM_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH ( 6 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for system-related operations + */ +enum +{ + LR1121_MODEM_SYSTEM_GET_STATUS_OC = 0x0100, + LR1121_MODEM_SYSTEM_GET_VERSION_OC = 0x0101, + LR1121_MODEM_SYSTEM_GET_ERRORS_OC = 0x010D, + LR1121_MODEM_SYSTEM_CLEAR_ERRORS_OC = 0x010E, + LR1121_MODEM_SYSTEM_CALIBRATE_OC = 0x010F, + LR1121_MODEM_SYSTEM_SET_REGMODE_OC = 0x0110, + LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_OC = 0x0111, + LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_OC = 0x0112, + LR1121_MODEM_SYSTEM_SET_DIOIRQPARAMS_OC = 0x0113, + LR1121_MODEM_SYSTEM_CLEAR_IRQ_OC = 0x0114, + LR1121_MODEM_SYSTEM_CFG_LFCLK_OC = 0x0116, + LR1121_MODEM_SYSTEM_SET_TCXO_MODE_OC = 0x0117, + LR1121_MODEM_SYSTEM_REBOOT_OC = 0x0118, + LR1121_MODEM_SYSTEM_GET_VBAT_OC = 0x0119, + LR1121_MODEM_SYSTEM_GET_TEMP_OC = 0x011A, + LR1121_MODEM_SYSTEM_SET_SLEEP_OC = 0x011B, + LR1121_MODEM_SYSTEM_SET_STANDBY_OC = 0x011C, + LR1121_MODEM_SYSTEM_SET_FS_OC = 0x011D, + LR1121_MODEM_SYSTEM_GET_RANDOM_OC = 0x0120, + LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_OC = 0x0121, + LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_OC = 0x0122, + LR1121_MODEM_SYSTEM_READ_INFOPAGE_OC = 0x0123, + LR1121_MODEM_SYSTEM_READ_UID_OC = 0x0125, + LR1121_MODEM_SYSTEM_READ_JOIN_EUI_OC = 0x0126, + LR1121_MODEM_SYSTEM_READ_PIN_OC = 0x0127, + LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_OC = 0x0128, + LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC = 0x012A, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Fill stat1 structure with data from stat1_byte + * + * @param [in] stat1_byte stat1 byte + * @param [out] stat1 stat1 structure + */ +static void lr1121_modem_system_convert_stat1_byte_to_enum( uint8_t stat1_byte, lr1121_modem_system_stat1_t* stat1 ); + +/*! + * @brief Fill stat2 structure with data from stat2_byte + * + * @param [in] stat2_byte stat2 byte + * @param [out] stat2 stat2 structure + */ +static void lr1121_modem_system_convert_stat2_byte_to_enum( uint8_t stat2_byte, lr1121_modem_system_stat2_t* stat2 ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr1121_modem_response_code_t lr1121_modem_system_reset( const void* context ) +{ + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_reset( context ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_status( const void* context, lr1121_modem_system_stat1_t* stat1, + lr1121_modem_system_stat2_t* stat2, + lr1121_modem_system_irq_mask_t* irq_status ) +{ + uint8_t data[LR1121_MODEM_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH] = { 0 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_direct_read( + context, data, LR1121_MODEM_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + lr1121_modem_system_convert_stat1_byte_to_enum( data[0], stat1 ); + lr1121_modem_system_convert_stat2_byte_to_enum( data[1], stat2 ); + if( irq_status != NULL ) + { + *irq_status = ( ( lr1121_modem_system_irq_mask_t ) data[2] << 24 ) + + ( ( lr1121_modem_system_irq_mask_t ) data[3] << 16 ) + + ( ( lr1121_modem_system_irq_mask_t ) data[4] << 8 ) + + ( ( lr1121_modem_system_irq_mask_t ) data[5] << 0 ); + } + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_clear_reset_status_info( const void* context ) +{ + uint8_t cbuffer[2] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_STATUS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_STATUS_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, sizeof( cbuffer ), 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_version( const void* context, + lr1121_modem_system_version_t* version ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_GET_VERSION_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_VERSION_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_VERSION_OC >> 0 ), + }; + uint8_t rbuffer[LR1121_MODEM_SYSTEM_VERSION_LENGTH] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_GET_VERSION_CMD_LENGTH, rbuffer, LR1121_MODEM_SYSTEM_VERSION_LENGTH ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + version->hw = rbuffer[0]; + version->type = ( lr1121_modem_system_version_type_t ) rbuffer[1]; + version->fw = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_get_errors( const void* context, lr1121_modem_system_errors_t* errors ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_GET_ERRORS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_ERRORS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_ERRORS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( errors )] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_GET_ERRORS_CMD_LENGTH, rbuffer, sizeof( *errors ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *errors = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_clear_errors( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_CLEAR_ERRORS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_CLEAR_ERRORS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_CLEAR_ERRORS_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_CLEAR_ERRORS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_calibrate( const void* context, const uint8_t calib_param ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_CALIBRATE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_CALIBRATE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_CALIBRATE_OC >> 0 ), + calib_param, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_CALIBRATE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_reg_mode( const void* context, + const lr1121_modem_system_reg_mode_t reg_mode ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_REGMODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_REGMODE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_REGMODE_OC >> 0 ), + ( uint8_t ) reg_mode, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_SET_REGMODE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_calibrate_image( const void* context, const uint8_t freq1, + const uint8_t freq2 ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_OC >> 0 ), + freq1, + freq2, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_calibrate_image_in_mhz( const void* context, + const uint16_t freq1_in_mhz, + const uint16_t freq2_in_mhz ) +{ + // Perform a floor() to get a value for freq1 corresponding to a frequency lower than or equal to freq1_in_mhz + const uint8_t freq1 = freq1_in_mhz / LR1121_MODEM_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ; + + // Perform a ceil() to get a value for freq2 corresponding to a frequency higher than or equal to freq2_in_mhz + const uint8_t freq2 = ( freq2_in_mhz + LR1121_MODEM_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ - 1 ) / + LR1121_MODEM_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ; + + return lr1121_modem_system_calibrate_image( context, freq1, freq2 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_dio_as_rf_switch( + const void* context, const lr1121_modem_system_rfswitch_cfg_t* rf_switch_cfg ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_OC >> 0 ), + rf_switch_cfg->enable, + rf_switch_cfg->standby, + rf_switch_cfg->rx, + rf_switch_cfg->tx, + rf_switch_cfg->tx_hp, + rf_switch_cfg->tx_hf, + 0x00, + 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_dio_irq_params( + const void* context, const lr1121_modem_system_irq_mask_t irqs_to_enable_dio1, + const lr1121_modem_system_irq_mask_t irqs_to_enable_dio2 ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_DIOIRQPARAMS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_DIOIRQPARAMS_OC >> 0 ), + ( uint8_t )( irqs_to_enable_dio1 >> 24 ), + ( uint8_t )( irqs_to_enable_dio1 >> 16 ), + ( uint8_t )( irqs_to_enable_dio1 >> 8 ), + ( uint8_t )( irqs_to_enable_dio1 >> 0 ), + ( uint8_t )( irqs_to_enable_dio2 >> 24 ), + ( uint8_t )( irqs_to_enable_dio2 >> 16 ), + ( uint8_t )( irqs_to_enable_dio2 >> 8 ), + ( uint8_t )( irqs_to_enable_dio2 >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_clear_irq_status( const void* context, + const lr1121_modem_system_irq_mask_t irqs_to_clear ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_CLEAR_IRQ_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_CLEAR_IRQ_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_CLEAR_IRQ_OC >> 0 ), + ( uint8_t )( irqs_to_clear >> 24 ), + ( uint8_t )( irqs_to_clear >> 16 ), + ( uint8_t )( irqs_to_clear >> 8 ), + ( uint8_t )( irqs_to_clear >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_CLEAR_IRQ_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_and_clear_irq_status( const void* context, + lr1121_modem_system_irq_mask_t* irq ) +{ + lr1121_modem_system_irq_mask_t lr1121_modem_irq_mask = LR1121_MODEM_SYSTEM_IRQ_NONE; + + lr1121_modem_response_code_t status = lr1121_modem_system_get_irq_status( context, &lr1121_modem_irq_mask ); + + if( ( status == LR1121_MODEM_RESPONSE_CODE_OK ) && ( lr1121_modem_irq_mask != 0 ) ) + { + status = lr1121_modem_system_clear_irq_status( context, lr1121_modem_irq_mask ); + } + if( ( status == LR1121_MODEM_RESPONSE_CODE_OK ) && ( irq != NULL ) ) + { + *irq = lr1121_modem_irq_mask; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_cfg_lfclk( const void* context, + const lr1121_modem_system_lfclk_cfg_t lfclock_cfg, + const bool wait_for_32k_ready ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_CFG_LFCLK_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_CFG_LFCLK_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_CFG_LFCLK_OC >> 0 ), + ( uint8_t )( lfclock_cfg | ( wait_for_32k_ready << 2 ) ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_CFG_LFCLK_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_tcxo_mode( const void* context, + const lr1121_modem_system_tcxo_supply_voltage_t tune, + const uint32_t timeout ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_TCXO_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_TCXO_MODE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_TCXO_MODE_OC >> 0 ), + ( uint8_t ) tune, + ( uint8_t )( timeout >> 16 ), + ( uint8_t )( timeout >> 8 ), + ( uint8_t )( timeout >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_SET_TCXO_MODE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_reboot( const void* context, const bool stay_in_bootloader ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_REBOOT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_REBOOT_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_REBOOT_OC >> 0 ), + ( stay_in_bootloader == true ) ? 0x03 : 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_REBOOT_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_vbat( const void* context, uint8_t* vbat ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_GET_VBAT_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_VBAT_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_VBAT_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_GET_VBAT_CMD_LENGTH, vbat, sizeof( *vbat ) ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_temp( const void* context, uint16_t* temp ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_GET_TEMP_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_TEMP_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_TEMP_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( uint16_t )] = { 0x00 }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_GET_TEMP_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + *temp = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_set_sleep( const void* context, + const lr1121_modem_system_sleep_cfg_t sleep_cfg, + const uint32_t sleep_time ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_SLEEP_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_SLEEP_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_SLEEP_OC >> 0 ), + 0x02u + sleep_cfg.is_warm_start, + ( uint8_t )( sleep_time >> 24 ), + ( uint8_t )( sleep_time >> 16 ), + ( uint8_t )( sleep_time >> 8 ), + ( uint8_t )( sleep_time >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_SET_SLEEP_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_standby( const void* context, + const lr1121_modem_system_standby_cfg_t standby_cfg ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_STANDBY_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_STANDBY_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_STANDBY_OC >> 0 ), + ( uint8_t ) standby_cfg, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_SET_STANDBY_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_wakeup( const void* context ) +{ + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_wakeup( context ); +} + +lr1121_modem_response_code_t lr1121_modem_system_set_fs( const void* context ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_SET_FS_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_FS_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_SET_FS_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( context, cbuffer, + LR1121_MODEM_SYSTEM_SET_FS_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_erase_infopage( const void* context, + const lr1121_modem_system_infopage_id_t infopage_id ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_write_infopage( const void* context, + const lr1121_modem_system_infopage_id_t infopage_id, + const uint16_t address, const uint32_t* data, + const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + ( uint8_t )( address >> 8 ), + ( uint8_t )( address >> 0 ), + }; + uint8_t cdata[256]; + + for( uint16_t index = 0; index < length; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t )( data[index] >> 24 ); + cdata_local[1] = ( uint8_t )( data[index] >> 16 ); + cdata_local[2] = ( uint8_t )( data[index] >> 8 ); + cdata_local[3] = ( uint8_t )( data[index] >> 0 ); + } + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH, cdata, length * sizeof( uint32_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_system_read_infopage( const void* context, + const lr1121_modem_system_infopage_id_t infopage_id, + const uint16_t address, uint32_t* data, + const uint8_t length ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_READ_INFOPAGE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_INFOPAGE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + ( uint8_t )( address >> 8 ), + ( uint8_t )( address >> 0 ), + length, + }; + + const lr1121_modem_response_code_t status = ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_READ_INFOPAGE_CMD_LENGTH, ( uint8_t* ) data, length * sizeof( *data ) ); + + if( status == LR1121_MODEM_RESPONSE_CODE_OK ) + { + for( uint8_t index = 0; index < length; index++ ) + { + uint8_t* buffer_local = ( uint8_t* ) &data[index]; + + data[index] = ( ( uint32_t ) buffer_local[0] << 24 ) + ( ( uint32_t ) buffer_local[1] << 16 ) + + ( ( uint32_t ) buffer_local[2] << 8 ) + ( ( uint32_t ) buffer_local[3] << 0 ); + } + } + + return status; +} + +lr1121_modem_response_code_t lr1121_modem_system_read_uid( const void* context, + lr1121_modem_system_uid_t unique_identifier ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_READ_UID_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_UID_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_UID_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_READ_UID_CMD_LENGTH, unique_identifier, LR1121_MODEM_SYSTEM_UID_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_system_read_join_eui( const void* context, + lr1121_modem_system_join_eui_t join_eui ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_READ_JOIN_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_JOIN_EUI_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_JOIN_EUI_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_READ_JOIN_EUI_CMD_LENGTH, join_eui, LR1121_MODEM_SYSTEM_JOIN_EUI_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_system_read_pin( const void* context, lr1121_modem_system_pin_t pin ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_READ_PIN_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_PIN_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_PIN_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_READ_PIN_CMD_LENGTH, pin, LR1121_MODEM_SYSTEM_PIN_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_system_read_pin_custom_eui( const void* context, + lr1121_modem_system_uid_t device_eui, + lr1121_modem_system_join_eui_t join_eui, + uint8_t rfu, lr1121_modem_system_pin_t pin ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_PIN_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_READ_PIN_OC >> 0 ), + device_eui[0], + device_eui[1], + device_eui[2], + device_eui[3], + device_eui[4], + device_eui[5], + device_eui[6], + device_eui[7], + join_eui[0], + join_eui[1], + join_eui[2], + join_eui[3], + join_eui[4], + join_eui[5], + join_eui[6], + join_eui[7], + rfu, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH, pin, LR1121_MODEM_SYSTEM_PIN_LENGTH ); +} + +lr1121_modem_response_code_t lr1121_modem_system_get_random_number( const void* context, uint32_t* random_number ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_GET_RANDOM_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_RANDOM_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_GET_RANDOM_OC >> 0 ), + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_read( + context, cbuffer, LR1121_MODEM_SYSTEM_GET_RANDOM_CMD_LENGTH, ( uint8_t* ) random_number, sizeof( uint32_t ) ); +} + +lr1121_modem_response_code_t lr1121_modem_system_enable_spi_crc( const void* context, bool enable_crc ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_OC >> 0 ), + ( enable_crc == true ) ? 0x01 : 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH, 0, 0 ); +} + +lr1121_modem_response_code_t lr1121_modem_system_drive_dio_in_sleep_mode( const void* context, bool enable_drive ) +{ + const uint8_t cbuffer[LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH] = { + ( uint8_t )( LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC >> 8 ), + ( uint8_t )( LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC >> 0 ), + ( enable_drive == true ) ? 0x01 : 0x00, + }; + + return ( lr1121_modem_response_code_t ) lr1121_modem_hal_write( + context, cbuffer, LR1121_MODEM_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH, 0, 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static void lr1121_modem_system_convert_stat1_byte_to_enum( uint8_t stat1_byte, lr1121_modem_system_stat1_t* stat1 ) +{ + if( stat1 != NULL ) + { + stat1->is_interrupt_active = ( ( stat1_byte & 0x01 ) != 0 ) ? true : false; + stat1->command_status = ( lr1121_modem_system_command_status_t )( stat1_byte >> 1 ); + } +} + +static void lr1121_modem_system_convert_stat2_byte_to_enum( uint8_t stat2_byte, lr1121_modem_system_stat2_t* stat2 ) +{ + if( stat2 != NULL ) + { + stat2->is_running_from_flash = ( ( stat2_byte & 0x01 ) != 0 ) ? true : false; + stat2->chip_mode = ( lr1121_modem_system_chip_modes_t )( ( stat2_byte & 0x0F ) >> 1 ); + stat2->reset_status = ( lr1121_modem_system_reset_status_t )( ( stat2_byte & 0xF0 ) >> 4 ); + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_modem_hal.c b/components/esp_lora_1121/src/lr1121_modem_hal.c new file mode 100755 index 0000000..3521c0e --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_modem_hal.c @@ -0,0 +1,344 @@ +/*! + * @file lr1121_modem_hal.c + * + * @brief Hardware Abstraction Layer (HAL) implementation for lr1121 + * + * The Clear BSD License + * Copyright Semtech Corporation 2024. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "esp_lora_1121.h" + +/*! + * @brief lr1121_modem_hal.h API implementation + */ + +/*! + * @brief Function to wait that the lr1121 modem-e busy line fall to low + * + * @param [in] context Chip implementation context + * @param [in] timeout_ms timeout in millisec before leave the function + * + * @returns lr1121_hal_status_t + */ +static lr1121_modem_hal_status_t lr1121_modem_hal_wait_on_busy(const void *context, uint32_t timeout_ms); + +/*! + * @brief Function to wait the that lr1121 modem-e busy line raise to high + * + * @param [in] context Chip implementation context + * @param [in] timeout_ms timeout in millisec before leave the function + * + * @returns lr1121_hal_status_t + */ +static lr1121_modem_hal_status_t lr1121_modem_hal_wait_on_unbusy(const void *context, uint32_t timeout_ms); + +lr1121_modem_hal_status_t lr1121_modem_hal_write(const void *context, const uint8_t *command, + const uint16_t command_length, const uint8_t *data, + const uint16_t data_length) +{ + + if (lr1121_modem_hal_wakeup( context ) == LR1121_MODEM_HAL_STATUS_OK) + { + uint8_t crc = 0; + uint8_t crc_received = 0; + lr1121_modem_hal_status_t status; + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + /* Send CMD */ + lora_spi_write_bytes(context, (uint8_t *)command, command_length); + /* Send Data */ + if (data_length > 0) + { + lora_spi_write_bytes(context, (uint8_t *)data, data_length); + } + + /* Compute and send CRC */ + crc = lr1121_modem_compute_crc( 0xFF, command, command_length ); + if (data_length > 0) + { + crc = lr1121_modem_compute_crc( crc, data, data_length ); + } + /* Send CRC */ + lora_spi_write_bytes(context, (uint8_t *)&crc, 1); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + /* Wait on busy pin up to 1000 ms */ + if( lr1121_modem_hal_wait_on_busy( context, 1000 ) != LR1121_MODEM_HAL_STATUS_OK ) + { + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; + } + + /* Send dummy byte to retrieve RC & CRC */ + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + + /* read RC */ + lora_spi_read_bytes(context, ( uint8_t* ) &status, 1); + lora_spi_read_bytes(context, ( uint8_t* ) &crc_received, 1); + + /* Compute response crc */ + crc = lr1121_modem_compute_crc( 0xFF, ( uint8_t* ) &status, 1 ); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + if( crc != crc_received ) + { + /* change the response code */ + status = LR1121_MODEM_HAL_STATUS_BAD_FRAME; + } + + /* Wait on busy pin up to 1000 ms */ + if( lr1121_modem_hal_wait_on_unbusy( context, 1000 ) != LR1121_MODEM_HAL_STATUS_OK ) + { + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; + } + + return status; + } + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; +} + +lr1121_modem_hal_status_t lr1121_modem_hal_write_without_rc( const void* context, const uint8_t* command, + const uint16_t command_length, const uint8_t* data, + const uint16_t data_length ) +{ + if( lr1121_modem_hal_wakeup( context ) == LR1121_MODEM_HAL_STATUS_OK ) + { + uint8_t crc = 0; + lr1121_modem_hal_status_t status = LR1121_MODEM_HAL_STATUS_OK; + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + /* Send CMD */ + lora_spi_write_bytes(context, (uint8_t *)command, command_length); + /* Send Data */ + if (data_length > 0) + { + lora_spi_write_bytes(context, (uint8_t *)data, data_length); + } + /* Compute and send CRC */ + crc = lr1121_modem_compute_crc( 0xFF, command, command_length ); + crc = lr1121_modem_compute_crc( crc, data, data_length ); + /* Send CRC */ + lora_spi_write_bytes(context, (uint8_t *)&crc, 1); + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + return status; + } + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; +} + +lr1121_modem_hal_status_t lr1121_modem_hal_read(const void *context, const uint8_t *command, + const uint16_t command_length, uint8_t *data, + const uint16_t data_length) +{ + if (lr1121_modem_hal_wakeup( context ) == LR1121_MODEM_HAL_STATUS_OK) + { + uint8_t crc = 0; + uint8_t crc_received = 0; + lr1121_modem_hal_status_t status = LR1121_MODEM_HAL_STATUS_ERROR; + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + /* Send CMD */ + lora_spi_write_bytes(context, (uint8_t *)command, command_length); + + /* Compute and send CRC */ + crc = lr1121_modem_compute_crc( 0xFF, command, command_length ); + /* Send CRC */ + lora_spi_write_bytes(context, &crc, 1); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + /* Wait on busy pin up to 1000 ms */ + if (lr1121_modem_hal_wait_on_busy(context, 1000) != LR1121_MODEM_HAL_STATUS_OK) + { + return LR1121_MODEM_HAL_STATUS_ERROR; + } + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + + /* read RC */ + lora_spi_read_bytes(context, ( uint8_t* ) &status, 1); + // printf("status:%d\r\n",status); + if( status == LR1121_MODEM_HAL_STATUS_OK ) + { + // printf("data_length:%d\r\n",data_length); + lora_spi_read_bytes(context, data, data_length); + } + lora_spi_read_bytes( context, ( uint8_t* ) &crc_received, 1 ); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + /* Compute response crc */ + crc = lr1121_modem_compute_crc( 0xFF, ( uint8_t* ) &status, 1 ); + if( status == LR1121_MODEM_HAL_STATUS_OK ) + { + crc = lr1121_modem_compute_crc( crc, data, data_length ); + } + + if( crc != crc_received ) + { + if( crc != crc_received ) + /* change the response code */ + status = LR1121_MODEM_HAL_STATUS_BAD_FRAME; + } + + /* Wait on busy pin up to 1000 ms */ + if( lr1121_modem_hal_wait_on_unbusy( context, 1000 ) != LR1121_MODEM_HAL_STATUS_OK ) + { + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; + } + + return status; + } + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; +} + +lr1121_modem_hal_status_t lr1121_modem_hal_direct_read(const void *context, uint8_t *data, + const uint16_t data_length) +{ + if (lr1121_modem_hal_wait_on_unbusy(context, 10000) == LR1121_MODEM_HAL_STATUS_OK) + { + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + + lora_spi_read_bytes(context, data, data_length); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + return LR1121_MODEM_HAL_STATUS_OK; + } + return LR1121_MODEM_HAL_STATUS_ERROR; +} + +lr1121_modem_hal_status_t lr1121_modem_hal_reset(const void *context) +{ + + if (((lr1121_t *)context)->reset >= 0) + { + gpio_set_level(((lr1121_t *)context)->reset, 0); + vTaskDelay(1 / portTICK_PERIOD_MS); + gpio_set_level(((lr1121_t *)context)->reset, 1); + } + + return LR1121_MODEM_HAL_STATUS_OK; +} + +lr1121_modem_hal_status_t lr1121_modem_hal_wakeup(const void *context) +{ + if( lr1121_modem_hal_wait_on_busy( context, 10000 ) == LR1121_MODEM_HAL_STATUS_OK ) + { + /* Wakeup radio */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + vTaskDelay(1 / portTICK_PERIOD_MS); + gpio_set_level(((lr1121_t *)context)->cs, 1); + vTaskDelay(1 / portTICK_PERIOD_MS); + } + else + { + return LR1121_MODEM_HAL_STATUS_BUSY_TIMEOUT; + } + + /* Wait on busy pin for 1000 ms */ + return lr1121_modem_hal_wait_on_unbusy( context, 1000 ); +} + + +static lr1121_modem_hal_status_t lr1121_modem_hal_wait_on_busy(const void *context, uint32_t timeout_ms) +{ +#if 0 + while( gpio_get_level( ( ( lr1121_t* ) context )->busy ) == 0 ) + { + ; + } +#else + if (((lr1121_t *)context)->busy < 0) + { + return LR1121_MODEM_HAL_STATUS_OK; + } + uint32_t start = esp_timer_get_time() / 1000; + uint32_t current = 0; + + while (gpio_get_level(((lr1121_t *)context)->busy) == 0) + { + current = esp_timer_get_time() / 1000; + if ((int32_t)(current - start) > (int32_t)timeout_ms) + { + return LR1121_MODEM_HAL_STATUS_ERROR; + } + } + +#endif + return LR1121_MODEM_HAL_STATUS_OK; +} + +static lr1121_modem_hal_status_t lr1121_modem_hal_wait_on_unbusy(const void *context, uint32_t timeout_ms) +{ +#if 0 + while( gpio_get_level( ( ( lr1121_t* ) context )->busy ) == 1 ) + { + ; + } +#else + if (((lr1121_t *)context)->busy < 0) + { + return LR1121_MODEM_HAL_STATUS_OK; + } + uint32_t start = esp_timer_get_time() / 1000; + uint32_t current = 0; + while (gpio_get_level(((lr1121_t *)context)->busy) == 1) + { + + current = esp_timer_get_time() / 1000; + if ((int32_t)(current - start) > (int32_t)timeout_ms) + { + return LR1121_MODEM_HAL_STATUS_ERROR; + } + } +#endif + return LR1121_MODEM_HAL_STATUS_OK; +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr1121_modem_printf_info.c b/components/esp_lora_1121/src/lr1121_printers/lr1121_modem_printf_info.c new file mode 100755 index 0000000..1853177 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr1121_modem_printf_info.c @@ -0,0 +1,315 @@ +/*! + * @file lr1121_modem_printf_info.c + * + * @brief Common Application Helper function implementations + * + * @copyright + * @parblock + * The Clear BSD License + * Copyright Semtech Corporation 2024. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * @endparblock + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ +#include "lr1121_modem_printf_info.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC VARIABLES -------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +void print_hex_buffer(const uint8_t *buffer, uint8_t size) +{ + uint8_t newline = 0; + + for (uint8_t i = 0; i < size; i++) + { + if (newline != 0) + { + printf("\n\n"); + newline = 0; + } + + printf("%02X ", buffer[i]); + + if (((i + 1) % 16) == 0) + { + newline = 1; + } + } + printf("\n\n"); +} + +void print_version(lr1121_modem_version_t modem_version) +{ + printf("###### ===== lr1121 MODEM-E VERSION ==== ######\n\n\n"); + printf("USE CASE : %02X\n", modem_version.use_case); + printf("MODEM : %02X.%02X.%02X\n", modem_version.modem_major, modem_version.modem_minor, + modem_version.modem_patch); + printf("LBM : %02X.%02X.%02X\n\n", modem_version.lbm_major, modem_version.lbm_minor, + modem_version.lbm_patch); +} + +void print_lorawan_credentials(const uint8_t *dev_eui, const uint8_t *join_eui, const uint8_t *pin, + const bool use_internal_credentials) +{ + if (use_internal_credentials) + { + printf("---=== INTERNAL CREDENTIALS ===---\n\n"); + } + else + { + printf("---=== CUSTOM CREDENTIALS ===---\n\n"); + } + printf("DevEui : %02X", dev_eui[0]); + for (int i = 1; i < 8; i++) + { + printf("-%02X", dev_eui[i]); + } + printf("\n"); + printf("JoinEui : %02X", join_eui[0]); + for (int i = 1; i < 8; i++) + { + printf("-%02X", join_eui[i]); + } + printf("\n"); + printf("Pin : %02X", pin[0]); + for (int i = 1; i < 4; i++) + { + printf("-%02X", pin[i]); + } + printf("\n\n"); +} + +void modem_status_to_string(lr1121_modem_lorawan_status_t modem_status) +{ + printf("Modem status : "); + + if ((modem_status & LR1121_LORAWAN_CRASH) == LR1121_LORAWAN_CRASH) + { + printf("CRASH "); + } + if ((modem_status & LR1121_LORAWAN_JOINED) == LR1121_LORAWAN_JOINED) + { + printf("JOINED "); + } + if ((modem_status & LR1121_LORAWAN_SUSPEND) == LR1121_LORAWAN_SUSPEND) + { + printf("SUSPEND "); + } + if ((modem_status & LR1121_LORAWAN_JOINING) == LR1121_LORAWAN_JOINING) + { + printf("JOINING "); + } + + printf("\n\n\n"); +} + +void get_and_print_lorawan_region_from_modem(const void *context, lr1121_modem_regions_t *modem_region) +{ + // 1. Get the region from modem + lr1121_modem_regions_t local_region = LR1121_LORAWAN_REGION_EU868; + const lr1121_modem_response_code_t response_code = lr1121_modem_get_region(context, &local_region); + if (response_code == LR1121_MODEM_RESPONSE_CODE_OK) + { + // 2a. If the get from the modem is successful print it. + // And the output pointer is not null: return the region + if (modem_region != NULL) + { + *modem_region = local_region; + } + print_lorawan_region(*modem_region); + } + else + { + // 2b. If the get from modem failed: print an error message + printf("Error on lr1121_modem_get_region, get response code: %d\n", response_code); + } +} + +void print_lorawan_region(lr1121_modem_regions_t region) +{ + switch (region) + { + case LR1121_LORAWAN_REGION_EU868: + { + printf("REGION : EU868\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_US915: + { + printf("REGION : US915\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_AU915: + { + printf("REGION : AU915\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_AS923_GRP1: + { + printf("REGION : AS923_GRP1\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_CN470: + { + printf("REGION : CN470\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_AS923_GRP2: + { + printf("REGION : AS923_GRP2\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_AS923_GRP3: + { + printf("REGION : AS923_GRP3\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_AS923_GRP4: + { + printf("REGION : AS923_GRP4\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_IN865: + { + printf("REGION : IN865\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_KR920: + { + // printf( "LBT : ACTIVATE LBT\n\n" ); + printf("REGION : KR920\n\n\n"); + break; + } + case LR1121_LORAWAN_REGION_RU864: + { + printf("REGION : RU864\n\n\n"); + break; + } + default: + printf("No supported region selected\n\n\n"); + break; + } +} + +void print_certification(lr1121_modem_certification_mode_t certif_running) +{ + if (certif_running == LR1121_MODEM_CERTIFICATION_MODE_ENABLE) + { + printf("###### ===================================== ######\n"); + printf("###### ===== CERTIFICATION MODE ENABLED ==== ######\n"); + printf("###### ===================================== ######\n\n\n"); + } + else + { + printf("###### ====================================== ######\n"); + printf("###### ===== CERTIFICATION MODE DISABLED ==== ######\n"); + printf("###### ====================================== ######\n\n\n"); + } +} + +void get_and_print_crashlog(const void *context) +{ + lr1121_modem_response_code_t response_code = LR1121_MODEM_RESPONSE_CODE_OK; + lr1121_modem_lorawan_status_t modem_status; + + response_code = lr1121_modem_get_status(context, (lr1121_modem_lorawan_status_bitmask_t*)&modem_status); + // Check if the crashlog bit is set in modem_status + if (response_code == LR1121_MODEM_RESPONSE_CODE_OK) + { + if ((modem_status & LR1121_LORAWAN_CRASH) == LR1121_LORAWAN_CRASH) + { + lr1121_modem_crashlog_status_t status_crashlog = LR1121_NO_NEW_CRASHLOG; + uint8_t crashlog[242] = {0}; + // Get the crashlog + response_code = lr1121_modem_get_crashlog(context, &status_crashlog, crashlog); + if ((response_code == LR1121_MODEM_RESPONSE_CODE_OK) && (status_crashlog == LR1121_NEW_CRASHLOG)) + { + printf("###### ===================================== ######\n"); + printf("###### =========== MODEM CRASHED =========== ######\n"); + printf("###### ===================================== ######\n\n"); + // HAL_DBG_TRACE_ARRAY( "Crashlog: ", crashlog, 242 ); + printf("%s - (%u bytes):\n", "Crashlog: ", 242); + for (uint32_t i = 0; i < 242; i++) + { + if (((i % 16) == 0) && (i > 0)) + { + printf("\n"); + } + printf(" %02X", crashlog[i]); + } + printf("\n"); + printf("\n\n"); + } + } + } + else + { + printf("Error on lr1121_modem_get_status, get response code: %d\n", response_code); + } +} +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_bootloader_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_bootloader_types_str.c new file mode 100755 index 0000000..38d6286 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_bootloader_types_str.c @@ -0,0 +1,159 @@ +/*! + * @file lr11xx_bootloader_types_str.c + * + * @brief Printer helper functions for LR11xx bootloader types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_bootloader_types_str.h" + +const char* lr11xx_bootloader_chip_modes_to_str( const lr11xx_bootloader_chip_modes_t value ) +{ + switch( value ) + { + case LR11XX_BOOTLOADER_CHIP_MODE_SLEEP: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_SLEEP"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_STBY_RC: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_STBY_RC"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_STBY_XOSC: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_STBY_XOSC"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_FS: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_FS"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_RX: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_RX"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_TX: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_TX"; + } + + case LR11XX_BOOTLOADER_CHIP_MODE_LOC: + { + return ( const char* ) "LR11XX_BOOTLOADER_CHIP_MODE_LOC"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_bootloader_reset_status_to_str( const lr11xx_bootloader_reset_status_t value ) +{ + switch( value ) + { + case LR11XX_BOOTLOADER_RESET_STATUS_CLEARED: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_CLEARED"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_ANALOG: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_ANALOG"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_EXTERNAL: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_EXTERNAL"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_SYSTEM: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_SYSTEM"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_WATCHDOG: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_WATCHDOG"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_IOCD_RESTART: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_IOCD_RESTART"; + } + + case LR11XX_BOOTLOADER_RESET_STATUS_RTC_RESTART: + { + return ( const char* ) "LR11XX_BOOTLOADER_RESET_STATUS_RTC_RESTART"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_bootloader_command_status_to_str( const lr11xx_bootloader_command_status_t value ) +{ + switch( value ) + { + case LR11XX_BOOTLOADER_CMD_STATUS_FAIL: + { + return ( const char* ) "LR11XX_BOOTLOADER_CMD_STATUS_FAIL"; + } + + case LR11XX_BOOTLOADER_CMD_STATUS_PERR: + { + return ( const char* ) "LR11XX_BOOTLOADER_CMD_STATUS_PERR"; + } + + case LR11XX_BOOTLOADER_CMD_STATUS_OK: + { + return ( const char* ) "LR11XX_BOOTLOADER_CMD_STATUS_OK"; + } + + case LR11XX_BOOTLOADER_CMD_STATUS_DATA: + { + return ( const char* ) "LR11XX_BOOTLOADER_CMD_STATUS_DATA"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_crypto_engine_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_crypto_engine_types_str.c new file mode 100755 index 0000000..9bfe9c6 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_crypto_engine_types_str.c @@ -0,0 +1,260 @@ +/*! + * @file lr11xx_crypto_engine_types_str.c + * + * @brief Printer helper functions for LR11xx crypto engine types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_crypto_engine_types_str.h" + +const char* lr11xx_crypto_element_to_str( const lr11xx_crypto_element_t value ) +{ + switch( value ) + { + case LR11XX_CRYPTO_ELEMENT_CRYPTO_ENGINE: + { + return ( const char* ) "LR11XX_CRYPTO_ELEMENT_CRYPTO_ENGINE"; + } + + case LR11XX_CRYPTO_ELEMENT_SECURE_ELEMENT: + { + return ( const char* ) "LR11XX_CRYPTO_ELEMENT_SECURE_ELEMENT"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_crypto_status_to_str( const lr11xx_crypto_status_t value ) +{ + switch( value ) + { + case LR11XX_CRYPTO_STATUS_SUCCESS: + { + return ( const char* ) "LR11XX_CRYPTO_STATUS_SUCCESS"; + } + + case LR11XX_CRYPTO_STATUS_ERROR_FAIL_CMAC: + { + return ( const char* ) "LR11XX_CRYPTO_STATUS_ERROR_FAIL_CMAC"; + } + + case LR11XX_CRYPTO_STATUS_ERROR_INVALID_KEY_ID: + { + return ( const char* ) "LR11XX_CRYPTO_STATUS_ERROR_INVALID_KEY_ID"; + } + + case LR11XX_CRYPTO_STATUS_ERROR_BUFFER_SIZE: + { + return ( const char* ) "LR11XX_CRYPTO_STATUS_ERROR_BUFFER_SIZE"; + } + + case LR11XX_CRYPTO_STATUS_ERROR: + { + return ( const char* ) "LR11XX_CRYPTO_STATUS_ERROR"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_crypto_lorawan_version_to_str( const lr11xx_crypto_lorawan_version_t value ) +{ + switch( value ) + { + case LR11XX_CRYPTO_LORAWAN_VERSION_1_0_X: + { + return ( const char* ) "LR11XX_CRYPTO_LORAWAN_VERSION_1_0_X"; + } + + case LR11XX_CRYPTO_LORAWAN_VERSION_1_1_X: + { + return ( const char* ) "LR11XX_CRYPTO_LORAWAN_VERSION_1_1_X"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_crypto_keys_idx_to_str( const lr11xx_crypto_keys_idx_t value ) +{ + switch( value ) + { + case LR11XX_CRYPTO_KEYS_IDX_MOTHER_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MOTHER_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_NWK_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_NWK_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_APP_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_APP_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_J_S_ENC_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_J_S_ENC_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_J_S_INT_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_J_S_INT_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_0: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_0"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_1: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_1"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_2: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_2"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_3: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_3"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_4: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_4"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_5: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP_KE_KEY_5"; + } + + case LR11XX_CRYPTO_KEYS_IDX_APP_S_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_APP_S_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_F_NWK_S_INT_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_F_NWK_S_INT_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_S_NWK_S_INT_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_S_NWK_S_INT_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_NWK_S_ENC_KEY: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_NWK_S_ENC_KEY"; + } + + case LR11XX_CRYPTO_KEYS_IDX_RFU_0: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_RFU_0"; + } + + case LR11XX_CRYPTO_KEYS_IDX_RFU_1: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_RFU_1"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_0: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_0"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_1: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_1"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_2: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_2"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_3: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_APP_S_KEY_3"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_0: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_0"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_1: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_1"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_2: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_2"; + } + + case LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_3: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_MC_NWK_S_KEY_3"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP0: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP0"; + } + + case LR11XX_CRYPTO_KEYS_IDX_GP1: + { + return ( const char* ) "LR11XX_CRYPTO_KEYS_IDX_GP1"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_lr_fhss_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_lr_fhss_types_str.c new file mode 100755 index 0000000..435bb47 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_lr_fhss_types_str.c @@ -0,0 +1,165 @@ +/*! + * @file lr11xx_lr_fhss_types_str.c + * + * @brief Printer helper functions for LR11xx LRFHSS types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_lr_fhss_types_str.h" + +const char* lr_fhss_v1_modulation_type_to_str( const lr_fhss_v1_modulation_type_t value ) +{ + switch( value ) + { + case LR_FHSS_V1_MODULATION_TYPE_GMSK_488: + { + return ( const char* ) "LR_FHSS_V1_MODULATION_TYPE_GMSK_488"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr_fhss_v1_cr_to_str( const lr_fhss_v1_cr_t value ) +{ + switch( value ) + { + case LR_FHSS_V1_CR_5_6: + { + return ( const char* ) "LR_FHSS_V1_CR_5_6"; + } + + case LR_FHSS_V1_CR_2_3: + { + return ( const char* ) "LR_FHSS_V1_CR_2_3"; + } + + case LR_FHSS_V1_CR_1_2: + { + return ( const char* ) "LR_FHSS_V1_CR_1_2"; + } + + case LR_FHSS_V1_CR_1_3: + { + return ( const char* ) "LR_FHSS_V1_CR_1_3"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr_fhss_v1_grid_to_str( const lr_fhss_v1_grid_t value ) +{ + switch( value ) + { + case LR_FHSS_V1_GRID_25391_HZ: + { + return ( const char* ) "LR_FHSS_V1_GRID_25391_HZ"; + } + + case LR_FHSS_V1_GRID_3906_HZ: + { + return ( const char* ) "LR_FHSS_V1_GRID_3906_HZ"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr_fhss_v1_bw_to_str( const lr_fhss_v1_bw_t value ) +{ + switch( value ) + { + case LR_FHSS_V1_BW_39063_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_39063_HZ"; + } + + case LR_FHSS_V1_BW_85938_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_85938_HZ"; + } + + case LR_FHSS_V1_BW_136719_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_136719_HZ"; + } + + case LR_FHSS_V1_BW_183594_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_183594_HZ"; + } + + case LR_FHSS_V1_BW_335938_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_335938_HZ"; + } + + case LR_FHSS_V1_BW_386719_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_386719_HZ"; + } + + case LR_FHSS_V1_BW_722656_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_722656_HZ"; + } + + case LR_FHSS_V1_BW_773438_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_773438_HZ"; + } + + case LR_FHSS_V1_BW_1523438_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_1523438_HZ"; + } + + case LR_FHSS_V1_BW_1574219_HZ: + { + return ( const char* ) "LR_FHSS_V1_BW_1574219_HZ"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_printf_info.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_printf_info.c new file mode 100755 index 0000000..01ccc5a --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_printf_info.c @@ -0,0 +1,40 @@ +#include "lr11xx_printf_info.h" +#include "lr1121_common/lr1121_common.h" +#include "stdio.h" + +// Print the version information of LR1121 +void lora_print_version( const void* context ) +{ + lr11xx_system_version_t ver; // Variable to store version information + if(lr11xx_system_get_version(context, &ver) == 0) // Check if version information is successfully retrieved + { + if(ver.type == LR11XX_SYSTEM_VERSION_TYPE_LR1121) // Check if the device is LR1121 + { + printf( "LR1121 information:\n" ); // Print header for LR1121 information + printf( " - Firmware = 0x%04X\n",ver.fw ); // Print firmware version in hexadecimal format + printf( " - Hardware = 0x%02X\n", ver.hw ); // Print hardware version in hexadecimal format + } + else + printf("NO LR1121\r\n"); // Print message if the device is not LR1121 + } +} + +// Print the temperature information of LR1121 +void lora__print_temp( const void* context ) +{ + uint16_t temp; // Variable to store raw temperature value + float t; // Variable to store calculated temperature in Celsius + lr11xx_system_get_temp(context,&temp); // Retrieve raw temperature value from the device + t = ((((float)(temp&0x07ff)/2047) * 1.35)-0.7295)*(1000/(-1.7)) + 25; // Calculate temperature in Celsius based on the raw value + printf( " LR1121 Temp = %0.2f ℃\n", t); // Print temperature with two decimal places +} + +// Print the battery voltage information of LR1121 +void lora_print_vbat( const void* context ) +{ + uint8_t vbat; // Variable to store raw battery voltage value + float v; // Variable to store calculated battery voltage in volts + lr11xx_system_get_vbat(context,&vbat); // Retrieve raw battery voltage value from the device + v = (((float)(5*vbat)/255)-1)*1.35; // Calculate battery voltage in volts based on the raw value + printf( " LR1121 Vbat = %0.2fV\n", v); // Print battery voltage with two decimal places +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_radio_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_radio_types_str.c new file mode 100755 index 0000000..159f558 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_radio_types_str.c @@ -0,0 +1,926 @@ +/*! + * @file lr11xx_radio_types_str.c + * + * @brief Printer helper functions for LR11xx radio types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_radio_types_str.h" + +const char* lr11xx_radio_pa_selection_to_str( const lr11xx_radio_pa_selection_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_PA_SEL_LP: + { + return ( const char* ) "LR11XX_RADIO_PA_SEL_LP"; + } + + case LR11XX_RADIO_PA_SEL_HP: + { + return ( const char* ) "LR11XX_RADIO_PA_SEL_HP"; + } + + case LR11XX_RADIO_PA_SEL_HF: + { + return ( const char* ) "LR11XX_RADIO_PA_SEL_HF"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_address_filtering_to_str( const lr11xx_radio_gfsk_address_filtering_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE: + { + return ( const char* ) "LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE"; + } + + case LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_ADDRESS: + { + return ( const char* ) "LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_ADDRESS"; + } + + case LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_AND_BROADCAST_ADDRESSES: + { + return ( const char* ) "LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_AND_BROADCAST_ADDRESSES"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_fallback_modes_to_str( const lr11xx_radio_fallback_modes_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_FALLBACK_STDBY_RC: + { + return ( const char* ) "LR11XX_RADIO_FALLBACK_STDBY_RC"; + } + + case LR11XX_RADIO_FALLBACK_STDBY_XOSC: + { + return ( const char* ) "LR11XX_RADIO_FALLBACK_STDBY_XOSC"; + } + + case LR11XX_RADIO_FALLBACK_FS: + { + return ( const char* ) "LR11XX_RADIO_FALLBACK_FS"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_ramp_time_to_str( const lr11xx_radio_ramp_time_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_RAMP_16_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_16_US"; + } + + case LR11XX_RADIO_RAMP_32_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_32_US"; + } + + case LR11XX_RADIO_RAMP_48_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_48_US"; + } + + case LR11XX_RADIO_RAMP_64_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_64_US"; + } + + case LR11XX_RADIO_RAMP_80_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_80_US"; + } + + case LR11XX_RADIO_RAMP_96_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_96_US"; + } + + case LR11XX_RADIO_RAMP_112_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_112_US"; + } + + case LR11XX_RADIO_RAMP_128_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_128_US"; + } + + case LR11XX_RADIO_RAMP_144_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_144_US"; + } + + case LR11XX_RADIO_RAMP_160_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_160_US"; + } + + case LR11XX_RADIO_RAMP_176_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_176_US"; + } + + case LR11XX_RADIO_RAMP_192_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_192_US"; + } + + case LR11XX_RADIO_RAMP_208_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_208_US"; + } + + case LR11XX_RADIO_RAMP_240_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_240_US"; + } + + case LR11XX_RADIO_RAMP_272_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_272_US"; + } + + case LR11XX_RADIO_RAMP_304_US: + { + return ( const char* ) "LR11XX_RADIO_RAMP_304_US"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_network_type_to_str( const lr11xx_radio_lora_network_type_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_NETWORK_PRIVATE: + { + return ( const char* ) "LR11XX_RADIO_LORA_NETWORK_PRIVATE"; + } + + case LR11XX_RADIO_LORA_NETWORK_PUBLIC: + { + return ( const char* ) "LR11XX_RADIO_LORA_NETWORK_PUBLIC"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_sf_to_str( const lr11xx_radio_lora_sf_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_SF5: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF5"; + } + + case LR11XX_RADIO_LORA_SF6: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF6"; + } + + case LR11XX_RADIO_LORA_SF7: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF7"; + } + + case LR11XX_RADIO_LORA_SF8: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF8"; + } + + case LR11XX_RADIO_LORA_SF9: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF9"; + } + + case LR11XX_RADIO_LORA_SF10: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF10"; + } + + case LR11XX_RADIO_LORA_SF11: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF11"; + } + + case LR11XX_RADIO_LORA_SF12: + { + return ( const char* ) "LR11XX_RADIO_LORA_SF12"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_bw_to_str( const lr11xx_radio_lora_bw_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_BW_10: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_10"; + } + + case LR11XX_RADIO_LORA_BW_15: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_15"; + } + + case LR11XX_RADIO_LORA_BW_20: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_20"; + } + + case LR11XX_RADIO_LORA_BW_31: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_31"; + } + + case LR11XX_RADIO_LORA_BW_41: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_41"; + } + + case LR11XX_RADIO_LORA_BW_62: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_62"; + } + + case LR11XX_RADIO_LORA_BW_125: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_125"; + } + + case LR11XX_RADIO_LORA_BW_250: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_250"; + } + + case LR11XX_RADIO_LORA_BW_500: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_500"; + } + + case LR11XX_RADIO_LORA_BW_200: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_200"; + } + + case LR11XX_RADIO_LORA_BW_400: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_400"; + } + + case LR11XX_RADIO_LORA_BW_800: + { + return ( const char* ) "LR11XX_RADIO_LORA_BW_800"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_cr_to_str( const lr11xx_radio_lora_cr_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_NO_CR: + { + return ( const char* ) "LR11XX_RADIO_LORA_NO_CR"; + } + + case LR11XX_RADIO_LORA_CR_4_5: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_4_5"; + } + + case LR11XX_RADIO_LORA_CR_4_6: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_4_6"; + } + + case LR11XX_RADIO_LORA_CR_4_7: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_4_7"; + } + + case LR11XX_RADIO_LORA_CR_4_8: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_4_8"; + } + + case LR11XX_RADIO_LORA_CR_LI_4_5: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_LI_4_5"; + } + + case LR11XX_RADIO_LORA_CR_LI_4_6: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_LI_4_6"; + } + + case LR11XX_RADIO_LORA_CR_LI_4_8: + { + return ( const char* ) "LR11XX_RADIO_LORA_CR_LI_4_8"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_intermediary_mode_to_str( const lr11xx_radio_intermediary_mode_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_MODE_SLEEP: + { + return ( const char* ) "LR11XX_RADIO_MODE_SLEEP"; + } + + case LR11XX_RADIO_MODE_STANDBY_RC: + { + return ( const char* ) "LR11XX_RADIO_MODE_STANDBY_RC"; + } + + case LR11XX_RADIO_MODE_STANDBY_XOSC: + { + return ( const char* ) "LR11XX_RADIO_MODE_STANDBY_XOSC"; + } + + case LR11XX_RADIO_MODE_FS: + { + return ( const char* ) "LR11XX_RADIO_MODE_FS"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_crc_type_to_str( const lr11xx_radio_gfsk_crc_type_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_CRC_OFF: + { + return ( const char* ) "LR11XX_RADIO_GFSK_CRC_OFF"; + } + + case LR11XX_RADIO_GFSK_CRC_1_BYTE: + { + return ( const char* ) "LR11XX_RADIO_GFSK_CRC_1_BYTE"; + } + + case LR11XX_RADIO_GFSK_CRC_2_BYTES: + { + return ( const char* ) "LR11XX_RADIO_GFSK_CRC_2_BYTES"; + } + + case LR11XX_RADIO_GFSK_CRC_1_BYTE_INV: + { + return ( const char* ) "LR11XX_RADIO_GFSK_CRC_1_BYTE_INV"; + } + + case LR11XX_RADIO_GFSK_CRC_2_BYTES_INV: + { + return ( const char* ) "LR11XX_RADIO_GFSK_CRC_2_BYTES_INV"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_dc_free_to_str( const lr11xx_radio_gfsk_dc_free_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_DC_FREE_OFF: + { + return ( const char* ) "LR11XX_RADIO_GFSK_DC_FREE_OFF"; + } + + case LR11XX_RADIO_GFSK_DC_FREE_WHITENING: + { + return ( const char* ) "LR11XX_RADIO_GFSK_DC_FREE_WHITENING"; + } + + case LR11XX_RADIO_GFSK_DC_FREE_WHITENING_SX128X_COMP: + { + return ( const char* ) "LR11XX_RADIO_GFSK_DC_FREE_WHITENING_SX128X_COMP"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_pkt_len_modes_to_str( const lr11xx_radio_gfsk_pkt_len_modes_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_PKT_FIX_LEN: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PKT_FIX_LEN"; + } + + case LR11XX_RADIO_GFSK_PKT_VAR_LEN: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PKT_VAR_LEN"; + } + + case LR11XX_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_preamble_detector_to_str( const lr11xx_radio_gfsk_preamble_detector_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_OFF: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_OFF"; + } + + case LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_8BITS: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_8BITS"; + } + + case LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_16BITS: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_16BITS"; + } + + case LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_24BITS: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_24BITS"; + } + + case LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_32BITS: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_32BITS"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_crc_to_str( const lr11xx_radio_lora_crc_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_CRC_OFF: + { + return ( const char* ) "LR11XX_RADIO_LORA_CRC_OFF"; + } + + case LR11XX_RADIO_LORA_CRC_ON: + { + return ( const char* ) "LR11XX_RADIO_LORA_CRC_ON"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_pkt_len_modes_to_str( const lr11xx_radio_lora_pkt_len_modes_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_PKT_EXPLICIT: + { + return ( const char* ) "LR11XX_RADIO_LORA_PKT_EXPLICIT"; + } + + case LR11XX_RADIO_LORA_PKT_IMPLICIT: + { + return ( const char* ) "LR11XX_RADIO_LORA_PKT_IMPLICIT"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lora_iq_to_str( const lr11xx_radio_lora_iq_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LORA_IQ_STANDARD: + { + return ( const char* ) "LR11XX_RADIO_LORA_IQ_STANDARD"; + } + + case LR11XX_RADIO_LORA_IQ_INVERTED: + { + return ( const char* ) "LR11XX_RADIO_LORA_IQ_INVERTED"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_pkt_type_to_str( const lr11xx_radio_pkt_type_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_PKT_NONE: + { + return ( const char* ) "LR11XX_RADIO_PKT_NONE"; + } + + case LR11XX_RADIO_PKT_TYPE_GFSK: + { + return ( const char* ) "LR11XX_RADIO_PKT_TYPE_GFSK"; + } + + case LR11XX_RADIO_PKT_TYPE_LORA: + { + return ( const char* ) "LR11XX_RADIO_PKT_TYPE_LORA"; + } + + case LR11XX_RADIO_PKT_TYPE_BPSK: + { + return ( const char* ) "LR11XX_RADIO_PKT_TYPE_BPSK"; + } + + case LR11XX_RADIO_PKT_TYPE_LR_FHSS: + { + return ( const char* ) "LR11XX_RADIO_PKT_TYPE_LR_FHSS"; + } + + case LR11XX_RADIO_PKT_TYPE_RTTOF: + { + return ( const char* ) "LR11XX_RADIO_PKT_TYPE_RTTOF"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_pa_reg_supply_to_str( const lr11xx_radio_pa_reg_supply_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_PA_REG_SUPPLY_VREG: + { + return ( const char* ) "LR11XX_RADIO_PA_REG_SUPPLY_VREG"; + } + + case LR11XX_RADIO_PA_REG_SUPPLY_VBAT: + { + return ( const char* ) "LR11XX_RADIO_PA_REG_SUPPLY_VBAT"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_rx_duty_cycle_mode_to_str( const lr11xx_radio_rx_duty_cycle_mode_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_RX_DUTY_CYCLE_MODE_RX: + { + return ( const char* ) "LR11XX_RADIO_RX_DUTY_CYCLE_MODE_RX"; + } + + case LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD: + { + return ( const char* ) "LR11XX_RADIO_RX_DUTY_CYCLE_MODE_CAD"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_bw_to_str( const lr11xx_radio_gfsk_bw_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_BW_4800: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_4800"; + } + + case LR11XX_RADIO_GFSK_BW_5800: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_5800"; + } + + case LR11XX_RADIO_GFSK_BW_7300: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_7300"; + } + + case LR11XX_RADIO_GFSK_BW_9700: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_9700"; + } + + case LR11XX_RADIO_GFSK_BW_11700: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_11700"; + } + + case LR11XX_RADIO_GFSK_BW_14600: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_14600"; + } + + case LR11XX_RADIO_GFSK_BW_19500: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_19500"; + } + + case LR11XX_RADIO_GFSK_BW_23400: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_23400"; + } + + case LR11XX_RADIO_GFSK_BW_29300: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_29300"; + } + + case LR11XX_RADIO_GFSK_BW_39000: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_39000"; + } + + case LR11XX_RADIO_GFSK_BW_46900: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_46900"; + } + + case LR11XX_RADIO_GFSK_BW_58600: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_58600"; + } + + case LR11XX_RADIO_GFSK_BW_78200: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_78200"; + } + + case LR11XX_RADIO_GFSK_BW_93800: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_93800"; + } + + case LR11XX_RADIO_GFSK_BW_117300: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_117300"; + } + + case LR11XX_RADIO_GFSK_BW_156200: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_156200"; + } + + case LR11XX_RADIO_GFSK_BW_187200: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_187200"; + } + + case LR11XX_RADIO_GFSK_BW_234300: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_234300"; + } + + case LR11XX_RADIO_GFSK_BW_312000: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_312000"; + } + + case LR11XX_RADIO_GFSK_BW_373600: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_373600"; + } + + case LR11XX_RADIO_GFSK_BW_467000: + { + return ( const char* ) "LR11XX_RADIO_GFSK_BW_467000"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_cad_exit_mode_to_str( const lr11xx_radio_cad_exit_mode_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_CAD_EXIT_MODE_STANDBYRC: + { + return ( const char* ) "LR11XX_RADIO_CAD_EXIT_MODE_STANDBYRC"; + } + + case LR11XX_RADIO_CAD_EXIT_MODE_RX: + { + return ( const char* ) "LR11XX_RADIO_CAD_EXIT_MODE_RX"; + } + + case LR11XX_RADIO_CAD_EXIT_MODE_TX: + { + return ( const char* ) "LR11XX_RADIO_CAD_EXIT_MODE_TX"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_gfsk_pulse_shape_to_str( const lr11xx_radio_gfsk_pulse_shape_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_GFSK_PULSE_SHAPE_OFF: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PULSE_SHAPE_OFF"; + } + + case LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_03: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_03"; + } + + case LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_05: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_05"; + } + + case LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_07: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_07"; + } + + case LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_1: + { + return ( const char* ) "LR11XX_RADIO_GFSK_PULSE_SHAPE_BT_1"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_bpsk_pulse_shape_to_str( const lr11xx_radio_bpsk_pulse_shape_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_DBPSK_PULSE_SHAPE: + { + return ( const char* ) "LR11XX_RADIO_DBPSK_PULSE_SHAPE"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lr_fhss_bitrate_to_str( const lr11xx_radio_lr_fhss_bitrate_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LR_FHSS_BITRATE_488_BPS: + { + return ( const char* ) "LR11XX_RADIO_LR_FHSS_BITRATE_488_BPS"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_radio_lr_fhss_pulse_shape_to_str( const lr11xx_radio_lr_fhss_pulse_shape_t value ) +{ + switch( value ) + { + case LR11XX_RADIO_LR_FHSS_PULSE_SHAPE_BT_1: + { + return ( const char* ) "LR11XX_RADIO_LR_FHSS_PULSE_SHAPE_BT_1"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_rttof_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_rttof_types_str.c new file mode 100755 index 0000000..2237746 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_rttof_types_str.c @@ -0,0 +1,57 @@ +/*! + * @file lr11xx_rttof_types_str.c + * + * @brief Printer helper functions for LR11xx RTToF types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_rttof_types_str.h" + +const char* lr11xx_rttof_result_type_to_str( const lr11xx_rttof_result_type_t value ) +{ + switch( value ) + { + case LR11XX_RTTOF_RESULT_TYPE_RAW: + { + return ( const char* ) "LR11XX_RTTOF_RESULT_TYPE_RAW"; + } + + case LR11XX_RTTOF_RESULT_TYPE_RSSI: + { + return ( const char* ) "LR11XX_RTTOF_RESULT_TYPE_RSSI"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_system_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_system_types_str.c new file mode 100755 index 0000000..e0b5b42 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_system_types_str.c @@ -0,0 +1,325 @@ +/*! + * @file lr11xx_system_types_str.c + * + * @brief Printer helper functions for LR11xx system types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_system_types_str.h" + +const char* lr11xx_system_chip_modes_to_str( const lr11xx_system_chip_modes_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_CHIP_MODE_SLEEP: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_SLEEP"; + } + + case LR11XX_SYSTEM_CHIP_MODE_STBY_RC: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_STBY_RC"; + } + + case LR11XX_SYSTEM_CHIP_MODE_STBY_XOSC: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_STBY_XOSC"; + } + + case LR11XX_SYSTEM_CHIP_MODE_FS: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_FS"; + } + + case LR11XX_SYSTEM_CHIP_MODE_RX: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_RX"; + } + + case LR11XX_SYSTEM_CHIP_MODE_TX: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_TX"; + } + + case LR11XX_SYSTEM_CHIP_MODE_LOC: + { + return ( const char* ) "LR11XX_SYSTEM_CHIP_MODE_LOC"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_reset_status_to_str( const lr11xx_system_reset_status_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_RESET_STATUS_CLEARED: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_CLEARED"; + } + + case LR11XX_SYSTEM_RESET_STATUS_ANALOG: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_ANALOG"; + } + + case LR11XX_SYSTEM_RESET_STATUS_EXTERNAL: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_EXTERNAL"; + } + + case LR11XX_SYSTEM_RESET_STATUS_SYSTEM: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_SYSTEM"; + } + + case LR11XX_SYSTEM_RESET_STATUS_WATCHDOG: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_WATCHDOG"; + } + + case LR11XX_SYSTEM_RESET_STATUS_IOCD_RESTART: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_IOCD_RESTART"; + } + + case LR11XX_SYSTEM_RESET_STATUS_RTC_RESTART: + { + return ( const char* ) "LR11XX_SYSTEM_RESET_STATUS_RTC_RESTART"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_command_status_to_str( const lr11xx_system_command_status_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_CMD_STATUS_FAIL: + { + return ( const char* ) "LR11XX_SYSTEM_CMD_STATUS_FAIL"; + } + + case LR11XX_SYSTEM_CMD_STATUS_PERR: + { + return ( const char* ) "LR11XX_SYSTEM_CMD_STATUS_PERR"; + } + + case LR11XX_SYSTEM_CMD_STATUS_OK: + { + return ( const char* ) "LR11XX_SYSTEM_CMD_STATUS_OK"; + } + + case LR11XX_SYSTEM_CMD_STATUS_DATA: + { + return ( const char* ) "LR11XX_SYSTEM_CMD_STATUS_DATA"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_lfclk_cfg_to_str( const lr11xx_system_lfclk_cfg_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_LFCLK_RC: + { + return ( const char* ) "LR11XX_SYSTEM_LFCLK_RC"; + } + + case LR11XX_SYSTEM_LFCLK_XTAL: + { + return ( const char* ) "LR11XX_SYSTEM_LFCLK_XTAL"; + } + + case LR11XX_SYSTEM_LFCLK_EXT: + { + return ( const char* ) "LR11XX_SYSTEM_LFCLK_EXT"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_reg_mode_to_str( const lr11xx_system_reg_mode_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_REG_MODE_LDO: + { + return ( const char* ) "LR11XX_SYSTEM_REG_MODE_LDO"; + } + + case LR11XX_SYSTEM_REG_MODE_DCDC: + { + return ( const char* ) "LR11XX_SYSTEM_REG_MODE_DCDC"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_infopage_id_to_str( const lr11xx_system_infopage_id_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_INFOPAGE_0: + { + return ( const char* ) "LR11XX_SYSTEM_INFOPAGE_0"; + } + + case LR11XX_SYSTEM_INFOPAGE_1: + { + return ( const char* ) "LR11XX_SYSTEM_INFOPAGE_1"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_standby_cfg_to_str( const lr11xx_system_standby_cfg_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_STANDBY_CFG_RC: + { + return ( const char* ) "LR11XX_SYSTEM_STANDBY_CFG_RC"; + } + + case LR11XX_SYSTEM_STANDBY_CFG_XOSC: + { + return ( const char* ) "LR11XX_SYSTEM_STANDBY_CFG_XOSC"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_tcxo_supply_voltage_to_str( const lr11xx_system_tcxo_supply_voltage_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_TCXO_CTRL_1_6V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_1_6V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_1_7V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_1_7V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_1_8V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_1_8V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_2_2V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_2_2V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_2_4V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_2_4V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_2_7V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_2_7V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_3_0V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_3_0V"; + } + + case LR11XX_SYSTEM_TCXO_CTRL_3_3V: + { + return ( const char* ) "LR11XX_SYSTEM_TCXO_CTRL_3_3V"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} + +const char* lr11xx_system_version_type_to_str( const lr11xx_system_version_type_t value ) +{ + switch( value ) + { + case LR11XX_SYSTEM_VERSION_TYPE_LR1110: + { + return ( const char* ) "LR11XX_SYSTEM_VERSION_TYPE_LR1110"; + } + + case LR11XX_SYSTEM_VERSION_TYPE_LR1120: + { + return ( const char* ) "LR11XX_SYSTEM_VERSION_TYPE_LR1120"; + } + + case LR11XX_SYSTEM_VERSION_TYPE_LR1121: + { + return ( const char* ) "LR11XX_SYSTEM_VERSION_TYPE_LR1121"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr1121_printers/lr11xx_types_str.c b/components/esp_lora_1121/src/lr1121_printers/lr11xx_types_str.c new file mode 100755 index 0000000..20bfd47 --- /dev/null +++ b/components/esp_lora_1121/src/lr1121_printers/lr11xx_types_str.c @@ -0,0 +1,57 @@ +/*! + * @file lr11xx_types_str.c + * + * @brief Printer helper functions for LR11xx types + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2023. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr11xx_types_str.h" + +const char* lr11xx_status_to_str( const lr11xx_status_t value ) +{ + switch( value ) + { + case LR11XX_STATUS_OK: + { + return ( const char* ) "LR11XX_STATUS_OK"; + } + + case LR11XX_STATUS_ERROR: + { + return ( const char* ) "LR11XX_STATUS_ERROR"; + } + + default: + { + return ( const char* ) "Unknown"; + } + } +} diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_bootloader.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_bootloader.c new file mode 100755 index 0000000..7c67adf --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_bootloader.c @@ -0,0 +1,294 @@ +/*! + * @file lr11xx_bootloader.c + * + * @brief Bootloader driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_bootloader.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 ( 64 ) +#define LR11XX_FLASH_DATA_MAX_LENGTH_UINT8 ( LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 * 4 ) + +#define LR11XX_BL_CMD_NO_PARAM_LENGTH ( 2 ) +#define LR11XX_BL_GET_STATUS_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_BL_VERSION_CMD_LENGTH LR11XX_BL_CMD_NO_PARAM_LENGTH +#define LR11XX_BL_ERASE_FLASH_CMD_LENGTH LR11XX_BL_CMD_NO_PARAM_LENGTH +#define LR11XX_BL_WRITE_FLASH_ENCRYPTED_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH + 4 ) +#define LR11XX_BL_REBOOT_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH + 1 ) +#define LR11XX_BL_GET_PIN_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH ) +#define LR11XX_BL_READ_CHIP_EUI_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH ) +#define LR11XX_BL_READ_JOIN_EUI_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for bootloader-related operations + */ +enum +{ + LR11XX_BL_GET_STATUS_OC = 0x0100, + LR11XX_BL_GET_VERSION_OC = 0x0101, + LR11XX_BL_ERASE_FLASH_OC = 0x8000, + LR11XX_BL_WRITE_FLASH_ENCRYPTED_OC = 0x8003, + LR11XX_BL_REBOOT_OC = 0x8005, + LR11XX_BL_GET_PIN_OC = 0x800B, + LR11XX_BL_READ_CHIP_EUI_OC = 0x800C, + LR11XX_BL_READ_JOIN_EUI_OC = 0x800D, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Returns the minimum of the operand given as parameter and the maximum allowed block size + * + * @param [in] operand Size to compare + * + * @returns Minimum between operand and @ref LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 + */ +static uint8_t lr11xx_bootloader_get_min_from_operand_and_max_block_size( uint32_t operand ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_bootloader_get_status( const void* context, lr11xx_bootloader_stat1_t* stat1, + lr11xx_bootloader_stat2_t* stat2, + lr11xx_bootloader_irq_mask_t* irq_status ) +{ + uint8_t data[LR11XX_BL_GET_STATUS_CMD_LENGTH] = { 0 }; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_direct_read( context, data, LR11XX_BL_GET_STATUS_CMD_LENGTH ); + + if( status == LR11XX_STATUS_OK ) + { + stat1->is_interrupt_active = ( ( data[0] & 0x01 ) != 0 ) ? true : false; + stat1->command_status = ( lr11xx_bootloader_command_status_t ) ( data[0] >> 1 ); + + stat2->is_running_from_flash = ( ( data[1] & 0x01 ) != 0 ) ? true : false; + stat2->chip_mode = ( lr11xx_bootloader_chip_modes_t ) ( ( data[1] & 0x0F ) >> 1 ); + stat2->reset_status = ( lr11xx_bootloader_reset_status_t ) ( ( data[1] & 0xF0 ) >> 4 ); + + *irq_status = + ( ( lr11xx_bootloader_irq_mask_t ) data[2] << 24 ) + ( ( lr11xx_bootloader_irq_mask_t ) data[3] << 16 ) + + ( ( lr11xx_bootloader_irq_mask_t ) data[4] << 8 ) + ( ( lr11xx_bootloader_irq_mask_t ) data[5] << 0 ); + } + + return status; +} + +lr11xx_status_t lr11xx_bootloader_clear_reset_status_info( const void* context ) +{ + const uint8_t cbuffer[LR11XX_BL_CMD_NO_PARAM_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_GET_STATUS_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_GET_STATUS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_BL_CMD_NO_PARAM_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_bootloader_get_version( const void* context, lr11xx_bootloader_version_t* version ) +{ + const uint8_t cbuffer[LR11XX_BL_VERSION_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_GET_VERSION_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_GET_VERSION_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_BL_VERSION_LENGTH] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_BL_VERSION_CMD_LENGTH, + rbuffer, LR11XX_BL_VERSION_LENGTH ); + + if( status == LR11XX_STATUS_OK ) + { + version->hw = rbuffer[0]; + version->type = rbuffer[1]; + version->fw = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + } + + return status; +} + +lr11xx_status_t lr11xx_bootloader_erase_flash( const void* context ) +{ + const uint8_t cbuffer[LR11XX_BL_ERASE_FLASH_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_ERASE_FLASH_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_ERASE_FLASH_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_BL_ERASE_FLASH_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_bootloader_write_flash_encrypted( const void* context, const uint32_t offset_in_byte, + const uint32_t* data, uint8_t length_in_word ) +{ + const uint8_t cbuffer[LR11XX_BL_WRITE_FLASH_ENCRYPTED_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_WRITE_FLASH_ENCRYPTED_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_WRITE_FLASH_ENCRYPTED_OC >> 0 ), + ( uint8_t ) ( offset_in_byte >> 24 ), + ( uint8_t ) ( offset_in_byte >> 16 ), + ( uint8_t ) ( offset_in_byte >> 8 ), + ( uint8_t ) ( offset_in_byte >> 0 ), + }; + + uint8_t cdata[LR11XX_FLASH_DATA_MAX_LENGTH_UINT8] = { 0 }; + for( uint8_t index = 0; index < length_in_word; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t ) ( data[index] >> 24 ); + cdata_local[1] = ( uint8_t ) ( data[index] >> 16 ); + cdata_local[2] = ( uint8_t ) ( data[index] >> 8 ); + cdata_local[3] = ( uint8_t ) ( data[index] >> 0 ); + } + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_BL_WRITE_FLASH_ENCRYPTED_CMD_LENGTH, cdata, + length_in_word * sizeof( uint32_t ) ); +} + +lr11xx_status_t lr11xx_bootloader_write_flash_encrypted_full( const void* context, const uint32_t offset_in_byte, + const uint32_t* buffer, const uint32_t length_in_word ) +{ + uint32_t remaining_length = length_in_word; + uint32_t local_offset = offset_in_byte; + uint32_t loop = 0; + + while( remaining_length != 0 ) + { + const lr11xx_status_t status = lr11xx_bootloader_write_flash_encrypted( + context, local_offset, buffer + loop * LR11XX_FLASH_DATA_MAX_LENGTH_UINT32, + lr11xx_bootloader_get_min_from_operand_and_max_block_size( remaining_length ) ); + + if( status != LR11XX_STATUS_OK ) + { + return status; + } + + local_offset += LR11XX_FLASH_DATA_MAX_LENGTH_UINT8; + remaining_length = ( remaining_length < LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 ) + ? 0 + : ( remaining_length - LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 ); + + loop++; + } + + return LR11XX_STATUS_OK; +} + +lr11xx_status_t lr11xx_bootloader_reboot( const void* context, const bool stay_in_bootloader ) +{ + const uint8_t cbuffer[LR11XX_BL_REBOOT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_REBOOT_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_REBOOT_OC >> 0 ), + ( stay_in_bootloader == true ) ? 0x03 : 0x00, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_BL_REBOOT_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_bootloader_read_pin( const void* context, lr11xx_bootloader_pin_t pin ) +{ + const uint8_t cbuffer[LR11XX_BL_GET_PIN_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_GET_PIN_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_GET_PIN_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_BL_GET_PIN_CMD_LENGTH, pin, + LR11XX_BL_PIN_LENGTH ); +} + +lr11xx_status_t lr11xx_bootloader_read_chip_eui( const void* context, lr11xx_bootloader_chip_eui_t chip_eui ) +{ + const uint8_t cbuffer[LR11XX_BL_READ_CHIP_EUI_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_READ_CHIP_EUI_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_READ_CHIP_EUI_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_BL_READ_CHIP_EUI_CMD_LENGTH, chip_eui, + LR11XX_BL_CHIP_EUI_LENGTH ); +} + +lr11xx_status_t lr11xx_bootloader_read_join_eui( const void* context, lr11xx_bootloader_join_eui_t join_eui ) +{ + const uint8_t cbuffer[LR11XX_BL_READ_JOIN_EUI_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_BL_READ_JOIN_EUI_OC >> 8 ), + ( uint8_t ) ( LR11XX_BL_READ_JOIN_EUI_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_BL_READ_JOIN_EUI_CMD_LENGTH, join_eui, + LR11XX_BL_JOIN_EUI_LENGTH ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint8_t lr11xx_bootloader_get_min_from_operand_and_max_block_size( uint32_t operand ) +{ + if( operand > LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 ) + { + return LR11XX_FLASH_DATA_MAX_LENGTH_UINT32; + } + else + { + return ( uint8_t ) operand; + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_crypto_engine.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_crypto_engine.c new file mode 100755 index 0000000..3ff69a5 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_crypto_engine.c @@ -0,0 +1,589 @@ +/*! + * @file lr11xx_crypto_engine.c + * + * @brief Cryptographic engine driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_crypto_engine.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 ( 64 ) +#define LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT8 ( LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 * 4 ) + +#define LR11XX_CRYPTO_SELECT_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_CRYPTO_SET_KEY_CMD_LENGTH ( 2 + 17 ) +#define LR11XX_CRYPTO_DERIVE_KEY_CMD_LENGTH ( 2 + 18 ) +#define LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_CMD_LENGTH ( 2 + 3 + 12 + 32 ) +#define LR11XX_CRYPTO_COMPUTE_AES_CMAC_CMD_LENGTH ( 2 + 1 + 272 ) +#define LR11XX_CRYPTO_VERIFY_AES_CMAC_CMD_LENGTH ( 2 + 1 + 4 + 256 ) +#define LR11XX_CRYPTO_AES_ENCRYPT_CMD_LENGTH ( 2 + 1 + 256 ) +#define LR11XX_CRYPTO_AES_DECRYPT_CMD_LENGTH ( 2 + 1 + 256 ) +#define LR11XX_CRYPTO_STORE_TO_FLASH_CMD_LENGTH ( 2 ) +#define LR11XX_CRYPTO_RESTORE_FROM_FLASH_CMD_LENGTH ( 2 ) +#define LR11XX_CRYPTO_SET_PARAMETER_CMD_LENGTH ( 2 + 1 + 4 ) +#define LR11XX_CRYPTO_GET_PARAMETER_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_CMD_LENGTH ( 2 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for crypto-related operations + */ +enum +{ + LR11XX_CRYPTO_SELECT_OC = 0x0500, + LR11XX_CRYPTO_SET_KEY_OC = 0x0502, + LR11XX_CRYPTO_DERIVE_KEY_OC = 0x0503, + LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_OC = 0x0504, + LR11XX_CRYPTO_COMPUTE_AES_CMAC_OC = 0x0505, + LR11XX_CRYPTO_VERIFY_AES_CMAC_OC = 0x0506, + LR11XX_CRYPTO_ENCRYPT_AES_01_OC = 0x0507, + LR11XX_CRYPTO_ENCRYPT_AES_OC = 0x0508, + LR11XX_CRYPTO_DECRYPT_AES_OC = 0x0509, + LR11XX_CRYPTO_STORE_TO_FLASH_OC = 0x050A, + LR11XX_CRYPTO_RESTORE_FROM_FLASH_OC = 0x050B, + LR11XX_CRYPTO_SET_PARAMETER_OC = 0x050D, + LR11XX_CRYPTO_GET_PARAMETER_OC = 0x050E, + LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_OC = 0x050F, + LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_OC = 0x0510, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Helper function that fill the cbuffer provided in first argument with the command opcode, the key id + * and the data to encrypt/decrypt/compute aes cmac + * + * @param [out] cbuffer Buffer used to build the frame + * @param [in] opcode Opcode to be added to the frame + * @param [in] key_id Key ID to be added to the frame + * @param [in] data Data to be added to the frame + * @param [in] length Number of bytes from data to be added to the frame + * + * @warning The caller MUST ensure cbuffer is array is big enough to contain opcode, key_id, and data! + */ +static void lr11xx_crypto_fill_cbuffer_opcode_key_data( uint8_t* cbuffer, uint16_t opcode, uint8_t key_id, + const uint8_t* data, uint16_t length ); + +/*! + * @brief Returns the minimum of the operand given as parameter and the maximum allowed block size + * + * @param [in] operand Size to compare + * + * @returns Minimum between operand and @ref LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 + */ +static uint8_t lr11xx_crypto_get_min_from_operand_and_max_block_size( uint32_t operand ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_crypto_select( const void* context, const lr11xx_crypto_element_t element ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_SELECT_CMD_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_SELECT_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_SELECT_OC >> 0 ); + + cbuffer[2] = element; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_CRYPTO_SELECT_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_crypto_set_key( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const lr11xx_crypto_key_t key ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_SET_KEY_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_SET_KEY_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_SET_KEY_OC >> 0 ); + + cbuffer[2] = key_id; + + for( uint8_t index = 0; index < sizeof( lr11xx_crypto_key_t ); index++ ) + { + cbuffer[3 + index] = key[index]; + } + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_CRYPTO_SET_KEY_CMD_LENGTH, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_derive_key( const void* context, lr11xx_crypto_status_t* status, const uint8_t src_key_id, + const uint8_t dest_key_id, const lr11xx_crypto_nonce_t nonce ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_DERIVE_KEY_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_DERIVE_KEY_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_DERIVE_KEY_OC >> 0 ); + + cbuffer[2] = src_key_id; + cbuffer[3] = dest_key_id; + + for( uint8_t index = 0; index < LR11XX_CRYPTO_NONCE_LENGTH; index++ ) + { + cbuffer[4 + index] = nonce[index]; + } + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_CRYPTO_DERIVE_KEY_CMD_LENGTH, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_process_join_accept( const void* context, lr11xx_crypto_status_t* status, + const uint8_t dec_key_id, const uint8_t ver_key_id, + const lr11xx_crypto_lorawan_version_t lorawan_version, + const uint8_t* header, const uint8_t* data_in, const uint8_t length, + uint8_t* data_out ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + 32] = { 0x00 }; + uint8_t header_length = ( lorawan_version == 0 ) ? 1 : 12; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_OC >> 0 ); + + cbuffer[2] = dec_key_id; + cbuffer[3] = ver_key_id; + cbuffer[4] = ( uint8_t ) lorawan_version; + + for( uint8_t index = 0; index < header_length; index++ ) + { + cbuffer[5 + index] = header[index]; + } + + for( uint8_t index = 0; index < length; index++ ) + { + cbuffer[5 + header_length + index] = data_in[index]; + } + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, 2 + 3 + header_length + length, rbuffer, 1 + length ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint8_t index = 0; index < length; index++ ) + { + data_out[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_compute_aes_cmac( const void* context, lr11xx_crypto_status_t* status, + const uint8_t key_id, const uint8_t* data, const uint16_t length, + lr11xx_crypto_mic_t mic ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_COMPUTE_AES_CMAC_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_MIC_LENGTH] = { 0x00 }; + + lr11xx_crypto_fill_cbuffer_opcode_key_data( cbuffer, LR11XX_CRYPTO_COMPUTE_AES_CMAC_OC, key_id, data, length ); + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, 3 + length, rbuffer, + LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_MIC_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint8_t index = 0; index < LR11XX_CRYPTO_MIC_LENGTH; index++ ) + { + mic[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_verify_aes_cmac( const void* context, lr11xx_crypto_status_t* status, + const uint8_t key_id, const uint8_t* data, const uint16_t length, + const lr11xx_crypto_mic_t mic ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_VERIFY_AES_CMAC_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_VERIFY_AES_CMAC_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_VERIFY_AES_CMAC_OC >> 0 ); + + cbuffer[2] = key_id; + + for( uint8_t index = 0; index < LR11XX_CRYPTO_MIC_LENGTH; index++ ) + { + cbuffer[3 + index] = mic[index]; + } + + for( uint16_t index = 0; index < length; index++ ) + { + cbuffer[3 + LR11XX_CRYPTO_MIC_LENGTH + index] = data[index]; + } + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, 3 + LR11XX_CRYPTO_MIC_LENGTH + length, + rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_aes_encrypt_01( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_AES_ENCRYPT_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_DATA_MAX_LENGTH] = { 0x00 }; + + lr11xx_crypto_fill_cbuffer_opcode_key_data( cbuffer, LR11XX_CRYPTO_ENCRYPT_AES_01_OC, key_id, data, length ); + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, 3 + length, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH + length ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint16_t index = 0; index < length; index++ ) + { + result[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_aes_encrypt( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_AES_ENCRYPT_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_DATA_MAX_LENGTH] = { 0x00 }; + + lr11xx_crypto_fill_cbuffer_opcode_key_data( cbuffer, LR11XX_CRYPTO_ENCRYPT_AES_OC, key_id, data, length ); + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, 3 + length, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH + length ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint16_t index = 0; index < length; index++ ) + { + result[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_aes_decrypt( const void* context, lr11xx_crypto_status_t* status, const uint8_t key_id, + const uint8_t* data, const uint16_t length, uint8_t* result ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_AES_DECRYPT_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_DATA_MAX_LENGTH] = { 0x00 }; + + lr11xx_crypto_fill_cbuffer_opcode_key_data( cbuffer, LR11XX_CRYPTO_DECRYPT_AES_OC, key_id, data, length ); + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, 3 + length, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH + length ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint16_t index = 0; index < length; index++ ) + { + result[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_store_to_flash( const void* context, lr11xx_crypto_status_t* status ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_STORE_TO_FLASH_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_STORE_TO_FLASH_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_STORE_TO_FLASH_OC >> 0 ); + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_CRYPTO_STORE_TO_FLASH_CMD_LENGTH, + rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_restore_from_flash( const void* context, lr11xx_crypto_status_t* status ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_RESTORE_FROM_FLASH_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_RESTORE_FROM_FLASH_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_RESTORE_FROM_FLASH_OC >> 0 ); + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( + context, cbuffer, LR11XX_CRYPTO_RESTORE_FROM_FLASH_CMD_LENGTH, rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_set_parameter( const void* context, lr11xx_crypto_status_t* status, + const uint8_t param_id, const lr11xx_crypto_param_t parameter ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_SET_PARAMETER_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_SET_PARAMETER_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_SET_PARAMETER_OC >> 0 ); + + cbuffer[2] = param_id; + + for( uint8_t index = 0; index < LR11XX_CRYPTO_PARAMETER_LENGTH; index++ ) + { + cbuffer[3 + index] = parameter[index]; + } + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_CRYPTO_SET_PARAMETER_CMD_LENGTH, + rbuffer, LR11XX_CRYPTO_STATUS_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_get_parameter( const void* context, lr11xx_crypto_status_t* status, + const uint8_t param_id, lr11xx_crypto_param_t parameter ) +{ + uint8_t cbuffer[LR11XX_CRYPTO_GET_PARAMETER_CMD_LENGTH] = { 0x00 }; + uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_PARAMETER_LENGTH] = { 0x00 }; + + cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_GET_PARAMETER_OC >> 8 ); + cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_GET_PARAMETER_OC >> 0 ); + + cbuffer[2] = param_id; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_CRYPTO_GET_PARAMETER_CMD_LENGTH, rbuffer, + LR11XX_CRYPTO_STATUS_LENGTH + LR11XX_CRYPTO_PARAMETER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *status = ( lr11xx_crypto_status_t ) rbuffer[0]; + + if( *status == LR11XX_CRYPTO_STATUS_SUCCESS ) + { + for( uint8_t index = 0; index < LR11XX_CRYPTO_PARAMETER_LENGTH; index++ ) + { + parameter[index] = rbuffer[1 + index]; + } + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_crypto_check_encrypted_firmware_image( const void* context, const uint32_t offset_in_byte, + const uint32_t* data, const uint8_t length_in_word ) +{ + const uint8_t cbuffer[LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_OC >> 8 ), + ( uint8_t ) ( LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_OC >> 0 ), + ( uint8_t ) ( offset_in_byte >> 24 ), + ( uint8_t ) ( offset_in_byte >> 16 ), + ( uint8_t ) ( offset_in_byte >> 8 ), + ( uint8_t ) ( offset_in_byte >> 0 ), + }; + + uint8_t cdata[256] = { 0 }; + for( uint8_t index = 0; index < length_in_word; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t ) ( data[index] >> 24 ); + cdata_local[1] = ( uint8_t ) ( data[index] >> 16 ); + cdata_local[2] = ( uint8_t ) ( data[index] >> 8 ); + cdata_local[3] = ( uint8_t ) ( data[index] >> 0 ); + } + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_CRYPTO_CHECK_ENCRYPTED_FW_IMAGE_CMD_LENGTH, + cdata, length_in_word * sizeof( uint32_t ) ); +} + +lr11xx_status_t lr11xx_crypto_check_encrypted_firmware_image_full( const void* context, const uint32_t offset_in_byte, + const uint32_t* buffer, + const uint32_t length_in_word ) +{ + uint32_t remaining_length = length_in_word; + uint32_t local_offset = offset_in_byte; + uint32_t loop = 0; + + while( remaining_length != 0 ) + { + const lr11xx_status_t status = lr11xx_crypto_check_encrypted_firmware_image( + context, local_offset, buffer + loop * LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32, + lr11xx_crypto_get_min_from_operand_and_max_block_size( remaining_length ) ); + + if( status != LR11XX_STATUS_OK ) + { + return status; + } + + local_offset += LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT8; + remaining_length = ( remaining_length < LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 ) + ? 0 + : ( remaining_length - LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 ); + + loop++; + } + + return LR11XX_STATUS_OK; +} + +lr11xx_status_t lr11xx_crypto_get_check_encrypted_firmware_image_result( const void* context, + bool* is_encrypted_fw_image_ok ) +{ + const uint8_t cbuffer[LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_OC >> 8 ), + ( uint8_t ) ( LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, + LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_CMD_LENGTH, + ( uint8_t* ) is_encrypted_fw_image_ok, 1 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static void lr11xx_crypto_fill_cbuffer_opcode_key_data( uint8_t* cbuffer, uint16_t opcode, uint8_t key_id, + const uint8_t* data, uint16_t length ) +{ + cbuffer[0] = ( uint8_t ) ( opcode >> 8 ); + cbuffer[1] = ( uint8_t ) ( opcode >> 0 ); + + cbuffer[2] = key_id; + + for( uint16_t index = 0; index < length; index++ ) + { + cbuffer[3 + index] = data[index]; + } +} + +uint8_t lr11xx_crypto_get_min_from_operand_and_max_block_size( uint32_t operand ) +{ + if( operand > LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 ) + { + return LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32; + } + else + { + return ( uint8_t ) operand; // Downcast done on purpose given that the value is smaller than 64 + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_driver_version.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_driver_version.c new file mode 100755 index 0000000..42355bf --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_driver_version.c @@ -0,0 +1,88 @@ +/*! + * @file lr11xx_driver_version.c + * + * @brief Placeholder to keep the version of LR11XX driver. + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_driver_version.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +#define STR_HELPER( x ) #x +#define STR( x ) STR_HELPER( x ) + +#define LR11XX_DRIVER_VERSION_FULL \ + "v" STR( LR11XX_DRIVER_VERSION_MAJOR ) "." STR( LR11XX_DRIVER_VERSION_MINOR ) "." STR( LR11XX_DRIVER_VERSION_PATCH ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +const char* lr11xx_driver_version_get_version_string( void ) +{ + return ( const char* ) LR11XX_DRIVER_VERSION_FULL; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_gnss.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_gnss.c new file mode 100755 index 0000000..c3d6dc5 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_gnss.c @@ -0,0 +1,1339 @@ +/*! + * @file lr11xx_gnss.c + * + * @brief GNSS scan driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_gnss.h" +#include "lr11xx_regmem.h" +#include "lr11xx_system_types.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_GNSS_READ_GNSS_RSSI_TEST_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_GNSS_SET_CONSTELLATION_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_READ_CONSTELLATION_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SET_ALMANAC_UPDATE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_READ_ALMANAC_UPDATE_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_FW_VERSION_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SET_SCAN_MODE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_SCAN_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_GNSS_SCAN_GET_RES_SIZE_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SCAN_READ_RES_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_ALMANAC_UPDATE_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_ALMANAC_READ_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SET_ASSISTANCE_POSITION_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_GNSS_READ_ASSISTANCE_POSITION_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_PUSH_SOLVER_MSG_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_PUSH_DM_MSG_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_GET_CONTEXT_STATUS_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_GET_NB_SV_SATELLITES_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_GET_SV_SATELLITES_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_GNSS_GET_SV_VISIBLE_CMD_LENGTH ( 2 + 9 ) +#define LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_FETCH_TIME_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_GNSS_READ_TIME_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_RESET_TIME_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_RESET_POSITION_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_ALMANAC_STATUS_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_GNSS_READ_DEMOD_STATUS_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_CUMULATIVE_TIMING_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_SET_TIME_CMD_LENGTH ( 2 + 6 ) +#define LR11XX_GNSS_CONFIG_DELAY_RESET_AP_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_GNSS_CONFIG_READ_RESET_AP_CMD_LENGTH ( 2 ) +#define LR11XX_GNSS_CONFIG_READ_KEEP_SYNC_STATUS_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_GNSS_GET_SV_SYNC_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_GNSS_WRITE_GPS_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH ( 2 + 5 ) +#define LR11XX_GNSS_WRITE_BEIDOU_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH ( 2 + 9 ) +#define LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_CMD_LENGTH ( 2 ) + +#define LR11XX_GNSS_READ_GNSS_RSSI_TEST_READ_RBUFFER_LENGTH ( 2 ) +#define LR11XX_GNSS_ALMANAC_READ_RBUFFER_LENGTH ( 6 ) +#define LR11XX_GNSS_ALMANAC_DATE_LENGTH ( 2 ) +#define LR11XX_GNSS_ALMANAC_UPDATE_MAX_NB_OF_BLOCKS \ + ( ( LR11XX_CMD_LENGTH_MAX - LR11XX_GNSS_ALMANAC_UPDATE_CMD_LENGTH ) / LR11XX_GNSS_SINGLE_ALMANAC_WRITE_SIZE ) +#define LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE ( 47 ) +#define LR11XX_GNSS_MAX_DETECTED_SV ( 32 ) +#define LR11XX_GNSS_DETECTED_SV_SINGLE_LENGTH ( 4 ) +#define LR11XX_GNSS_MAX_DETECTED_SV_BUFFER_LENGTH \ + ( LR11XX_GNSS_MAX_DETECTED_SV * LR11XX_GNSS_DETECTED_SV_SINGLE_LENGTH ) +#define LR11XX_GNSS_READ_FIRMWARE_VERSION_RBUFFER_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_TIME_RBUFFER_LENGTH ( 12 ) +#define LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_RBUFFER_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_DEMOD_STATUS_RBUFFER_LENGTH ( 2 ) +#define LR11XX_GNSS_READ_CUMULATIVE_TIMING_RBUFFER_LENGTH ( 125 ) +#define LR11XX_GNSS_DOPPLER_SOLVER_RES_RBUFFER_LENGTH ( 18 ) +#define LR11XX_GNSS_READ_DELAY_RESET_AP_RBUFFER_LENGTH ( 3 ) +#define LR11XX_GNSS_READ_ALMANAC_STATUS_RBUFFER_LENGTH ( 53 ) +#define LR11XX_GNSS_READ_KEEP_SYNC_STATUS_RBUFFER_LENGTH ( 5 ) +#define LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_RBUFFER_LENGTH ( 2 ) + +#define LR11XX_GNSS_SCALING_LATITUDE 90 +#define LR11XX_GNSS_SCALING_LONGITUDE 180 +#define LR11XX_GNSS_SNR_TO_CNR_OFFSET ( 31 ) + +#define LR11XX_GNSS_SCAN_RESULT_DESTINATION_INDEX ( 0 ) + +/*! + * @brief GNSS scan power consumption + * + * @note these numbers are given for information, it should be modified according to the used hardware. + */ +#define LR11XX_GNSS_RADIO_ACQUISITION_GPS_UA_DCDC ( 15000 ) +#define LR11XX_GNSS_RADIO_ACQUISITION_BEIDOU_UA_DCDC ( 16500 ) +#define LR11XX_GNSS_COMPUTATION_UA_DCDC ( 3100 ) +#define LR11XX_GNSS_RADIO_ACQUISITION_GPS_UA_LDO ( 24500 ) +#define LR11XX_GNSS_RADIO_ACQUISITION_BEIDOU_UA_LDO ( 27300 ) +#define LR11XX_GNSS_COMPUTATION_UA_LDO ( 5000 ) +#define LR11XX_GNSS_LF_CLOCK_VALUE ( 32768 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for GNSS-related operations + */ +enum +{ + LR11XX_GNSS_READ_GNSS_RSSI_TEST_OC = 0x0222, + LR11XX_GNSS_SET_CONSTELLATION_OC = 0x0400, //!< Set the constellation to use + LR11XX_GNSS_READ_CONSTELLATION_OC = 0x0401, //!< Read the used constellations + LR11XX_GNSS_SET_ALMANAC_UPDATE_OC = 0x0402, //!< Set almanac update configuration + LR11XX_GNSS_READ_ALMANAC_UPDATE_OC = 0x0403, //!< Read the almanac update configuration + LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_OC = 0x0404, //!< Set the frequency search space + LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_OC = 0x0405, //!< Read the frequency search space + LR11XX_GNSS_READ_FW_VERSION_OC = 0x0406, //!< Read the firmware version + LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_OC = 0x0407, //!< Read the supported constellations + LR11XX_GNSS_SET_SCAN_MODE_OC = 0x0408, //!< Define single or double capture + LR11XX_GNSS_SCAN_OC = 0x040B, //!< Launch the scan + LR11XX_GNSS_SCAN_GET_RES_SIZE_OC = 0x040C, //!< Get the size of the output payload + LR11XX_GNSS_SCAN_READ_RES_OC = 0x040D, //!< Read the byte stream + LR11XX_GNSS_ALMANAC_UPDATE_OC = 0x040E, //!< Update the almanac + LR11XX_GNSS_ALMANAC_READ_OC = 0x040F, //!< Read all almanacs + LR11XX_GNSS_SET_ASSISTANCE_POSITION_OC = 0x0410, //!< Set the assistance position + LR11XX_GNSS_READ_ASSISTANCE_POSITION_OC = 0x0411, //!< Read the assistance position + LR11XX_GNSS_PUSH_SOLVER_MSG_OC = 0x0414, //!< Push messages coming from the solver + LR11XX_GNSS_PUSH_DM_MSG_OC = 0x0415, //!< Push messages coming from the device management + LR11XX_GNSS_GET_CONTEXT_STATUS_OC = 0x0416, //!< Read the context + LR11XX_GNSS_GET_NB_SATELLITES_OC = 0x0417, //!< Get the number of satellites detected during a scan + LR11XX_GNSS_GET_SATELLITES_OC = 0x0418, //!< Get the list of satellites detected during a scan + LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_OC = 0x041A, //!< Read the almanac of given satellites + LR11XX_GNSS_GET_SV_VISIBLE_OC = 0x041F, //!< Get the number of visible SV from a date and a position + LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_OC = 0x0420, //!< Get visible SV ID and corresponding doppler value + LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_OC = 0x0426, //!< Get the type of scan launched during the last scan + LR11XX_GNSS_FETCH_TIME_OC = 0x0432, //!< Start the time acquisition/domulation + LR11XX_GNSS_READ_TIME_OC = 0x0434, //!< Read time from LR11XX + LR11XX_GNSS_RESET_TIME_OC = 0x0435, //!< Reset the internal time + LR11XX_GNSS_RESET_POSITION_OC = 0x0437, //!< Reset the location and the history Doppler buffer + LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_OC = 0x0438, //!< Read the week number rollover + LR11XX_GNSS_READ_DEMOD_STATUS_OC = 0x0439, //!< Read demod status + LR11XX_GNSS_READ_CUMULATIVE_TIMING_OC = 0x044A, //!< Read cumulative timing + LR11XX_GNSS_SET_TIME_OC = 0x044B, //!< Set the GPS time + LR11XX_GNSS_CONFIG_DELAY_RESET_AP_OC = 0x044D, //!< Configures the time delay in sec + LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_OC = + 0x044F, //!< Read the assisted position based on the internal doppler solver + LR11XX_GNSS_READ_DELAY_RESET_AP_OC = 0x0453, //!< Read the time delay in sec + LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_OC = + 0x0454, //!< Launches one scan to download from satellite almanac parameters broadcasted + LR11XX_GNSS_READ_KEEP_SYNC_STATUS_OC = 0x0456, //!< Read the number of visible satellites and the time elapsed from + //!< last detected satellite list update + LR11XX_GNSS_READ_ALMANAC_STATUS_OC = 0x0457, //!< Returns the actual state of almanac GPS and Beidou. + LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_OC = 0x0463, //!< Configures the almanac update period + LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_OC = 0x0464, //!< Read the almanac update period + LR11XX_GNSS_GET_SV_SYNC_OC = 0x0466, //!< Returns the list of satellite for the next keep sync scan + LR11XX_GNSS_WRITE_BIT_MASK_SAT_ACTIVATED_OC = + 0x0472, //!< Configures the ability of the LR11xx to search almanac for each satellites +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Helper function that convert an array of uint8_t into a uint32_t single value + * + * @warning It is up to the caller to ensure that value points to an array of at least sizeof(uint32_t) elements. + * + * @param [in] value Array of uint8_t to be translated into a uint32_t + * + * @returns 32-bit value + */ +static uint32_t lr11xx_gnss_uint8_to_uint32( uint8_t value[4] ); + +/*! + * @brief Returns the minimum of the operand given as parameter and the maximum allowed number of blocks + * + * @param [in] operand Size to compare + * + * @returns Minimum between operand and @ref LR11XX_GNSS_ALMANAC_UPDATE_MAX_NB_OF_BLOCKS + */ +static uint16_t lr11xx_gnss_get_min_from_operand_and_max_nb_of_blocks( uint16_t operand ); + +/*! + * @brief Get the almanac base address and size + * + * @param [in] context Chip implementation context + * @param [out] address Start address of the almanac in memory + * @param [out] size Size of the almanac in byte + * + * @returns Operation status + */ +static lr11xx_status_t lr11xx_gnss_get_almanac_address_size( const void* context, uint32_t* address, uint16_t* size ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_gnss_get_result_size( const void* context, uint16_t* result_size ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SCAN_GET_RES_SIZE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SCAN_GET_RES_SIZE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SCAN_GET_RES_SIZE_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( uint16_t )] = { 0 }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_SCAN_GET_RES_SIZE_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *result_size = ( ( uint16_t ) rbuffer[0] << 8 ) + ( ( uint16_t ) rbuffer[1] ); + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_results( const void* context, uint8_t* result_buffer, + const uint16_t result_buffer_size ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SCAN_READ_RES_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SCAN_READ_RES_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SCAN_READ_RES_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_SCAN_READ_RES_CMD_LENGTH, result_buffer, + result_buffer_size ); +} + +lr11xx_status_t lr11xx_gnss_almanac_update( const void* context, const uint8_t* blocks, const uint8_t nb_of_blocks ) +{ + const uint8_t cbuffer[LR11XX_GNSS_ALMANAC_UPDATE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_ALMANAC_UPDATE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_ALMANAC_UPDATE_OC >> 0 ), + }; + + uint16_t remaining_nb_of_blocks = nb_of_blocks; + + while( remaining_nb_of_blocks > 0 ) + { + const uint16_t nb_of_blocks_to_write = + lr11xx_gnss_get_min_from_operand_and_max_nb_of_blocks( remaining_nb_of_blocks ); + + const uint8_t* blocks_to_write = + blocks + ( nb_of_blocks - remaining_nb_of_blocks ) * LR11XX_GNSS_SINGLE_ALMANAC_WRITE_SIZE; + + const lr11xx_hal_status_t status = + lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_ALMANAC_UPDATE_CMD_LENGTH, blocks_to_write, + nb_of_blocks_to_write * LR11XX_GNSS_SINGLE_ALMANAC_WRITE_SIZE ); + + if( status != LR11XX_HAL_STATUS_OK ) + { + return ( lr11xx_status_t ) status; + } + + remaining_nb_of_blocks -= nb_of_blocks_to_write; + } + + return LR11XX_STATUS_OK; +} + +lr11xx_status_t lr11xx_gnss_read_almanac( const void* context, + lr11xx_gnss_almanac_full_read_bytestream_t almanac_bytestream ) +{ + uint32_t almanac_address = 0; + uint16_t almanac_size = 0; + lr11xx_status_t status = lr11xx_gnss_get_almanac_address_size( context, &almanac_address, &almanac_size ); + if( status != LR11XX_STATUS_OK ) + { + return status; + } + + const uint8_t N_READ_ALMANAC_REGMEM32 = 15; + + for( uint8_t index_regmem32 = 0; index_regmem32 < N_READ_ALMANAC_REGMEM32; index_regmem32++ ) + { + const uint16_t local_bytestream_index_burst = + index_regmem32 * LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE * 4; + uint32_t temporary_buffer[LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE] = { 0 }; + + const lr11xx_status_t local_status = lr11xx_regmem_read_regmem32( + context, almanac_address, temporary_buffer, LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE ); + if( local_status != LR11XX_STATUS_OK ) + { + return local_status; + } + + almanac_address += ( LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE * 4 ); + + for( uint8_t index_local_temp = 0; index_local_temp < LR11XX_GNSS_READ_ALMANAC_TEMPBUFFER_SIZE_BYTE; + index_local_temp++ ) + { + const uint16_t local_bytestream_index = local_bytestream_index_burst + ( index_local_temp * 4 ); + almanac_bytestream[local_bytestream_index + 0] = ( uint8_t )( temporary_buffer[index_local_temp] >> 0 ); + almanac_bytestream[local_bytestream_index + 1] = ( uint8_t )( temporary_buffer[index_local_temp] >> 8 ); + almanac_bytestream[local_bytestream_index + 2] = ( uint8_t )( temporary_buffer[index_local_temp] >> 16 ); + almanac_bytestream[local_bytestream_index + 3] = ( uint8_t )( temporary_buffer[index_local_temp] >> 24 ); + } + } + return status; +} + +lr11xx_status_t lr11xx_gnss_get_almanac_age_for_satellite( const void* context, const lr11xx_gnss_satellite_id_t sv_id, + uint16_t* almanac_age ) +{ + uint32_t almanac_base_address = 0; + uint16_t almanac_size = 0; + const lr11xx_status_t status_get_almanac_address_size = + lr11xx_gnss_get_almanac_address_size( context, &almanac_base_address, &almanac_size ); + + if( status_get_almanac_address_size != LR11XX_STATUS_OK ) + { + return status_get_almanac_address_size; + } + + const uint16_t offset_almanac_date = sv_id * LR11XX_GNSS_SINGLE_ALMANAC_READ_SIZE + 1; + uint8_t raw_almanac_date[LR11XX_GNSS_ALMANAC_DATE_LENGTH] = { 0 }; + + const lr11xx_status_t status_read_mem = lr11xx_regmem_read_mem8( + context, almanac_base_address + offset_almanac_date, raw_almanac_date, LR11XX_GNSS_ALMANAC_DATE_LENGTH ); + if( status_read_mem == LR11XX_STATUS_OK ) + { + // Note: the memory on LR11XX is LSB first. As the 2-byte wide almanac age is obtained by calling the _mem8, the + // conversion to uint16_t here is done LSB first + ( *almanac_age ) = ( ( ( uint16_t ) raw_almanac_date[1] ) << 8 ) + ( ( ( uint16_t ) raw_almanac_date[0] ) ); + } + return status_read_mem; +} + +lr11xx_status_t lr11xx_gnss_get_almanac_address_size( const void* context, uint32_t* address, uint16_t* size ) +{ + const uint8_t cbuffer[LR11XX_GNSS_ALMANAC_READ_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_ALMANAC_READ_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_ALMANAC_READ_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_GNSS_ALMANAC_READ_RBUFFER_LENGTH] = { 0 }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_ALMANAC_READ_CMD_LENGTH, + rbuffer, LR11XX_GNSS_ALMANAC_READ_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *address = lr11xx_gnss_uint8_to_uint32( &rbuffer[0] ); + *size = ( ( ( uint16_t ) rbuffer[4] ) << 8 ) | ( ( uint16_t ) rbuffer[5] ); + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_push_solver_msg( const void* context, const uint8_t* payload, const uint16_t payload_size ) +{ + const uint8_t cbuffer[LR11XX_GNSS_PUSH_SOLVER_MSG_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_PUSH_SOLVER_MSG_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_PUSH_SOLVER_MSG_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_PUSH_SOLVER_MSG_CMD_LENGTH, payload, + payload_size ); +} + +lr11xx_status_t lr11xx_gnss_set_constellations_to_use( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_to_use ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SET_CONSTELLATION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_CONSTELLATION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_CONSTELLATION_OC >> 0 ), + ( uint8_t ) constellation_to_use, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SET_CONSTELLATION_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_used_constellations( const void* context, + lr11xx_gnss_constellation_mask_t* constellations_used ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_CONSTELLATION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_CONSTELLATION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_CONSTELLATION_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_CONSTELLATION_CMD_LENGTH, + constellations_used, sizeof( *constellations_used ) ); +} + +lr11xx_status_t lr11xx_gnss_set_almanac_update( const void* context, + const lr11xx_gnss_constellation_mask_t constellations_to_update ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SET_ALMANAC_UPDATE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_ALMANAC_UPDATE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_ALMANAC_UPDATE_OC >> 0 ), + ( uint8_t ) constellations_to_update, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SET_ALMANAC_UPDATE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_almanac_update( const void* context, + lr11xx_gnss_constellation_mask_t* constellations_to_update ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_ALMANAC_UPDATE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_UPDATE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_UPDATE_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_ALMANAC_UPDATE_CMD_LENGTH, + constellations_to_update, sizeof( *constellations_to_update ) ); +} + +lr11xx_status_t lr11xx_gnss_set_freq_search_space( const void* radio, + const lr11xx_gnss_freq_search_space_t freq_search_space ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_OC >> 0 ), + ( uint8_t ) freq_search_space, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( radio, cbuffer, LR11XX_GNSS_SET_FREQ_SEARCH_SPACE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_freq_search_space( const void* radio, + lr11xx_gnss_freq_search_space_t* freq_search_space ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( radio, cbuffer, LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_CMD_LENGTH, + ( uint8_t* ) freq_search_space, sizeof( uint8_t ) ); +} + +lr11xx_status_t lr11xx_gnss_read_firmware_version( const void* context, lr11xx_gnss_version_t* version ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_FW_VERSION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_FW_VERSION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_FW_VERSION_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_GNSS_READ_FIRMWARE_VERSION_RBUFFER_LENGTH] = { 0 }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_FW_VERSION_CMD_LENGTH, + rbuffer, LR11XX_GNSS_READ_FIRMWARE_VERSION_RBUFFER_LENGTH ); + + version->gnss_firmware = rbuffer[0]; + version->gnss_almanac = rbuffer[1]; + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_supported_constellations( const void* context, + lr11xx_gnss_constellation_mask_t* supported_constellations ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_SUPPORTED_CONSTELLATION_CMD_LENGTH, + supported_constellations, sizeof( *supported_constellations ) ); +} + +lr11xx_status_t lr11xx_gnss_set_scan_mode( const void* context, const lr11xx_gnss_scan_mode_t scan_mode ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SET_SCAN_MODE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_SCAN_MODE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_SCAN_MODE_OC >> 0 ), + ( uint8_t ) scan_mode, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SET_SCAN_MODE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_scan( const void* context, const lr11xx_gnss_search_mode_t effort_mode, + const uint8_t gnss_input_parameters, const uint8_t nb_sat ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SCAN_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SCAN_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SCAN_OC >> 0 ), + ( uint8_t ) effort_mode, + gnss_input_parameters, + nb_sat, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SCAN_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_set_assistance_position( + const void* context, const lr11xx_gnss_solver_assistance_position_t* assistance_position ) +{ + const int16_t latitude = ( ( assistance_position->latitude * 2048 ) / LR11XX_GNSS_SCALING_LATITUDE ); + const int16_t longitude = ( ( assistance_position->longitude * 2048 ) / LR11XX_GNSS_SCALING_LONGITUDE ); + const uint8_t cbuffer[LR11XX_GNSS_SET_ASSISTANCE_POSITION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_ASSISTANCE_POSITION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_ASSISTANCE_POSITION_OC >> 0 ), + ( uint8_t )( latitude >> 8 ), + ( uint8_t )( latitude >> 0 ), + ( uint8_t )( longitude >> 8 ), + ( uint8_t )( longitude >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SET_ASSISTANCE_POSITION_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_assistance_position( const void* context, + lr11xx_gnss_solver_assistance_position_t* assistance_position ) +{ + uint8_t position_buffer[4] = { 0x00 }; + int16_t position_tmp; + const uint8_t cbuffer[LR11XX_GNSS_READ_ASSISTANCE_POSITION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_ASSISTANCE_POSITION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_ASSISTANCE_POSITION_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( + context, cbuffer, LR11XX_GNSS_READ_ASSISTANCE_POSITION_CMD_LENGTH, position_buffer, sizeof( position_buffer ) ); + + position_tmp = ( int16_t )( ( ( uint16_t ) position_buffer[0] << 8 ) + position_buffer[1] ); + assistance_position->latitude = ( ( float ) ( position_tmp ) *LR11XX_GNSS_SCALING_LATITUDE ) / 2048; + + position_tmp = ( int16_t )( ( ( uint16_t ) position_buffer[2] << 8 ) + position_buffer[3] ); + assistance_position->longitude = ( ( float ) ( position_tmp ) *LR11XX_GNSS_SCALING_LONGITUDE ) / 2048; + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_push_dmc_msg( const void* context, uint8_t* dmc_msg, uint16_t dmc_msg_len ) +{ + const uint8_t cbuffer[LR11XX_GNSS_PUSH_DM_MSG_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_PUSH_DM_MSG_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_PUSH_DM_MSG_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_PUSH_DM_MSG_CMD_LENGTH, dmc_msg, + dmc_msg_len ); +} + +lr11xx_status_t lr11xx_gnss_get_context_status( const void* context, + lr11xx_gnss_context_status_bytestream_t context_status ) +{ + const uint8_t cbuffer[LR11XX_GNSS_GET_CONTEXT_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_CONTEXT_STATUS_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_CONTEXT_STATUS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_CONTEXT_STATUS_CMD_LENGTH, + context_status, LR11XX_GNSS_CONTEXT_STATUS_LENGTH ); +} + +lr11xx_status_t lr11xx_gnss_get_nb_detected_satellites( const void* context, uint8_t* nb_detected_satellites ) +{ + const uint8_t cbuffer[LR11XX_GNSS_GET_NB_SV_SATELLITES_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_NB_SATELLITES_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_NB_SATELLITES_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_NB_SV_SATELLITES_CMD_LENGTH, + nb_detected_satellites, 1 ); +} + +lr11xx_status_t lr11xx_gnss_get_detected_satellites( + const void* context, const uint8_t nb_detected_satellites, + lr11xx_gnss_detected_satellite_t* detected_satellite_id_snr_doppler ) +{ + const uint8_t max_satellites_to_fetch = + ( LR11XX_GNSS_MAX_DETECTED_SV > nb_detected_satellites ) ? nb_detected_satellites : LR11XX_GNSS_MAX_DETECTED_SV; + const uint16_t read_size = max_satellites_to_fetch * LR11XX_GNSS_DETECTED_SV_SINGLE_LENGTH; + uint8_t result_buffer[LR11XX_GNSS_MAX_DETECTED_SV_BUFFER_LENGTH] = { 0 }; + + const uint8_t cbuffer[LR11XX_GNSS_GET_SV_SATELLITES_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_SATELLITES_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_SATELLITES_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_SV_SATELLITES_CMD_LENGTH, result_buffer, read_size ); + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + for( uint8_t index_satellite = 0; index_satellite < max_satellites_to_fetch; index_satellite++ ) + { + const uint16_t local_result_buffer_index = index_satellite * LR11XX_GNSS_DETECTED_SV_SINGLE_LENGTH; + lr11xx_gnss_detected_satellite_t* local_satellite_result = + &detected_satellite_id_snr_doppler[index_satellite]; + + local_satellite_result->satellite_id = result_buffer[local_result_buffer_index]; + local_satellite_result->cnr = result_buffer[local_result_buffer_index + 1] + LR11XX_GNSS_SNR_TO_CNR_OFFSET; + local_satellite_result->doppler = ( int16_t )( ( result_buffer[local_result_buffer_index + 2] << 8 ) + + ( result_buffer[local_result_buffer_index + 3] ) ); + } + } + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_almanac_per_satellites( const void* context, uint8_t sv_id_init, uint8_t n_sv, + uint8_t* almanacs ) +{ + const uint8_t cbuffer[LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_OC >> 0 ), sv_id_init, n_sv + }; + + const uint16_t n_bytes_to_read = n_sv * LR11XX_GNSS_SINGLE_ALMANAC_READ_SIZE; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_ALMANAC_PER_SATELLITE_CMD_LENGTH, + almanacs, n_bytes_to_read ); +} + +lr11xx_status_t lr11xx_gnss_read_gnss_rssi_test( const void* context, int8_t* rssi_gnss_dbm ) +{ + const uint8_t gnss_rssi_path_test = 0x09; + const uint8_t cbuffer[LR11XX_GNSS_READ_GNSS_RSSI_TEST_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_GNSS_RSSI_TEST_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_GNSS_RSSI_TEST_OC >> 0 ), + gnss_rssi_path_test, + 0, + }; + + uint8_t rssi_gnss_raw[LR11XX_GNSS_READ_GNSS_RSSI_TEST_READ_RBUFFER_LENGTH] = { 0 }; + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_GNSS_RSSI_TEST_CMD_LENGTH, rssi_gnss_raw, + LR11XX_GNSS_READ_GNSS_RSSI_TEST_READ_RBUFFER_LENGTH ); + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *rssi_gnss_dbm = rssi_gnss_raw[1]; + } + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_parse_context_status_buffer( + const lr11xx_gnss_context_status_bytestream_t context_status_bytestream, + lr11xx_gnss_context_status_t* context_status ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + + if( ( ( lr11xx_gnss_destination_t ) context_status_bytestream[0] == LR11XX_GNSS_DESTINATION_DMC ) && + ( ( lr11xx_gnss_message_dmc_opcode_t ) context_status_bytestream[1] == LR11XX_GNSS_DMC_STATUS ) ) + { + context_status->firmware_version = context_status_bytestream[2]; + + context_status->global_almanac_crc = + ( ( uint32_t ) context_status_bytestream[3] ) + ( ( uint32_t ) context_status_bytestream[4] << 8 ) + + ( ( uint32_t ) context_status_bytestream[5] << 16 ) + ( ( uint32_t ) context_status_bytestream[6] << 24 ); + + context_status->error_code = ( lr11xx_gnss_error_code_t )( context_status_bytestream[7] >> 4 ); + + context_status->almanac_update_gps = + ( ( context_status_bytestream[7] & LR11XX_GNSS_DMC_ALMANAC_UPDATE_GPS_MASK ) != 0 ) ? true : false; + + context_status->almanac_update_beidou = + ( ( context_status_bytestream[7] & LR11XX_GNSS_DMC_ALMANAC_UPDATE_BEIDOU_MASK ) != 0 ) ? true : false; + + context_status->freq_search_space = ( lr11xx_gnss_freq_search_space_t )( + ( ( ( context_status_bytestream[7] & LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_MSB_MASK ) >> + LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_MSB_POS ) + << 1 ) + + ( ( context_status_bytestream[8] & LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_LSB_MASK ) >> + LR11XX_GNSS_DMC_FREQUENCY_SEARCH_SPACE_LSB_POS ) ); + + status = LR11XX_STATUS_OK; + } + + return status; +} + +lr11xx_status_t lr11xx_gnss_get_result_destination( const uint8_t* result_buffer, const uint16_t result_buffer_size, + lr11xx_gnss_destination_t* destination ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + + if( result_buffer_size != 0 ) + { + switch( result_buffer[LR11XX_GNSS_SCAN_RESULT_DESTINATION_INDEX] ) + { + case LR11XX_GNSS_DESTINATION_HOST: + { + *destination = LR11XX_GNSS_DESTINATION_HOST; + status = LR11XX_STATUS_OK; + break; + } + case LR11XX_GNSS_DESTINATION_SOLVER: + { + *destination = LR11XX_GNSS_DESTINATION_SOLVER; + status = LR11XX_STATUS_OK; + break; + } + case LR11XX_GNSS_DESTINATION_DMC: + { + *destination = LR11XX_GNSS_DESTINATION_DMC; + status = LR11XX_STATUS_OK; + break; + } + } + } + + return status; +} + +uint16_t lr11xx_gnss_compute_almanac_age( uint16_t almanac_date, + uint16_t nb_days_between_epoch_and_last_gps_time_rollover, + uint16_t nb_days_since_epoch ) +{ + return nb_days_since_epoch - ( almanac_date + nb_days_between_epoch_and_last_gps_time_rollover ); +} + +lr11xx_status_t lr11xx_gnss_get_nb_visible_satellites( + const void* context, const lr11xx_gnss_date_t date, + const lr11xx_gnss_solver_assistance_position_t* assistance_position, + const lr11xx_gnss_constellation_t constellation, uint8_t* nb_visible_sv ) +{ + const int16_t latitude = ( ( assistance_position->latitude * 2048 ) / LR11XX_GNSS_SCALING_LATITUDE ); + const int16_t longitude = ( ( assistance_position->longitude * 2048 ) / LR11XX_GNSS_SCALING_LONGITUDE ); + const uint8_t cbuffer[LR11XX_GNSS_GET_SV_VISIBLE_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_SV_VISIBLE_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_SV_VISIBLE_OC >> 0 ), + ( uint8_t )( date >> 24 ), + ( uint8_t )( date >> 16 ), + ( uint8_t )( date >> 8 ), + ( uint8_t )( date >> 0 ), + ( uint8_t )( latitude >> 8 ), + ( uint8_t )( latitude >> 0 ), + ( uint8_t )( longitude >> 8 ), + ( uint8_t )( longitude >> 0 ), + ( uint8_t )( constellation - 1 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_SV_VISIBLE_CMD_LENGTH, nb_visible_sv, + 1 ); +} + +lr11xx_status_t lr11xx_gnss_get_visible_satellites( const void* context, const uint8_t nb_visible_satellites, + lr11xx_gnss_visible_satellite_t* visible_satellite_id_doppler ) +{ + uint8_t result_buffer[12 * 5] = { 0 }; + const uint16_t read_size = nb_visible_satellites * 5; + + const uint8_t cbuffer[LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_SV_VISIBLE_DOPPLER_CMD_LENGTH, result_buffer, read_size ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + for( uint8_t index_satellite = 0; index_satellite < nb_visible_satellites; index_satellite++ ) + { + const uint16_t local_result_buffer_index = index_satellite * 5; + lr11xx_gnss_visible_satellite_t* local_satellite_result = &visible_satellite_id_doppler[index_satellite]; + + local_satellite_result->satellite_id = result_buffer[local_result_buffer_index]; + local_satellite_result->doppler = ( int16_t )( ( result_buffer[local_result_buffer_index + 1] << 8 ) + + ( result_buffer[local_result_buffer_index + 2] ) ); + local_satellite_result->doppler_error = ( int16_t )( ( result_buffer[local_result_buffer_index + 3] << 8 ) + + ( result_buffer[local_result_buffer_index + 4] ) ); + } + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_fetch_time( const void* context, const lr11xx_gnss_search_mode_t effort_mode, + const lr11xx_gnss_fetch_time_option_t option ) +{ + const uint8_t cbuffer[LR11XX_GNSS_FETCH_TIME_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_FETCH_TIME_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_FETCH_TIME_OC >> 0 ), + effort_mode, + option, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_FETCH_TIME_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_time( const void* context, lr11xx_gnss_time_t* time ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_TIME_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_READ_TIME_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_TIME_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_TIME_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_TIME_CMD_LENGTH, rbuffer, sizeof( rbuffer ) ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + time->error_code = ( lr11xx_gnss_read_time_status_t ) rbuffer[0]; + time->gps_time_s = lr11xx_gnss_uint8_to_uint32( &rbuffer[1] ); + time->nb_us_in_s = + ( uint32_t )( rbuffer[5] << 16 ) | ( uint32_t )( rbuffer[6] << 8 ) | ( uint32_t )( rbuffer[7] ); + time->nb_us_in_s /= 16; + time->time_accuracy = lr11xx_gnss_uint8_to_uint32( &rbuffer[8] ); + time->time_accuracy /= 16; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_reset_time( const void* context ) +{ + const uint8_t cbuffer[LR11XX_GNSS_RESET_TIME_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_RESET_TIME_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_RESET_TIME_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_RESET_TIME_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_reset_position( const void* context ) +{ + const uint8_t cbuffer[LR11XX_GNSS_RESET_POSITION_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_RESET_POSITION_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_RESET_POSITION_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_RESET_POSITION_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_week_number_rollover( const void* context, + lr11xx_gnss_week_number_rollover_status_t* wn_rollover_status, + uint8_t* wn_number_rollover ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( + context, cbuffer, LR11XX_GNSS_READ_WEEK_NUMBER_ROLLOVER_CMD_LENGTH, rbuffer, sizeof( rbuffer ) ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *wn_rollover_status = ( lr11xx_gnss_week_number_rollover_status_t ) rbuffer[0]; + *wn_number_rollover = rbuffer[1]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_demod_status( const void* context, lr11xx_gnss_demod_status_t* demod_status, + lr11xx_gnss_demod_info_t* demod_info ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_DEMOD_STATUS_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_READ_DEMOD_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_DEMOD_STATUS_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_DEMOD_STATUS_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_DEMOD_STATUS_CMD_LENGTH, rbuffer, sizeof( rbuffer ) ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *demod_status = ( lr11xx_gnss_demod_status_t ) rbuffer[0]; + demod_info->word_sync_found = rbuffer[1] & 0x01; + demod_info->first_tow_found = ( rbuffer[1] >> 1 ) & 0x01; + demod_info->wn_demodulated = ( rbuffer[1] >> 2 ) & 0x01; + demod_info->wn_found = ( rbuffer[1] >> 3 ) & 0x01; + demod_info->sub1_found = ( rbuffer[1] >> 4 ) & 0x01; + demod_info->sub4_found = ( rbuffer[1] >> 5 ) & 0x01; + demod_info->sub5_found = ( rbuffer[1] >> 6 ) & 0x01; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_cumulative_timing( const void* context, + lr11xx_gnss_cumulative_timing_t* cumulative_timing ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_CUMULATIVE_TIMING_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_READ_CUMULATIVE_TIMING_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_CUMULATIVE_TIMING_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_CUMULATIVE_TIMING_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_CUMULATIVE_TIMING_CMD_LENGTH, rbuffer, sizeof( rbuffer ) ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + cumulative_timing->init = lr11xx_gnss_uint8_to_uint32( &rbuffer[0] ); + cumulative_timing->phase1_gps_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[4] ); + cumulative_timing->phase1_gps_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[8] ); + cumulative_timing->multiscan_gps_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[12] ); + cumulative_timing->multiscan_gps_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[16] ); + cumulative_timing->multiscan_gps_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[20] ); + cumulative_timing->phase1_beidou_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[24] ); + cumulative_timing->phase1_beidou_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[28] ); + cumulative_timing->multiscan_beidou_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[32] ); + cumulative_timing->multiscan_beidou_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[36] ); + cumulative_timing->multiscan_beidou_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[40] ); + cumulative_timing->demod_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[44] ); + cumulative_timing->demod_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[48] ); + cumulative_timing->demod_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[52] ); + cumulative_timing->demod_sleep_32m = lr11xx_gnss_uint8_to_uint32( &rbuffer[56] ); + cumulative_timing->total_gps_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[60] ); + cumulative_timing->total_gps_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[64] ); + cumulative_timing->total_gps_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[68] ); + cumulative_timing->total_gps_sleep_32m = lr11xx_gnss_uint8_to_uint32( &rbuffer[72] ); + cumulative_timing->total_gps = lr11xx_gnss_uint8_to_uint32( &rbuffer[76] ); + cumulative_timing->total_beidou_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[80] ); + cumulative_timing->total_beidou_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[84] ); + cumulative_timing->total_beidou_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[88] ); + cumulative_timing->total_beidou_sleep_32m = lr11xx_gnss_uint8_to_uint32( &rbuffer[92] ); + cumulative_timing->total_beidou = lr11xx_gnss_uint8_to_uint32( &rbuffer[96] ); + cumulative_timing->total_capture = lr11xx_gnss_uint8_to_uint32( &rbuffer[100] ); + cumulative_timing->total_process = lr11xx_gnss_uint8_to_uint32( &rbuffer[104] ); + cumulative_timing->total_sleep_32k = lr11xx_gnss_uint8_to_uint32( &rbuffer[108] ); + cumulative_timing->total_sleep_32m = lr11xx_gnss_uint8_to_uint32( &rbuffer[112] ); + cumulative_timing->total = lr11xx_gnss_uint8_to_uint32( &rbuffer[116] ); + cumulative_timing->last_capture_size_32k_cnt = lr11xx_gnss_uint8_to_uint32( &rbuffer[120] ); + cumulative_timing->constellation_demod = rbuffer[124]; + } + + return ( lr11xx_status_t ) hal_status; +} + +void lr11xx_gnss_compute_power_consumption( + const lr11xx_gnss_cumulative_timing_t* cumulative_timing, + const lr11xx_gnss_instantaneous_power_consumption_ua_t* instantaneous_power_consumption_ua, + uint32_t* power_consumption_nah, uint32_t* power_consumption_nwh ) +{ + float e_init = + ( ( float ) instantaneous_power_consumption_ua->init_ua / 1000.0 * ( float ) cumulative_timing->init ) / + 32768.0; + + float e_gps_capture = ( ( ( float ) instantaneous_power_consumption_ua->phase1_gps_capture_ua / 1000.0 * + ( float ) cumulative_timing->phase1_gps_capture ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_gps_capture_ua / 1000.0 * + ( float ) cumulative_timing->multiscan_gps_capture ) ) / + 32768.0; + + float e_gps_process = ( ( ( float ) instantaneous_power_consumption_ua->phase1_gps_process_ua / 1000.0 * + ( float ) cumulative_timing->phase1_gps_process ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_gps_process_ua / 1000.0 * + ( float ) cumulative_timing->multiscan_gps_process ) ) / + 32768.0; + + float e_gps_sleep_32k = ( ( float ) instantaneous_power_consumption_ua->sleep_32k_ua / 1000.0 * + ( float ) cumulative_timing->multiscan_gps_sleep_32k ) / + 32768.0; + + float e_tot_gps = e_gps_capture + e_gps_process + e_gps_sleep_32k; + + float e_beidou_capture = ( ( ( float ) instantaneous_power_consumption_ua->phase1_beidou_capture_ua / 1000.0 * + ( float ) cumulative_timing->phase1_beidou_capture ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_beidou_capture_ua / 1000.0 * + ( float ) cumulative_timing->multiscan_beidou_capture ) ) / + 32768.0; + float e_beidou_process = ( ( ( float ) instantaneous_power_consumption_ua->phase1_beidou_process_ua / 1000.0 * + ( float ) cumulative_timing->phase1_beidou_process ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_beidou_process_ua / 1000.0 * + ( float ) cumulative_timing->multiscan_beidou_process ) ) / + 32768.0; + float e_beidou_sleep_32k = + ( instantaneous_power_consumption_ua->sleep_32k_ua / 1000.0 * cumulative_timing->multiscan_beidou_sleep_32k ) / + 32768.0; + + float e_tot_beidou = e_beidou_capture + e_beidou_process + e_beidou_sleep_32k; + + float e_demod = 0; + if( cumulative_timing->constellation_demod == 0 ) // Demodulation has been done on GPS constellation + { + e_demod = ( ( ( float ) instantaneous_power_consumption_ua->multiscan_gps_capture_ua / 1000.0 * + ( float ) cumulative_timing->demod_capture ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_gps_process_ua / 1000.0 * + ( float ) cumulative_timing->demod_process ) + + ( ( float ) instantaneous_power_consumption_ua->sleep_32k_ua / 1000.0 * + ( float ) cumulative_timing->demod_sleep_32k ) + + ( ( float ) instantaneous_power_consumption_ua->demod_sleep_32m_ua / 1000.0 * + ( float ) cumulative_timing->demod_sleep_32m ) ) / + 32768.0; + } + else // Domulation has been done on Beidou constellation + { + e_demod = ( ( ( float ) instantaneous_power_consumption_ua->multiscan_beidou_capture_ua / 1000.0 * + ( float ) cumulative_timing->demod_capture ) + + ( ( float ) instantaneous_power_consumption_ua->multiscan_beidou_process_ua / 1000.0 * + ( float ) cumulative_timing->demod_process ) + + ( ( float ) instantaneous_power_consumption_ua->sleep_32k_ua / 1000.0 * + ( float ) cumulative_timing->demod_sleep_32k ) + + ( ( float ) instantaneous_power_consumption_ua->demod_sleep_32m_ua / 1000.0 * + ( float ) cumulative_timing->demod_sleep_32m ) ) / + 32768.0; + } + + float power_consumption_uah_tmp = ( ( e_init + e_tot_gps + e_tot_beidou + e_demod ) * 1000 ) / + ( 3600.0 - ( ( float ) cumulative_timing->total / 32768.0 ) ); + + *power_consumption_nah = ( uint32_t )( power_consumption_uah_tmp * 1000 ); + *power_consumption_nwh = + ( uint32_t )( power_consumption_uah_tmp * instantaneous_power_consumption_ua->board_voltage_mv ); +} + +lr11xx_status_t lr11xx_gnss_set_time( const void* context, const uint32_t time, const uint16_t time_accuracy ) +{ + const uint8_t cbuffer[LR11XX_GNSS_SET_TIME_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_SET_TIME_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_SET_TIME_OC >> 0 ), + ( uint8_t )( time >> 24 ), + ( uint8_t )( time >> 16 ), + ( uint8_t )( time >> 8 ), + ( uint8_t ) time, + ( uint8_t )( time_accuracy >> 8 ), + ( uint8_t ) time_accuracy, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_SET_TIME_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_config_delay_reset_assistance_position( const void* context, const uint32_t delay ) +{ + const uint8_t cbuffer[LR11XX_GNSS_CONFIG_DELAY_RESET_AP_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_CONFIG_DELAY_RESET_AP_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_CONFIG_DELAY_RESET_AP_OC >> 0 ), + ( uint8_t )( delay >> 16 ), + ( uint8_t )( delay >> 8 ), + ( uint8_t ) delay, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_CONFIG_DELAY_RESET_AP_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_doppler_solver_result( const void* context, + lr11xx_gnss_doppler_solver_result_t* doppler_solver_result ) +{ + uint8_t rbuffer[LR11XX_GNSS_DOPPLER_SOLVER_RES_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_DOPPLER_SOLVER_RESULT_CMD_LENGTH, rbuffer, + LR11XX_GNSS_DOPPLER_SOLVER_RES_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + doppler_solver_result->error_code = ( lr11xx_gnss_doppler_solver_error_code_t ) rbuffer[0]; + doppler_solver_result->nb_sv_used = rbuffer[1]; + doppler_solver_result->one_shot_latitude = ( uint16_t )( rbuffer[2] << 8 ) | ( uint16_t )( rbuffer[3] ); + doppler_solver_result->one_shot_longitude = ( uint16_t )( rbuffer[4] << 8 ) | ( uint16_t )( rbuffer[5] ); + doppler_solver_result->one_shot_accuracy = ( uint16_t )( rbuffer[6] << 8 ) | ( uint16_t )( rbuffer[7] ); + doppler_solver_result->one_shot_xtal_ppb = ( uint16_t )( rbuffer[8] << 8 ) | ( uint16_t )( rbuffer[9] ); + doppler_solver_result->filtered_latitude = ( uint16_t )( rbuffer[10] << 8 ) | ( uint16_t )( rbuffer[11] ); + doppler_solver_result->filtered_longitude = ( uint16_t )( rbuffer[12] << 8 ) | ( uint16_t )( rbuffer[13] ); + doppler_solver_result->one_shot_accuracy = ( uint16_t )( rbuffer[14] << 8 ) | ( uint16_t )( rbuffer[15] ); + doppler_solver_result->one_shot_xtal_ppb = ( uint16_t )( rbuffer[16] << 8 ) | ( uint16_t )( rbuffer[17] ); + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_delay_reset_assistance_position( const void* context, uint32_t* delay ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_DELAY_RESET_AP_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_CONFIG_READ_RESET_AP_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_DELAY_RESET_AP_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_DELAY_RESET_AP_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_CONFIG_READ_RESET_AP_CMD_LENGTH, rbuffer, + LR11XX_GNSS_READ_DELAY_RESET_AP_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *delay = ( uint32_t )( rbuffer[0] << 16 ) | ( uint32_t )( rbuffer[1] << 8 ) | ( uint32_t )( rbuffer[2] ); + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_almanac_update_from_sat( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_search_mode_t effort_mode ) +{ + const uint8_t cbuffer[LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_OC >> 0 ), ( uint8_t ) effort_mode, + ( uint8_t ) constellation_mask + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_ALMANAC_UPDATE_FROM_SAT_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_keep_sync_status( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + uint8_t* nb_visible_sat, uint32_t* time_elapsed ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_KEEP_SYNC_STATUS_RBUFFER_LENGTH] = { 0x00 }; + const uint8_t cbuffer[LR11XX_GNSS_CONFIG_READ_KEEP_SYNC_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_KEEP_SYNC_STATUS_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_KEEP_SYNC_STATUS_OC >> 0 ), + ( uint8_t ) constellation_mask, + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_CONFIG_READ_KEEP_SYNC_STATUS_CMD_LENGTH, rbuffer, + LR11XX_GNSS_READ_KEEP_SYNC_STATUS_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *nb_visible_sat = rbuffer[0]; + *time_elapsed = lr11xx_gnss_uint8_to_uint32( &rbuffer[1] ); + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_read_almanac_status( const void* context, + lr11xx_gnss_read_almanac_status_t* almanac_status ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_ALMANAC_STATUS_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR11XX_GNSS_READ_ALMANAC_STATUS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_STATUS_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_STATUS_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_ALMANAC_STATUS_CMD_LENGTH, rbuffer, + LR11XX_GNSS_READ_ALMANAC_STATUS_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + almanac_status->status_gps = ( lr11xx_gnss_almanac_status_t ) rbuffer[0]; + almanac_status->next_gps_time_sat_to_update = lr11xx_gnss_uint8_to_uint32( &rbuffer[1] ); + almanac_status->next_gps_nb_subframe_to_demodulate = rbuffer[5]; + almanac_status->next_gps_sat_id_to_update_in_sub_4 = rbuffer[6]; + almanac_status->next_gps_sat_id_to_update_in_sub_5 = rbuffer[7]; + almanac_status->next_gps_subframe_id_start = rbuffer[8]; + almanac_status->nb_sat_gps_to_update = rbuffer[9]; + almanac_status->sat_id_gps_to_update = lr11xx_gnss_uint8_to_uint32( &rbuffer[10] ); + almanac_status->sat_id_gps_activated = lr11xx_gnss_uint8_to_uint32( &rbuffer[14] ); + almanac_status->status_beidou = ( lr11xx_gnss_almanac_status_t ) rbuffer[18]; + almanac_status->next_beidou_time_sat_to_update = lr11xx_gnss_uint8_to_uint32( &rbuffer[19] ); + almanac_status->next_beidou_nb_subframe_to_demodulate = rbuffer[23]; + almanac_status->next_beidou_sat_id_to_update_in_sub_4 = rbuffer[24]; + almanac_status->next_beidou_sat_id_to_update_in_sub_5 = rbuffer[25]; + almanac_status->next_beidou_subframe_id_start = rbuffer[26]; + almanac_status->nb_sat_beidou_to_update = rbuffer[27]; + almanac_status->sat_id_beidou_to_update[0] = lr11xx_gnss_uint8_to_uint32( &rbuffer[28] ); + almanac_status->sat_id_beidou_to_update[1] = lr11xx_gnss_uint8_to_uint32( &rbuffer[32] ); + almanac_status->sat_id_beidou_activated[0] = lr11xx_gnss_uint8_to_uint32( &rbuffer[36] ); + almanac_status->sat_id_beidou_activated[1] = lr11xx_gnss_uint8_to_uint32( &rbuffer[40] ); + almanac_status->sat_id_beidou_black_list[0] = lr11xx_gnss_uint8_to_uint32( &rbuffer[44] ); + almanac_status->sat_id_beidou_black_list[1] = lr11xx_gnss_uint8_to_uint32( &rbuffer[48] ); + almanac_status->next_am_id = rbuffer[52]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_config_almanac_update_period( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_sv_type_t sv_type, const uint16_t period ) +{ + const uint8_t cbuffer[LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_OC >> 0 ), + ( uint8_t ) constellation_mask, + ( uint8_t ) sv_type, + ( uint8_t )( period >> 8 ), + ( uint8_t )( period >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_GNSS_CONFIG_ALMANAC_UPDATE_PERIOD_CMD_LENGTH, + 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_almanac_update_period( const void* context, + const lr11xx_gnss_constellation_mask_t constellation_mask, + const lr11xx_gnss_sv_type_t sv_type, uint16_t* period ) +{ + uint8_t rbuffer[LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_RBUFFER_LENGTH] = { 0x00 }; + + const uint8_t cbuffer[LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_OC >> 0 ), + ( uint8_t ) constellation_mask, + ( uint8_t ) sv_type, + }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_CMD_LENGTH, rbuffer, + LR11XX_GNSS_READ_ALMANAC_UPDATE_PERIOD_RBUFFER_LENGTH ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + *period = ( rbuffer[0] << 8 ) | rbuffer[1]; + } + + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_gnss_get_sv_sync( const void* context, const lr11xx_gnss_constellation_mask_t constellation_mask, + const uint8_t nb_sv_to_get, uint8_t* sv_sync_list ) +{ + const uint8_t cbuffer[LR11XX_GNSS_GET_SV_SYNC_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_GET_SV_SYNC_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_GET_SV_SYNC_OC >> 0 ), + ( uint8_t ) constellation_mask, + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_GNSS_GET_SV_SYNC_CMD_LENGTH, sv_sync_list, + nb_sv_to_get ); +} + +lr11xx_status_t lr11xx_gnss_set_gps_bit_mask_sat_activated( const void* context, const uint32_t gps_sat_activated_1_32 ) +{ + const uint8_t cbuffer[LR11XX_GNSS_WRITE_GPS_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_WRITE_BIT_MASK_SAT_ACTIVATED_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_WRITE_BIT_MASK_SAT_ACTIVATED_OC >> 0 ), + ( uint8_t ) LR11XX_GNSS_GPS_MASK, + ( uint8_t )( gps_sat_activated_1_32 >> 24 ), + ( uint8_t )( gps_sat_activated_1_32 >> 16 ), + ( uint8_t )( gps_sat_activated_1_32 >> 8 ), + ( uint8_t )( gps_sat_activated_1_32 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, + LR11XX_GNSS_WRITE_GPS_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_set_beidou_bit_mask_sat_activated( const void* context, + const uint32_t beidou_sat_activated_1_32, + const uint32_t beidou_sat_activated_33_63 ) +{ + const uint8_t cbuffer[LR11XX_GNSS_WRITE_BEIDOU_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_WRITE_BIT_MASK_SAT_ACTIVATED_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_WRITE_BIT_MASK_SAT_ACTIVATED_OC >> 0 ), + ( uint8_t ) LR11XX_GNSS_BEIDOU_MASK, + ( uint8_t )( beidou_sat_activated_1_32 >> 24 ), + ( uint8_t )( beidou_sat_activated_1_32 >> 16 ), + ( uint8_t )( beidou_sat_activated_1_32 >> 8 ), + ( uint8_t )( beidou_sat_activated_1_32 ), + ( uint8_t )( beidou_sat_activated_33_63 >> 24 ), + ( uint8_t )( beidou_sat_activated_33_63 >> 16 ), + ( uint8_t )( beidou_sat_activated_33_63 >> 8 ), + ( uint8_t )( beidou_sat_activated_33_63 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, + LR11XX_GNSS_WRITE_BEIDOU_BIT_MASK_SAT_ACTIVATED_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_gnss_read_last_scan_mode_launched( const void* context, + lr11xx_gnss_scan_mode_launched_t* last_scan_mode ) +{ + uint8_t rbuffer[1] = { 0x00 }; + + const uint8_t cbuffer[LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_CMD_LENGTH] = { + ( uint8_t )( LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_OC >> 8 ), + ( uint8_t )( LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_OC >> 0 ), + }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( + context, cbuffer, LR11XX_GNSS_READ_LAST_SCAN_MODE_LAUNCHED_CMD_LENGTH, rbuffer, sizeof( rbuffer ) ); + + *last_scan_mode = ( lr11xx_gnss_scan_mode_launched_t ) rbuffer[0]; + + return ( lr11xx_status_t ) hal_status; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +uint32_t lr11xx_gnss_uint8_to_uint32( uint8_t value[4] ) +{ + return ( ( ( uint32_t ) value[0] ) << 24 ) + ( ( ( uint32_t ) value[1] ) << 16 ) + + ( ( ( uint32_t ) value[2] ) << 8 ) + ( ( ( uint32_t ) value[3] ) ); +} + +uint16_t lr11xx_gnss_get_min_from_operand_and_max_nb_of_blocks( uint16_t operand ) +{ + if( operand > LR11XX_GNSS_ALMANAC_UPDATE_MAX_NB_OF_BLOCKS ) + { + return LR11XX_GNSS_ALMANAC_UPDATE_MAX_NB_OF_BLOCKS; + } + else + { + return operand; + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_lr_fhss.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_lr_fhss.c new file mode 100755 index 0000000..7aac7a4 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_lr_fhss.c @@ -0,0 +1,216 @@ +/*! + * @file lr11xx_lr_fhss.c + * + * @brief LR_FHSS driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_lr_fhss.h" +#include "lr11xx_radio.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +#define LR11XX_LR_FHSS_BUILD_FRAME_LENGTH ( 2 + 9 ) +#define LR11XX_LR_FHSS_HEADER_BITS ( 114 ) +#define LR11XX_LR_FHSS_FRAG_BITS ( 48 ) +#define LR11XX_LR_FHSS_BLOCK_PREAMBLE_BITS ( 2 ) +#define LR11XX_LR_FHSS_BLOCK_BITS ( LR11XX_LR_FHSS_FRAG_BITS + LR11XX_LR_FHSS_BLOCK_PREAMBLE_BITS ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for radio-related operations + */ +enum +{ + LR11XX_LR_FHSS_BUILD_FRAME_OC = 0x022C, +}; + +/*! + * @brief Hopping enable/disabled enumerations for \ref lr11xx_lr_fhss_build_frame + */ +typedef enum +{ + LR11XX_LR_FHSS_HOPPING_DISABLE = 0x00, + LR11XX_LR_FHSS_HOPPING_ENABLE = 0x01, +} lr11xx_lr_fhss_hopping_configuration_t; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Get the bit count and block count for a LR-FHSS frame + * + * @param [in] params Parameter structure + * @param [in] payload_length Length of physical payload, in bytes + * + * @returns Length of physical payload, in bits + */ + +static uint16_t lr11xx_lr_fhss_get_nb_bits( const lr_fhss_v1_params_t* params, uint16_t payload_length ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_lr_fhss_init( const void* context ) +{ + const lr11xx_status_t set_packet_type_status = lr11xx_radio_set_pkt_type( context, LR11XX_RADIO_PKT_TYPE_LR_FHSS ); + if( set_packet_type_status != LR11XX_STATUS_OK ) + { + return set_packet_type_status; + } + + const lr11xx_radio_mod_params_lr_fhss_t mod_lr_fhss = { + .br_in_bps = LR11XX_RADIO_LR_FHSS_BITRATE_488_BPS, + .pulse_shape = LR11XX_RADIO_LR_FHSS_PULSE_SHAPE_BT_1, + }; + + const lr11xx_status_t set_modulation_param_status = lr11xx_radio_set_lr_fhss_mod_params( context, &mod_lr_fhss ); + return set_modulation_param_status; +} + +uint16_t lr11xx_lr_fhss_get_bit_delay_in_us( const lr11xx_lr_fhss_params_t* params, uint16_t payload_length ) +{ + const uint16_t nb_bits = lr11xx_lr_fhss_get_nb_bits( &( params->lr_fhss_params ), payload_length ); + + const uint8_t nb_padding_bits = 1 + ( ( 32768 - nb_bits ) & 0x07 ); + + return 1600 + nb_padding_bits * 2048; +} + +lr11xx_status_t lr11xx_lr_fhss_build_frame( const void* context, const lr11xx_lr_fhss_params_t* lr_fhss_params, + uint16_t hop_sequence_id, const uint8_t* payload, uint8_t payload_length ) +{ + // Since the build_frame command is last, it is possible to check status through stat1 + + lr11xx_status_t status = lr11xx_radio_set_lr_fhss_sync_word( context, lr_fhss_params->lr_fhss_params.sync_word ); + if( status != LR11XX_STATUS_OK ) + { + return status; + } + + const uint8_t cbuffer[LR11XX_LR_FHSS_BUILD_FRAME_LENGTH] = { + ( uint8_t ) ( LR11XX_LR_FHSS_BUILD_FRAME_OC >> 8 ), + ( uint8_t ) ( LR11XX_LR_FHSS_BUILD_FRAME_OC >> 0 ), + ( uint8_t ) lr_fhss_params->lr_fhss_params.header_count, + ( uint8_t ) lr_fhss_params->lr_fhss_params.cr, + ( uint8_t ) lr_fhss_params->lr_fhss_params.modulation_type, + ( uint8_t ) lr_fhss_params->lr_fhss_params.grid, + ( uint8_t ) ( lr_fhss_params->lr_fhss_params.enable_hopping ? LR11XX_LR_FHSS_HOPPING_ENABLE + : LR11XX_LR_FHSS_HOPPING_DISABLE ), + ( uint8_t ) lr_fhss_params->lr_fhss_params.bw, + ( uint8_t ) ( hop_sequence_id >> 8 ), + ( uint8_t ) ( hop_sequence_id >> 0 ), + ( uint8_t ) lr_fhss_params->device_offset, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_LR_FHSS_BUILD_FRAME_LENGTH, payload, + payload_length ); +} + +uint32_t lr11xx_lr_fhss_get_time_on_air_in_ms( const lr11xx_lr_fhss_params_t* params, uint16_t payload_length ) +{ + // Multiply by 1000 / 488.28125, or equivalently 256/125, rounding up + return ( ( lr11xx_lr_fhss_get_nb_bits( ¶ms->lr_fhss_params, payload_length ) << 8 ) + 124 ) / 125; +} + +unsigned int lr11xx_lr_fhss_get_hop_sequence_count( const lr11xx_lr_fhss_params_t* lr_fhss_params ) +{ + if( ( lr_fhss_params->lr_fhss_params.grid == LR_FHSS_V1_GRID_25391_HZ ) || + ( ( lr_fhss_params->lr_fhss_params.grid == LR_FHSS_V1_GRID_3906_HZ ) && + ( lr_fhss_params->lr_fhss_params.bw < LR_FHSS_V1_BW_335938_HZ ) ) ) + { + return 384; + } + return 512; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION --------------------------------------------- + */ + +uint16_t lr11xx_lr_fhss_get_nb_bits( const lr_fhss_v1_params_t* params, uint16_t payload_length ) +{ + uint16_t length_bits = ( payload_length + 2 ) * 8 + 6; + switch( params->cr ) + { + case LR_FHSS_V1_CR_5_6: + length_bits = ( ( length_bits * 6 ) + 4 ) / 5; + break; + + case LR_FHSS_V1_CR_2_3: + length_bits = length_bits * 3 / 2; + break; + + case LR_FHSS_V1_CR_1_2: + length_bits = length_bits * 2; + break; + + case LR_FHSS_V1_CR_1_3: + length_bits = length_bits * 3; + break; + } + + uint16_t payload_bits = ( length_bits / LR11XX_LR_FHSS_FRAG_BITS ) * LR11XX_LR_FHSS_BLOCK_BITS; + uint16_t last_block_bits = length_bits % LR11XX_LR_FHSS_FRAG_BITS; + if( last_block_bits > 0 ) + { + payload_bits += last_block_bits + 2; + } + + return LR11XX_LR_FHSS_HEADER_BITS * params->header_count + payload_bits; +} diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio.c new file mode 100755 index 0000000..092801f --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio.c @@ -0,0 +1,1349 @@ +/*! + * @file lr11xx_radio.c + * + * @brief Radio driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_radio.h" +#include "lr11xx_regmem.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/** + * @brief Management of the high ACP workaround + */ +#ifdef LR11XX_DISABLE_HIGH_ACP_WORKAROUND +#define LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ) LR11XX_STATUS_OK +#else +#define LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ) lr11xx_radio_apply_high_acp_workaround( context ) +#endif + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_RADIO_RESET_STATS_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_GET_STATS_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_GET_PKT_TYPE_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_GET_PKT_STATUS_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_GET_RSSI_INST_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH ( 2 + LR11XX_RADIO_GFSK_SYNC_WORD_LENGTH ) +#define LR11XX_RADIO_SET_LORA_PUBLIC_NETWORK_CMD_LENGTH ( 2 + 8 ) +#define LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH ( 2 + 0 ) +#define LR11XX_RADIO_SET_RX_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_RADIO_SET_TX_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_RADIO_SET_RF_FREQUENCY_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_RADIO_SET_AUTO_TX_RX_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_RADIO_SET_CAD_PARAMS_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_RADIO_SET_PKT_TYPE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH ( 2 + 10 ) +#define LR11XX_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH ( 2 + 5 ) +#define LR11XX_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH ( 2 + 5 ) +#define LR11XX_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH ( 2 + 9 ) +#define LR11XX_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH ( 2 + 6 ) +#define LR11XX_RADIO_SET_TX_PARAMS_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_RADIO_SET_PKT_ADDRESS_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_RADIO_SET_PA_CFG_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_SET_CAD_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_SET_TX_CW_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH ( 2 + 8 ) +#define LR11XX_RADIO_SET_GFSK_WHITENING_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_RADIO_SET_RX_BOOSTED_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_SET_RSSI_CALIBRATION_LENGTH ( 2 + 11 ) +#define LR11XX_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_GET_LORA_RX_INFO_CMD_LENGTH ( 2 ) +#define LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH ( 2 + 1 ) + +/** + * @brief Internal RTC frequency + */ +#define LR11XX_RTC_FREQ_IN_HZ 32768UL + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for radio-related operations + */ +enum +{ + LR11XX_RADIO_RESET_STATS_OC = 0x0200, + LR11XX_RADIO_GET_STATS_OC = 0x0201, + LR11XX_RADIO_GET_PKT_TYPE_OC = 0x0202, + LR11XX_RADIO_GET_RXBUFFER_STATUS_OC = 0x0203, + LR11XX_RADIO_GET_PKT_STATUS_OC = 0x0204, + LR11XX_RADIO_GET_RSSI_INST_OC = 0x0205, + LR11XX_RADIO_SET_GFSK_SYNC_WORD_OC = 0x0206, + LR11XX_RADIO_SET_LORA_PUBLIC_NETWORK_OC = 0x0208, + LR11XX_RADIO_SET_RX_OC = 0x0209, + LR11XX_RADIO_SET_TX_OC = 0x020A, + LR11XX_RADIO_SET_RF_FREQUENCY_OC = 0x020B, + LR11XX_RADIO_AUTOTXRX_OC = 0x020C, + LR11XX_RADIO_SET_CAD_PARAMS_OC = 0x020D, + LR11XX_RADIO_SET_PKT_TYPE_OC = 0x020E, + LR11XX_RADIO_SET_MODULATION_PARAM_OC = 0x020F, + LR11XX_RADIO_SET_PKT_PARAM_OC = 0x0210, + LR11XX_RADIO_SET_TX_PARAMS_OC = 0x0211, + LR11XX_RADIO_SET_PKT_ADRS_OC = 0x0212, + LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_OC = 0x0213, + LR11XX_RADIO_SET_RX_DUTY_CYCLE_OC = 0x0214, + LR11XX_RADIO_SET_PA_CFG_OC = 0x0215, + LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC = 0x0217, + LR11XX_RADIO_SET_CAD_OC = 0x0218, + LR11XX_RADIO_SET_TX_CW_OC = 0x0219, + LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_OC = 0x021A, + LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_OC = 0x021B, + LR11XX_RADIO_SET_GFSK_CRC_PARAMS_OC = 0x0224, + LR11XX_RADIO_SET_GFSK_WHITENING_PARAMS_OC = 0x0225, + LR11XX_RADIO_SET_RX_BOOSTED_OC = 0x0227, + LR11XX_RADIO_SET_RSSI_CALIBRATION_OC = 0x0229, + LR11XX_RADIO_SET_LORA_SYNC_WORD_OC = 0x022B, + LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_OC = 0x022D, + LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC = 0x022E, + LR11XX_RADIO_GET_LORA_RX_INFO_OC = 0x0230, + LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC = 0x0231, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Get the CRC length in byte from the corresponding GFSK radio parameter + * + * @param [in] crc_type GFSK CRC parameter + * + * @returns CRC length in byte + */ +static inline uint32_t lr11xx_radio_get_gfsk_crc_len_in_bytes( lr11xx_radio_gfsk_crc_type_t crc_type ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_radio_reset_stats( const void* context ) +{ + const uint8_t cbuffer[LR11XX_RADIO_RESET_STATS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_RESET_STATS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_RESET_STATS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_RESET_STATS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_get_gfsk_stats( const void* context, lr11xx_radio_stats_gfsk_t* stats ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_STATS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_STATS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_STATS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( lr11xx_radio_stats_gfsk_t )] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_RADIO_GET_STATS_CMD_LENGTH, rbuffer, sizeof( lr11xx_radio_stats_gfsk_t ) ); + + if( status == LR11XX_STATUS_OK ) + { + stats->nb_pkt_received = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + stats->nb_pkt_crc_error = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + stats->nb_pkt_len_error = ( ( uint16_t ) rbuffer[4] << 8 ) + ( uint16_t ) rbuffer[5]; + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_lora_stats( const void* context, lr11xx_radio_stats_lora_t* stats ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_STATS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_STATS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_STATS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( lr11xx_radio_stats_lora_t )] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_RADIO_GET_STATS_CMD_LENGTH, rbuffer, sizeof( lr11xx_radio_stats_lora_t ) ); + + if( status == LR11XX_STATUS_OK ) + { + stats->nb_pkt_received = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + stats->nb_pkt_crc_error = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + stats->nb_pkt_header_error = ( ( uint16_t ) rbuffer[4] << 8 ) + ( uint16_t ) rbuffer[5]; + stats->nb_pkt_falsesync = ( ( uint16_t ) rbuffer[6] << 8 ) + ( uint16_t ) rbuffer[7]; + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_pkt_type( const void* context, lr11xx_radio_pkt_type_t* pkt_type ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_PKT_TYPE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_TYPE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_TYPE_OC >> 0 ), + }; + uint8_t pkt_type_raw = 0; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_RADIO_GET_PKT_TYPE_CMD_LENGTH, &pkt_type_raw, 1 ); + + if( status == LR11XX_STATUS_OK ) + { + *pkt_type = ( lr11xx_radio_pkt_type_t ) pkt_type_raw; + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_rx_buffer_status( const void* context, + lr11xx_radio_rx_buffer_status_t* rx_buffer_status ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_RXBUFFER_STATUS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_RXBUFFER_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( *rx_buffer_status )] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_RADIO_GET_RXBUFFER_STATUS_CMD_LENGTH, rbuffer, sizeof( *rx_buffer_status ) ); + + if( status == LR11XX_STATUS_OK ) + { + rx_buffer_status->pld_len_in_bytes = rbuffer[0]; + rx_buffer_status->buffer_start_pointer = rbuffer[1]; + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_gfsk_pkt_status( const void* context, lr11xx_radio_pkt_status_gfsk_t* pkt_status ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_PKT_STATUS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_STATUS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[4] = { 0x00 }; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_RADIO_GET_PKT_STATUS_CMD_LENGTH, rbuffer, 4 ); + + if( status == LR11XX_STATUS_OK ) + { + pkt_status->rssi_sync_in_dbm = -( int8_t ) ( rbuffer[0] >> 1 ); + pkt_status->rssi_avg_in_dbm = -( int8_t ) ( rbuffer[1] >> 1 ); + pkt_status->rx_len_in_bytes = rbuffer[2]; + pkt_status->is_addr_err = ( ( rbuffer[3] & 0x20 ) != 0 ) ? true : false; + pkt_status->is_crc_err = ( ( rbuffer[3] & 0x10 ) != 0 ) ? true : false; + pkt_status->is_len_err = ( ( rbuffer[3] & 0x08 ) != 0 ) ? true : false; + pkt_status->is_abort_err = ( ( rbuffer[3] & 0x04 ) != 0 ) ? true : false; + pkt_status->is_received = ( ( rbuffer[3] & 0x02 ) != 0 ) ? true : false; + pkt_status->is_sent = ( ( rbuffer[3] & 0x01 ) != 0 ) ? true : false; + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_lora_pkt_status( const void* context, lr11xx_radio_pkt_status_lora_t* pkt_status ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_PKT_STATUS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_STATUS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_PKT_STATUS_OC >> 0 ), + }; + uint8_t rbuffer[3] = { 0x00 }; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_RADIO_GET_PKT_STATUS_CMD_LENGTH, rbuffer, 3 ); + + if( status == LR11XX_STATUS_OK ) + { + pkt_status->rssi_pkt_in_dbm = -( int8_t ) ( rbuffer[0] >> 1 ); + pkt_status->snr_pkt_in_db = ( ( ( int8_t ) rbuffer[1] ) + 2 ) >> 2; + pkt_status->signal_rssi_pkt_in_dbm = -( int8_t ) ( rbuffer[2] >> 1 ); + } + + return status; +} + +lr11xx_status_t lr11xx_radio_get_rssi_inst( const void* context, int8_t* rssi_in_dbm ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_RSSI_INST_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_RSSI_INST_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_RSSI_INST_OC >> 0 ), + }; + uint8_t rssi = 0; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_RADIO_GET_RSSI_INST_CMD_LENGTH, &rssi, sizeof( rssi ) ); + + if( status == LR11XX_STATUS_OK ) + { + *rssi_in_dbm = -( int8_t ) ( rssi >> 1 ); + } + + return status; +} + +lr11xx_status_t lr11xx_radio_set_gfsk_sync_word( const void* context, + const uint8_t gfsk_sync_word[LR11XX_RADIO_GFSK_SYNC_WORD_LENGTH] ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_SYNC_WORD_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_SYNC_WORD_OC >> 0 ), + gfsk_sync_word[0], + gfsk_sync_word[1], + gfsk_sync_word[2], + gfsk_sync_word[3], + gfsk_sync_word[4], + gfsk_sync_word[5], + gfsk_sync_word[6], + gfsk_sync_word[7], + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_GFSK_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +#ifndef LR11XX_DISABLE_WARNINGS +#warning \ + "The function lr11xx_radio_set_lora_sync_word replaces the \ +deprecated function lr11xx_radio_set_lora_public_network. \ +lr11xx_radio_set_lora_sync_word, however, is incompatible \ +with chip firmware versions prior to 0x303. For those legacy chips \ +only, please use lr11xx_radio_set_lora_public_network. \ +To deactivate this warning, define C preprocessor symbol \ +LR11XX_DISABLE_WARNINGS." +#endif +lr11xx_status_t lr11xx_radio_set_lora_sync_word( const void* context, const uint8_t sync_word ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_WORD_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_WORD_OC >> 0 ), + sync_word, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_lora_public_network( const void* context, + const lr11xx_radio_lora_network_type_t network_type ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_LORA_PUBLIC_NETWORK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_PUBLIC_NETWORK_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_PUBLIC_NETWORK_OC >> 0 ), + ( uint8_t ) network_type, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_LORA_SYNC_WORD_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_lr_fhss_sync_word( const void* context, + const uint8_t sync_word[LR11XX_RADIO_LR_FHSS_SYNC_WORD_LENGTH] ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_LR_FHSS_SYNC_WORD_LENGTH, sync_word, + LR11XX_RADIO_LR_FHSS_SYNC_WORD_LENGTH ); +} + +lr11xx_status_t lr11xx_radio_set_rx( const void* context, const uint32_t timeout_in_ms ) +{ + const uint32_t timeout_in_rtc_step = lr11xx_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr11xx_radio_set_rx_with_timeout_in_rtc_step( context, timeout_in_rtc_step ); +} + +lr11xx_status_t lr11xx_radio_set_rx_and_lna_mode( const void* context, const uint32_t timeout_in_ms, + lr11xx_radio_lna_mode_t lna_mode ) +{ + const uint32_t timeout_in_rtc_step = lr11xx_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr11xx_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( context, timeout_in_rtc_step, lna_mode ); +} + +lr11xx_status_t lr11xx_radio_set_rx_with_timeout_in_rtc_step( const void* context, const uint32_t timeout_in_ms ) +{ + return lr11xx_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( context, timeout_in_ms, + LR11XX_RADIO_LNA_MODE_DIFFERENTIAL_LF0 ); +} + +lr11xx_status_t lr11xx_radio_set_rx_with_timeout_in_rtc_step_and_lna_mode( const void* context, const uint32_t timeout, + lr11xx_radio_lna_mode_t lna_mode ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + const uint8_t cbuffer[LR11XX_RADIO_SET_RX_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RX_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RX_OC >> 0 ), + ( uint8_t ) ( timeout >> 16 ), + ( uint8_t ) ( timeout >> 8 ), + ( uint8_t ) ( timeout >> 0 ), + }; + + do + { + status = LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + + status = ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RX_CMD_LENGTH, 0, 0 ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + + if( ( lna_mode == LR11XX_RADIO_LNA_MODE_SINGLE_RFI_P_LF0 ) || + ( lna_mode == LR11XX_RADIO_LNA_MODE_SINGLE_RFI_N_LF0 ) ) + { + status = lr11xx_radio_set_lna_mode( context, lna_mode ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + } + + } while( 0 ); + + return status; +} + +lr11xx_status_t lr11xx_radio_set_tx( const void* context, const uint32_t timeout_in_ms ) +{ + const uint32_t timeout_in_rtc_step = lr11xx_radio_convert_time_in_ms_to_rtc_step( timeout_in_ms ); + + return lr11xx_radio_set_tx_with_timeout_in_rtc_step( context, timeout_in_rtc_step ); +} + +lr11xx_status_t lr11xx_radio_set_tx_with_timeout_in_rtc_step( const void* context, const uint32_t timeout_in_rtc_step ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + + const uint8_t cbuffer[LR11XX_RADIO_SET_TX_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_TX_OC >> 8 ), ( uint8_t ) ( LR11XX_RADIO_SET_TX_OC >> 0 ), + ( uint8_t ) ( timeout_in_rtc_step >> 16 ), ( uint8_t ) ( timeout_in_rtc_step >> 8 ), + ( uint8_t ) ( timeout_in_rtc_step >> 0 ), + }; + + do + { + status = LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + + status = ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_TX_CMD_LENGTH, 0, 0 ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + } while( 0 ); + + return status; +} + +lr11xx_status_t lr11xx_radio_set_rf_freq( const void* context, const uint32_t freq_in_hz ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_RF_FREQUENCY_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RF_FREQUENCY_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RF_FREQUENCY_OC >> 0 ), + ( uint8_t ) ( freq_in_hz >> 24 ), + ( uint8_t ) ( freq_in_hz >> 16 ), + ( uint8_t ) ( freq_in_hz >> 8 ), + ( uint8_t ) ( freq_in_hz >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RF_FREQUENCY_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_auto_tx_rx( const void* context, const uint32_t delay, + const lr11xx_radio_intermediary_mode_t intermediary_mode, + const uint32_t timeout ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_AUTO_TX_RX_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_AUTOTXRX_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_AUTOTXRX_OC >> 0 ), + ( uint8_t ) ( delay >> 16 ), + ( uint8_t ) ( delay >> 8 ), + ( uint8_t ) ( delay ), + ( uint8_t ) intermediary_mode, + ( uint8_t ) ( timeout >> 16 ), + ( uint8_t ) ( timeout >> 8 ), + ( uint8_t ) ( timeout ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_AUTO_TX_RX_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_cad_params( const void* context, const lr11xx_radio_cad_params_t* cad_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_CAD_PARAMS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_CAD_PARAMS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_CAD_PARAMS_OC >> 0 ), + cad_params->cad_symb_nb, + cad_params->cad_detect_peak, + cad_params->cad_detect_min, + ( uint8_t ) cad_params->cad_exit_mode, + ( uint8_t ) ( cad_params->cad_timeout >> 16 ), + ( uint8_t ) ( cad_params->cad_timeout >> 8 ), + ( uint8_t ) ( cad_params->cad_timeout ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_CAD_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_pkt_type( const void* context, const lr11xx_radio_pkt_type_t pkt_type ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PKT_TYPE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_TYPE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_TYPE_OC >> 0 ), + ( uint8_t ) pkt_type, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PKT_TYPE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_gfsk_mod_params( const void* context, + const lr11xx_radio_mod_params_gfsk_t* mod_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t ) ( mod_params->br_in_bps >> 24 ), + ( uint8_t ) ( mod_params->br_in_bps >> 16 ), + ( uint8_t ) ( mod_params->br_in_bps >> 8 ), + ( uint8_t ) ( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + ( uint8_t ) mod_params->bw_dsb_param, + ( uint8_t ) ( mod_params->fdev_in_hz >> 24 ), + ( uint8_t ) ( mod_params->fdev_in_hz >> 16 ), + ( uint8_t ) ( mod_params->fdev_in_hz >> 8 ), + ( uint8_t ) ( mod_params->fdev_in_hz >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_MODULATION_PARAMS_GFSK_CMD_LENGTH, + 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_bpsk_mod_params( const void* context, + const lr11xx_radio_mod_params_bpsk_t* mod_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t ) ( mod_params->br_in_bps >> 24 ), + ( uint8_t ) ( mod_params->br_in_bps >> 16 ), + ( uint8_t ) ( mod_params->br_in_bps >> 8 ), + ( uint8_t ) ( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_MODULATION_PARAMS_BPSK_CMD_LENGTH, + 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_lora_mod_params( const void* context, + const lr11xx_radio_mod_params_lora_t* mod_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t ) mod_params->sf, + ( uint8_t ) mod_params->bw, + ( uint8_t ) mod_params->cr, + ( uint8_t ) mod_params->ldro, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_MODULATION_PARAMS_LORA_CMD_LENGTH, + 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_lr_fhss_mod_params( const void* radio, + const lr11xx_radio_mod_params_lr_fhss_t* mod_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_MODULATION_PARAM_OC >> 0 ), + ( uint8_t ) ( mod_params->br_in_bps >> 24 ), + ( uint8_t ) ( mod_params->br_in_bps >> 16 ), + ( uint8_t ) ( mod_params->br_in_bps >> 8 ), + ( uint8_t ) ( mod_params->br_in_bps >> 0 ), + ( uint8_t ) mod_params->pulse_shape, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( radio, cbuffer, LR11XX_RADIO_SET_MODULATION_PARAMS_LR_FHSS_CMD_LENGTH, + 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_gfsk_pkt_params( const void* context, + const lr11xx_radio_pkt_params_gfsk_t* pkt_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 0 ), + ( uint8_t ) ( pkt_params->preamble_len_in_bits >> 8 ), + ( uint8_t ) ( pkt_params->preamble_len_in_bits >> 0 ), + ( uint8_t ) ( pkt_params->preamble_detector ), + pkt_params->sync_word_len_in_bits, + ( uint8_t ) ( pkt_params->address_filtering ), + ( uint8_t ) ( pkt_params->header_type ), + pkt_params->pld_len_in_bytes, + ( uint8_t ) ( pkt_params->crc_type ), + ( uint8_t ) ( pkt_params->dc_free ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PKT_PARAM_GFSK_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_bpsk_pkt_params( const void* context, + const lr11xx_radio_pkt_params_bpsk_t* pkt_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 0 ), + pkt_params->pld_len_in_bytes, + ( uint8_t ) ( pkt_params->ramp_up_delay >> 8 ), + ( uint8_t ) ( pkt_params->ramp_up_delay >> 0 ), + ( uint8_t ) ( pkt_params->ramp_down_delay >> 8 ), + ( uint8_t ) ( pkt_params->ramp_down_delay >> 0 ), + ( uint8_t ) ( pkt_params->pld_len_in_bits >> 8 ), + ( uint8_t ) ( pkt_params->pld_len_in_bits >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PKT_PARAM_BPSK_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_lora_pkt_params( const void* context, + const lr11xx_radio_pkt_params_lora_t* pkt_params ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_PARAM_OC >> 0 ), + ( uint8_t ) ( pkt_params->preamble_len_in_symb >> 8 ), + ( uint8_t ) ( pkt_params->preamble_len_in_symb >> 0 ), + ( uint8_t ) ( pkt_params->header_type ), + pkt_params->pld_len_in_bytes, + ( uint8_t ) ( pkt_params->crc ), + ( uint8_t ) ( pkt_params->iq ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PKT_PARAM_LORA_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_tx_params( const void* context, const int8_t pwr_in_dbm, + const lr11xx_radio_ramp_time_t ramp_time ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_TX_PARAMS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_TX_PARAMS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_TX_PARAMS_OC >> 0 ), + ( uint8_t ) pwr_in_dbm, + ( uint8_t ) ramp_time, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_TX_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_pkt_address( const void* context, const uint8_t node_address, + const uint8_t broadcast_address ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PKT_ADDRESS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_ADRS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PKT_ADRS_OC >> 0 ), + node_address, + broadcast_address, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PKT_ADDRESS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_rx_tx_fallback_mode( const void* context, + const lr11xx_radio_fallback_modes_t fallback_mode ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_OC >> 0 ), + fallback_mode, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RX_TX_FALLBACK_MODE_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_radio_set_rx_duty_cycle( const void* context, const uint32_t rx_period_in_ms, + const uint32_t sleep_period_in_ms, + const lr11xx_radio_rx_duty_cycle_mode_t mode ) +{ + const uint32_t rx_period_in_rtc_step = lr11xx_radio_convert_time_in_ms_to_rtc_step( rx_period_in_ms ); + const uint32_t sleep_period_in_rtc_step = lr11xx_radio_convert_time_in_ms_to_rtc_step( sleep_period_in_ms ); + + return lr11xx_radio_set_rx_duty_cycle_with_timings_in_rtc_step( context, rx_period_in_rtc_step, + sleep_period_in_rtc_step, mode ); +} + +lr11xx_status_t lr11xx_radio_set_rx_duty_cycle_with_timings_in_rtc_step( const void* context, + const uint32_t rx_period_in_rtc_step, + const uint32_t sleep_period_in_rtc_step, + const lr11xx_radio_rx_duty_cycle_mode_t mode ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RX_DUTY_CYCLE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RX_DUTY_CYCLE_OC >> 0 ), + ( uint8_t ) ( rx_period_in_rtc_step >> 16 ), + ( uint8_t ) ( rx_period_in_rtc_step >> 8 ), + ( uint8_t ) ( rx_period_in_rtc_step >> 0 ), + ( uint8_t ) ( sleep_period_in_rtc_step >> 16 ), + ( uint8_t ) ( sleep_period_in_rtc_step >> 8 ), + ( uint8_t ) ( sleep_period_in_rtc_step >> 0 ), + ( uint8_t ) mode, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RX_DUTY_CYCLE_MODE_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_radio_set_pa_cfg( const void* context, const lr11xx_radio_pa_cfg_t* pa_cfg ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_PA_CFG_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_PA_CFG_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_PA_CFG_OC >> 0 ), + ( uint8_t ) pa_cfg->pa_sel, + ( uint8_t ) pa_cfg->pa_reg_supply, + pa_cfg->pa_duty_cycle, + pa_cfg->pa_hp_sel, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_PA_CFG_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_stop_timeout_on_preamble( const void* context, const bool stop_timeout_on_preamble ) +{ + const uint8_t cbuffer[LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_OC >> 0 ), + ( uint8_t ) stop_timeout_on_preamble, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_STOP_TIMEOUT_ON_PREAMBLE_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_radio_set_cad( const void* context ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + const uint8_t cbuffer[LR11XX_RADIO_SET_CAD_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_CAD_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_CAD_OC >> 0 ), + }; + + do + { + status = LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + + status = ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_CAD_CMD_LENGTH, 0, 0 ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + } while( 0 ); + + return status; +} + +lr11xx_status_t lr11xx_radio_set_tx_cw( const void* context ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_TX_CW_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_TX_CW_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_TX_CW_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_TX_CW_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_tx_infinite_preamble( const void* context ) +{ + lr11xx_status_t status = LR11XX_STATUS_ERROR; + const uint8_t cbuffer[LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_OC >> 0 ), + }; + + do + { + status = LR11XX_RADIO_APPLY_HIGH_ACP_WORKAROUND( context ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + + status = ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, + LR11XX_RADIO_SET_TX_INFINITE_PREAMBLE_CMD_LENGTH, 0, 0 ); + if( status != LR11XX_STATUS_OK ) + { + break; + } + } while( 0 ); + + return status; +} + +lr11xx_status_t lr11xx_radio_set_lora_sync_timeout( const void* context, const uint16_t nb_symbol ) +{ + if( nb_symbol <= 255 ) + { + const uint8_t cbuffer[LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 0 ), + nb_symbol, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_CMD_LENGTH, 0, + 0 ); + } + else + { + uint8_t exp; + uint8_t mant; + + lr11xx_radio_convert_nb_symb_to_mant_exp( nb_symbol, &mant, &exp ); + + return lr11xx_radio_set_lora_sync_timeout_with_mantissa_exponent( context, mant, exp ); + } +} + +lr11xx_status_t lr11xx_radio_set_lora_sync_timeout_with_mantissa_exponent( const void* context, const uint8_t mantissa, + const uint8_t exponent ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_OC >> 0 ), + mantissa << 3 | exponent, + 0x01, + }; + + if( ( mantissa > 31 ) || ( exponent > 7 ) ) + { + return LR11XX_STATUS_ERROR; + } + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_LORA_SYNC_TIMEOUT_EXT_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_radio_set_gfsk_crc_params( const void* context, const uint32_t seed, const uint32_t polynomial ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_CRC_PARAMS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_CRC_PARAMS_OC >> 0 ), + ( uint8_t ) ( seed >> 24 ), + ( uint8_t ) ( seed >> 16 ), + ( uint8_t ) ( seed >> 8 ), + ( uint8_t ) ( seed >> 0 ), + ( uint8_t ) ( polynomial >> 24 ), + ( uint8_t ) ( polynomial >> 16 ), + ( uint8_t ) ( polynomial >> 8 ), + ( uint8_t ) ( polynomial >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_GFSK_CRC_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_gfsk_whitening_seed( const void* context, const uint16_t seed ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_GFSK_WHITENING_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_WHITENING_PARAMS_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_GFSK_WHITENING_PARAMS_OC >> 0 ), + ( uint8_t ) ( seed >> 8 ), + ( uint8_t ) ( seed >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_GFSK_WHITENING_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_cfg_rx_boosted( const void* context, const bool enable_boost_mode ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_RX_BOOSTED_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RX_BOOSTED_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RX_BOOSTED_OC >> 0 ), + ( enable_boost_mode == true ) ? 0x01 : 0x00, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RX_BOOSTED_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_set_rssi_calibration( const void* context, + const lr11xx_radio_rssi_calibration_table_t* rssi_cal_table ) +{ + const uint8_t cbuffer[LR11XX_RADIO_SET_RSSI_CALIBRATION_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_SET_RSSI_CALIBRATION_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_SET_RSSI_CALIBRATION_OC >> 0 ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g5 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g4 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g7 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g6 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g9 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g8 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g11 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g10 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g13 & 0x0F ) << 4 ) + ( rssi_cal_table->gain_tune.g12 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g13hp2 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp1 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g13hp4 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp3 & 0x0F ) ), + ( uint8_t ) ( ( ( rssi_cal_table->gain_tune.g13hp6 & 0x0F ) << 4 ) + + ( rssi_cal_table->gain_tune.g13hp5 & 0x0F ) ), + ( uint8_t ) ( rssi_cal_table->gain_tune.g13hp7 & 0x0F ), + ( uint8_t ) ( rssi_cal_table->gain_offset >> 8 ), + ( uint8_t ) ( rssi_cal_table->gain_offset >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RADIO_SET_RSSI_CALIBRATION_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_radio_get_gfsk_rx_bandwidth( uint32_t bw_in_hz, lr11xx_radio_gfsk_bw_t* bw_parameter ) +{ + if( bw_in_hz <= 4800 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_4800; + } + else if( bw_in_hz <= 5800 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_5800; + } + else if( bw_in_hz <= 7300 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_7300; + } + else if( bw_in_hz <= 9700 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_9700; + } + else if( bw_in_hz <= 11700 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_11700; + } + else if( bw_in_hz <= 14600 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_14600; + } + else if( bw_in_hz <= 19500 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_19500; + } + else if( bw_in_hz <= 23400 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_23400; + } + else if( bw_in_hz <= 29300 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_29300; + } + else if( bw_in_hz <= 39000 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_39000; + } + else if( bw_in_hz <= 46900 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_46900; + } + else if( bw_in_hz <= 58600 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_58600; + } + else if( bw_in_hz <= 78200 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_78200; + } + else if( bw_in_hz <= 93800 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_93800; + } + else if( bw_in_hz <= 117300 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_117300; + } + else if( bw_in_hz <= 156200 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_156200; + } + else if( bw_in_hz <= 187200 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_187200; + } + else if( bw_in_hz <= 234300 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_234300; + } + else if( bw_in_hz <= 312000 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_312000; + } + else if( bw_in_hz <= 373600 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_373600; + } + else if( bw_in_hz <= 467000 ) + { + *bw_parameter = LR11XX_RADIO_GFSK_BW_467000; + } + else + { + return LR11XX_STATUS_ERROR; + } + + return LR11XX_STATUS_OK; +} + +uint32_t lr11xx_radio_get_lora_time_on_air_numerator( const lr11xx_radio_pkt_params_lora_t* pkt_p, + const lr11xx_radio_mod_params_lora_t* mod_p ) +{ + const int32_t pld_len_in_bytes = pkt_p->pld_len_in_bytes; + const int32_t sf = mod_p->sf; + const bool pld_is_fix = pkt_p->header_type == LR11XX_RADIO_LORA_PKT_IMPLICIT; + + int32_t fine_synch = ( sf <= 6 ) ? 1 : 0; + bool long_interleaving = ( mod_p->cr > 4 ); + + int32_t total_bytes_nb = pld_len_in_bytes + ( ( pkt_p->crc == LR11XX_RADIO_LORA_CRC_ON ) ? 2 : 0 ); + int32_t tx_bits_symbol = sf - 2 * ( mod_p->ldro != 0 ? 1 : 0 ); + + int32_t ceil_numerator; + int32_t ceil_denominator; + + uint32_t intermed; + + int32_t symbols_nb_data; + int32_t tx_infobits_header; + int32_t tx_infobits_payload; + + if( long_interleaving ) + { + const int32_t fec_rate_numerator = 4; + const int32_t fec_rate_denominator = ( mod_p->cr + ( mod_p->cr == 7 ? 1 : 0 ) ); + + if( pld_is_fix ) + { + int32_t tx_bits_symbol_start = sf - 2 + 2 * fine_synch; + if( 8 * total_bytes_nb * fec_rate_denominator <= 7 * fec_rate_numerator * tx_bits_symbol_start ) + { + ceil_numerator = 8 * total_bytes_nb * fec_rate_denominator; + ceil_denominator = fec_rate_numerator * tx_bits_symbol_start; + } + else + { + int32_t tx_codedbits_header = tx_bits_symbol_start * 8; + ceil_numerator = 8 * fec_rate_numerator * tx_bits_symbol + 8 * total_bytes_nb * fec_rate_denominator - + fec_rate_numerator * tx_codedbits_header; + ceil_denominator = fec_rate_numerator * tx_bits_symbol; + } + } + else + { + tx_infobits_header = ( sf * 4 + fine_synch * 8 - 28 ) & ~0x07; + if( tx_infobits_header < 8 * total_bytes_nb ) + { + if( tx_infobits_header > 8 * pld_len_in_bytes ) + { + tx_infobits_header = 8 * pld_len_in_bytes; + } + } + tx_infobits_payload = 8 * total_bytes_nb - tx_infobits_header; + if( tx_infobits_payload < 0 ) + { + tx_infobits_payload = 0; + } + + ceil_numerator = tx_infobits_payload * fec_rate_denominator + 8 * fec_rate_numerator * tx_bits_symbol; + ceil_denominator = fec_rate_numerator * tx_bits_symbol; + } + } + else + { + tx_infobits_header = sf * 4 + fine_synch * 8 - 8; + + if( !pld_is_fix ) + { + tx_infobits_header -= 20; + } + + tx_infobits_payload = 8 * total_bytes_nb - tx_infobits_header; + + if( tx_infobits_payload < 0 ) + tx_infobits_payload = 0; + + ceil_numerator = tx_infobits_payload; + ceil_denominator = 4 * tx_bits_symbol; + } + + symbols_nb_data = ( ( ceil_numerator + ceil_denominator - 1 ) / ceil_denominator ); + if( !long_interleaving ) + { + symbols_nb_data = symbols_nb_data * ( mod_p->cr + 4 ) + 8; + } + intermed = pkt_p->preamble_len_in_symb + 4 + 2 * fine_synch + symbols_nb_data; + + return ( uint32_t ) ( ( 4 * intermed + 1 ) * ( 1 << ( sf - 2 ) ) ) - 1; +} + +uint32_t lr11xx_radio_get_lora_bw_in_hz( lr11xx_radio_lora_bw_t bw ) +{ + uint32_t bw_in_hz = 0; + + switch( bw ) + { + case LR11XX_RADIO_LORA_BW_10: + bw_in_hz = 10417UL; + break; + case LR11XX_RADIO_LORA_BW_15: + bw_in_hz = 15625UL; + break; + case LR11XX_RADIO_LORA_BW_20: + bw_in_hz = 20833UL; + break; + case LR11XX_RADIO_LORA_BW_31: + bw_in_hz = 31250UL; + break; + case LR11XX_RADIO_LORA_BW_41: + bw_in_hz = 41667UL; + break; + case LR11XX_RADIO_LORA_BW_62: + bw_in_hz = 62500UL; + break; + case LR11XX_RADIO_LORA_BW_125: + bw_in_hz = 125000UL; + break; + case LR11XX_RADIO_LORA_BW_250: + bw_in_hz = 250000UL; + break; + case LR11XX_RADIO_LORA_BW_500: + bw_in_hz = 500000UL; + break; + case LR11XX_RADIO_LORA_BW_200: + bw_in_hz = 203000UL; + break; + case LR11XX_RADIO_LORA_BW_400: + bw_in_hz = 406000UL; + break; + case LR11XX_RADIO_LORA_BW_800: + bw_in_hz = 812000UL; + break; + } + + return bw_in_hz; +} + +uint32_t lr11xx_radio_get_lora_time_on_air_in_ms( const lr11xx_radio_pkt_params_lora_t* pkt_p, + const lr11xx_radio_mod_params_lora_t* mod_p ) +{ + uint32_t numerator = 1000U * lr11xx_radio_get_lora_time_on_air_numerator( pkt_p, mod_p ); + uint32_t denominator = lr11xx_radio_get_lora_bw_in_hz( mod_p->bw ); + // Perform integral ceil() + return ( numerator + denominator - 1 ) / denominator; +} + +uint32_t lr11xx_radio_get_gfsk_time_on_air_numerator( const lr11xx_radio_pkt_params_gfsk_t* pkt_p ) +{ + uint8_t header_len_in_bits; + + switch( pkt_p->header_type ) + { + case LR11XX_RADIO_GFSK_PKT_FIX_LEN: + { + header_len_in_bits = 0; + break; + } + case LR11XX_RADIO_GFSK_PKT_VAR_LEN: + { + header_len_in_bits = 8; + break; + } + case LR11XX_RADIO_GFSK_PKT_VAR_LEN_SX128X_COMP: + { + header_len_in_bits = 9; + break; + } + default: + { + return 0; + } + } + + return pkt_p->preamble_len_in_bits + header_len_in_bits + pkt_p->sync_word_len_in_bits + + ( ( pkt_p->pld_len_in_bytes + + ( pkt_p->address_filtering == LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE ? 0 : 1 ) + + lr11xx_radio_get_gfsk_crc_len_in_bytes( pkt_p->crc_type ) ) + << 3 ); +} + +uint32_t lr11xx_radio_get_gfsk_time_on_air_in_ms( const lr11xx_radio_pkt_params_gfsk_t* pkt_p, + const lr11xx_radio_mod_params_gfsk_t* mod_p ) +{ + uint32_t numerator = 1000U * lr11xx_radio_get_gfsk_time_on_air_numerator( pkt_p ); + uint32_t denominator = mod_p->br_in_bps; + + // Perform integral ceil() + return ( numerator + denominator - 1 ) / denominator; +} + +uint32_t lr11xx_radio_convert_time_in_ms_to_rtc_step( uint32_t time_in_ms ) +{ + return ( uint32_t ) ( time_in_ms * LR11XX_RTC_FREQ_IN_HZ / 1000 ); +} + +lr11xx_status_t lr11xx_radio_cfg_bluetooth_low_energy_beaconning_compatibility( const void* context, + const uint8_t channel_id, + const uint8_t* buffer, + const uint8_t length ) +{ + const uint8_t command[LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_OC >> 0 ), + channel_id, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( + context, command, LR11XX_RADIO_CFG_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_CMD_LENGTH, buffer, length ); +} + +lr11xx_status_t lr11xx_radio_get_lora_rx_info( const void* context, bool* is_crc_present, lr11xx_radio_lora_cr_t* cr ) +{ + const uint8_t cbuffer[LR11XX_RADIO_GET_LORA_RX_INFO_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_GET_LORA_RX_INFO_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_GET_LORA_RX_INFO_OC >> 0 ), + }; + uint8_t rbuffer = 0; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_RADIO_GET_LORA_RX_INFO_CMD_LENGTH, &rbuffer, 1 ); + + if( status == LR11XX_STATUS_OK ) + { + *is_crc_present = ( ( ( rbuffer & ( 0x01 << 4 ) ) != 0 ) ) ? true : false; + *cr = ( lr11xx_radio_lora_cr_t ) ( rbuffer & 0x07 ); + } + + return status; +} + +lr11xx_status_t lr11xx_radio_cfg_and_send_bluetooth_low_energy_beaconning_compatibility( const void* context, + const uint8_t channel_id, + const uint8_t* buffer, + const uint8_t length ) +{ + const uint8_t command[LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC >> 8 ), + ( uint8_t ) ( LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_OC >> 0 ), + channel_id, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( + context, command, LR11XX_RADIO_BLUETOOTH_LOW_ENERGY_BEACONNING_COMPATIBILITY_SEND_CMD_LENGTH, buffer, length ); +} + +lr11xx_status_t lr11xx_radio_apply_high_acp_workaround( const void* context ) +{ + return lr11xx_regmem_write_regmem32_mask( context, 0x00F30054, 1 << 30, 0 << 30 ); +} + +uint16_t lr11xx_radio_convert_nb_symb_to_mant_exp( const uint16_t nb_symbol, uint8_t* mant, uint8_t* exp ) +{ + uint8_t exp_loc = 0; + uint16_t mant_loc = ( nb_symbol + 1 ) >> 1; + + while( mant_loc > 31 ) + { + mant_loc = ( mant_loc + 3 ) >> 2; + exp_loc++; + } + + *mant = ( uint8_t ) mant_loc; + *exp = exp_loc; + + return mant_loc << ( 2 * exp_loc + 1 ); +} + +lr11xx_status_t lr11xx_radio_set_lna_mode( const void* context, lr11xx_radio_lna_mode_t lna_config ) +{ + return lr11xx_regmem_write_regmem32_mask( context, 0x00F3008C, 0xF0, lna_config << 4 ); +} +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static inline uint32_t lr11xx_radio_get_gfsk_crc_len_in_bytes( lr11xx_radio_gfsk_crc_type_t crc_type ) +{ + switch( crc_type ) + { + case LR11XX_RADIO_GFSK_CRC_OFF: + return 0; + case LR11XX_RADIO_GFSK_CRC_1_BYTE: + return 1; + case LR11XX_RADIO_GFSK_CRC_2_BYTES: + return 2; + case LR11XX_RADIO_GFSK_CRC_1_BYTE_INV: + return 1; + case LR11XX_RADIO_GFSK_CRC_2_BYTES_INV: + return 2; + } + + return 0; +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio_timings.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio_timings.c new file mode 100755 index 0000000..a27eeeb --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_radio_timings.c @@ -0,0 +1,233 @@ +/** + * @file lr11xx_radio_timings.c + * + * @brief LR11XX timing helper functions implementation + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_radio_timings.h" +#include "lr11xx_radio.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +/** + * @brief Time in microsecond taken by the chip to process the Rx done interrupt + */ +#define RX_DONE_IRQ_PROCESSING_TIME_IN_US 74 + +/** + * @brief Time in microsecond taken by the chip to process the Tx done interrupt + */ +#define TX_DONE_IRQ_PROCESSING_TIME_IN_US 111 + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/** + * @brief Get the power amplifier ramp time for a given power amplifier ramp time parameter + * + * @param [in] ramp_time Power amplifier ramp time parameter + * + * @returns Ramp time in microsecond + */ +static uint32_t lr11xx_radio_timings_get_pa_ramp_time_in_us( const lr11xx_radio_ramp_time_t ramp_time ); + +/** + * @brief Get the LoRa reception input delay + * + * @param [in] bw LoRa bandwidth + * + * @returns LoRa reception input delay in microsecond + */ +static uint32_t lr11xx_radio_timings_get_lora_rx_input_delay_in_us( lr11xx_radio_lora_bw_t bw ); + +/** + * @brief Get the LoRa symbol time + * + * @param [in] bw LoRa bandwidth + * @param [in] sf LoRa spreading factor + * + * @returns LoRa symbol time in microsecond + */ +static uint32_t lr11xx_radio_timings_get_lora_symb_time_in_us( const lr11xx_radio_lora_sf_t sf, + const lr11xx_radio_lora_bw_t bw ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +uint32_t lr11xx_radio_timings_get_delay_between_last_bit_sent_and_rx_done_in_us( + const lr11xx_radio_mod_params_lora_t* mod_params ) +{ + return lr11xx_radio_timings_get_lora_rx_input_delay_in_us( mod_params->bw ) + + 2 * lr11xx_radio_timings_get_lora_symb_time_in_us( mod_params->sf, mod_params->bw ) + + RX_DONE_IRQ_PROCESSING_TIME_IN_US; +} + +uint32_t lr11xx_radio_timings_get_delay_between_last_bit_sent_and_tx_done_in_us( + const lr11xx_radio_ramp_time_t ramp_time ) +{ + return lr11xx_radio_timings_get_pa_ramp_time_in_us( ramp_time ) + TX_DONE_IRQ_PROCESSING_TIME_IN_US; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static uint32_t lr11xx_radio_timings_get_pa_ramp_time_in_us( const lr11xx_radio_ramp_time_t ramp_time ) +{ + switch( ramp_time ) + { + case LR11XX_RADIO_RAMP_16_US: + { + return 16; + } + case LR11XX_RADIO_RAMP_32_US: + { + return 32; + } + case LR11XX_RADIO_RAMP_48_US: + { + return 48; + } + case LR11XX_RADIO_RAMP_64_US: + { + return 64; + } + case LR11XX_RADIO_RAMP_80_US: + { + return 80; + } + case LR11XX_RADIO_RAMP_96_US: + { + return 96; + } + case LR11XX_RADIO_RAMP_112_US: + { + return 112; + } + case LR11XX_RADIO_RAMP_128_US: + { + return 128; + } + case LR11XX_RADIO_RAMP_144_US: + { + return 144; + } + case LR11XX_RADIO_RAMP_160_US: + { + return 160; + } + case LR11XX_RADIO_RAMP_176_US: + { + return 176; + } + case LR11XX_RADIO_RAMP_192_US: + { + return 192; + } + case LR11XX_RADIO_RAMP_208_US: + { + return 208; + } + case LR11XX_RADIO_RAMP_240_US: + { + return 240; + } + case LR11XX_RADIO_RAMP_272_US: + { + return 272; + } + case LR11XX_RADIO_RAMP_304_US: + { + return 304; + } + default: + return 0; + } +} + +static uint32_t lr11xx_radio_timings_get_lora_rx_input_delay_in_us( lr11xx_radio_lora_bw_t bw ) +{ + switch( bw ) + { + case LR11XX_RADIO_LORA_BW_500: + { + return 16; + } + case LR11XX_RADIO_LORA_BW_250: + { + return 31; + } + case LR11XX_RADIO_LORA_BW_125: + { + return 57; + } + default: + { + return 0; + } + } +} + +static uint32_t lr11xx_radio_timings_get_lora_symb_time_in_us( const lr11xx_radio_lora_sf_t sf, + const lr11xx_radio_lora_bw_t bw ) +{ + return ( 1 << ( uint8_t ) sf ) * 1000000 / lr11xx_radio_get_lora_bw_in_hz( bw ); +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_regmem.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_regmem.c new file mode 100755 index 0000000..0d3ac02 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_regmem.c @@ -0,0 +1,323 @@ +/*! + * @file lr11xx_regmem.c + * + * @brief Register/memory driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_regmem.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH 2 +#define LR11XX_REGMEM_WRITE_REGMEM32_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_REGMEM_READ_REGMEM32_CMD_LENGTH ( 2 + 4 + 1 ) +#define LR11XX_REGMEM_WRITE_MEM8_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_REGMEM_READ_MEM8_CMD_LENGTH ( 2 + 4 + 1 ) +#define LR11XX_REGMEM_WRITE_BUFFER8_CMD_LENGTH ( 2 ) +#define LR11XX_REGMEM_READ_BUFFER8_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH ( 2 + 4 + 4 + 4 ) + +#define LR11XX_REGMEM_BUFFER_SIZE_MAX ( 256 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for register and memory related operations + */ +enum +{ + LR11XX_REGMEM_WRITE_REGMEM32_OC = 0x0105, + LR11XX_REGMEM_READ_REGMEM32_OC = 0x0106, + LR11XX_REGMEM_WRITE_MEM8_OC = 0x0107, + LR11XX_REGMEM_READ_MEM8_OC = 0x0108, + LR11XX_REGMEM_WRITE_BUFFER8_OC = 0x0109, + LR11XX_REGMEM_READ_BUFFER8_OC = 0x010A, + LR11XX_REGMEM_CLEAR_RXBUFFER_OC = 0x010B, + LR11XX_REGMEM_WRITE_REGMEM32_MASK_OC = 0x010C, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Helper function that fill both cbuffer with opcode and memory address + * + * It is typically used in read/write regmem32 functions. + * + * @warning It is up to the caller to ensure cbuffer is big enough to contain opcode and address! + */ +static void lr11xx_regmem_fill_cbuffer_opcode_address( uint8_t* cbuffer, uint16_t opcode, uint32_t address ); + +/*! + * @brief Helper function that fill both cbuffer with opcode memory address, and data length to read + * + * It is typically used in read functions. + * + * @warning It is up to the caller to ensure cbuffer is big enough to contain opcode and address! + */ +static void lr11xx_regmem_fill_cbuffer_opcode_address_length( uint8_t* cbuffer, uint16_t opcode, uint32_t address, + uint8_t length ); + +/*! + * @brief Helper function that fill both cbuffer with data + * + * It is typically used in write write regmem32 functions. + * + * @warning It is up to the caller to ensure cdata is big enough to contain all data! + */ +static void lr11xx_regmem_fill_cdata( uint8_t* cdata, const uint32_t* data, uint8_t data_length ); + +/*! + * @brief Helper function that fill both cbuffer and cdata buffers with opcode, memory address and data + * + * It is typically used to factorize and write regmem32 operations. Behind the scene it calls the other helpers + * lr11xx_regmem_fill_cbuffer_opcode_address and lr11xx_regmem_fill_cdata. + * + * @warning It is up to the caller to ensure cbuffer and cdata are big enough to contain their respective information! + */ +static void lr11xx_regmem_fill_cbuffer_cdata_opcode_address_data( uint8_t* cbuffer, uint8_t* cdata, uint16_t opcode, + uint32_t address, const uint32_t* data, + uint8_t data_length ); + +/*! + * @brief Helper function that convert an array of uint8_t into an array of uint32_t + * + * Typically used in the read function returning uint32_t array. + * + * @warning It is up to the caller to ensure the raw_buffer is of length at least "out_buffer_length * + * sizeof(uint32_t)"! + */ +static void lr11xx_regmem_fill_out_buffer_from_raw_buffer( uint32_t* out_buffer, const uint8_t* raw_buffer, + uint8_t out_buffer_length ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_regmem_write_regmem32( const void* context, const uint32_t address, const uint32_t* buffer, + const uint8_t length ) +{ + uint8_t cbuffer[LR11XX_REGMEM_WRITE_REGMEM32_CMD_LENGTH]; + uint8_t cdata[LR11XX_REGMEM_BUFFER_SIZE_MAX]; + + if( length > LR11XX_REGMEM_MAX_WRITE_READ_WORDS ) + { + return LR11XX_STATUS_ERROR; + } + + lr11xx_regmem_fill_cbuffer_cdata_opcode_address_data( cbuffer, cdata, LR11XX_REGMEM_WRITE_REGMEM32_OC, address, + buffer, length ); + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_REGMEM_WRITE_REGMEM32_CMD_LENGTH, cdata, + length * sizeof( uint32_t ) ); +} + +lr11xx_status_t lr11xx_regmem_read_regmem32( const void* context, const uint32_t address, uint32_t* buffer, + const uint8_t length ) +{ + uint8_t cbuffer[LR11XX_REGMEM_READ_REGMEM32_CMD_LENGTH] = { 0 }; + + if( length > LR11XX_REGMEM_MAX_WRITE_READ_WORDS ) + { + return LR11XX_STATUS_ERROR; + } + + lr11xx_regmem_fill_cbuffer_opcode_address_length( cbuffer, LR11XX_REGMEM_READ_REGMEM32_OC, address, length ); + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_REGMEM_READ_REGMEM32_CMD_LENGTH, ( uint8_t* ) buffer, length * sizeof( uint32_t ) ); + + if( status == LR11XX_STATUS_OK ) + { + lr11xx_regmem_fill_out_buffer_from_raw_buffer( buffer, ( const uint8_t* ) buffer, length ); + } + + return status; +} + +lr11xx_status_t lr11xx_regmem_write_mem8( const void* context, const uint32_t address, const uint8_t* buffer, + const uint8_t length ) +{ + uint8_t cbuffer[LR11XX_REGMEM_WRITE_MEM8_CMD_LENGTH]; + + lr11xx_regmem_fill_cbuffer_opcode_address( cbuffer, LR11XX_REGMEM_WRITE_MEM8_OC, address ); + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_REGMEM_WRITE_MEM8_CMD_LENGTH, buffer, + length ); +} + +lr11xx_status_t lr11xx_regmem_read_mem8( const void* context, const uint32_t address, uint8_t* buffer, + const uint8_t length ) +{ + uint8_t cbuffer[LR11XX_REGMEM_READ_MEM8_CMD_LENGTH]; + + lr11xx_regmem_fill_cbuffer_opcode_address_length( cbuffer, LR11XX_REGMEM_READ_MEM8_OC, address, length ); + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_REGMEM_READ_MEM8_CMD_LENGTH, buffer, length ); +} + +lr11xx_status_t lr11xx_regmem_write_buffer8( const void* context, const uint8_t* buffer, const uint8_t length ) +{ + const uint8_t cbuffer[LR11XX_REGMEM_WRITE_BUFFER8_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_REGMEM_WRITE_BUFFER8_OC >> 8 ), + ( uint8_t ) ( LR11XX_REGMEM_WRITE_BUFFER8_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_REGMEM_WRITE_BUFFER8_CMD_LENGTH, buffer, + length ); +} + +lr11xx_status_t lr11xx_regmem_read_buffer8( const void* context, uint8_t* buffer, const uint8_t offset, + const uint8_t length ) +{ + const uint8_t cbuffer[LR11XX_REGMEM_READ_BUFFER8_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_REGMEM_READ_BUFFER8_OC >> 8 ), + ( uint8_t ) ( LR11XX_REGMEM_READ_BUFFER8_OC >> 0 ), + offset, + length, + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_REGMEM_READ_BUFFER8_CMD_LENGTH, buffer, + length ); +} + +lr11xx_status_t lr11xx_regmem_clear_rxbuffer( const void* context ) +{ + const uint8_t cbuffer[LR11XX_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_REGMEM_CLEAR_RXBUFFER_OC >> 8 ), + ( uint8_t ) ( LR11XX_REGMEM_CLEAR_RXBUFFER_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_REGMEM_CLEAR_RXBUFFER_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_regmem_write_regmem32_mask( const void* context, const uint32_t address, const uint32_t mask, + const uint32_t data ) +{ + uint8_t cbuffer[LR11XX_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH]; + + lr11xx_regmem_fill_cbuffer_opcode_address( cbuffer, LR11XX_REGMEM_WRITE_REGMEM32_MASK_OC, address ); + + cbuffer[6] = ( uint8_t ) ( mask >> 24 ); + cbuffer[7] = ( uint8_t ) ( mask >> 16 ); + cbuffer[8] = ( uint8_t ) ( mask >> 8 ); + cbuffer[9] = ( uint8_t ) ( mask >> 0 ); + + cbuffer[10] = ( uint8_t ) ( data >> 24 ); + cbuffer[11] = ( uint8_t ) ( data >> 16 ); + cbuffer[12] = ( uint8_t ) ( data >> 8 ); + cbuffer[13] = ( uint8_t ) ( data >> 0 ); + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_REGMEM_WRITE_REGMEM32_MASK_CMD_LENGTH, 0, 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +void lr11xx_regmem_fill_cbuffer_opcode_address( uint8_t* cbuffer, uint16_t opcode, uint32_t address ) +{ + cbuffer[0] = ( uint8_t ) ( opcode >> 8 ); + cbuffer[1] = ( uint8_t ) ( opcode >> 0 ); + + cbuffer[2] = ( uint8_t ) ( address >> 24 ); + cbuffer[3] = ( uint8_t ) ( address >> 16 ); + cbuffer[4] = ( uint8_t ) ( address >> 8 ); + cbuffer[5] = ( uint8_t ) ( address >> 0 ); +} + +void lr11xx_regmem_fill_cbuffer_opcode_address_length( uint8_t* cbuffer, uint16_t opcode, uint32_t address, + uint8_t length ) +{ + lr11xx_regmem_fill_cbuffer_opcode_address( cbuffer, opcode, address ); + cbuffer[6] = length; +} + +void lr11xx_regmem_fill_cdata( uint8_t* cdata, const uint32_t* data, uint8_t data_length ) +{ + for( uint16_t index = 0; index < data_length; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t ) ( data[index] >> 24 ); + cdata_local[1] = ( uint8_t ) ( data[index] >> 16 ); + cdata_local[2] = ( uint8_t ) ( data[index] >> 8 ); + cdata_local[3] = ( uint8_t ) ( data[index] >> 0 ); + } +} + +void lr11xx_regmem_fill_cbuffer_cdata_opcode_address_data( uint8_t* cbuffer, uint8_t* cdata, uint16_t opcode, + uint32_t address, const uint32_t* data, uint8_t data_length ) +{ + lr11xx_regmem_fill_cbuffer_opcode_address( cbuffer, opcode, address ); + lr11xx_regmem_fill_cdata( cdata, data, data_length ); +} + +void lr11xx_regmem_fill_out_buffer_from_raw_buffer( uint32_t* out_buffer, const uint8_t* raw_buffer, + uint8_t out_buffer_length ) +{ + for( uint8_t out_index = 0; out_index < out_buffer_length; out_index++ ) + { + const uint8_t* raw_buffer_local = &raw_buffer[out_index * 4]; + + out_buffer[out_index] = ( ( uint32_t ) raw_buffer_local[0] << 24 ) + + ( ( uint32_t ) raw_buffer_local[1] << 16 ) + ( ( uint32_t ) raw_buffer_local[2] << 8 ) + + ( ( uint32_t ) raw_buffer_local[3] << 0 ); + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_rttof.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_rttof.c new file mode 100755 index 0000000..4d06b48 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_rttof.c @@ -0,0 +1,194 @@ +/** + * @file lr11xx_rttof.c + * + * @brief Round-Trip Time of Flight (RTToF) driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2022. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include "lr11xx_rttof.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_RTTOF_SET_ADDRESS_CMD_LENGTH ( 2 + 5 ) +#define LR11XX_RTTOF_SET_REQUEST_ADDRESS_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_RTTOF_SET_RX_TX_DELAY_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_RTTOF_SET_PARAMETERS_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_RTTOF_GET_RESULT_CMD_LENGTH ( 2 + 1 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/** + * @brief Operating codes for RTToF-related operations + */ +enum +{ + LR11XX_RTTOF_SET_ADDRESS = 0x021C, + LR11XX_RTTOF_SET_REQUEST_ADDRESS = 0x021D, + LR11XX_RTTOF_SET_RX_TX_DELAY = 0x021F, + LR11XX_RTTOF_SET_PARAMETERS = 0x0228, + LR11XX_RTTOF_GET_RESULT = 0x021E, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTION DECLARATIONS ------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTION DEFINITIONS --------------------------------------------- + */ + +lr11xx_status_t lr11xx_rttof_set_address( const void* context, const uint32_t address, const uint8_t check_length ) +{ + const uint8_t cbuffer[LR11XX_RTTOF_SET_ADDRESS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_RTTOF_SET_ADDRESS >> 8 ), + ( uint8_t )( LR11XX_RTTOF_SET_ADDRESS >> 0 ), + ( uint8_t )( address >> 24 ), + ( uint8_t )( address >> 16 ), + ( uint8_t )( address >> 8 ), + ( uint8_t )( address >> 0 ), + check_length, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RTTOF_SET_ADDRESS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_rttof_set_request_address( const void* context, const uint32_t request_address ) +{ + const uint8_t cbuffer[LR11XX_RTTOF_SET_REQUEST_ADDRESS_CMD_LENGTH] = { + ( uint8_t )( LR11XX_RTTOF_SET_REQUEST_ADDRESS >> 8 ), + ( uint8_t )( LR11XX_RTTOF_SET_REQUEST_ADDRESS >> 0 ), + ( uint8_t )( request_address >> 24 ), + ( uint8_t )( request_address >> 16 ), + ( uint8_t )( request_address >> 8 ), + ( uint8_t )( request_address >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RTTOF_SET_REQUEST_ADDRESS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_rttof_set_rx_tx_delay_indicator( const void* context, const uint32_t delay_indicator ) +{ + const uint8_t cbuffer[LR11XX_RTTOF_SET_RX_TX_DELAY_CMD_LENGTH] = { + ( uint8_t )( LR11XX_RTTOF_SET_RX_TX_DELAY >> 8 ), + ( uint8_t )( LR11XX_RTTOF_SET_RX_TX_DELAY >> 0 ), + ( uint8_t )( delay_indicator >> 24 ), + ( uint8_t )( delay_indicator >> 16 ), + ( uint8_t )( delay_indicator >> 8 ), + ( uint8_t )( delay_indicator >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RTTOF_SET_RX_TX_DELAY_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_rttof_set_parameters( const void* context, const uint8_t nb_symbols ) +{ + const uint8_t cbuffer[LR11XX_RTTOF_SET_PARAMETERS_CMD_LENGTH] = { ( uint8_t )( LR11XX_RTTOF_SET_PARAMETERS >> 8 ), + ( uint8_t )( LR11XX_RTTOF_SET_PARAMETERS >> 0 ), + 0x00, nb_symbols }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_RTTOF_SET_PARAMETERS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_rttof_get_raw_result( const void* context, const lr11xx_rttof_result_type_t type, + uint8_t result[LR11XX_RTTOF_RESULT_LENGTH] ) +{ + const uint8_t cbuffer[LR11XX_RTTOF_GET_RESULT_CMD_LENGTH] = { + ( uint8_t )( LR11XX_RTTOF_GET_RESULT >> 8 ), + ( uint8_t )( LR11XX_RTTOF_GET_RESULT >> 0 ), + ( uint8_t ) type, + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_RTTOF_GET_RESULT_CMD_LENGTH, result, + LR11XX_RTTOF_RESULT_LENGTH ); +} + +int32_t lr11xx_rttof_distance_raw_to_meter( lr11xx_radio_lora_bw_t rttof_bw, + const uint8_t raw_distance_buf[LR11XX_RTTOF_RESULT_LENGTH] ) +{ + const uint8_t bitcnt = 24u; + uint8_t bw_scaling = 0u; + + const uint32_t raw_distance = + ( ( uint32_t ) raw_distance_buf[3] << 0 ) + ( ( uint32_t ) raw_distance_buf[2] << 8 ) + + ( ( uint32_t ) raw_distance_buf[1] << 16 ) + ( ( uint32_t ) raw_distance_buf[0] << 24 ); + + if( rttof_bw == LR11XX_RADIO_LORA_BW_500 ) + { + bw_scaling = 1u; + } + else if( rttof_bw == LR11XX_RADIO_LORA_BW_250 ) + { + bw_scaling = 2u; + } + else if( rttof_bw == LR11XX_RADIO_LORA_BW_125 ) + { + bw_scaling = 4u; + } + + int32_t retval = raw_distance; + if( raw_distance >= ( 1 << ( bitcnt - 1 ) ) ) + { + retval -= ( 1 << bitcnt ); + } + + return 300 * bw_scaling * retval / 4096; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTION DEFINITIONS -------------------------------------------- + */ + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_system.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_system.c new file mode 100755 index 0000000..eeda3f9 --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_system.c @@ -0,0 +1,664 @@ +/*! + * @file lr11xx_system.c + * + * @brief System driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include + +#include "lr11xx_system.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_SYSTEM_GET_VERSION_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_GET_ERRORS_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_CLEAR_ERRORS_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_CALIBRATE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_SET_REGMODE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH ( 2 + 8 ) +#define LR11XX_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH ( 2 + 8 ) +#define LR11XX_SYSTEM_CLEAR_IRQ_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_SYSTEM_CFG_LFCLK_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_SET_TCXO_MODE_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_SYSTEM_REBOOT_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_GET_VBAT_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_GET_TEMP_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_SET_SLEEP_CMD_LENGTH ( 2 + 5 ) +#define LR11XX_SYSTEM_SET_STANDBY_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_SET_FS_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH ( 2 + 1 ) +#define LR11XX_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_SYSTEM_READ_INFOPAGE_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_SYSTEM_READ_UID_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_READ_JOIN_EUI_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_READ_PIN_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH ( LR11XX_SYSTEM_READ_PIN_CMD_LENGTH + 17 ) +#define LR11XX_SYSTEM_GET_RANDOM_CMD_LENGTH ( 2 ) +#define LR11XX_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH ( 3 ) +#define LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH ( 3 ) + +#define LR11XX_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH ( 6 ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for system-related operations + */ +enum +{ + LR11XX_SYSTEM_GET_STATUS_OC = 0x0100, + LR11XX_SYSTEM_GET_VERSION_OC = 0x0101, + LR11XX_SYSTEM_GET_ERRORS_OC = 0x010D, + LR11XX_SYSTEM_CLEAR_ERRORS_OC = 0x010E, + LR11XX_SYSTEM_CALIBRATE_OC = 0x010F, + LR11XX_SYSTEM_SET_REGMODE_OC = 0x0110, + LR11XX_SYSTEM_CALIBRATE_IMAGE_OC = 0x0111, + LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_OC = 0x0112, + LR11XX_SYSTEM_SET_DIOIRQPARAMS_OC = 0x0113, + LR11XX_SYSTEM_CLEAR_IRQ_OC = 0x0114, + LR11XX_SYSTEM_CFG_LFCLK_OC = 0x0116, + LR11XX_SYSTEM_SET_TCXO_MODE_OC = 0x0117, + LR11XX_SYSTEM_REBOOT_OC = 0x0118, + LR11XX_SYSTEM_GET_VBAT_OC = 0x0119, + LR11XX_SYSTEM_GET_TEMP_OC = 0x011A, + LR11XX_SYSTEM_SET_SLEEP_OC = 0x011B, + LR11XX_SYSTEM_SET_STANDBY_OC = 0x011C, + LR11XX_SYSTEM_SET_FS_OC = 0x011D, + LR11XX_SYSTEM_GET_RANDOM_OC = 0x0120, + LR11XX_SYSTEM_ERASE_INFOPAGE_OC = 0x0121, + LR11XX_SYSTEM_WRITE_INFOPAGE_OC = 0x0122, + LR11XX_SYSTEM_READ_INFOPAGE_OC = 0x0123, + LR11XX_SYSTEM_READ_UID_OC = 0x0125, + LR11XX_SYSTEM_READ_JOIN_EUI_OC = 0x0126, + LR11XX_SYSTEM_READ_PIN_OC = 0x0127, + LR11XX_SYSTEM_ENABLE_SPI_CRC_OC = 0x0128, + LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC = 0x012A, +}; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Fill stat1 structure with data from stat1_byte + * + * @param [in] stat1_byte stat1 byte + * @param [out] stat1 stat1 structure + */ +static void lr11xx_system_convert_stat1_byte_to_enum( uint8_t stat1_byte, lr11xx_system_stat1_t* stat1 ); + +/*! + * @brief Fill stat2 structure with data from stat2_byte + * + * @param [in] stat2_byte stat2 byte + * @param [out] stat2 stat2 structure + */ +static void lr11xx_system_convert_stat2_byte_to_enum( uint8_t stat2_byte, lr11xx_system_stat2_t* stat2 ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_system_reset( const void* context ) +{ + return ( lr11xx_status_t ) lr11xx_hal_reset( context ); +} + +lr11xx_status_t lr11xx_system_get_status( const void* context, lr11xx_system_stat1_t* stat1, + lr11xx_system_stat2_t* stat2, lr11xx_system_irq_mask_t* irq_status ) +{ + uint8_t data[LR11XX_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH] = { 0 }; + + const lr11xx_status_t status = + ( lr11xx_status_t ) lr11xx_hal_direct_read( context, data, LR11XX_SYSTEM_GET_STATUS_DIRECT_READ_LENGTH ); + + if( status == LR11XX_STATUS_OK ) + { + lr11xx_system_convert_stat1_byte_to_enum( data[0], stat1 ); + lr11xx_system_convert_stat2_byte_to_enum( data[1], stat2 ); + if( irq_status != NULL ) + { + *irq_status = ( ( lr11xx_system_irq_mask_t ) data[2] << 24 ) + + ( ( lr11xx_system_irq_mask_t ) data[3] << 16 ) + + ( ( lr11xx_system_irq_mask_t ) data[4] << 8 ) + ( ( lr11xx_system_irq_mask_t ) data[5] << 0 ); + } + } + + return status; +} + +lr11xx_status_t lr11xx_system_clear_reset_status_info( const void* context ) +{ + uint8_t cbuffer[2] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_STATUS_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_STATUS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, sizeof( cbuffer ), 0, 0 ); +} + +lr11xx_status_t lr11xx_system_get_version( const void* context, lr11xx_system_version_t* version ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_GET_VERSION_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_VERSION_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_VERSION_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_SYSTEM_VERSION_LENGTH] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_SYSTEM_GET_VERSION_CMD_LENGTH, rbuffer, LR11XX_SYSTEM_VERSION_LENGTH ); + + if( status == LR11XX_STATUS_OK ) + { + version->hw = rbuffer[0]; + version->type = ( lr11xx_system_version_type_t ) rbuffer[1]; + version->fw = ( ( uint16_t ) rbuffer[2] << 8 ) + ( uint16_t ) rbuffer[3]; + } + + return status; +} + +lr11xx_status_t lr11xx_system_get_errors( const void* context, lr11xx_system_errors_t* errors ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_GET_ERRORS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_ERRORS_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_ERRORS_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( errors )] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_SYSTEM_GET_ERRORS_CMD_LENGTH, rbuffer, sizeof( *errors ) ); + + if( status == LR11XX_STATUS_OK ) + { + *errors = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + } + + return status; +} + +lr11xx_status_t lr11xx_system_clear_errors( const void* context ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_CLEAR_ERRORS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_CLEAR_ERRORS_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_CLEAR_ERRORS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_CLEAR_ERRORS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_calibrate( const void* context, const uint8_t calib_param ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_CALIBRATE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_CALIBRATE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_CALIBRATE_OC >> 0 ), + calib_param, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_CALIBRATE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_set_reg_mode( const void* context, const lr11xx_system_reg_mode_t reg_mode ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_REGMODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_REGMODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_REGMODE_OC >> 0 ), + ( uint8_t ) reg_mode, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_REGMODE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_calibrate_image( const void* context, const uint8_t freq1, const uint8_t freq2 ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_CALIBRATE_IMAGE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_CALIBRATE_IMAGE_OC >> 0 ), + freq1, + freq2, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_CALIBRATE_IMAGE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_calibrate_image_in_mhz( const void* context, const uint16_t freq1_in_mhz, + const uint16_t freq2_in_mhz ) +{ + // Perform a floor() to get a value for freq1 corresponding to a frequency lower than or equal to freq1_in_mhz + const uint8_t freq1 = freq1_in_mhz / LR11XX_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ; + + // Perform a ceil() to get a value for freq2 corresponding to a frequency higher than or equal to freq2_in_mhz + const uint8_t freq2 = ( freq2_in_mhz + LR11XX_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ - 1 ) / + LR11XX_SYSTEM_IMAGE_CALIBRATION_STEP_IN_MHZ; + + return lr11xx_system_calibrate_image( context, freq1, freq2 ); +} + +lr11xx_status_t lr11xx_system_set_dio_as_rf_switch( const void* context, + const lr11xx_system_rfswitch_cfg_t* rf_switch_cfg ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_OC >> 0 ), + rf_switch_cfg->enable, + rf_switch_cfg->standby, + rf_switch_cfg->rx, + rf_switch_cfg->tx, + rf_switch_cfg->tx_hp, + rf_switch_cfg->tx_hf, + rf_switch_cfg->gnss, + rf_switch_cfg->wifi, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_DIO_AS_RF_SWITCH_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_system_set_dio_irq_params( const void* context, + const lr11xx_system_irq_mask_t irqs_to_enable_dio1, + const lr11xx_system_irq_mask_t irqs_to_enable_dio2 ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_DIOIRQPARAMS_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_DIOIRQPARAMS_OC >> 0 ), + ( uint8_t ) ( irqs_to_enable_dio1 >> 24 ), + ( uint8_t ) ( irqs_to_enable_dio1 >> 16 ), + ( uint8_t ) ( irqs_to_enable_dio1 >> 8 ), + ( uint8_t ) ( irqs_to_enable_dio1 >> 0 ), + ( uint8_t ) ( irqs_to_enable_dio2 >> 24 ), + ( uint8_t ) ( irqs_to_enable_dio2 >> 16 ), + ( uint8_t ) ( irqs_to_enable_dio2 >> 8 ), + ( uint8_t ) ( irqs_to_enable_dio2 >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_DIO_IRQ_PARAMS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_clear_irq_status( const void* context, const lr11xx_system_irq_mask_t irqs_to_clear ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_CLEAR_IRQ_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_CLEAR_IRQ_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_CLEAR_IRQ_OC >> 0 ), + ( uint8_t ) ( irqs_to_clear >> 24 ), + ( uint8_t ) ( irqs_to_clear >> 16 ), + ( uint8_t ) ( irqs_to_clear >> 8 ), + ( uint8_t ) ( irqs_to_clear >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_CLEAR_IRQ_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_get_and_clear_irq_status( const void* context, lr11xx_system_irq_mask_t* irq ) +{ + lr11xx_system_irq_mask_t lr11xx_irq_mask = LR11XX_SYSTEM_IRQ_NONE; + + lr11xx_status_t status = lr11xx_system_get_irq_status( context, &lr11xx_irq_mask ); + + if( ( status == LR11XX_STATUS_OK ) && ( lr11xx_irq_mask != 0 ) ) + { + status = lr11xx_system_clear_irq_status( context, lr11xx_irq_mask ); + } + if( ( status == LR11XX_STATUS_OK ) && ( irq != NULL ) ) + { + *irq = lr11xx_irq_mask; + } + + return status; +} + +lr11xx_status_t lr11xx_system_cfg_lfclk( const void* context, const lr11xx_system_lfclk_cfg_t lfclock_cfg, + const bool wait_for_32k_ready ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_CFG_LFCLK_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_CFG_LFCLK_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_CFG_LFCLK_OC >> 0 ), + ( uint8_t ) ( lfclock_cfg | ( wait_for_32k_ready << 2 ) ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_CFG_LFCLK_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_set_tcxo_mode( const void* context, const lr11xx_system_tcxo_supply_voltage_t tune, + const uint32_t timeout ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_TCXO_MODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_TCXO_MODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_TCXO_MODE_OC >> 0 ), + ( uint8_t ) tune, + ( uint8_t ) ( timeout >> 16 ), + ( uint8_t ) ( timeout >> 8 ), + ( uint8_t ) ( timeout >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_TCXO_MODE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_reboot( const void* context, const bool stay_in_bootloader ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_REBOOT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_REBOOT_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_REBOOT_OC >> 0 ), + ( stay_in_bootloader == true ) ? 0x03 : 0x00, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_REBOOT_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_get_vbat( const void* context, uint8_t* vbat ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_GET_VBAT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_VBAT_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_VBAT_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_GET_VBAT_CMD_LENGTH, vbat, + sizeof( *vbat ) ); +} + +lr11xx_status_t lr11xx_system_get_temp( const void* context, uint16_t* temp ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_GET_TEMP_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_TEMP_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_TEMP_OC >> 0 ), + }; + uint8_t rbuffer[sizeof( uint16_t )] = { 0x00 }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_SYSTEM_GET_TEMP_CMD_LENGTH, rbuffer, sizeof( uint16_t ) ); + + if( status == LR11XX_STATUS_OK ) + { + *temp = ( ( uint16_t ) rbuffer[0] << 8 ) + ( uint16_t ) rbuffer[1]; + } + + return status; +} + +lr11xx_status_t lr11xx_system_set_sleep( const void* context, const lr11xx_system_sleep_cfg_t sleep_cfg, + const uint32_t sleep_time ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_SLEEP_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_SLEEP_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_SLEEP_OC >> 0 ), + ( sleep_cfg.is_rtc_timeout << 1 ) + sleep_cfg.is_warm_start, + ( uint8_t ) ( sleep_time >> 24 ), + ( uint8_t ) ( sleep_time >> 16 ), + ( uint8_t ) ( sleep_time >> 8 ), + ( uint8_t ) ( sleep_time >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_SLEEP_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_set_standby( const void* context, const lr11xx_system_standby_cfg_t standby_cfg ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_STANDBY_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_STANDBY_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_STANDBY_OC >> 0 ), + ( uint8_t ) standby_cfg, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_STANDBY_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_wakeup( const void* context ) +{ + return ( lr11xx_status_t ) lr11xx_hal_wakeup( context ); +} + +lr11xx_status_t lr11xx_system_abort_blocking_cmd( const void* context ) +{ + return ( lr11xx_status_t ) lr11xx_hal_abort_blocking_cmd( context ); +} + +lr11xx_status_t lr11xx_system_set_fs( const void* context ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_SET_FS_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_SET_FS_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_SET_FS_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_SET_FS_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_erase_infopage( const void* context, const lr11xx_system_infopage_id_t infopage_id ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_ERASE_INFOPAGE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_ERASE_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_ERASE_INFOPAGE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_write_infopage( const void* context, const lr11xx_system_infopage_id_t infopage_id, + const uint16_t address, const uint32_t* data, const uint8_t length ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_WRITE_INFOPAGE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_WRITE_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + ( uint8_t ) ( address >> 8 ), + ( uint8_t ) ( address >> 0 ), + }; + uint8_t cdata[256]; + + for( uint16_t index = 0; index < length; index++ ) + { + uint8_t* cdata_local = &cdata[index * sizeof( uint32_t )]; + + cdata_local[0] = ( uint8_t ) ( data[index] >> 24 ); + cdata_local[1] = ( uint8_t ) ( data[index] >> 16 ); + cdata_local[2] = ( uint8_t ) ( data[index] >> 8 ); + cdata_local[3] = ( uint8_t ) ( data[index] >> 0 ); + } + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_WRITE_INFOPAGE_CMD_LENGTH, cdata, + length * sizeof( uint32_t ) ); +} + +lr11xx_status_t lr11xx_system_read_infopage( const void* context, const lr11xx_system_infopage_id_t infopage_id, + const uint16_t address, uint32_t* data, const uint8_t length ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_READ_INFOPAGE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_READ_INFOPAGE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_READ_INFOPAGE_OC >> 0 ), + ( uint8_t ) infopage_id, + ( uint8_t ) ( address >> 8 ), + ( uint8_t ) ( address >> 0 ), + length, + }; + + const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read( + context, cbuffer, LR11XX_SYSTEM_READ_INFOPAGE_CMD_LENGTH, ( uint8_t* ) data, length * sizeof( *data ) ); + + if( status == LR11XX_STATUS_OK ) + { + for( uint8_t index = 0; index < length; index++ ) + { + uint8_t* buffer_local = ( uint8_t* ) &data[index]; + + data[index] = ( ( uint32_t ) buffer_local[0] << 24 ) + ( ( uint32_t ) buffer_local[1] << 16 ) + + ( ( uint32_t ) buffer_local[2] << 8 ) + ( ( uint32_t ) buffer_local[3] << 0 ); + } + } + + return status; +} + +lr11xx_status_t lr11xx_system_read_uid( const void* context, lr11xx_system_uid_t unique_identifier ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_READ_UID_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_READ_UID_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_READ_UID_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_READ_UID_CMD_LENGTH, unique_identifier, + LR11XX_SYSTEM_UID_LENGTH ); +} + +lr11xx_status_t lr11xx_system_read_join_eui( const void* context, lr11xx_system_join_eui_t join_eui ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_READ_JOIN_EUI_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_READ_JOIN_EUI_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_READ_JOIN_EUI_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_READ_JOIN_EUI_CMD_LENGTH, join_eui, + LR11XX_SYSTEM_JOIN_EUI_LENGTH ); +} + +lr11xx_status_t lr11xx_system_read_pin( const void* context, lr11xx_system_pin_t pin ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_READ_PIN_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_READ_PIN_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_READ_PIN_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_READ_PIN_CMD_LENGTH, pin, + LR11XX_SYSTEM_PIN_LENGTH ); +} + +lr11xx_status_t lr11xx_system_read_pin_custom_eui( const void* context, lr11xx_system_uid_t device_eui, + lr11xx_system_join_eui_t join_eui, uint8_t rfu, + lr11xx_system_pin_t pin ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_READ_PIN_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_READ_PIN_OC >> 0 ), + device_eui[0], + device_eui[1], + device_eui[2], + device_eui[3], + device_eui[4], + device_eui[5], + device_eui[6], + device_eui[7], + join_eui[0], + join_eui[1], + join_eui[2], + join_eui[3], + join_eui[4], + join_eui[5], + join_eui[6], + join_eui[7], + rfu, + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_READ_PIN_CUSTOM_EUI_CMD_LENGTH, pin, + LR11XX_SYSTEM_PIN_LENGTH ); +} + +lr11xx_status_t lr11xx_system_get_random_number( const void* context, uint32_t* random_number ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_GET_RANDOM_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_GET_RANDOM_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_GET_RANDOM_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_SYSTEM_GET_RANDOM_CMD_LENGTH, + ( uint8_t* ) random_number, sizeof( uint32_t ) ); +} + +lr11xx_status_t lr11xx_system_enable_spi_crc( const void* context, bool enable_crc ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_ENABLE_SPI_CRC_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_ENABLE_SPI_CRC_OC >> 0 ), + ( enable_crc == true ) ? 0x01 : 0x00, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_ENABLE_SPI_CRC_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_system_drive_dio_in_sleep_mode( const void* context, bool enable_drive ) +{ + const uint8_t cbuffer[LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_OC >> 0 ), + ( enable_drive == true ) ? 0x01 : 0x00, + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_SYSTEM_DRIVE_DIO_IN_SLEEP_MODE_CMD_LENGTH, 0, + 0 ); +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static void lr11xx_system_convert_stat1_byte_to_enum( uint8_t stat1_byte, lr11xx_system_stat1_t* stat1 ) +{ + if( stat1 != NULL ) + { + stat1->is_interrupt_active = ( ( stat1_byte & 0x01 ) != 0 ) ? true : false; + stat1->command_status = ( lr11xx_system_command_status_t ) ( stat1_byte >> 1 ); + } +} + +static void lr11xx_system_convert_stat2_byte_to_enum( uint8_t stat2_byte, lr11xx_system_stat2_t* stat2 ) +{ + if( stat2 != NULL ) + { + stat2->is_running_from_flash = ( ( stat2_byte & 0x01 ) != 0 ) ? true : false; + stat2->chip_mode = ( lr11xx_system_chip_modes_t ) ( ( stat2_byte & 0x0F ) >> 1 ); + stat2->reset_status = ( lr11xx_system_reset_status_t ) ( ( stat2_byte & 0xF0 ) >> 4 ); + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_driver/lr11xx_wifi.c b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_wifi.c new file mode 100755 index 0000000..9c1312a --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_driver/lr11xx_wifi.c @@ -0,0 +1,940 @@ +/*! + * @file lr11xx_wifi.c + * + * @brief Wi-Fi passive scan driver implementation for LR11XX + * + * The Clear BSD License + * Copyright Semtech Corporation 2021. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include "lr11xx_wifi.h" +#include "lr11xx_system_types.h" +#include "lr11xx_hal.h" + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE MACROS----------------------------------------------------------- + */ + +#ifndef MIN +#define MIN( a, b ) ( ( a > b ) ? b : a ) +#endif // MIN + + +/*! + * @brief Check if a value is inferior to another one - included + */ +#define IS_INFERIOR( value, max ) ( value <= max ) + +/*! + * @brief Check if a value is in between min and max - included + */ +#define IS_BETWEEN( value, min, max ) ( IS_INFERIOR(min, value) && IS_INFERIOR(value, max) ) + +/*! + * @brief Check if a value is in between 0x80 and 0xBF - included + */ +#define IS_BETWEEN_0x80_AND_0xBF( value ) IS_BETWEEN( value, 0x80, 0xBF ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE CONSTANTS ------------------------------------------------------- + */ + +#define LR11XX_WIFI_BASIC_COMPLETE_RESULT_SIZE ( 22 ) +#define LR11XX_WIFI_BASIC_MAC_TYPE_CHANNEL_RESULT_SIZE ( 9 ) + +#define LR11XX_WIFI_MAX_SIZE_PER_SPI( single_size ) \ + ( single_size * ( LR11XX_WIFI_MAX_RESULT_PER_TRANSACTION( single_size ) ) ) + +#define LR11XX_WIFI_MAX_RESULT_PER_TRANSACTION( single_size ) \ + ( MIN( ( LR11XX_WIFI_READ_RESULT_LIMIT ) / ( single_size ), LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK ) ) + +#define LR11XX_WIFI_ALL_CUMULATIVE_TIMING_SIZE ( 16 ) +#define LR11XX_WIFI_VERSION_SIZE ( 2 ) +#define LR11XX_WIFI_READ_RESULT_LIMIT ( 1020 ) +#define LR11XX_WIFI_COUNTRY_RESULT_LENGTH_SIZE ( 1 ) +#define LR11XX_WIFI_EXTENDED_COMPLETE_RESULT_SIZE ( 79 ) +#define LR11XX_WIFI_SCAN_SINGLE_COUNTRY_CODE_RESULT_SIZE ( 10 ) +#define LR11XX_WIFI_MAX_COUNTRY_CODE_RESULT_SIZE \ + ( LR11XX_WIFI_MAX_COUNTRY_CODE * LR11XX_WIFI_SCAN_SINGLE_COUNTRY_CODE_RESULT_SIZE ) + +// Command length +#define LR11XX_WIFI_SCAN_CMD_LENGTH ( 2 + 9 ) +#define LR11XX_WIFI_SEARCH_COUNTRY_CODE_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_WIFI_SCAN_TIME_LIMIT_CMD_LENGTH ( 2 + 9 ) +#define LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_CMD_LENGTH ( 2 + 7 ) +#define LR11XX_WIFI_GET_RESULT_SIZE_CMD_LENGTH ( 2 ) +#define LR11XX_WIFI_READ_RESULT_CMD_LENGTH ( 2 + 3 ) +#define LR11XX_WIFI_RESET_CUMUL_TIMING_CMD_LENGTH ( 2 ) +#define LR11XX_WIFI_READ_CUMUL_TIMING_CMD_LENGTH ( 2 ) +#define LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_CMD_LENGTH ( 2 ) +#define LR11XX_WIFI_READ_COUNTRY_CODE_CMD_LENGTH ( 2 + 2 ) +#define LR11XX_WIFI_CFG_TIMESTAMP_AP_PHONE_CMD_LENGTH ( 2 + 4 ) +#define LR11XX_WIFI_GET_VERSION_CMD_LENGTH ( 2 ) + +/*! + * @brief Wi-Fi scan power consumption in nA + * + * @note these numbers are given for information, it should be modified according to the used hardware. + */ +#define LR11XX_WIFI_CORRELATION_NA ( 12000000ULL ) +#define LR11XX_WIFI_CAPTURE_NA ( 12000000ULL ) +#define LR11XX_WIFI_DEMODULATION_NA ( 4000000ULL ) + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE TYPES ----------------------------------------------------------- + */ + +/*! + * @brief Operating codes for Wi-Fi-related operations + */ +enum +{ + LR11XX_WIFI_SCAN_OC = 0x0300, + LR11XX_WIFI_SCAN_TIME_LIMIT = 0x0301, + LR11XX_WIFI_SEARCH_COUNTRY_CODE_OC = 0x0302, + LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_OC = 0x0303, + LR11XX_WIFI_GET_RESULT_SIZE_OC = 0x0305, + LR11XX_WIFI_READ_RESULT_OC = 0x0306, + LR11XX_WIFI_RESET_CUMUL_TIMING_OC = 0x0307, + LR11XX_WIFI_READ_CUMUL_TIMING_OC = 0x0308, + LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_OC = 0x0309, + LR11XX_WIFI_READ_COUNTRY_CODE_OC = 0x030A, + LR11XX_WIFI_CONFIGURE_TIMESTAMP_AP_PHONE_OC = 0x030B, + LR11XX_WIFI_GET_VERSION_OC = 0x0320, +}; + +/*! + * @brief Wi-Fi scan results interface + */ +typedef union +{ + lr11xx_wifi_basic_complete_result_t* basic_complete; + lr11xx_wifi_basic_mac_type_channel_result_t* basic_mac_type_channel; + lr11xx_wifi_extended_full_result_t* extended_complete; +} lr11xx_wifi_result_interface_t; + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE VARIABLES ------------------------------------------------------- + */ + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DECLARATION ------------------------------------------- + */ + +/*! + * @brief Return a uint16 value by reading a buffer of uint8 from index. + * + * This function interpret the array MSB first. It is equivalent to: + * return array[index] * 256 + array[index+1] + * + * @returns The uint16 value + */ +static uint16_t uint16_from_array( const uint8_t* array, const uint16_t index ); + +/*! + * @brief Return a uint64 value by reading a buffer of uint8 from index. + * + * This function interpret the array MSB first. + * + * @returns The uint64 value + */ +static uint64_t uint64_from_array( const uint8_t* array, const uint16_t index ); + +/*! + * @brief Propagate the result buffer interpretation depending on the format_code selected + * + * @see interpret_basic_complete_result_from_buffer, interpret_basic_mac_type_channel_result_from_buffer, + * interpret_extended_full_result_from_buffer + */ +static void generic_results_interpreter( const uint8_t n_result_to_parse, const uint8_t index_result_start_writing, + const uint8_t* buffer, lr11xx_wifi_result_interface_t result_interface, + const lr11xx_wifi_result_format_t format_code ); + +/*! + * @brief Parse basic complete result + */ +static void interpret_basic_complete_result_from_buffer( const uint8_t nb_results, + const uint8_t index_result_start_writing, + const uint8_t* buffer, + lr11xx_wifi_basic_complete_result_t* result ); + +/*! + * @brief Parse basic MAC - type - channel result + */ +static void interpret_basic_mac_type_channel_result_from_buffer( const uint8_t nb_results, + const uint8_t index_result_start_writing, + const uint8_t* buffer, + lr11xx_wifi_basic_mac_type_channel_result_t* result ); + +/*! + * @brief Parse extended full result + */ +static void interpret_extended_full_result_from_buffer( const uint8_t nb_results, + const uint8_t index_result_start_writing, const uint8_t* buffer, + lr11xx_wifi_extended_full_result_t* result ); + +/*! + * @brief Parse basic MAC - type - channel result + */ +static lr11xx_status_t fetch_and_aggregate_all_results( const void* context, const uint8_t index_result_start, + const uint8_t nb_results, + const uint8_t nb_results_per_chunk_max, + const lr11xx_wifi_result_format_t result_format_code, + uint8_t* result_buffer, + lr11xx_wifi_result_interface_t result_structures ); + +/*! + * @brief Share the size of a result format + * + * @returns Size in byte of the format given as parameter + */ +static uint8_t lr11xx_wifi_get_result_size_from_format( const lr11xx_wifi_result_format_t format ); + +/*! + * @brief Fetch results from the radio after a successful Wi-Fi passive scan + * + * @returns Operation status + */ +static lr11xx_hal_status_t lr11xx_wifi_read_results_helper( const void* context, const uint8_t start_index, + const uint8_t n_elem, uint8_t* buffer, + const lr11xx_wifi_result_format_t result_format ); + +/*! + * @brief Extract Wi-Fi MAC address from a buffer + */ +static void lr11xx_wifi_read_mac_address_from_buffer( const uint8_t* buffer, const uint16_t index_in_buffer, + lr11xx_wifi_mac_address_t mac_address ); + +/*! + * @brief Share the format code corresponding to a result format + * + * @returns Format code + */ +static uint8_t lr11xx_wifi_get_format_code( const lr11xx_wifi_result_format_t format ); + +/* + * ----------------------------------------------------------------------------- + * --- PUBLIC FUNCTIONS DEFINITION --------------------------------------------- + */ + +lr11xx_status_t lr11xx_wifi_scan( const void* context, const lr11xx_wifi_signal_type_scan_t signal_type, + const lr11xx_wifi_channel_mask_t channels, const lr11xx_wifi_mode_t scan_mode, + const uint8_t max_results, const uint8_t nb_scan_per_channel, + const uint16_t timeout_in_ms, const bool abort_on_timeout ) +{ + const uint8_t cbuffer[LR11XX_WIFI_SCAN_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_SCAN_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_SCAN_OC >> 0 ), + ( uint8_t ) signal_type, + ( uint8_t ) ( channels >> 8 ), + ( uint8_t ) ( channels >> 0 ), + ( uint8_t ) scan_mode, + max_results, + nb_scan_per_channel, + ( uint8_t ) ( timeout_in_ms >> 8 ), + ( uint8_t ) ( timeout_in_ms >> 0 ), + ( uint8_t ) ( ( abort_on_timeout == true ) ? 1 : 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_WIFI_SCAN_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_wifi_search_country_code( const void* context, const lr11xx_wifi_channel_mask_t channels_mask, + const uint8_t nb_max_results, const uint8_t nb_scan_per_channel, + const uint16_t timeout_in_ms, const bool abort_on_timeout ) +{ + const uint8_t cbuffer[LR11XX_WIFI_SEARCH_COUNTRY_CODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_SEARCH_COUNTRY_CODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_SEARCH_COUNTRY_CODE_OC >> 0 ), + ( uint8_t ) ( channels_mask >> 8 ), + ( uint8_t ) ( channels_mask >> 0 ), + nb_max_results, + nb_scan_per_channel, + ( uint8_t ) ( timeout_in_ms >> 8 ), + ( uint8_t ) ( timeout_in_ms >> 0 ), + ( uint8_t ) ( ( abort_on_timeout == true ) ? 1 : 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_WIFI_SEARCH_COUNTRY_CODE_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_wifi_scan_time_limit( const void* radio, const lr11xx_wifi_signal_type_scan_t signal_type, + const lr11xx_wifi_channel_mask_t channels, + const lr11xx_wifi_mode_t scan_mode, const uint8_t max_results, + const uint16_t timeout_per_channel_ms, const uint16_t timeout_per_scan_ms ) +{ + const uint8_t cbuffer[LR11XX_WIFI_SCAN_TIME_LIMIT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_SCAN_TIME_LIMIT >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_SCAN_TIME_LIMIT >> 0 ), + ( uint8_t ) signal_type, + ( uint8_t ) ( channels >> 8 ), + ( uint8_t ) ( channels >> 0 ), + ( uint8_t ) scan_mode, + max_results, + ( uint8_t ) ( timeout_per_channel_ms >> 8 ), + ( uint8_t ) ( timeout_per_channel_ms >> 0 ), + ( uint8_t ) ( timeout_per_scan_ms >> 8 ), + ( uint8_t ) ( timeout_per_scan_ms >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( radio, cbuffer, LR11XX_WIFI_SCAN_TIME_LIMIT_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_wifi_search_country_code_time_limit( const void* radio, + const lr11xx_wifi_channel_mask_t channels, + const uint8_t max_results, + const uint16_t timeout_per_channel_ms, + const uint16_t timeout_per_scan_ms ) +{ + const uint8_t cbuffer[LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_OC >> 0 ), + ( uint8_t ) ( channels >> 8 ), + ( uint8_t ) ( channels >> 0 ), + ( uint8_t ) max_results, + ( uint8_t ) ( timeout_per_channel_ms >> 8 ), + ( uint8_t ) ( timeout_per_channel_ms >> 0 ), + ( uint8_t ) ( timeout_per_scan_ms >> 8 ), + ( uint8_t ) ( timeout_per_scan_ms >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( radio, cbuffer, LR11XX_WIFI_COUNTRY_CODE_TIME_LIMIT_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_wifi_get_nb_results( const void* context, uint8_t* nb_results ) +{ + const uint8_t cbuffer[LR11XX_WIFI_GET_RESULT_SIZE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_GET_RESULT_SIZE_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_GET_RESULT_SIZE_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_GET_RESULT_SIZE_CMD_LENGTH, nb_results, + sizeof( *nb_results ) ); +} + +lr11xx_status_t lr11xx_wifi_read_basic_complete_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_basic_complete_result_t* results ) +{ + uint8_t result_buffer[LR11XX_WIFI_MAX_SIZE_PER_SPI( LR11XX_WIFI_BASIC_COMPLETE_RESULT_SIZE )] = { 0 }; + const uint8_t nb_results_per_chunk_max = + LR11XX_WIFI_MAX_RESULT_PER_TRANSACTION( LR11XX_WIFI_BASIC_COMPLETE_RESULT_SIZE ); + + lr11xx_wifi_result_interface_t result_interface = { 0 }; + result_interface.basic_complete = results; + + return fetch_and_aggregate_all_results( context, start_result_index, nb_results, nb_results_per_chunk_max, + LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE, result_buffer, result_interface ); +} + +lr11xx_status_t lr11xx_wifi_read_basic_mac_type_channel_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_basic_mac_type_channel_result_t* results ) +{ + uint8_t result_buffer[LR11XX_WIFI_MAX_SIZE_PER_SPI( LR11XX_WIFI_BASIC_MAC_TYPE_CHANNEL_RESULT_SIZE )] = { 0 }; + const uint8_t nb_results_per_chunk_max = + LR11XX_WIFI_MAX_RESULT_PER_TRANSACTION( LR11XX_WIFI_BASIC_MAC_TYPE_CHANNEL_RESULT_SIZE ); + + lr11xx_wifi_result_interface_t result_interface = { 0 }; + result_interface.basic_mac_type_channel = results; + + return fetch_and_aggregate_all_results( context, start_result_index, nb_results, nb_results_per_chunk_max, + LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL, result_buffer, + result_interface ); +} + +lr11xx_status_t lr11xx_wifi_read_extended_full_results( const void* radio, const uint8_t start_result_index, + const uint8_t nb_results, + lr11xx_wifi_extended_full_result_t* results ) +{ + uint8_t result_buffer[LR11XX_WIFI_MAX_SIZE_PER_SPI( LR11XX_WIFI_EXTENDED_COMPLETE_RESULT_SIZE )] = { 0 }; + const uint8_t nb_results_per_chunk_max = + LR11XX_WIFI_MAX_RESULT_PER_TRANSACTION( LR11XX_WIFI_EXTENDED_COMPLETE_RESULT_SIZE ); + + lr11xx_wifi_result_interface_t result_interface = { 0 }; + result_interface.extended_complete = results; + + return fetch_and_aggregate_all_results( radio, start_result_index, nb_results, nb_results_per_chunk_max, + LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL, result_buffer, result_interface ); +} + +lr11xx_status_t lr11xx_wifi_reset_cumulative_timing( const void* context ) +{ + const uint8_t cbuffer[LR11XX_WIFI_RESET_CUMUL_TIMING_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_RESET_CUMUL_TIMING_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_RESET_CUMUL_TIMING_OC >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_WIFI_RESET_CUMUL_TIMING_CMD_LENGTH, 0, 0 ); +} + +lr11xx_status_t lr11xx_wifi_read_cumulative_timing( const void* context, lr11xx_wifi_cumulative_timings_t* timing ) +{ + const uint8_t cbuffer[LR11XX_WIFI_READ_CUMUL_TIMING_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_READ_CUMUL_TIMING_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_READ_CUMUL_TIMING_OC >> 0 ), + }; + uint8_t buffer_out[LR11XX_WIFI_ALL_CUMULATIVE_TIMING_SIZE] = { 0 }; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_READ_CUMUL_TIMING_CMD_LENGTH, + buffer_out, LR11XX_WIFI_ALL_CUMULATIVE_TIMING_SIZE ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + timing->rx_detection_us = + ( buffer_out[0] << 24 ) + ( buffer_out[1] << 16 ) + ( buffer_out[2] << 8 ) + buffer_out[3]; + timing->rx_correlation_us = + ( buffer_out[4] << 24 ) + ( buffer_out[5] << 16 ) + ( buffer_out[6] << 8 ) + buffer_out[7]; + timing->rx_capture_us = + ( buffer_out[8] << 24 ) + ( buffer_out[9] << 16 ) + ( buffer_out[10] << 8 ) + buffer_out[11]; + timing->demodulation_us = + ( buffer_out[12] << 24 ) + ( buffer_out[13] << 16 ) + ( buffer_out[14] << 8 ) + buffer_out[15]; + } + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_wifi_get_nb_country_code_results( const void* context, uint8_t* country_result_size ) +{ + const uint8_t cbuffer[LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_WIFI_COUNTRY_RESULT_LENGTH_SIZE] = { 0 }; + + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_GET_SIZE_COUNTRY_RESULT_CMD_LENGTH, rbuffer, + LR11XX_WIFI_COUNTRY_RESULT_LENGTH_SIZE ); + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + ( *country_result_size ) = rbuffer[0]; + } + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_wifi_read_country_code_results( const void* context, const uint8_t start_result_index, + const uint8_t nb_country_results, + lr11xx_wifi_country_code_t* country_code_results ) +{ + const uint8_t cbuffer[LR11XX_WIFI_READ_COUNTRY_CODE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_READ_COUNTRY_CODE_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_READ_COUNTRY_CODE_OC >> 0 ), + start_result_index, + nb_country_results, + }; + uint8_t rbuffer[LR11XX_WIFI_MAX_COUNTRY_CODE_RESULT_SIZE] = { 0 }; + const uint16_t country_code_result_size_to_read = + nb_country_results * LR11XX_WIFI_SCAN_SINGLE_COUNTRY_CODE_RESULT_SIZE; + + const lr11xx_hal_status_t hal_status = lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_READ_COUNTRY_CODE_CMD_LENGTH, + rbuffer, country_code_result_size_to_read ); + + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + for( uint8_t result_index = 0; result_index < nb_country_results; result_index++ ) + { + const uint8_t local_index = result_index * LR11XX_WIFI_SCAN_SINGLE_COUNTRY_CODE_RESULT_SIZE; + lr11xx_wifi_country_code_t* local_country_code_result = &country_code_results[result_index]; + + local_country_code_result->country_code[0] = rbuffer[local_index + 0]; + local_country_code_result->country_code[1] = rbuffer[local_index + 1]; + local_country_code_result->io_regulation = rbuffer[local_index + 2]; + local_country_code_result->channel_info_byte = rbuffer[local_index + 3]; + + for( uint8_t field_mac_index = 0; field_mac_index < LR11XX_WIFI_MAC_ADDRESS_LENGTH; field_mac_index++ ) + { + local_country_code_result->mac_address[field_mac_index] = + rbuffer[local_index + ( LR11XX_WIFI_MAC_ADDRESS_LENGTH - field_mac_index - 1 ) + 4]; + } + } + } + return ( lr11xx_status_t ) hal_status; +} + +lr11xx_status_t lr11xx_wifi_cfg_timestamp_ap_phone( const void* context, uint32_t timestamp_in_s ) +{ + const uint8_t cbuffer[LR11XX_WIFI_CFG_TIMESTAMP_AP_PHONE_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_CONFIGURE_TIMESTAMP_AP_PHONE_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_CONFIGURE_TIMESTAMP_AP_PHONE_OC >> 0 ), + ( uint8_t ) ( timestamp_in_s >> 24 ), + ( uint8_t ) ( timestamp_in_s >> 16 ), + ( uint8_t ) ( timestamp_in_s >> 8 ), + ( uint8_t ) ( timestamp_in_s >> 0 ), + }; + + return ( lr11xx_status_t ) lr11xx_hal_write( context, cbuffer, LR11XX_WIFI_CFG_TIMESTAMP_AP_PHONE_CMD_LENGTH, 0, + 0 ); +} + +lr11xx_status_t lr11xx_wifi_read_version( const void* context, lr11xx_wifi_version_t* wifi_version ) +{ + const uint8_t cbuffer[LR11XX_WIFI_GET_VERSION_CMD_LENGTH] = { + ( uint8_t ) ( LR11XX_WIFI_GET_VERSION_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_GET_VERSION_OC >> 0 ), + }; + uint8_t rbuffer[LR11XX_WIFI_VERSION_SIZE] = { 0 }; + const lr11xx_hal_status_t hal_status = + lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_GET_VERSION_CMD_LENGTH, rbuffer, LR11XX_WIFI_VERSION_SIZE ); + if( hal_status == LR11XX_HAL_STATUS_OK ) + { + wifi_version->major = rbuffer[0]; + wifi_version->minor = rbuffer[1]; + } + return ( lr11xx_status_t ) hal_status; +} + +uint8_t lr11xx_wifi_get_nb_results_max_per_chunk( void ) +{ + return ( uint8_t ) LR11XX_WIFI_N_RESULTS_MAX_PER_CHUNK; +} + +void lr11xx_wifi_parse_channel_info( const lr11xx_wifi_channel_info_byte_t channel_info, lr11xx_wifi_channel_t* channel, + bool* rssi_validity, lr11xx_wifi_mac_origin_t* mac_origin_estimation ) +{ + ( *channel ) = lr11xx_wifi_extract_channel_from_info_byte( channel_info ); + ( *mac_origin_estimation ) = ( lr11xx_wifi_mac_origin_t ) ( ( channel_info & 0x30 ) >> 4 ); + ( *rssi_validity ) = ( ( channel_info & 0x40 ) == 0 ) ? true : false; +} + +lr11xx_wifi_channel_t lr11xx_wifi_extract_channel_from_info_byte( const lr11xx_wifi_channel_info_byte_t channel_info ) +{ + return ( lr11xx_wifi_channel_t ) ( channel_info & 0x0F ); +} + +void lr11xx_wifi_parse_frame_type_info( const lr11xx_wifi_frame_type_info_byte_t frame_type_info, + lr11xx_wifi_frame_type_t* frame_type, + lr11xx_wifi_frame_sub_type_t* frame_sub_type, bool* to_ds, bool* from_ds ) +{ + ( *frame_type ) = ( lr11xx_wifi_frame_type_t ) ( ( frame_type_info >> 6 ) & 0x03 ); + ( *frame_sub_type ) = ( lr11xx_wifi_frame_sub_type_t ) ( ( frame_type_info >> 2 ) & 0x0F ); + ( *to_ds ) = ( bool ) ( ( frame_type_info >> 1 ) & 0x01 ); + ( *from_ds ) = ( bool ) ( frame_type_info & 0x01 ); +} + +void lr11xx_wifi_parse_data_rate_info( const lr11xx_wifi_datarate_info_byte_t data_rate_info, + lr11xx_wifi_signal_type_result_t* wifi_signal_type, + lr11xx_wifi_datarate_t* wifi_data_rate ) +{ + ( *wifi_signal_type ) = lr11xx_wifi_extract_signal_type_from_data_rate_info( data_rate_info ); + ( *wifi_data_rate ) = ( lr11xx_wifi_datarate_t ) ( data_rate_info >> 2 ); +} + +lr11xx_wifi_signal_type_result_t lr11xx_wifi_extract_signal_type_from_data_rate_info( + const lr11xx_wifi_datarate_info_byte_t data_rate_info ) +{ + return ( lr11xx_wifi_signal_type_result_t ) ( data_rate_info & 0x03 ); +} + +uint32_t lr11xx_wifi_get_consumption_nah( lr11xx_system_reg_mode_t regulator, lr11xx_wifi_cumulative_timings_t timing ) +{ + float wifi_scan_consumption_nah = 0; + + wifi_scan_consumption_nah = ( ( float ) timing.rx_capture_us * LR11XX_WIFI_CAPTURE_NA ) + + ( ( float ) timing.demodulation_us * LR11XX_WIFI_DEMODULATION_NA ) + + ( ( float ) timing.rx_correlation_us * LR11XX_WIFI_CORRELATION_NA ); + + wifi_scan_consumption_nah = wifi_scan_consumption_nah / + ( 3600000000.0 - ( ( float ) timing.rx_capture_us + ( float ) timing.demodulation_us + + ( float ) timing.rx_correlation_us ) ); + + if( regulator == LR11XX_SYSTEM_REG_MODE_LDO ) + { + wifi_scan_consumption_nah *= 2.0; + } + + return ( uint32_t ) wifi_scan_consumption_nah; +} + +/* + * ----------------------------------------------------------------------------- + * --- PRIVATE FUNCTIONS DEFINITION -------------------------------------------- + */ + +static lr11xx_hal_status_t lr11xx_wifi_read_results_helper( const void* context, const uint8_t start_index, + const uint8_t n_elem, uint8_t* buffer, + const lr11xx_wifi_result_format_t result_format ) +{ + const uint8_t size_single_elem = lr11xx_wifi_get_result_size_from_format( result_format ); + const uint8_t result_format_code = lr11xx_wifi_get_format_code( result_format ); + const uint8_t cbuffer[LR11XX_WIFI_READ_RESULT_CMD_LENGTH] = { ( uint8_t ) ( LR11XX_WIFI_READ_RESULT_OC >> 8 ), + ( uint8_t ) ( LR11XX_WIFI_READ_RESULT_OC & 0x00FF ), + start_index, n_elem, result_format_code }; + const uint16_t size_total = n_elem * size_single_elem; + return lr11xx_hal_read( context, cbuffer, LR11XX_WIFI_READ_RESULT_CMD_LENGTH, buffer, size_total ); +} + +static uint16_t uint16_from_array( const uint8_t* array, const uint16_t index ) +{ + return ( uint16_t ) ( array[index] << 8 ) + ( ( uint16_t ) ( array[index + 1] ) ); +} + +static uint64_t uint64_from_array( const uint8_t* array, const uint16_t index ) +{ + return ( ( uint64_t ) ( array[index] ) << 56 ) + ( ( uint64_t ) ( array[index + 1] ) << 48 ) + + ( ( uint64_t ) ( array[index + 2] ) << 40 ) + ( ( uint64_t ) ( array[index + 3] ) << 32 ) + + ( ( uint64_t ) ( array[index + 4] ) << 24 ) + ( ( uint64_t ) ( array[index + 5] ) << 16 ) + + ( ( uint64_t ) ( array[index + 6] ) << 8 ) + ( uint64_t ) ( array[index + 7] ); +} + +static void lr11xx_wifi_read_mac_address_from_buffer( const uint8_t* buffer, const uint16_t index_in_buffer, + lr11xx_wifi_mac_address_t mac_address ) +{ + for( uint8_t field_mac_index = 0; field_mac_index < LR11XX_WIFI_MAC_ADDRESS_LENGTH; field_mac_index++ ) + { + mac_address[field_mac_index] = buffer[index_in_buffer + field_mac_index]; + } +} + +static uint8_t lr11xx_wifi_get_format_code( const lr11xx_wifi_result_format_t format ) +{ + uint8_t format_code = 0x00; + switch( format ) + { + case LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE: + { + format_code = 0x01; + break; + } + case LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL: + { + format_code = 0x04; + break; + } + case LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL: + { + format_code = 0x01; + break; + } + } + return format_code; +} + +static uint8_t lr11xx_wifi_get_result_size_from_format( const lr11xx_wifi_result_format_t format ) +{ + uint8_t result_size = 0; + switch( format ) + { + case LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE: + { + result_size = LR11XX_WIFI_BASIC_COMPLETE_RESULT_SIZE; + break; + } + case LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL: + { + result_size = LR11XX_WIFI_BASIC_MAC_TYPE_CHANNEL_RESULT_SIZE; + break; + } + case LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL: + { + result_size = LR11XX_WIFI_EXTENDED_COMPLETE_RESULT_SIZE; + break; + } + } + return result_size; +} + +static lr11xx_status_t fetch_and_aggregate_all_results( const void* context, const uint8_t index_result_start, + const uint8_t nb_results, + const uint8_t nb_results_per_chunk_max, + const lr11xx_wifi_result_format_t result_format_code, + uint8_t* result_buffer, + lr11xx_wifi_result_interface_t result_structures ) +{ + uint8_t index_to_read = index_result_start; + uint8_t index_result_start_writing = 0; + uint8_t remaining_results = nb_results; + + lr11xx_hal_status_t hal_status = LR11XX_HAL_STATUS_OK; + while( remaining_results > 0 ) + { + uint8_t results_to_read = MIN( remaining_results, nb_results_per_chunk_max ); + + lr11xx_hal_status_t local_hal_status = lr11xx_wifi_read_results_helper( context, index_to_read, results_to_read, + result_buffer, result_format_code ); + if( local_hal_status != LR11XX_HAL_STATUS_OK ) + { + return ( lr11xx_status_t ) local_hal_status; + } + + generic_results_interpreter( results_to_read, index_result_start_writing, result_buffer, result_structures, + result_format_code ); + + // Reset the content of the result_buffer in case there are still results to fetch + { + const uint16_t result_buffer_size = + LR11XX_WIFI_MAX_SIZE_PER_SPI( lr11xx_wifi_get_result_size_from_format( result_format_code ) ); + for( uint16_t index = 0; index < result_buffer_size; index++ ) + { + result_buffer[index] = 0; + } + } + + index_to_read += results_to_read; + index_result_start_writing += results_to_read; + remaining_results -= results_to_read; + } + return ( lr11xx_status_t ) hal_status; +} + +static void generic_results_interpreter( const uint8_t n_result_to_parse, const uint8_t index_result_start_writing, + const uint8_t* buffer, lr11xx_wifi_result_interface_t result_interface, + const lr11xx_wifi_result_format_t format_code ) +{ + switch( format_code ) + { + case LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE: + { + interpret_basic_complete_result_from_buffer( n_result_to_parse, index_result_start_writing, buffer, + result_interface.basic_complete ); + break; + } + + case LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL: + { + interpret_basic_mac_type_channel_result_from_buffer( n_result_to_parse, index_result_start_writing, buffer, + result_interface.basic_mac_type_channel ); + break; + } + + case LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL: + { + interpret_extended_full_result_from_buffer( n_result_to_parse, index_result_start_writing, buffer, + result_interface.extended_complete ); + break; + } + } +} + +static void interpret_basic_complete_result_from_buffer( const uint8_t nb_results, + const uint8_t index_result_start_writing, + const uint8_t* buffer, + lr11xx_wifi_basic_complete_result_t* result ) +{ + for( uint8_t result_index = 0; result_index < nb_results; result_index++ ) + { + const uint16_t local_index_start = LR11XX_WIFI_BASIC_COMPLETE_RESULT_SIZE * result_index; + lr11xx_wifi_basic_complete_result_t* local_wifi_result = &result[index_result_start_writing + result_index]; + local_wifi_result->data_rate_info_byte = buffer[local_index_start + 0]; + local_wifi_result->channel_info_byte = buffer[local_index_start + 1]; + local_wifi_result->rssi = buffer[local_index_start + 2]; + local_wifi_result->frame_type_info_byte = buffer[local_index_start + 3]; + lr11xx_wifi_read_mac_address_from_buffer( buffer, local_index_start + 4, local_wifi_result->mac_address ); + local_wifi_result->phi_offset = uint16_from_array( buffer, local_index_start + 10 ); + local_wifi_result->timestamp_us = uint64_from_array( buffer, local_index_start + 12 ); + local_wifi_result->beacon_period_tu = uint16_from_array( buffer, local_index_start + 20 ); + } +} + +static void interpret_basic_mac_type_channel_result_from_buffer( const uint8_t nb_results, + const uint8_t index_result_start_writing, + const uint8_t* buffer, + lr11xx_wifi_basic_mac_type_channel_result_t* result ) +{ + for( uint8_t result_index = 0; result_index < nb_results; result_index++ ) + { + const uint16_t local_index_start = LR11XX_WIFI_BASIC_MAC_TYPE_CHANNEL_RESULT_SIZE * result_index; + lr11xx_wifi_basic_mac_type_channel_result_t* local_wifi_result = + &result[index_result_start_writing + result_index]; + local_wifi_result->data_rate_info_byte = buffer[local_index_start + 0]; + local_wifi_result->channel_info_byte = buffer[local_index_start + 1]; + local_wifi_result->rssi = buffer[local_index_start + 2]; + lr11xx_wifi_read_mac_address_from_buffer( buffer, local_index_start + 3, local_wifi_result->mac_address ); + } +} + +void interpret_extended_full_result_from_buffer( const uint8_t nb_results, const uint8_t index_result_start_writing, + const uint8_t* buffer, lr11xx_wifi_extended_full_result_t* result ) +{ + for( uint8_t result_index = 0; result_index < nb_results; result_index++ ) + { + const uint16_t local_index_start = LR11XX_WIFI_EXTENDED_COMPLETE_RESULT_SIZE * result_index; + lr11xx_wifi_extended_full_result_t* local_wifi_result = &result[index_result_start_writing + result_index]; + + local_wifi_result->data_rate_info_byte = buffer[local_index_start + 0]; + local_wifi_result->channel_info_byte = buffer[local_index_start + 1]; + local_wifi_result->rssi = buffer[local_index_start + 2]; + local_wifi_result->rate = buffer[local_index_start + 3]; + local_wifi_result->service = uint16_from_array( buffer, local_index_start + 4 ); + local_wifi_result->length = uint16_from_array( buffer, local_index_start + 6 ); + local_wifi_result->frame_control = uint16_from_array( buffer, local_index_start + 8 ); + lr11xx_wifi_read_mac_address_from_buffer( buffer, local_index_start + 10, local_wifi_result->mac_address_1 ); + lr11xx_wifi_read_mac_address_from_buffer( buffer, local_index_start + 16, local_wifi_result->mac_address_2 ); + lr11xx_wifi_read_mac_address_from_buffer( buffer, local_index_start + 22, local_wifi_result->mac_address_3 ); + local_wifi_result->timestamp_us = uint64_from_array( buffer, local_index_start + 28 ); + local_wifi_result->beacon_period_tu = uint16_from_array( buffer, local_index_start + 36 ); + local_wifi_result->seq_control = uint16_from_array( buffer, local_index_start + 38 ); + for( uint8_t ssid_index = 0; ssid_index < LR11XX_WIFI_RESULT_SSID_LENGTH; ssid_index++ ) + { + local_wifi_result->ssid_bytes[ssid_index] = buffer[local_index_start + ssid_index + 40]; + } + local_wifi_result->current_channel = ( lr11xx_wifi_channel_t ) buffer[local_index_start + 72]; + local_wifi_result->country_code[0] = buffer[local_index_start + 73]; + local_wifi_result->country_code[1] = buffer[local_index_start + 74]; + local_wifi_result->io_regulation = buffer[local_index_start + 75]; + local_wifi_result->fcs_check_byte.is_fcs_checked = ( ( buffer[local_index_start + 76] & 0x01 ) == 0x01 ); + local_wifi_result->fcs_check_byte.is_fcs_ok = ( ( buffer[local_index_start + 76] & 0x02 ) == 0x02 ); + local_wifi_result->phi_offset = uint16_from_array( buffer, local_index_start + 77 ); + } +} + +bool lr11xx_wifi_is_well_formed_utf8_byte_sequence( const uint8_t* buffer, const uint8_t length ) +{ + uint8_t index = 0; + + while( index < length ) + { + if( IS_INFERIOR( buffer[index], 0x7F ) ) + { + index += 1; + continue; + } + + if( length - index >= 2 ) + { + if( IS_BETWEEN( buffer[index], 0xC2, 0xDF ) && IS_BETWEEN_0x80_AND_0xBF( buffer[index + 1] ) ) + { + index += 2; + continue; + } + + if( length - index >= 3 ) + { + if( ( buffer[index] == 0xE0 ) && IS_BETWEEN( buffer[index + 1], 0xA0, 0xBF ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) ) + { + index += 3; + continue; + } + else if( IS_BETWEEN( buffer[index], 0xE1, 0xEC ) && IS_BETWEEN_0x80_AND_0xBF( buffer[index + 1] ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) ) + { + index += 3; + continue; + } + else if( ( buffer[index] == 0xED ) && IS_BETWEEN( buffer[index + 1], 0x80, 0x9F ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) ) + { + index += 3; + continue; + } + else if( IS_BETWEEN( buffer[index], 0xEE, 0xEF ) && IS_BETWEEN_0x80_AND_0xBF( buffer[index + 1] ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) ) + { + index += 3; + continue; + } + + if( length - index >= 4 ) + { + if( ( buffer[index] == 0xF0 ) && IS_BETWEEN( buffer[index + 1], 0x90, 0xBF ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) && IS_BETWEEN_0x80_AND_0xBF( buffer[index + 3] ) ) + { + index += 4; + continue; + } + else if( IS_BETWEEN( buffer[index], 0xF1, 0xF3 ) && IS_BETWEEN_0x80_AND_0xBF( buffer[index + 1] ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 3] ) ) + { + index += 4; + continue; + } + else if( ( buffer[index] == 0xF4 ) && IS_BETWEEN( buffer[index + 1], 0x80, 0x8F ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 2] ) && + IS_BETWEEN_0x80_AND_0xBF( buffer[index + 3] ) ) + { + index += 4; + continue; + } + } + } + } + + return false; + } + + return true; +} + +bool lr11xx_wifi_are_scan_mode_result_format_compatible( lr11xx_wifi_mode_t scan_mode, + lr11xx_wifi_result_format_t result_format ) +{ + switch( scan_mode ) + { + case LR11XX_WIFI_SCAN_MODE_BEACON: + case LR11XX_WIFI_SCAN_MODE_BEACON_AND_PKT: + { + switch( result_format ) + { + case LR11XX_WIFI_RESULT_FORMAT_BASIC_COMPLETE: + case LR11XX_WIFI_RESULT_FORMAT_BASIC_MAC_TYPE_CHANNEL: + { + return true; + } + + default: + { + return false; + } + } + break; + } + + case LR11XX_WIFI_SCAN_MODE_FULL_BEACON: + case LR11XX_WIFI_SCAN_MODE_UNTIL_SSID: + { + switch( result_format ) + { + case LR11XX_WIFI_RESULT_FORMAT_EXTENDED_FULL: + { + return true; + } + default: + { + return false; + } + } + } + + default: + { + return false; + } + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/components/esp_lora_1121/src/lr11xx_hal.c b/components/esp_lora_1121/src/lr11xx_hal.c new file mode 100755 index 0000000..65e41da --- /dev/null +++ b/components/esp_lora_1121/src/lr11xx_hal.c @@ -0,0 +1,220 @@ +/*! + * @file lr11xx_hal.c + * + * @brief Hardware Abstraction Layer (HAL) implementation for lr1121 + * + * The Clear BSD License + * Copyright Semtech Corporation 2024. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * ----------------------------------------------------------------------------- + * --- DEPENDENCIES ------------------------------------------------------------ + */ + +#include +#include +#include "esp_lora_1121.h" + +/*! + * @brief lr11xx_hal.h API implementation + */ + +/*! + * @brief Function to wait the that lr1121 modem-e busy line raise to high + * + * @param [in] context Chip implementation context + * @param [in] timeout_ms timeout in millisec before leave the function + * + * @returns lr1121_hal_status_t + */ +static lr11xx_hal_status_t lr11xx_hal_wait_on_unbusy(const void *context, uint32_t timeout_ms); + +lr11xx_hal_status_t lr11xx_hal_write(const void *context, const uint8_t *command, + const uint16_t command_length, const uint8_t *data, + const uint16_t data_length) +{ +#if defined(USE_LR11XX_CRC_OVER_SPI) + uint8_t cmd_crc = lr11xx_hal_compute_crc(0xFF, command, command_length); + if (data_length > 0){ + cmd_crc = lr11xx_hal_compute_crc(cmd_crc, data, data_length); + } + +#endif + + if (lr11xx_hal_wait_on_unbusy(context, 10000) == LR11XX_HAL_STATUS_OK) + { + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + /* Send CMD */ + lora_spi_write_bytes(context, (uint8_t *)command, command_length); + /* Send Data */ + if (data_length > 0) + { + lora_spi_write_bytes(context, (uint8_t *)data, data_length); + } +#if defined(USE_LR11XX_CRC_OVER_SPI) + lora_spi_write_bytes(context, &cmd_crc, 1); +#endif + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + return LR11XX_HAL_STATUS_OK; + } + return LR11XX_HAL_STATUS_ERROR; +} + +lr11xx_hal_status_t lr11xx_hal_read(const void *context, const uint8_t *command, + const uint16_t command_length, uint8_t *data, + const uint16_t data_length) +{ +#if defined(USE_LR11XX_CRC_OVER_SPI) + const uint8_t cmd_crc = lr11xx_hal_compute_crc(0xFF, command, command_length); +#endif + uint8_t dummy_byte_rx = LR11XX_NOP; + + if (lr11xx_hal_wait_on_unbusy(context, 10000) == LR11XX_HAL_STATUS_OK) + { + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + /* Send CMD */ + // uint8_t rx_data[16] = {0}; + lora_spi_write_bytes(context, (uint8_t *)command, command_length); +#if defined(USE_LR11XX_CRC_OVER_SPI) + lora_spi_write_bytes(context, &cmd_crc, 1); +#endif + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + /* Wait on busy pin up to 1000 ms */ + if (lr11xx_hal_wait_on_unbusy(context, 1000) != LR11XX_HAL_STATUS_OK) + { + return LR11XX_HAL_STATUS_ERROR; + } + + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + + /* dummy read */ + lora_spi_read_bytes(context, &dummy_byte_rx, 1); + lora_spi_read_bytes(context, data, data_length); + +#if defined(USE_LR11XX_CRC_OVER_SPI) + uint8_t crc_rx; + lora_spi_read_bytes(context, &crc_rx, 1); +#endif + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + +#if defined( USE_LR11XX_CRC_OVER_SPI ) + uint8_t crc_computed = lr11xx_hal_compute_crc( 0xFF, &dummy_byte_rx, 1 ); + if(data_length > 0) + { + crc_computed = lr11xx_hal_compute_crc( crc_computed, data, data_length ); + } + + if( crc_rx != crc_computed ) + { + return LR11XX_HAL_STATUS_ERROR; + } +#endif + return LR11XX_HAL_STATUS_OK; + } + return LR11XX_HAL_STATUS_ERROR; +} + +lr11xx_hal_status_t lr11xx_hal_direct_read(const void *context, uint8_t *data, + const uint16_t data_length) +{ + if (lr11xx_hal_wait_on_unbusy(context, 10000) == LR11XX_HAL_STATUS_OK) + { + /* NSS low */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + + lora_spi_read_bytes(context, data, data_length); + + /* NSS high */ + gpio_set_level(((lr1121_t *)context)->cs, 1); + + return LR11XX_HAL_STATUS_OK; + } + return LR11XX_HAL_STATUS_ERROR; +} + +lr11xx_hal_status_t lr11xx_hal_reset(const void *context) +{ + + if (((lr1121_t *)context)->reset < 0) + { + return LR11XX_HAL_STATUS_OK; + } + + gpio_set_level(((lr1121_t *)context)->reset, 0); + vTaskDelay(10 / portTICK_PERIOD_MS); + gpio_set_level(((lr1121_t *)context)->reset, 1); + + return LR11XX_HAL_STATUS_OK; +} + +lr11xx_hal_status_t lr11xx_hal_wakeup(const void *context) +{ + /* Wakeup radio */ + gpio_set_level(((lr1121_t *)context)->cs, 0); + vTaskDelay(10 / portTICK_PERIOD_MS); + gpio_set_level(((lr1121_t *)context)->cs, 1); + + /* Wait on busy pin for 1000 ms */ + return LR11XX_HAL_STATUS_OK; +} + +static lr11xx_hal_status_t lr11xx_hal_wait_on_unbusy(const void *context, uint32_t timeout_ms) +{ +#if 0 + while( gpio_get_level( ( ( lr1121_t* ) context )->busy ) == 1 ) + { + ; + } +#else + if (((lr1121_t *)context)->busy < 0) + { + return LR11XX_HAL_STATUS_OK; + } + uint32_t start = esp_timer_get_time() / 1000; + uint32_t current = 0; + while (gpio_get_level(((lr1121_t *)context)->busy) == 1) + { + + current = esp_timer_get_time() / 1000; + if ((int32_t)(current - start) > (int32_t)timeout_ms) + { + return LR11XX_HAL_STATUS_ERROR; + } + } +#endif + return LR11XX_HAL_STATUS_OK; +} diff --git a/components/esp_lora_1121/test_app/CMakeLists.txt b/components/esp_lora_1121/test_app/CMakeLists.txt new file mode 100755 index 0000000..d10b1a2 --- /dev/null +++ b/components/esp_lora_1121/test_app/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(test_lr1121) diff --git a/components/esp_lora_1121/test_app/main/CMakeLists.txt b/components/esp_lora_1121/test_app/main/CMakeLists.txt new file mode 100755 index 0000000..34b2eca --- /dev/null +++ b/components/esp_lora_1121/test_app/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "lr1121_config.c" "test_lr1121.c" + PRIV_REQUIRES spi_flash driver + INCLUDE_DIRS "") diff --git a/components/esp_lora_1121/test_app/main/idf_component.yml b/components/esp_lora_1121/test_app/main/idf_component.yml new file mode 100755 index 0000000..aa11120 --- /dev/null +++ b/components/esp_lora_1121/test_app/main/idf_component.yml @@ -0,0 +1,8 @@ +## IDF Component Manager Manifest File +dependencies: + ## Required IDF version + idf: ">=5.3.0" + + esp_lora_1121: + version: "*" + path: "../../../esp_lora_1121" \ No newline at end of file diff --git a/components/esp_lora_1121/test_app/main/lr1121_config.c b/components/esp_lora_1121/test_app/main/lr1121_config.c new file mode 100755 index 0000000..6dbbac7 --- /dev/null +++ b/components/esp_lora_1121/test_app/main/lr1121_config.c @@ -0,0 +1,394 @@ +/*! + * @file lr1121_config.c + * + * @brief Common functions shared by the examples + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2022. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lr1121_config.h" + +lr1121_t lr1121; + +// LoRa modulation parameters +static lr11xx_radio_mod_params_lora_t lora_mod_params = { + .sf = LORA_SPREADING_FACTOR, // Spreading factor + .bw = LORA_BANDWIDTH, // Bandwidth + .cr = LORA_CODING_RATE, // Coding rate + .ldro = 0 // Low Data Rate Optimization (initialized in radio init) +}; + +// LoRa packet parameters +static const lr11xx_radio_pkt_params_lora_t lora_pkt_params = { + .preamble_len_in_symb = LORA_PREAMBLE_LENGTH, // Preamble length in symbols + .header_type = LORA_PKT_LEN_MODE, // Header type (implicit or explicit) + .pld_len_in_bytes = PAYLOAD_LENGTH, // Payload length in bytes + .crc = LORA_CRC, // CRC mode + .iq = LORA_IQ, // IQ inversion +}; + +// GFSK modulation parameters +static const lr11xx_radio_mod_params_gfsk_t gfsk_mod_params = { + .br_in_bps = FSK_BITRATE, // Bitrate in bps + .pulse_shape = FSK_PULSE_SHAPE, // Pulse shape + .bw_dsb_param = FSK_BANDWIDTH, // Bandwidth parameter + .fdev_in_hz = FSK_FDEV, // Frequency deviation in Hz +}; + +// GFSK packet parameters +static const lr11xx_radio_pkt_params_gfsk_t gfsk_pkt_params = { + .preamble_len_in_bits = FSK_PREAMBLE_LENGTH, // Preamble length in bits + .preamble_detector = FSK_PREAMBLE_DETECTOR, // Preamble detector type + .sync_word_len_in_bits = FSK_SYNCWORD_LENGTH, // Sync word length in bits + .address_filtering = FSK_ADDRESS_FILTERING, // Address filtering mode + .header_type = FSK_HEADER_TYPE, // Header type + .pld_len_in_bytes = PAYLOAD_LENGTH, // Payload length in bytes + .crc_type = FSK_CRC_TYPE, // CRC type + .dc_free = FSK_DC_FREE, // DC-free encoding mode +}; + +static const lr11xx_radio_mod_params_bpsk_t bpsk_mod_params = { + .br_in_bps = BPSK_BITRATE_IN_BPS, + .pulse_shape = LR11XX_RADIO_DBPSK_PULSE_SHAPE, +}; + +static lr11xx_radio_pkt_params_bpsk_t bpsk_pkt_params = { + .pld_len_in_bytes = 0, // Will be initialized in radio init + .ramp_up_delay = 0, + .ramp_down_delay = 0, + .pld_len_in_bits = 0, // Will be initialized in radio init +}; + +void print_lora_configuration( void ); +void print_gfsk_configuration( void ); + +// Initialize the LR1121 system +void lora_system_init( const void* context ) +{ + lr11xx_system_reset( ( void* ) context ); // Reset the LR1121 system + lr11xx_hal_wakeup( ( void* ) context ); // Wake up the device + + // Enable or disable CRC over SPI +#if defined(USE_LR11XX_CRC_OVER_SPI) + lr11xx_system_enable_spi_crc(( void* ) context, true); +#else + lr11xx_system_enable_spi_crc(( void* ) context, false); +#endif + + // Set the LR1121 to standby mode using the external oscillator + lr11xx_system_set_standby(( void* ) context, LR11XX_SYSTEM_STANDBY_CFG_XOSC); + // Calibrate the image + lr11xx_system_calibrate_image(( void* ) context,0x6B,0x6E); // Calibrate for 430~440MHz + // lr11xx_system_calibrate_image(( void* ) context,0xD7,0xDB); // Calibrate for 863~870MHz + + // Configure the regulator mode + const lr11xx_system_reg_mode_t regulator = smtc_shield_lr11xx_common_get_reg_mode(); + lr11xx_system_set_reg_mode( ( void* ) context, regulator ); + + // Configure the RF switch + const lr11xx_system_rfswitch_cfg_t* rf_switch_setup = smtc_shield_lr11xx_common_get_rf_switch_cfg(); + lr11xx_system_set_dio_as_rf_switch( context, rf_switch_setup ); + + // Enable the TCXO + lr11xx_system_set_tcxo_mode( context, LR11XX_SYSTEM_TCXO_CTRL_3_0V, 300 ); + + // Configure the low-frequency clock source + lr11xx_system_cfg_lfclk( context, LR11XX_SYSTEM_LFCLK_XTAL, true ); + + // Clear all pending error flags + lr11xx_system_clear_errors( context ); + // Calibrate the system + lr11xx_system_calibrate( context, 0x3F ); + + uint16_t errors; + // Retrieve system errors + lr11xx_system_get_errors( context, &errors ); + if(errors & LR11XX_SYSTEM_ERRORS_IMG_CALIB_MASK) + { + printf("Image calibration error\r\n"); + } + // Clear all pending error flags + lr11xx_system_clear_errors( context ); + + // Clear all pending IRQ status bits + lr11xx_system_clear_irq_status( context, LR11XX_SYSTEM_IRQ_ALL_MASK ); +} + +// Initialize the LR1121 radio module +void lora_radio_init( const void* context ) +{ + // Retrieve the PA power configuration for the target frequency and power level + const smtc_shield_lr11xx_pa_pwr_cfg_t* pa_pwr_cfg = + smtc_shield_lr1121mb1gis_get_pa_pwr_cfg( RF_FREQ_IN_HZ, TX_OUTPUT_POWER_DBM ); + + if( pa_pwr_cfg == NULL ) + { + printf( "Invalid target frequency or power level\n" ); + while( true ) + { + } + } + + // Print common configuration parameters + printf( "Common parameters:\n" ); + printf( " Packet type = %s\n", lr11xx_radio_pkt_type_to_str( PACKET_TYPE ) ); + printf( " RF frequency = %u Hz\n", RF_FREQ_IN_HZ ); + printf( " Output power = %i dBm\n", TX_OUTPUT_POWER_DBM ); + printf( " Fallback mode = %s\n", lr11xx_radio_fallback_modes_to_str( FALLBACK_MODE ) ); + printf( ( ENABLE_RX_BOOST_MODE == true ) ? " Rx boost activated\n" : " Rx boost deactivated\n" ); + printf( "\n" ); + + // Set the packet type + lr11xx_radio_set_pkt_type( context, PACKET_TYPE ); + + // Verify the packet type setting + lr11xx_radio_pkt_type_t spi_check; + lr11xx_radio_get_pkt_type(context, &spi_check); + if(spi_check == LR11XX_RADIO_PKT_TYPE_LORA) + { + printf("LoRa modulation\r\n" ); + } + else if(spi_check == LR11XX_RADIO_PKT_TYPE_GFSK) + { + printf("GFSK modulation\r\n" ); + } + else + printf("spi_check_err\r\n" ); + + // Set the RF frequency + lr11xx_radio_set_rf_freq( context, RF_FREQ_IN_HZ ); + + // Set the RSSI calibration table + lr11xx_radio_set_rssi_calibration(context, smtc_shield_lr11xx_get_rssi_calibration_table( RF_FREQ_IN_HZ )); + + // Configure the PA settings + lr11xx_radio_set_pa_cfg( context, &( pa_pwr_cfg->pa_config ) ); + + // Set the TX power and ramp time + lr11xx_radio_set_tx_params( context, pa_pwr_cfg->power, PA_RAMP_TIME ); + + // Set the fallback mode after TX/RX operations + lr11xx_radio_set_rx_tx_fallback_mode( context, FALLBACK_MODE ); + // Configure the RX boost mode + lr11xx_radio_cfg_rx_boosted( context, ENABLE_RX_BOOST_MODE ); + + // Configure LoRa or GFSK parameters based on the packet type + if( PACKET_TYPE == LR11XX_RADIO_PKT_TYPE_LORA ) + { + print_lora_configuration( ); + lora_mod_params.ldro = smtc_shield_lr11xx_common_compute_lora_ldro( LORA_SPREADING_FACTOR, LORA_BANDWIDTH ); + lr11xx_radio_set_lora_mod_params( context, &lora_mod_params ); + lr11xx_radio_set_lora_pkt_params( context, &lora_pkt_params ); + lr11xx_radio_set_lora_sync_word( context, LORA_SYNCWORD ); + } + // Configure the radio for GFSK modulation + else if( PACKET_TYPE == LR11XX_RADIO_PKT_TYPE_GFSK ) + { + // Print the current GFSK configuration + print_gfsk_configuration( ); + + // Set the GFSK modulation parameters + lr11xx_radio_set_gfsk_mod_params( context, &gfsk_mod_params ); + // Set the GFSK packet parameters + lr11xx_radio_set_gfsk_pkt_params( context, &gfsk_pkt_params ); + // Set the GFSK sync word + lr11xx_radio_set_gfsk_sync_word( context, gfsk_sync_word ); + + // If DC-free encoding is enabled, set the whitening seed + if( FSK_DC_FREE != LR11XX_RADIO_GFSK_DC_FREE_OFF ) + { + lr11xx_radio_set_gfsk_whitening_seed( context, FSK_WHITENING_SEED ); + } + + // If CRC is enabled, set the CRC parameters + if( FSK_CRC_TYPE != LR11XX_RADIO_GFSK_CRC_OFF ) + { + lr11xx_radio_set_gfsk_crc_params( context, FSK_CRC_SEED, FSK_CRC_POLYNOMIAL ); + } + + // If address filtering is enabled, set the packet address + if( FSK_ADDRESS_FILTERING != LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE ) + { + lr11xx_radio_set_pkt_address( context, FSK_NODE_ADDRESS, FSK_BROADCAST_ADDRESS ); + } + } + // Configure the radio for LR-FHSS modulation + else if( PACKET_TYPE == LR11XX_RADIO_PKT_TYPE_LR_FHSS ) + { + // Define the LR-FHSS modulation parameters + const lr11xx_radio_mod_params_lr_fhss_t mod_lr_fhss = { + .br_in_bps = LR11XX_RADIO_LR_FHSS_BITRATE_488_BPS, // Bitrate in bps + .pulse_shape = LR11XX_RADIO_LR_FHSS_PULSE_SHAPE_BT_1, // Pulse shape + }; + + // Set the LR-FHSS modulation parameters + lr11xx_radio_set_lr_fhss_mod_params( context, &mod_lr_fhss ); + } +} + +void lora_radio_dbpsk_init( const void* context, const uint8_t payload_len ) +{ + const smtc_shield_lr11xx_pa_pwr_cfg_t* pa_pwr_cfg = + smtc_shield_lr1121mb1gis_get_pa_pwr_cfg( SIGFOX_UPLINK_RF_FREQ_IN_HZ, SIGFOX_TX_OUTPUT_POWER_DBM ); + + if( pa_pwr_cfg == NULL ) + { + printf( "Invalid target frequency or power level\n" ); + while( true ) + { + } + } + + printf( "Sigfox parameters:\n" ); + printf( " Packet type = %s\n", lr11xx_radio_pkt_type_to_str( LR11XX_RADIO_PKT_TYPE_BPSK ) ); + printf( " RF frequency = %u Hz\n", SIGFOX_UPLINK_RF_FREQ_IN_HZ ); + printf( " Output power = %i dBm\n", SIGFOX_TX_OUTPUT_POWER_DBM ); + + lr11xx_radio_set_pkt_type( context, LR11XX_RADIO_PKT_TYPE_BPSK ); + lr11xx_radio_set_rf_freq( context, SIGFOX_UPLINK_RF_FREQ_IN_HZ ); + lr11xx_radio_set_rssi_calibration( + context, smtc_shield_lr11xx_get_rssi_calibration_table( SIGFOX_UPLINK_RF_FREQ_IN_HZ ) ); + lr11xx_radio_set_pa_cfg( context, &( pa_pwr_cfg->pa_config ) ); + + lr11xx_radio_set_tx_params( context, pa_pwr_cfg->power, PA_RAMP_TIME ) ; + + lr11xx_radio_set_bpsk_mod_params( context, &bpsk_mod_params ); + + bpsk_pkt_params.pld_len_in_bytes = smtc_dbpsk_get_pld_len_in_bytes( payload_len << 3 ); + bpsk_pkt_params.pld_len_in_bits = smtc_dbpsk_get_pld_len_in_bits( payload_len << 3 ); + + if( BPSK_BITRATE_IN_BPS == 100 ) + { + bpsk_pkt_params.ramp_up_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_100_BPS; + bpsk_pkt_params.ramp_down_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS; + } + else if( BPSK_BITRATE_IN_BPS == 600 ) + { + bpsk_pkt_params.ramp_up_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_600_BPS; + bpsk_pkt_params.ramp_down_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_600_BPS; + } + else + { + bpsk_pkt_params.ramp_up_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_UP_TIME_DEFAULT; + bpsk_pkt_params.ramp_down_delay = LR11XX_RADIO_SIGFOX_DBPSK_RAMP_DOWN_TIME_DEFAULT; + } + + lr11xx_radio_set_bpsk_pkt_params( context, &bpsk_pkt_params ); +} + + +// Print the LoRa configuration parameters +void print_lora_configuration(void) +{ + // Print LoRa modulation parameters + printf( "LoRa modulation parameters:\n" ); + printf( " Spreading factor = %s\n", lr11xx_radio_lora_sf_to_str( LORA_SPREADING_FACTOR ) ); // Spreading factor + printf( " Bandwidth = %s\n", lr11xx_radio_lora_bw_to_str( LORA_BANDWIDTH ) ); // Bandwidth + printf( " Coding rate = %s\n", lr11xx_radio_lora_cr_to_str( LORA_CODING_RATE ) ); // Coding rate + printf( "\n" ); + + // Print LoRa packet parameters + printf( "LoRa packet parameters:\n" ); + printf( " Preamble length = %d symbol(s)\n", LORA_PREAMBLE_LENGTH ); // Preamble length in symbols + printf( " Header mode = %s\n", lr11xx_radio_lora_pkt_len_modes_to_str( LORA_PKT_LEN_MODE ) ); // Header mode + printf( " Payload length = %d byte(s)\n", PAYLOAD_LENGTH ); // Payload length in bytes + printf( " CRC mode = %s\n", lr11xx_radio_lora_crc_to_str( LORA_CRC ) ); // CRC mode + printf( " IQ = %s\n", lr11xx_radio_lora_iq_to_str( LORA_IQ ) ); // IQ inversion + printf( "\n" ); + + // Print LoRa syncword + printf( "LoRa syncword = 0x%02X\n", LORA_SYNCWORD ); + printf( "\n" ); +} + +// Print the GFSK configuration parameters +void print_gfsk_configuration( void ) +{ + // Print GFSK modulation parameters + printf( "GFSK modulation parameters:\n" ); + printf( " Bitrate = %u bps\n", FSK_BITRATE ); // Bitrate in bps + printf( " Pulse shape = %s\n", lr11xx_radio_gfsk_pulse_shape_to_str( FSK_PULSE_SHAPE ) ); // Pulse shape + printf( " Bandwidth = %s\n", lr11xx_radio_gfsk_bw_to_str( FSK_BANDWIDTH ) ); // Bandwidth + printf( " Frequency deviation = %u Hz\n", FSK_FDEV ); // Frequency deviation in Hz + printf( "\n" ); + + // Print GFSK packet parameters + printf( "GFSK packet parameters:\n" ); + printf( " Preamble length = %d bit(s)\n", FSK_PREAMBLE_LENGTH ); // Preamble length in bits + printf( " Preamble detector = %s\n", lr11xx_radio_gfsk_preamble_detector_to_str( FSK_PREAMBLE_DETECTOR ) ); // Preamble detector + printf( " Syncword length = %d bit(s)\n", FSK_SYNCWORD_LENGTH ); // Syncword length in bits + printf( " Address filtering = %s\n", lr11xx_radio_gfsk_address_filtering_to_str( FSK_ADDRESS_FILTERING ) ); // Address filtering mode + if( FSK_ADDRESS_FILTERING != LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE ) + { + printf( " (Node address = 0x%02X)\n", FSK_NODE_ADDRESS ); // Node address + if( FSK_ADDRESS_FILTERING == LR11XX_RADIO_GFSK_ADDRESS_FILTERING_NODE_AND_BROADCAST_ADDRESSES ) + { + printf( " (Broadcast address = 0x%02X)\n", FSK_BROADCAST_ADDRESS ); // Broadcast address + } + } + printf( " Header mode = %s\n", lr11xx_radio_gfsk_pkt_len_modes_to_str( FSK_HEADER_TYPE ) ); // Header mode + printf( " Payload length = %d byte(s)\n", PAYLOAD_LENGTH ); // Payload length in bytes + printf( " CRC mode = %s\n", lr11xx_radio_gfsk_crc_type_to_str( FSK_CRC_TYPE ) ); // CRC mode + if( FSK_CRC_TYPE != LR11XX_RADIO_GFSK_CRC_OFF ) + { + printf( " (CRC seed = 0x%08X)\n", FSK_CRC_SEED ); // CRC seed + printf( " (CRC polynomial = 0x%08X)\n", FSK_CRC_POLYNOMIAL ); // CRC polynomial + } + printf( " DC free = %s\n", lr11xx_radio_gfsk_dc_free_to_str( FSK_DC_FREE ) ); // DC-free encoding mode + if( FSK_DC_FREE != LR11XX_RADIO_GFSK_DC_FREE_OFF ) + { + printf( " (Whitening seed = 0x%04X)\n", FSK_WHITENING_SEED ); // Whitening seed + } + printf( "\n" ); +} + +// Calculate the time on air for the configured packet +uint32_t get_time_on_air_in_ms( void ) +{ + // Determine the time on air based on the packet type + switch( PACKET_TYPE ) + { + case LR11XX_RADIO_PKT_TYPE_LORA: + { + // Calculate time on air for LoRa + return lr11xx_radio_get_lora_time_on_air_in_ms( &lora_pkt_params, &lora_mod_params ); + } + case LR11XX_RADIO_PKT_TYPE_GFSK: + { + // Calculate time on air for GFSK + return lr11xx_radio_get_gfsk_time_on_air_in_ms( &gfsk_pkt_params, &gfsk_mod_params ); + } + default: + { + // Return 0 if the packet type is not recognized + return 0; + } + } +} \ No newline at end of file diff --git a/components/esp_lora_1121/test_app/main/lr1121_config.h b/components/esp_lora_1121/test_app/main/lr1121_config.h new file mode 100755 index 0000000..465e94a --- /dev/null +++ b/components/esp_lora_1121/test_app/main/lr1121_config.h @@ -0,0 +1,212 @@ +/*! + * @file lr1121_config.h + * + * @brief Common functions shared by the examples + * + * @copyright + * The Clear BSD License + * Copyright Semtech Corporation 2022. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the disclaimer + * below) provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Semtech corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY + * THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SEMTECH CORPORATION BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LR1121_CONFIG_H +#define LR1121_CONFIG_H + +#include "esp_lora_1121.h" + +#define RX_CONTINUOUS 0xFFFFFF + +/*! + * @brief General parameters + */ +#define PACKET_TYPE LR11XX_RADIO_PKT_TYPE_LORA //LR11XX_RADIO_PKT_TYPE_GFSK LR11XX_RADIO_PKT_TYPE_LORA +#define RF_FREQ_IN_HZ 434 * 1000 * 1000 +#define TX_OUTPUT_POWER_DBM 22 //-9~22 +#define PA_RAMP_TIME LR11XX_RADIO_RAMP_48_US +#define FALLBACK_MODE LR11XX_RADIO_FALLBACK_STDBY_RC +#define ENABLE_RX_BOOST_MODE true +#define PAYLOAD_LENGTH 7 + +/*! + * @brief Modulation parameters for LoRa packets + */ +#define LORA_SPREADING_FACTOR LR11XX_RADIO_LORA_SF7 +#define LORA_BANDWIDTH LR11XX_RADIO_LORA_BW_125 +#define LORA_CODING_RATE LR11XX_RADIO_LORA_CR_4_5 + +/*! + * @brief Packet parameters for LoRa packets + */ +#define LORA_PREAMBLE_LENGTH 8 +#define LORA_PKT_LEN_MODE LR11XX_RADIO_LORA_PKT_EXPLICIT +#define LORA_IQ LR11XX_RADIO_LORA_IQ_STANDARD +#define LORA_CRC LR11XX_RADIO_LORA_CRC_OFF + +#define LORA_SYNCWORD 0x12 // 0x12 Private Network, 0x34 Public Network + +/*! + * @brief Modulation parameters for GFSK packets + */ +#ifndef FSK_FDEV +#define FSK_FDEV 25000U // Hz +#endif +#ifndef FSK_BITRATE +#define FSK_BITRATE 50000U // bps +#endif +#ifndef FSK_BANDWIDTH +#define FSK_BANDWIDTH LR11XX_RADIO_GFSK_BW_117300 // Make sure to follow the rule: (2 * FDEV + BITRATE) < BW +#endif +#ifndef FSK_PULSE_SHAPE +#define FSK_PULSE_SHAPE LR11XX_RADIO_GFSK_PULSE_SHAPE_OFF +#endif + +/*! + * @brief Packet parameters for GFSK packets + */ +#ifndef FSK_PREAMBLE_LENGTH +#define FSK_PREAMBLE_LENGTH 32 // bits +#endif +#ifndef FSK_PREAMBLE_DETECTOR +#define FSK_PREAMBLE_DETECTOR LR11XX_RADIO_GFSK_PREAMBLE_DETECTOR_MIN_16BITS +#endif +#ifndef FSK_SYNCWORD_LENGTH +#define FSK_SYNCWORD_LENGTH 40 // bits +#endif +#ifndef FSK_ADDRESS_FILTERING +#define FSK_ADDRESS_FILTERING LR11XX_RADIO_GFSK_ADDRESS_FILTERING_DISABLE +#endif +#ifndef FSK_HEADER_TYPE +#define FSK_HEADER_TYPE LR11XX_RADIO_GFSK_PKT_VAR_LEN +#endif +#ifndef FSK_CRC_TYPE +#define FSK_CRC_TYPE LR11XX_RADIO_GFSK_CRC_1_BYTE_INV +#endif +#ifndef FSK_DC_FREE +#define FSK_DC_FREE LR11XX_RADIO_GFSK_DC_FREE_OFF +#endif + +/*! + * @brief GFSK sync word + */ +static const uint8_t gfsk_sync_word[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; + +/*! + * @brief GFSK whitening seed + */ +#ifndef FSK_WHITENING_SEED +#define FSK_WHITENING_SEED 0x0123 +#endif + +/*! + * @brief GFSK CRC seed + */ +#ifndef FSK_CRC_SEED +#define FSK_CRC_SEED 0x01234567 +#endif + +/*! + * @brief GFSK CRC polynomial + */ +#ifndef FSK_CRC_POLYNOMIAL +#define FSK_CRC_POLYNOMIAL 0x01234567 +#endif + +/*! + * @brief GFSK address filtering - node address + */ +#ifndef FSK_NODE_ADDRESS +#define FSK_NODE_ADDRESS 0x05 +#endif + +/*! + * @brief GFSK address filtering - broadcast address + */ +#ifndef FSK_BROADCAST_ADDRESS +#define FSK_BROADCAST_ADDRESS 0xAB +#endif + +/*! + * @brief Sigfox radio configuration + */ +#ifndef SIGFOX_RC +#define SIGFOX_RC 1 +#endif + +#if( SIGFOX_RC == 1 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 868130000 +#define BPSK_BITRATE_IN_BPS 100 +#define SIGFOX_TX_OUTPUT_POWER_DBM 14 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_UP_TIME_100_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#elif( SIGFOX_RC == 2 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 902200000 +#define BPSK_BITRATE_IN_BPS 600 +#define SIGFOX_TX_OUTPUT_POWER_DBM 22 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_UP_TIME_600_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_600_BPS +#elif( SIGFOX_RC == 3 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 923200000 +#define BPSK_BITRATE_IN_BPS 100 +#define SIGFOX_TX_OUTPUT_POWER_DBM 14 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#elif( SIGFOX_RC == 4 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 920800000 +#define BPSK_BITRATE_IN_BPS 600 +#define SIGFOX_TX_OUTPUT_POWER_DBM 22 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_UP_TIME_600_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_600_BPS +#elif( SIGFOX_RC == 5 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 923300000 +#define BPSK_BITRATE_IN_BPS 100 +#define SIGFOX_TX_OUTPUT_POWER_DBM 12 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#elif( SIGFOX_RC == 6 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 865200000 +#define BPSK_BITRATE_IN_BPS 100 +#define SIGFOX_TX_OUTPUT_POWER_DBM 14 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#elif( SIGFOX_RC == 7 ) +#define SIGFOX_UPLINK_RF_FREQ_IN_HZ 868800000 +#define BPSK_BITRATE_IN_BPS 100 +#define SIGFOX_TX_OUTPUT_POWER_DBM 14 +#define RAMP_UP_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#define RAMP_DOWN_DELAY SIGFOX_DBPSK_RAMP_DOWN_TIME_100_BPS +#else +#error "Select a valid Radio Configuration" +#endif + +extern lr1121_t lr1121; + +void lora_system_init( const void* context ); +void lora_radio_init( const void* context ); +void lora_radio_dbpsk_init( const void* context, const uint8_t payload_len ); + +uint32_t get_time_on_air_in_ms( void ); +#endif \ No newline at end of file diff --git a/components/esp_lora_1121/test_app/main/test_lr1121.c b/components/esp_lora_1121/test_app/main/test_lr1121.c new file mode 100755 index 0000000..deb1bca --- /dev/null +++ b/components/esp_lora_1121/test_app/main/test_lr1121.c @@ -0,0 +1,330 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/i2c_master.h" +#include "esp_log.h" +#include "esp_lora_1121.h" + +#include "lr1121_config.h" + +static const char *TAG = "lr1121_example"; + +#define TEST_SPI_MOSI (GPIO_NUM_45) +#define TEST_SPI_MISO (GPIO_NUM_46) +#define TEST_SPI_CLK (GPIO_NUM_40) +#define TEST_SPI_CS (GPIO_NUM_42) +#define TEST_SPI_INT (GPIO_NUM_38) +#define TEST_SPI_RESET (GPIO_NUM_39) +#define TEST_SPI_BUSY (GPIO_NUM_41) + +#define TEST_SPI_NUM (SPI3_HOST) +#define TEST_SPI_CLK_SPEED_HZ 8 * 1000 * 1000 + +#define RX_TIMEOUT_VALUE 600 +#define PING_PONG_PREFIX_SIZE 5 +#define SYNC_PACKET_THRESHOLD 64 +#define ITERATION_INDEX ( PING_PONG_PREFIX_SIZE + 1 ) +#define DELAY_BEFORE_TX_MS 20 +#define DELAY_PING_PONG_PACE_MS 200 +#define IRQ_MASK \ + ( LR11XX_SYSTEM_IRQ_TX_DONE | LR11XX_SYSTEM_IRQ_RX_DONE | LR11XX_SYSTEM_IRQ_TIMEOUT | \ + LR11XX_SYSTEM_IRQ_HEADER_ERROR | LR11XX_SYSTEM_IRQ_CRC_ERROR | LR11XX_SYSTEM_IRQ_FSK_LEN_ERROR ) + +#define HAL_DBG_TRACE_ARRAY( msg, array, len ) \ + do \ + { \ + printf( "%s - (%lu bytes):\n", msg, ( uint32_t ) len ); \ + for( uint32_t i = 0; i < ( uint32_t ) len; i++ ) \ + { \ + if( ( ( i % 16 ) == 0 ) && ( i > 0 ) ) \ + { \ + printf( "\n" ); \ + } \ + printf( " %02X", array[i] ); \ + } \ + printf( "\n" ); \ + } while( 0 ); + +static spi_device_handle_t spi_handle = NULL;// SPI Handle + +static uint8_t buffer_tx[PAYLOAD_LENGTH]; +static bool is_master = true; + +static const uint8_t ping_msg[PING_PONG_PREFIX_SIZE] = "PING"; +static const uint8_t pong_msg[PING_PONG_PREFIX_SIZE] = "PONG"; + +static uint8_t iteration = 0; +static uint16_t packets_to_sync = 0; + +bool irq_flag; +/** + * @brief Handle reception failure for ping-pong example + */ +static void ping_pong_reception_failure_handling( void ); + +void lora_irq_process( const void* context, lr11xx_system_irq_mask_t irq_filter_mask ); + +static void IRAM_ATTR isr(void* arg) { + irq_flag = true; // Set the interrupt flag +} + +static esp_err_t spi_bus_init() { + spi_bus_config_t buscfg = { + .mosi_io_num = TEST_SPI_MOSI, + .miso_io_num = TEST_SPI_MISO, + .sclk_io_num = TEST_SPI_CLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = 64, + }; + + spi_device_interface_config_t devcfg = { + .clock_speed_hz = TEST_SPI_CLK_SPEED_HZ, // 8 MHz + .mode = 0, // SPI mode 0: CPOL=0, CPHA=0 + .spics_io_num = -1, + .queue_size = 1, + }; + // Initialize SPI bus + ESP_ERROR_CHECK(spi_bus_initialize(TEST_SPI_NUM, &buscfg, SPI_DMA_CH_AUTO)); + ESP_ERROR_CHECK(spi_bus_add_device(TEST_SPI_NUM, &devcfg, &spi_handle)); + + return ESP_OK; +} + +static void lr1121_test_task(void *arg) { + + lora_init_io_context(&lr1121,TEST_SPI_CS,TEST_SPI_RESET,TEST_SPI_BUSY,TEST_SPI_INT); // Initialize the I/O context for the LR1121 + lora_init_io(&lr1121); // Initialize the I/O for the LR1121 + + lora_spi_init(&lr1121, spi_handle); // Initialize the SPI interface for the LR1121 + + printf( "===== LR11xx Ping-Pong example =====\n\n" ); + printf( "LR11XX driver version: %s\n", lr11xx_driver_version_get_version_string( ) ); + + // Initialize the system + lora_system_init(&lr1121); + // Print the version number for verification + lora_print_version(&lr1121); + // Initialize the LoRa radio + lora_radio_init(&lr1121); + + lora_init_irq(&lr1121, isr); // Initialize the interrupt service routine + + + ASSERT_LR11XX_RC( lr11xx_system_set_dio_irq_params( &lr1121, IRQ_MASK, 0 ) ); + ASSERT_LR11XX_RC( lr11xx_system_clear_irq_status( &lr1121, LR11XX_SYSTEM_IRQ_ALL_MASK ) ); + + /* Intializes random number generator */ + srand( 10 ); + + memcpy( buffer_tx, ping_msg, PING_PONG_PREFIX_SIZE ); + buffer_tx[PING_PONG_PREFIX_SIZE] = ( uint8_t ) 0; + buffer_tx[ITERATION_INDEX] = ( uint8_t ) ( iteration ); + for( int i = PING_PONG_PREFIX_SIZE + 1 + 1; i < PAYLOAD_LENGTH; i++ ) + { + buffer_tx[i] = i; + } + + ASSERT_LR11XX_RC( lr11xx_regmem_write_buffer8( &lr1121, buffer_tx, PAYLOAD_LENGTH ) ); + + + ASSERT_LR11XX_RC( lr11xx_radio_set_tx( &lr1121, 0 ) ); + while (1) + { + if(irq_flag) + lora_irq_process( &lr1121, IRQ_MASK ); + vTaskDelay(1 / portTICK_PERIOD_MS); // Short delay to control the loop speed + } +} + +void on_tx_done( void ) +{ + + printf( "Sent message %s, iteration %d\n", buffer_tx, iteration ); + vTaskDelay( DELAY_PING_PONG_PACE_MS / portTICK_PERIOD_MS); + ASSERT_LR11XX_RC( lr11xx_radio_set_rx( + &lr1121, + get_time_on_air_in_ms( ) + RX_TIMEOUT_VALUE + rand( ) % 500 ) ); // Random delay to avoid + // unwanted synchronization +} + +void lora_receive( const void* context, uint8_t* buffer, uint8_t buffer_length, uint8_t* size ) +{ + lr11xx_radio_rx_buffer_status_t rx_buffer_status; + lr11xx_radio_pkt_status_lora_t pkt_status_lora; + lr11xx_radio_pkt_status_gfsk_t pkt_status_gfsk; + + lr11xx_radio_get_rx_buffer_status( context, &rx_buffer_status ); + *size = rx_buffer_status.pld_len_in_bytes; + if( *size > buffer_length ) + { + printf( "Received payload (size: %d) is bigger than the buffer (size: %d)!\n", *size, + buffer_length ); + return; + } + lr11xx_regmem_read_buffer8( context, buffer, rx_buffer_status.buffer_start_pointer, + rx_buffer_status.pld_len_in_bytes ); + + HAL_DBG_TRACE_ARRAY( "Packet content", buffer, *size ); + + printf( "Packet status:\n" ); + if( PACKET_TYPE == LR11XX_RADIO_PKT_TYPE_LORA ) + { + lr11xx_radio_get_lora_pkt_status( context, &pkt_status_lora ); + printf( " - RSSI packet = %i dBm\n", pkt_status_lora.rssi_pkt_in_dbm ); + printf( " - Signal RSSI packet = %i dBm\n", pkt_status_lora.signal_rssi_pkt_in_dbm ); + printf( " - SNR packet = %i dB\n", pkt_status_lora.snr_pkt_in_db ); + } + else if( PACKET_TYPE == LR11XX_RADIO_PKT_TYPE_GFSK ) + { + lr11xx_radio_get_gfsk_pkt_status( context, &pkt_status_gfsk ); + printf( " - RSSI average = %i dBm\n", pkt_status_gfsk.rssi_avg_in_dbm ); + printf( " - RSSI sync = %i dBm\n", pkt_status_gfsk.rssi_sync_in_dbm ); + } +} + +void on_rx_done( void ) +{ + uint8_t buffer_rx[PAYLOAD_LENGTH]; + uint8_t size; + + packets_to_sync = 0; + + + lora_receive( &lr1121, buffer_rx, PAYLOAD_LENGTH, &size ); + iteration = buffer_rx[ITERATION_INDEX]; + + iteration++; + printf( "Received message %s, iteration %d\n", buffer_rx, iteration ); + + if( is_master == true ) + { + if( memcmp( buffer_rx, ping_msg, PING_PONG_PREFIX_SIZE ) == 0 ) + { + is_master = false; + memcpy( buffer_tx, pong_msg, PING_PONG_PREFIX_SIZE ); + } + else if( memcmp( buffer_rx, pong_msg, PING_PONG_PREFIX_SIZE ) != 0 ) + { + printf( "Unexpected message\n" ); + } + } + else + { + if( memcmp( buffer_rx, ping_msg, PING_PONG_PREFIX_SIZE ) != 0 ) + { + printf( "Unexpected message\n" ); + + is_master = true; + memcpy( buffer_tx, ping_msg, PING_PONG_PREFIX_SIZE ); + } + } + + vTaskDelay( (DELAY_PING_PONG_PACE_MS + DELAY_BEFORE_TX_MS) / portTICK_PERIOD_MS); + buffer_tx[ITERATION_INDEX] = iteration; + + ASSERT_LR11XX_RC( lr11xx_regmem_write_buffer8( &lr1121, buffer_tx, PAYLOAD_LENGTH ) ); + + ASSERT_LR11XX_RC( lr11xx_radio_set_tx( &lr1121, 0 ) ); +} + +void on_rx_timeout( void ) +{ + packets_to_sync++; + if( packets_to_sync > SYNC_PACKET_THRESHOLD ) + { + printf( + "It looks like synchronisation is still not done, consider resetting one of the board\n" ); + } + ping_pong_reception_failure_handling( ); +} + +void on_rx_crc_error( void ) +{ + ping_pong_reception_failure_handling( ); +} + +void on_fsk_len_error( void ) +{ + ping_pong_reception_failure_handling( ); +} + +static void ping_pong_reception_failure_handling( void ) +{ + is_master = true; + iteration = 0; + memcpy( buffer_tx, ping_msg, PING_PONG_PREFIX_SIZE ); + buffer_tx[ITERATION_INDEX] = iteration; + + ASSERT_LR11XX_RC( lr11xx_regmem_write_buffer8( &lr1121, buffer_tx, PAYLOAD_LENGTH ) ); + + ASSERT_LR11XX_RC( lr11xx_radio_set_tx( &lr1121, 0 ) ); +} + +void lora_irq_process( const void* context, lr11xx_system_irq_mask_t irq_filter_mask ) +{ + + irq_flag = false; + + lr11xx_system_irq_mask_t irq_regs; + lr11xx_system_get_and_clear_irq_status( context, &irq_regs ); + + printf( "Interrupt flags = 0x%08lX\n", irq_regs ); + + irq_regs &= irq_filter_mask; + + printf( "Interrupt flags (after filtering) = 0x%08lX\n", irq_regs ); + + if( ( irq_regs & LR11XX_SYSTEM_IRQ_TX_DONE ) == LR11XX_SYSTEM_IRQ_TX_DONE ) + { + printf( "Tx done\n" ); + on_tx_done( ); + } + + + if( ( irq_regs & LR11XX_SYSTEM_IRQ_HEADER_ERROR ) == LR11XX_SYSTEM_IRQ_HEADER_ERROR ) + { + printf( "Header error\n" ); + } + + if( ( irq_regs & LR11XX_SYSTEM_IRQ_RX_DONE ) == LR11XX_SYSTEM_IRQ_RX_DONE ) + { + if( ( irq_regs & LR11XX_SYSTEM_IRQ_CRC_ERROR ) == LR11XX_SYSTEM_IRQ_CRC_ERROR ) + { + printf( "CRC error\n" ); + on_rx_crc_error( ); + } + else if( ( irq_regs & LR11XX_SYSTEM_IRQ_FSK_LEN_ERROR ) == LR11XX_SYSTEM_IRQ_FSK_LEN_ERROR ) + { + printf( "FSK length error\n" ); + on_fsk_len_error( ); + } + else + { + printf( "Rx done\n" ); + on_rx_done( ); + } + } + + if( ( irq_regs & LR11XX_SYSTEM_IRQ_TIMEOUT ) == LR11XX_SYSTEM_IRQ_TIMEOUT ) + { + printf( "Rx timeout\n" ); + on_rx_timeout( ); + } + + printf( "\n" ); + +} + +void app_main(void) +{ + ESP_LOGI(TAG, "Initializing SPI..."); + + esp_err_t ret = spi_bus_init(); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to initialize SPI (error: %d)", ret); + return; + } + + xTaskCreate(lr1121_test_task, "lr1121_test_task", 4096, NULL, 5, NULL); +} \ No newline at end of file diff --git a/components/input/CMakeLists.txt b/components/input/CMakeLists.txt new file mode 100644 index 0000000..05664a6 --- /dev/null +++ b/components/input/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "input.c" + INCLUDE_DIRS "include" + REQUIRES esp_adc +) diff --git a/components/input/Kconfig b/components/input/Kconfig new file mode 100644 index 0000000..eb518c8 --- /dev/null +++ b/components/input/Kconfig @@ -0,0 +1,32 @@ +menu "Joystick input" + +config JOYSTICK_ADC_CHANNEL + int "ADC1 channel for joystick ladder" + range 0 9 + default 6 + +config JOYSTICK_ADC_LEVEL_LEFT + int "Expected ADC raw value for LEFT" + default 600 + +config JOYSTICK_ADC_LEVEL_UP + int "Expected ADC raw value for UP" + default 1200 + +config JOYSTICK_ADC_LEVEL_PRESS + int "Expected ADC raw value for PRESS" + default 1900 + +config JOYSTICK_ADC_LEVEL_DOWN + int "Expected ADC raw value for DOWN" + default 2600 + +config JOYSTICK_ADC_LEVEL_RIGHT + int "Expected ADC raw value for RIGHT" + default 3300 + +config JOYSTICK_ADC_TOLERANCE + int "Tolerance (+/- counts) when matching ADC reading to a direction" + default 150 + +endmenu diff --git a/components/input/include/input.h b/components/input/include/input.h new file mode 100644 index 0000000..1e43927 --- /dev/null +++ b/components/input/include/input.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esp_err.h" +#include "esp_adc/adc_oneshot.h" + +typedef enum { + INPUT_NONE = 0, + INPUT_UP, + INPUT_DOWN, + INPUT_LEFT, + INPUT_RIGHT, + INPUT_CENTER, +} input_event_t; + +void input_init(void); +input_event_t input_poll(void); +esp_err_t input_read_raw(int *out_raw); +adc_channel_t input_get_channel(void); diff --git a/components/input/input.c b/components/input/input.c new file mode 100644 index 0000000..918177a --- /dev/null +++ b/components/input/input.c @@ -0,0 +1,94 @@ +#include "input.h" +#include +#include "esp_log.h" +#include "sdkconfig.h" +#include "esp_adc/adc_oneshot.h" + +static const char *TAG = "input"; + +static adc_oneshot_unit_handle_t s_adc_handle; +static adc_channel_t s_channel; + +static void log_levels(void) +{ + ESP_LOGI(TAG, "Joystick ladder on ADC1_CH%d, levels L=%d U=%d P=%d D=%d R=%d tol=%d", + CONFIG_JOYSTICK_ADC_CHANNEL, + CONFIG_JOYSTICK_ADC_LEVEL_LEFT, + CONFIG_JOYSTICK_ADC_LEVEL_UP, + CONFIG_JOYSTICK_ADC_LEVEL_PRESS, + CONFIG_JOYSTICK_ADC_LEVEL_DOWN, + CONFIG_JOYSTICK_ADC_LEVEL_RIGHT, + CONFIG_JOYSTICK_ADC_TOLERANCE); +} + +void input_init(void) +{ + adc_oneshot_unit_init_cfg_t unit_cfg = { + .unit_id = ADC_UNIT_1, + .ulp_mode = ADC_ULP_MODE_DISABLE, + }; + ESP_ERROR_CHECK(adc_oneshot_new_unit(&unit_cfg, &s_adc_handle)); + + s_channel = (adc_channel_t)CONFIG_JOYSTICK_ADC_CHANNEL; + adc_oneshot_chan_cfg_t chan_cfg = { + .bitwidth = ADC_BITWIDTH_DEFAULT, + .atten = ADC_ATTEN_DB_11, + }; + ESP_ERROR_CHECK(adc_oneshot_config_channel(s_adc_handle, s_channel, &chan_cfg)); + log_levels(); +} + +adc_channel_t input_get_channel(void) +{ + return s_channel; +} + +esp_err_t input_read_raw(int *out_raw) +{ + int raw = 0; + esp_err_t err = adc_oneshot_read(s_adc_handle, s_channel, &raw); + if (err != ESP_OK) { + return err; + } + if (out_raw) { + *out_raw = raw; + } + return ESP_OK; +} + +input_event_t input_poll(void) +{ + int raw = 0; + if (input_read_raw(&raw) != ESP_OK) { + return INPUT_NONE; + } + struct level_map { + input_event_t evt; + int expected; + } map[] = { + {INPUT_LEFT, CONFIG_JOYSTICK_ADC_LEVEL_LEFT}, + // Вертикаль інвертована (UP читається ближче до рівня DOWN) на цій платі + {INPUT_UP, CONFIG_JOYSTICK_ADC_LEVEL_DOWN}, + {INPUT_CENTER, CONFIG_JOYSTICK_ADC_LEVEL_PRESS}, + {INPUT_DOWN, CONFIG_JOYSTICK_ADC_LEVEL_UP}, + {INPUT_RIGHT, CONFIG_JOYSTICK_ADC_LEVEL_RIGHT}, + }; + + int best_diff = INT_MAX; + input_event_t best_evt = INPUT_NONE; + for (size_t i = 0; i < sizeof(map) / sizeof(map[0]); i++) { + int diff = map[i].expected - raw; + if (diff < 0) { + diff = -diff; + } + if (diff < best_diff) { + best_diff = diff; + best_evt = map[i].evt; + } + } + + if (best_diff <= CONFIG_JOYSTICK_ADC_TOLERANCE) { + return best_evt; + } + return INPUT_NONE; +} diff --git a/components/lora_radio/CMakeLists.txt b/components/lora_radio/CMakeLists.txt new file mode 100644 index 0000000..661623b --- /dev/null +++ b/components/lora_radio/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register( + SRCS "lora_radio.c" + INCLUDE_DIRS "include" + REQUIRES common esp_lora_1121 + PRIV_REQUIRES esp_driver_spi esp_driver_gpio esp_timer driver +) diff --git a/components/lora_radio/Kconfig b/components/lora_radio/Kconfig new file mode 100644 index 0000000..ec33f45 --- /dev/null +++ b/components/lora_radio/Kconfig @@ -0,0 +1,56 @@ +menu "LoRa radio (LR1121)" + +config LORA_SPI_HOST + int "SPI host" + range 0 3 + default 2 + help + Номер SPI host для RA01 (звичайно HSPI = 2, VSPI = 3). + +config LORA_PIN_CS + int "LR1121 CS (NSS) pin" + default 18 + +config LORA_PIN_MOSI + int "LR1121 MOSI pin" + default 27 + +config LORA_PIN_MISO + int "LR1121 MISO pin" + default 19 + +config LORA_PIN_SCK + int "LR1121 SCK pin" + default 5 + +config LORA_PIN_RST + int "LR1121 RESET pin" + default 14 + +config LORA_PIN_BUSY + int "LR1121 BUSY pin" + default 26 + +config LORA_PIN_DIO1 + int "LR1121 DIO1 pin" + default 25 + +config LORA_FREQ_MHZ + int "Частота МГц" + default 868 + +config LORA_BW_KHZ + int "Смуга пропускання кГц" + default 125 + +config LORA_SF + int "Spreading factor" + range 5 12 + default 7 + +config LORA_CR + int "Coding rate (4/x)" + range 5 8 + default 5 + +endmenu diff --git a/components/lora_radio/include/lora_radio.h b/components/lora_radio/include/lora_radio.h new file mode 100644 index 0000000..432dc7b --- /dev/null +++ b/components/lora_radio/include/lora_radio.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include +#include "esp_err.h" + +#ifndef CONFIG_LORA_CR +#define CONFIG_LORA_CR 5 +#endif + +typedef struct { + int freq_centi_mhz; // частота у сотих MHz (433.35 MHz => 43335) + int bw_khz; // смуга пропускання, кГц + int sf; // spreading factor (5..12) + int cr; // coding rate denominator (4/x) + int tx_power_dbm; // вихідна потужність, дБм + uint16_t preamble_syms; // довжина прекомбози, символи + uint8_t payload_len; // очікувана довжина корисного навантаження (0 = довільна для explicit header) + bool crc_on; // включити CRC + bool iq_invert; // інверсія IQ (звичайно false) + bool header_implicit; // implicit header режим +} lora_params_t; + +typedef struct { + int rssi_dbm; + int snr_db; + uint8_t last_status; +} lora_metrics_t; + +bool lora_radio_init(bool is_tx_role); +esp_err_t lora_radio_apply_params(const lora_params_t *params); +esp_err_t lora_radio_set_tx_power_dbm(int dbm); +esp_err_t lora_radio_set_frequency_centi_mhz(int freq_centi_mhz); +void lora_radio_get_params(lora_params_t *out); +void lora_radio_tick_tx(void); +void lora_radio_tick_rx(void); +void lora_radio_get_metrics(lora_metrics_t *out); +void lora_radio_get_last_payload(char *out, size_t out_len); +esp_err_t lora_radio_send(const uint8_t *data, size_t len); diff --git a/components/lora_radio/lora_radio.c b/components/lora_radio/lora_radio.c new file mode 100644 index 0000000..e2f17cb --- /dev/null +++ b/components/lora_radio/lora_radio.c @@ -0,0 +1,476 @@ +#include "lora_radio.h" +#include +#include "esp_check.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "esp_lora_1121.h" +#include "lr1121_common/lr1121_common.h" +#include "lr11xx_driver/lr11xx_hal.h" +#include "lr11xx_driver/lr11xx_radio.h" +#include "lr11xx_driver/lr11xx_regmem.h" +#include "lr11xx_driver/lr11xx_system.h" + +static const char *TAG = "lora_radio"; + +#define LR1121_SPI_FREQ_HZ (8 * 1000 * 1000) +#define LR1121_SPI_MODE (0) +#define LR1121_RX_CONTINUOUS (0xFFFFFF) +#define LR1121_SYNC_WORD (0x12) // Private network +#define LR1121_PA_RAMP (LR11XX_RADIO_RAMP_48_US) + +static lr1121_t s_lr = {0}; +static spi_device_handle_t s_spi = NULL; +static bool s_is_tx = false; +static lora_params_t s_params; +static lora_metrics_t s_metrics = { .rssi_dbm = -120, .snr_db = -20, .last_status = 0 }; +static char s_last_payload[96] = "(no data)"; +static size_t s_last_payload_len = 0; +static int64_t s_last_rx_restart_us = 0; +static bool s_tx_in_progress = false; +static int64_t s_last_tx_us = 0; + +static inline esp_err_t lr_status_to_esp(lr11xx_status_t st) +{ + return (st == LR11XX_STATUS_OK) ? ESP_OK : ESP_FAIL; +} + +static uint32_t cmhz_to_hz(int cmhz) +{ + if (cmhz <= 0) { + return 0; + } + return (uint32_t)cmhz * 10000U; +} + +static lr11xx_radio_lora_sf_t map_sf(int sf) +{ + switch (sf) { + case 5: return LR11XX_RADIO_LORA_SF5; + case 6: return LR11XX_RADIO_LORA_SF6; + case 7: return LR11XX_RADIO_LORA_SF7; + case 8: return LR11XX_RADIO_LORA_SF8; + case 9: return LR11XX_RADIO_LORA_SF9; + case 10: return LR11XX_RADIO_LORA_SF10; + case 11: return LR11XX_RADIO_LORA_SF11; + case 12: return LR11XX_RADIO_LORA_SF12; + default: return LR11XX_RADIO_LORA_SF7; + } +} + +static lr11xx_radio_lora_bw_t map_bw(int bw_khz) +{ + switch (bw_khz) { + case 125: return LR11XX_RADIO_LORA_BW_125; + case 250: return LR11XX_RADIO_LORA_BW_250; + case 500: return LR11XX_RADIO_LORA_BW_500; + default: return LR11XX_RADIO_LORA_BW_125; + } +} + +static lr11xx_radio_lora_cr_t map_cr(int cr) +{ + switch (cr) { + case 5: return LR11XX_RADIO_LORA_CR_4_5; + case 6: return LR11XX_RADIO_LORA_CR_4_6; + case 7: return LR11XX_RADIO_LORA_CR_4_7; + case 8: return LR11XX_RADIO_LORA_CR_4_8; + default: return LR11XX_RADIO_LORA_CR_4_5; + } +} + +static void sanitize_params(lora_params_t *p) +{ + if (!p) { + return; + } + if (p->freq_centi_mhz < 15000) p->freq_centi_mhz = 15000; // 150 MHz мінімум + if (p->freq_centi_mhz > 250000) p->freq_centi_mhz = 250000; // 2.5 GHz максимум + if (p->bw_khz != 125 && p->bw_khz != 250 && p->bw_khz != 500) { + p->bw_khz = 125; + } + if (p->sf < 5) p->sf = 5; + if (p->sf > 12) p->sf = 12; + if (p->cr < 5) p->cr = 5; + if (p->cr > 8) p->cr = 8; + int max_dbm = 22; + // HF port (L/S/2.4 GHz) має нижчу допустиму потужність + if (p->freq_centi_mhz >= 150000) { + max_dbm = 13; + } + if (p->tx_power_dbm < -17) p->tx_power_dbm = -17; + if (p->tx_power_dbm > max_dbm) p->tx_power_dbm = max_dbm; + if (p->preamble_syms == 0) p->preamble_syms = 8; + if (p->payload_len == 0 && p->header_implicit) { + p->payload_len = 1; + } +} + +static void lr1121_calibrate_image_for_freq(uint32_t freq_hz) +{ + // Використовуємо універсальне калібрування за частотою в MHz ±10 MHz + uint16_t mhz = (uint16_t)(freq_hz / 1000000U); + uint16_t f1 = (mhz > 10) ? (uint16_t)(mhz - 10) : mhz; + uint16_t f2 = (uint16_t)(mhz + 10); + lr11xx_system_calibrate_image_in_mhz(&s_lr, f1, f2); +} + +static esp_err_t radio_setup_spi(void) +{ + spi_bus_config_t buscfg = { + .mosi_io_num = CONFIG_LORA_PIN_MOSI, + .miso_io_num = CONFIG_LORA_PIN_MISO, + .sclk_io_num = CONFIG_LORA_PIN_SCK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + }; + esp_err_t err = spi_bus_initialize(CONFIG_LORA_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO); + if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { + return err; + } + + if (s_spi) { + return ESP_OK; + } + + spi_device_interface_config_t devcfg = { + .clock_speed_hz = LR1121_SPI_FREQ_HZ, + .mode = LR1121_SPI_MODE, + .spics_io_num = -1, // CS керуємо вручну в HAL + .queue_size = 2, + }; + err = spi_bus_add_device(CONFIG_LORA_SPI_HOST, &devcfg, &s_spi); + if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { + return err; + } + return ESP_OK; +} + +static esp_err_t lr1121_hw_init(void) +{ + lora_init_io_context(&s_lr, + CONFIG_LORA_PIN_CS, + CONFIG_LORA_PIN_RST, + CONFIG_LORA_PIN_BUSY, + CONFIG_LORA_PIN_DIO1); + lora_init_io(&s_lr); + lora_spi_init(&s_lr, s_spi); + return ESP_OK; +} + +static esp_err_t lr1121_system_boot(void) +{ + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_reset(&s_lr)), TAG, "reset"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_hal_wakeup(&s_lr)), TAG, "wakeup"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_set_standby(&s_lr, LR11XX_SYSTEM_STANDBY_CFG_XOSC)), TAG, "standby"); + const lr11xx_system_reg_mode_t reg_mode = smtc_shield_lr11xx_common_get_reg_mode(); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_set_reg_mode(&s_lr, reg_mode)), TAG, "reg mode"); + + const lr11xx_system_rfswitch_cfg_t *rf_switch = smtc_shield_lr11xx_common_get_rf_switch_cfg(); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_set_dio_as_rf_switch(&s_lr, rf_switch)), TAG, "rf switch"); + + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_set_tcxo_mode(&s_lr, LR11XX_SYSTEM_TCXO_CTRL_3_0V, 300)), TAG, "tcxo"); + + const smtc_shield_lr11xx_lfclk_cfg_t *lf = smtc_shield_lr11xx_common_get_lfclk_cfg(); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_cfg_lfclk(&s_lr, lf->lf_clk_cfg, lf->wait_32k_ready)), TAG, "lfclk"); + + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_clear_errors(&s_lr)), TAG, "clear errors"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_calibrate(&s_lr, 0x3F)), TAG, "calibrate"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_clear_irq_status(&s_lr, LR11XX_SYSTEM_IRQ_ALL_MASK)), TAG, "clear irq"); + + lr11xx_system_version_t ver = {0}; + if (lr11xx_system_get_version(&s_lr, &ver) == LR11XX_STATUS_OK) { + ESP_LOGI(TAG, "LR1121 ver hw=0x%02X type=0x%02X fw=0x%04X", + ver.hw, ver.type, ver.fw); + } + return ESP_OK; +} + +static esp_err_t lr1121_apply_lora(const lora_params_t *p) +{ + uint32_t freq_hz = cmhz_to_hz(p->freq_centi_mhz); + lr11xx_radio_lora_bw_t bw = map_bw(p->bw_khz); + lr11xx_radio_lora_sf_t sf = map_sf(p->sf); + lr11xx_radio_lora_cr_t cr = map_cr(p->cr); + + lr11xx_radio_mod_params_lora_t mod = { + .sf = sf, + .bw = bw, + .cr = cr, + .ldro = smtc_shield_lr11xx_common_compute_lora_ldro(sf, bw), + }; + lr11xx_radio_pkt_params_lora_t pkt = { + .preamble_len_in_symb = p->preamble_syms, + .header_type = p->header_implicit ? LR11XX_RADIO_LORA_PKT_IMPLICIT : LR11XX_RADIO_LORA_PKT_EXPLICIT, + .pld_len_in_bytes = p->payload_len, + .crc = p->crc_on ? LR11XX_RADIO_LORA_CRC_ON : LR11XX_RADIO_LORA_CRC_OFF, + .iq = p->iq_invert ? LR11XX_RADIO_LORA_IQ_INVERTED : LR11XX_RADIO_LORA_IQ_STANDARD, + }; + + const lr11xx_radio_rssi_calibration_table_t *rssi_cal = smtc_shield_lr11xx_get_rssi_calibration_table(freq_hz); + const smtc_shield_lr11xx_pa_pwr_cfg_t *pa_cfg = smtc_shield_lr1121mb1gis_get_pa_pwr_cfg(freq_hz, p->tx_power_dbm); + if (pa_cfg == NULL || rssi_cal == NULL) { + return ESP_ERR_INVALID_ARG; + } + + lr1121_calibrate_image_for_freq(freq_hz); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_pkt_type(&s_lr, LR11XX_RADIO_PKT_TYPE_LORA)), TAG, "pkt type"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_rf_freq(&s_lr, freq_hz)), TAG, "freq"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_rssi_calibration(&s_lr, rssi_cal)), TAG, "rssi cal"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_pa_cfg(&s_lr, &pa_cfg->pa_config)), TAG, "pa cfg"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_tx_params(&s_lr, pa_cfg->power, LR1121_PA_RAMP)), TAG, "tx params"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_rx_tx_fallback_mode(&s_lr, LR11XX_RADIO_FALLBACK_STDBY_RC)), TAG, "fallback"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_cfg_rx_boosted(&s_lr, true)), TAG, "rx boost"); + + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_lora_mod_params(&s_lr, &mod)), TAG, "mod params"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_lora_pkt_params(&s_lr, &pkt)), TAG, "pkt params"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_lora_sync_word(&s_lr, LR1121_SYNC_WORD)), TAG, "sync word"); + + lr11xx_system_irq_mask_t irq_mask = LR11XX_SYSTEM_IRQ_RX_DONE | LR11XX_SYSTEM_IRQ_TIMEOUT | LR11XX_SYSTEM_IRQ_HEADER_ERROR | LR11XX_SYSTEM_IRQ_CRC_ERROR; + if (s_is_tx) { + irq_mask |= LR11XX_SYSTEM_IRQ_TX_DONE; + } + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_set_dio_irq_params(&s_lr, irq_mask, 0)), TAG, "irq mask"); + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_system_clear_irq_status(&s_lr, LR11XX_SYSTEM_IRQ_ALL_MASK)), TAG, "clr irq"); + + return ESP_OK; +} + +static esp_err_t lr1121_enter_rx_continuous(void) +{ + s_last_rx_restart_us = esp_timer_get_time(); + return lr_status_to_esp(lr11xx_radio_set_rx_with_timeout_in_rtc_step(&s_lr, LR1121_RX_CONTINUOUS)); +} + +bool lora_radio_init(bool is_tx_role) +{ + s_is_tx = is_tx_role; + s_params.freq_centi_mhz = CONFIG_LORA_FREQ_MHZ * 100; + s_params.bw_khz = CONFIG_LORA_BW_KHZ; + s_params.sf = CONFIG_LORA_SF; + s_params.cr = CONFIG_LORA_CR; + s_params.tx_power_dbm = 14; + s_params.preamble_syms = 8; + s_params.payload_len = 0; + s_params.crc_on = true; + s_params.iq_invert = false; + s_params.header_implicit = false; + sanitize_params(&s_params); + + ESP_LOGI(TAG, "Init LR1121 over SPI host %d (MOSI=%d, MISO=%d, SCK=%d, CS=%d, RST=%d, BUSY=%d, DIO1=%d)", + CONFIG_LORA_SPI_HOST, + CONFIG_LORA_PIN_MOSI, + CONFIG_LORA_PIN_MISO, + CONFIG_LORA_PIN_SCK, + CONFIG_LORA_PIN_CS, + CONFIG_LORA_PIN_RST, + CONFIG_LORA_PIN_BUSY, + CONFIG_LORA_PIN_DIO1); + if (CONFIG_LORA_PIN_BUSY < 0) { + ESP_LOGE(TAG, "BUSY pin обов'язковий для LR1121, вкажіть коректний GPIO"); + return false; + } + + if (radio_setup_spi() != ESP_OK) { + ESP_LOGE(TAG, "SPI init failed"); + return false; + } + if (lr1121_hw_init() != ESP_OK) { + ESP_LOGE(TAG, "IO init failed"); + return false; + } + if (lr1121_system_boot() != ESP_OK) { + ESP_LOGE(TAG, "System boot failed"); + return false; + } + if (lr1121_apply_lora(&s_params) != ESP_OK) { + ESP_LOGE(TAG, "Initial params failed"); + return false; + } + + if (!s_is_tx) { + lr1121_enter_rx_continuous(); + } + + ESP_LOGI(TAG, "Radio ready: %.2f MHz BW %d kHz SF %d CR 4/%d TX %d dBm", + s_params.freq_centi_mhz / 100.0f, + s_params.bw_khz, + s_params.sf, + s_params.cr, + s_params.tx_power_dbm); + return true; +} + +esp_err_t lora_radio_apply_params(const lora_params_t *params) +{ + if (!params) { + return ESP_ERR_INVALID_ARG; + } + lora_params_t clean = *params; + sanitize_params(&clean); + esp_err_t err = lr1121_apply_lora(&clean); + if (err == ESP_OK) { + s_params = clean; + if (!s_is_tx) { + lr1121_enter_rx_continuous(); + } + ESP_LOGI(TAG, "Apply LoRa params: %.2f MHz, BW %d kHz, SF %d, CR 4/%d, TX %d dBm", + s_params.freq_centi_mhz / 100.0f, + s_params.bw_khz, + s_params.sf, + s_params.cr, + s_params.tx_power_dbm); + } + return err; +} + +esp_err_t lora_radio_set_tx_power_dbm(int dbm) +{ + lora_params_t next = s_params; + next.tx_power_dbm = dbm; + return lora_radio_apply_params(&next); +} + +esp_err_t lora_radio_set_frequency_centi_mhz(int freq_centi_mhz) +{ + lora_params_t next = s_params; + next.freq_centi_mhz = freq_centi_mhz; + return lora_radio_apply_params(&next); +} + +void lora_radio_get_params(lora_params_t *out) +{ + if (!out) { + return; + } + *out = s_params; +} + +void lora_radio_tick_tx(void) +{ + if (!s_is_tx) { + return; + } + lr11xx_system_irq_mask_t irq_status = 0; + if (lr11xx_system_get_and_clear_irq_status(&s_lr, &irq_status) != LR11XX_STATUS_OK) { + return; + } + if (irq_status == 0) { + return; + } + s_metrics.last_status = (uint8_t)(irq_status & 0xFF); + if (irq_status & LR11XX_SYSTEM_IRQ_TX_DONE) { + s_tx_in_progress = false; + ESP_LOGI(TAG, "TX done"); + } + if (irq_status & LR11XX_SYSTEM_IRQ_TIMEOUT) { + s_tx_in_progress = false; + ESP_LOGW(TAG, "TX timeout"); + } +} + +void lora_radio_tick_rx(void) +{ + if (s_is_tx) { + return; + } + + lr11xx_system_irq_mask_t irq_status = 0; + if (lr11xx_system_get_and_clear_irq_status(&s_lr, &irq_status) != LR11XX_STATUS_OK) { + return; + } + if (irq_status == 0) { + int64_t now = esp_timer_get_time(); + if (now - s_last_rx_restart_us > 1000000) { + lr1121_enter_rx_continuous(); + } + return; + } + s_metrics.last_status = (uint8_t)(irq_status & 0xFF); + + if (irq_status & LR11XX_SYSTEM_IRQ_RX_DONE) { + lr11xx_radio_rx_buffer_status_t rx_status = {0}; + if (lr11xx_radio_get_rx_buffer_status(&s_lr, &rx_status) == LR11XX_STATUS_OK && rx_status.pld_len_in_bytes > 0) { + uint8_t buf[sizeof(s_last_payload)]; + uint8_t copy_len = rx_status.pld_len_in_bytes; + if (copy_len >= sizeof(buf)) { + copy_len = sizeof(buf) - 1; + } + if (lr11xx_regmem_read_buffer8(&s_lr, buf, rx_status.buffer_start_pointer, copy_len) == LR11XX_STATUS_OK) { + memcpy(s_last_payload, buf, copy_len); + s_last_payload[copy_len] = '\0'; + s_last_payload_len = copy_len; + + lr11xx_radio_pkt_status_lora_t pkt = {0}; + if (lr11xx_radio_get_lora_pkt_status(&s_lr, &pkt) == LR11XX_STATUS_OK) { + s_metrics.rssi_dbm = pkt.rssi_pkt_in_dbm; + s_metrics.snr_db = pkt.snr_pkt_in_db; + } + ESP_LOGI(TAG, "RX %u bytes RSSI=%ddBm SNR=%ddB \"%s\"", + (unsigned)copy_len, s_metrics.rssi_dbm, s_metrics.snr_db, s_last_payload); + } + } + lr1121_enter_rx_continuous(); + } + + if (irq_status & (LR11XX_SYSTEM_IRQ_TIMEOUT | LR11XX_SYSTEM_IRQ_HEADER_ERROR | LR11XX_SYSTEM_IRQ_CRC_ERROR)) { + ESP_LOGW(TAG, "RX irq=0x%04X (timeout/header/crc)", irq_status); + lr1121_enter_rx_continuous(); + } +} + +void lora_radio_get_metrics(lora_metrics_t *out) +{ + if (!out) { + return; + } + *out = s_metrics; +} + +void lora_radio_get_last_payload(char *out, size_t out_len) +{ + if (!out || out_len == 0) { + return; + } + if (s_last_payload_len == 0) { + strlcpy(out, "(no data)", out_len); + return; + } + strlcpy(out, s_last_payload, out_len); +} + +esp_err_t lora_radio_send(const uint8_t *data, size_t len) +{ + if (!s_is_tx) { + return ESP_ERR_INVALID_STATE; + } + if (!data || len == 0) { + return ESP_ERR_INVALID_ARG; + } + if (len > 255) { + len = 255; // обмеження довжини пакета + } + + // Оновити pkt params під фактичну довжину + lr11xx_radio_pkt_params_lora_t pkt = { + .preamble_len_in_symb = s_params.preamble_syms, + .header_type = s_params.header_implicit ? LR11XX_RADIO_LORA_PKT_IMPLICIT : LR11XX_RADIO_LORA_PKT_EXPLICIT, + .pld_len_in_bytes = (uint8_t)len, + .crc = s_params.crc_on ? LR11XX_RADIO_LORA_CRC_ON : LR11XX_RADIO_LORA_CRC_OFF, + .iq = s_params.iq_invert ? LR11XX_RADIO_LORA_IQ_INVERTED : LR11XX_RADIO_LORA_IQ_STANDARD, + }; + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_lora_pkt_params(&s_lr, &pkt)), TAG, "pkt params tx"); + + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_regmem_write_buffer8(&s_lr, data, len)), TAG, "write buf"); + + // timeout 0 => без тайм-ауту, чекаємо TX_DONE + ESP_RETURN_ON_ERROR(lr_status_to_esp(lr11xx_radio_set_tx(&s_lr, 0)), TAG, "set tx"); + s_tx_in_progress = true; + s_last_tx_us = esp_timer_get_time(); + s_params.payload_len = (uint8_t)len; + return ESP_OK; +} diff --git a/components/ui/CMakeLists.txt b/components/ui/CMakeLists.txt new file mode 100644 index 0000000..527b822 --- /dev/null +++ b/components/ui/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register( + SRCS "ui.c" + INCLUDE_DIRS "include" + REQUIRES common + PRIV_REQUIRES esp_driver_i2c esp_driver_gpio driver +) diff --git a/components/ui/Kconfig b/components/ui/Kconfig new file mode 100644 index 0000000..418f7eb --- /dev/null +++ b/components/ui/Kconfig @@ -0,0 +1,38 @@ +menu "Display" + +config DISPLAY_DRIVER + string "Display driver" + default "SSD1306 I2C OLED" + +config DISPLAY_I2C_PORT + int "Display I2C port" + range 0 1 + default 0 + +config DISPLAY_I2C_ADDR + int "Display I2C address" + default 60 + help + Decimal value of OLED I2C address (default 0x3C = 60). + +config DISPLAY_PIN_SDA + int "Display SDA pin" + default 21 + +config DISPLAY_PIN_RST + int "Display RESET pin (-1 if not used)" + default -1 + +config DISPLAY_PIN_SCL + int "Display SCL pin" + default 22 + +config DISPLAY_WIDTH + int "Display width (px)" + default 128 + +config DISPLAY_HEIGHT + int "Display height (px)" + default 64 + +endmenu diff --git a/components/ui/include/ui.h b/components/ui/include/ui.h new file mode 100644 index 0000000..2568691 --- /dev/null +++ b/components/ui/include/ui.h @@ -0,0 +1,5 @@ +#pragma once + +void ui_init(void); +void ui_show_role(const char *role); +void ui_show_status(const char *line1, const char *line2, const char *line3, const char *line4, const char *line5, const char *line6); diff --git a/components/ui/ui.c b/components/ui/ui.c new file mode 100644 index 0000000..6a2fbfc --- /dev/null +++ b/components/ui/ui.c @@ -0,0 +1,386 @@ +#include "ui.h" +#include +#include +#include +#include +#include +#include "esp_log.h" +#include "sdkconfig.h" +#include "driver/i2c.h" +#include "driver/gpio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#define TAG "ui" + +#define OLED_CONTROL_CMD 0x00 +#define OLED_CONTROL_DATA 0x40 +#define I2C_TIMEOUT_MS 50 + +static i2c_port_t s_port = CONFIG_DISPLAY_I2C_PORT; +static uint8_t s_addr = CONFIG_DISPLAY_I2C_ADDR; +static int s_reset_pin = CONFIG_DISPLAY_PIN_RST; +static uint8_t s_framebuf[CONFIG_DISPLAY_WIDTH * CONFIG_DISPLAY_HEIGHT / 8]; +static char s_role[32] = "LoRa"; +static bool s_i2c_ok = false; +static bool s_dirty = true; +static char s_prev_lines[6][48] = {{0}}; +static char s_prev_role[sizeof(s_role)] = {0}; + +// 5x7 font (ASCII 32..127), taken from a minimal public-domain font +static const uint8_t font5x7[] = { + 0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5F,0x00,0x00, 0x00,0x07,0x00,0x07,0x00, 0x14,0x7F,0x14,0x7F,0x14, + 0x24,0x2A,0x7F,0x2A,0x12, 0x23,0x13,0x08,0x64,0x62, 0x36,0x49,0x55,0x22,0x50, 0x00,0x05,0x03,0x00,0x00, + 0x00,0x1C,0x22,0x41,0x00, 0x00,0x41,0x22,0x1C,0x00, 0x14,0x08,0x3E,0x08,0x14, 0x08,0x08,0x3E,0x08,0x08, + 0x00,0x50,0x30,0x00,0x00, 0x08,0x08,0x08,0x08,0x08, 0x00,0x60,0x60,0x00,0x00, 0x20,0x10,0x08,0x04,0x02, + 0x3E,0x51,0x49,0x45,0x3E, 0x00,0x42,0x7F,0x40,0x00, 0x72,0x49,0x49,0x49,0x46, 0x21,0x41,0x45,0x4B,0x31, + 0x18,0x14,0x12,0x7F,0x10, 0x27,0x45,0x45,0x45,0x39, 0x3C,0x4A,0x49,0x49,0x30, 0x01,0x71,0x09,0x05,0x03, + 0x36,0x49,0x49,0x49,0x36, 0x06,0x49,0x49,0x29,0x1E, 0x00,0x36,0x36,0x00,0x00, 0x00,0x56,0x36,0x00,0x00, + 0x08,0x14,0x22,0x41,0x00, 0x14,0x14,0x14,0x14,0x14, 0x00,0x41,0x22,0x14,0x08, 0x02,0x01,0x59,0x09,0x06, + 0x3E,0x41,0x5D,0x59,0x4E, 0x7E,0x11,0x11,0x11,0x7E, 0x7F,0x49,0x49,0x49,0x36, 0x3E,0x41,0x41,0x41,0x22, + 0x7F,0x41,0x41,0x22,0x1C, 0x7F,0x49,0x49,0x49,0x41, 0x7F,0x09,0x09,0x09,0x01, 0x3E,0x41,0x49,0x49,0x7A, + 0x7F,0x08,0x08,0x08,0x7F, 0x00,0x41,0x7F,0x41,0x00, 0x20,0x40,0x41,0x3F,0x01, 0x7F,0x08,0x14,0x22,0x41, + 0x7F,0x40,0x40,0x40,0x40, 0x7F,0x02,0x04,0x02,0x7F, 0x7F,0x04,0x08,0x10,0x7F, 0x3E,0x41,0x41,0x41,0x3E, + 0x7F,0x09,0x09,0x09,0x06, 0x3E,0x41,0x51,0x21,0x5E, 0x7F,0x09,0x19,0x29,0x46, 0x46,0x49,0x49,0x49,0x31, + 0x01,0x01,0x7F,0x01,0x01, 0x3F,0x40,0x40,0x40,0x3F, 0x1F,0x20,0x40,0x20,0x1F, 0x7F,0x20,0x18,0x20,0x7F, + 0x63,0x14,0x08,0x14,0x63, 0x03,0x04,0x78,0x04,0x03, 0x61,0x51,0x49,0x45,0x43, 0x00,0x7F,0x41,0x41,0x00, + 0x02,0x04,0x08,0x10,0x20, 0x00,0x41,0x41,0x7F,0x00, 0x04,0x02,0x01,0x02,0x04, 0x40,0x40,0x40,0x40,0x40, + 0x00,0x01,0x02,0x04,0x00, 0x20,0x54,0x54,0x54,0x78, 0x7F,0x48,0x44,0x44,0x38, 0x38,0x44,0x44,0x44,0x28, + 0x38,0x44,0x44,0x48,0x7F, 0x38,0x54,0x54,0x54,0x18, 0x08,0x7E,0x09,0x01,0x02, 0x0C,0x52,0x52,0x52,0x3E, + 0x7F,0x08,0x04,0x04,0x78, 0x00,0x44,0x7D,0x40,0x00, 0x20,0x40,0x40,0x3D,0x00, 0x7F,0x10,0x28,0x44,0x00, + 0x00,0x41,0x7F,0x40,0x00, 0x7C,0x04,0x18,0x04,0x78, 0x7C,0x08,0x04,0x04,0x78, 0x38,0x44,0x44,0x44,0x38, + 0x7C,0x14,0x14,0x14,0x08, 0x08,0x14,0x14,0x18,0x7C, 0x7C,0x08,0x04,0x04,0x08, 0x48,0x54,0x54,0x54,0x24, + 0x04,0x3F,0x44,0x40,0x20, 0x3C,0x40,0x40,0x20,0x7C, 0x1C,0x20,0x40,0x20,0x1C, 0x3C,0x40,0x30,0x40,0x3C, + 0x44,0x28,0x10,0x28,0x44, 0x0C,0x50,0x50,0x50,0x3C, 0x44,0x64,0x54,0x4C,0x44, 0x00,0x08,0x36,0x41,0x00, + 0x00,0x00,0x7F,0x00,0x00, 0x00,0x41,0x36,0x08,0x00, 0x10,0x08,0x08,0x10,0x08, 0x78,0x46,0x41,0x46,0x78 +}; + +static esp_err_t ssd1306_write(uint8_t control, const uint8_t *data, size_t len) +{ + if (!s_i2c_ok) { + return ESP_ERR_INVALID_STATE; + } + if (!data || len == 0) { + return ESP_OK; + } + static uint8_t buf[CONFIG_DISPLAY_WIDTH + 2]; + if (len + 1 > sizeof(buf)) { + return ESP_ERR_INVALID_SIZE; + } + buf[0] = control; + memcpy(&buf[1], data, len); + return i2c_master_write_to_device(s_port, s_addr, buf, len + 1, pdMS_TO_TICKS(I2C_TIMEOUT_MS)); +} + +static inline esp_err_t ssd1306_send_cmd(uint8_t cmd) +{ + if (!s_i2c_ok) { + return ESP_ERR_INVALID_STATE; + } + return ssd1306_write(OLED_CONTROL_CMD, &cmd, 1); +} + +static inline esp_err_t ssd1306_send_cmd2(uint8_t cmd, uint8_t val) +{ + if (!s_i2c_ok) { + return ESP_ERR_INVALID_STATE; + } + uint8_t data[2] = {cmd, val}; + return ssd1306_write(OLED_CONTROL_CMD, data, sizeof(data)); +} + +static inline esp_err_t ssd1306_send_data(const uint8_t *data, size_t len) +{ + if (!s_i2c_ok) { + return ESP_ERR_INVALID_STATE; + } + return ssd1306_write(OLED_CONTROL_DATA, data, len); +} + +static void i2c_init(void) +{ + s_i2c_ok = false; + if (s_reset_pin == CONFIG_DISPLAY_PIN_SCL || s_reset_pin == CONFIG_DISPLAY_PIN_SDA) { + ESP_LOGW(TAG, "RST pin matches I2C pin (RST=%d, SDA=%d, SCL=%d) — ensure wiring is correct", s_reset_pin, CONFIG_DISPLAY_PIN_SDA, CONFIG_DISPLAY_PIN_SCL); + } + + // Базова валідація пінів, щоб не падати через ESP_ERR_INVALID_ARG + if (CONFIG_DISPLAY_PIN_SDA < 0 || CONFIG_DISPLAY_PIN_SCL < 0 || + CONFIG_DISPLAY_PIN_SDA > 48 || CONFIG_DISPLAY_PIN_SCL > 48 || + CONFIG_DISPLAY_PIN_SDA == CONFIG_DISPLAY_PIN_SCL || + CONFIG_DISPLAY_PIN_SDA == 45 || CONFIG_DISPLAY_PIN_SDA == 46 || + CONFIG_DISPLAY_PIN_SCL == 45 || CONFIG_DISPLAY_PIN_SCL == 46) { + ESP_LOGE(TAG, "Invalid I2C pins: SDA=%d SCL=%d (port %d)", + CONFIG_DISPLAY_PIN_SDA, CONFIG_DISPLAY_PIN_SCL, s_port); + return; + } + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = CONFIG_DISPLAY_PIN_SDA, + .scl_io_num = CONFIG_DISPLAY_PIN_SCL, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + }; + conf.master.clk_speed = 400000; + esp_err_t err = i2c_param_config(s_port, &conf); + if (err != ESP_OK) { + ESP_LOGE(TAG, "i2c_param_config failed: SDA=%d SCL=%d port=%d err=%s", + CONFIG_DISPLAY_PIN_SDA, CONFIG_DISPLAY_PIN_SCL, s_port, esp_err_to_name(err)); + return; + } + err = i2c_driver_install(s_port, conf.mode, 0, 0, 0); + if (err != ESP_OK) { + ESP_LOGE(TAG, "i2c_driver_install failed: port=%d err=%s", s_port, esp_err_to_name(err)); + return; + } + s_i2c_ok = true; +} + +static void oled_reset(void) +{ + if (s_reset_pin < 0) { + return; + } + gpio_config_t io_conf = { + .pin_bit_mask = 1ULL << s_reset_pin, + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + gpio_config(&io_conf); + gpio_set_level(s_reset_pin, 1); + vTaskDelay(pdMS_TO_TICKS(1)); + gpio_set_level(s_reset_pin, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(s_reset_pin, 1); + vTaskDelay(pdMS_TO_TICKS(10)); +} + +static void ssd1306_init_sequence(void) +{ + ESP_LOGI(TAG, "Init OLED %s %dx%d at I2C%d addr 0x%02X (SDA=%d, SCL=%d, RST=%d)", + CONFIG_DISPLAY_DRIVER, + CONFIG_DISPLAY_WIDTH, + CONFIG_DISPLAY_HEIGHT, + s_port, + s_addr, + CONFIG_DISPLAY_PIN_SDA, + CONFIG_DISPLAY_PIN_SCL, + CONFIG_DISPLAY_PIN_RST); + + uint8_t com_pins = (CONFIG_DISPLAY_HEIGHT == 32) ? 0x02 : 0x12; + uint8_t multiplex = CONFIG_DISPLAY_HEIGHT - 1; + + ESP_ERROR_CHECK(ssd1306_send_cmd(0xAE)); // display off + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xD5, 0x80)); // clock div + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xA8, multiplex)); // multiplex + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xD3, 0x00)); // display offset + ESP_ERROR_CHECK(ssd1306_send_cmd(0x40)); // start line = 0 + ESP_ERROR_CHECK(ssd1306_send_cmd2(0x8D, 0x14)); // charge pump on + ESP_ERROR_CHECK(ssd1306_send_cmd2(0x20, 0x00)); // horizontal addressing + ESP_ERROR_CHECK(ssd1306_send_cmd(0xA1)); // segment remap + ESP_ERROR_CHECK(ssd1306_send_cmd(0xC8)); // COM scan dec + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xDA, com_pins)); // COM pins config + ESP_ERROR_CHECK(ssd1306_send_cmd2(0x81, 0x7F)); // contrast + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xD9, 0xF1)); // pre-charge + ESP_ERROR_CHECK(ssd1306_send_cmd2(0xDB, 0x40)); // VCOM detect + ESP_ERROR_CHECK(ssd1306_send_cmd(0xA4)); // resume RAM + ESP_ERROR_CHECK(ssd1306_send_cmd(0xA6)); // normal display + ESP_ERROR_CHECK(ssd1306_send_cmd(0x2E)); // deactivate scroll + ESP_ERROR_CHECK(ssd1306_send_cmd(0xAF)); // display on + + // set column/page range to avoid leftover data on wider panels + ESP_ERROR_CHECK(ssd1306_send_cmd(0x21)); + ESP_ERROR_CHECK(ssd1306_send_cmd(0x00)); + ESP_ERROR_CHECK(ssd1306_send_cmd(CONFIG_DISPLAY_WIDTH - 1)); + ESP_ERROR_CHECK(ssd1306_send_cmd(0x22)); + ESP_ERROR_CHECK(ssd1306_send_cmd(0x00)); + ESP_ERROR_CHECK(ssd1306_send_cmd((CONFIG_DISPLAY_HEIGHT / 8) - 1)); +} + +static void clear_buffer(void) +{ + memset(s_framebuf, 0x00, sizeof(s_framebuf)); +} + +static void draw_pixel(int x, int y, bool on) +{ + if (x < 0 || x >= CONFIG_DISPLAY_WIDTH || y < 0 || y >= CONFIG_DISPLAY_HEIGHT) { + return; + } + int page = y / 8; + int bit = y % 8; + size_t idx = page * CONFIG_DISPLAY_WIDTH + x; + if (on) { + s_framebuf[idx] |= (1U << bit); + } else { + s_framebuf[idx] &= ~(1U << bit); + } +} + +static void draw_char_scaled(int x, int y, char c, int scale) +{ + if (c < 32 || c > 126) { + c = '?'; + } + if (scale < 1) { + scale = 1; + } + const uint8_t *glyph = &font5x7[(c - 32) * 5]; + for (int col = 0; col < 5; col++) { + uint8_t line = glyph[col]; + for (int row = 0; row < 7; row++) { + bool pixel_on = line & (1 << row); + for (int dx = 0; dx < scale; dx++) { + for (int dy = 0; dy < scale; dy++) { + int px = x + col * scale + dx; + int py = y + row * scale + dy; + draw_pixel(px, py, pixel_on); + } + } + } + } + // spacing column + for (int dx = 0; dx < scale; dx++) { + int px = x + 5 * scale + dx; + for (int row = 0; row < 7 * scale; row++) { + draw_pixel(px, y + row, false); + } + } +} + +static void draw_text_scaled(int x, int y, const char *text, int scale) +{ + int cursor_x = x; + while (text && *text) { + draw_char_scaled(cursor_x, y, *text, scale); + cursor_x += 6 * scale; + text++; + } +} + +static void sanitize_ascii(const char *in, char *out, size_t out_len) +{ + if (!out || out_len == 0) { + return; + } + if (!in) { + out[0] = '\0'; + return; + } + size_t out_idx = 0; + for (size_t i = 0; in[i] != '\0' && out_idx + 1 < out_len; i++) { + unsigned char c = (unsigned char)in[i]; + if (c >= 32 && c <= 126) { + out[out_idx++] = (char)c; + } else { + out[out_idx++] = ' '; + } + } + out[out_idx] = '\0'; +} + +static void sanitize_role(const char *role) +{ + if (!role || role[0] == '\0') { + strlcpy(s_role, "LoRa", sizeof(s_role)); + return; + } + if (strstr(role, "ередавач")) { + strlcpy(s_role, "TX", sizeof(s_role)); + return; + } + if (strstr(role, "риймач")) { + strlcpy(s_role, "RX", sizeof(s_role)); + return; + } + sanitize_ascii(role, s_role, sizeof(s_role)); + if (s_role[0] == '\0') { + strlcpy(s_role, "LoRa", sizeof(s_role)); + } +} + +static void ssd1306_flush(void) +{ + const int pages = CONFIG_DISPLAY_HEIGHT / 8; + for (int page = 0; page < pages; page++) { + ESP_ERROR_CHECK(ssd1306_send_cmd(0xB0 | page)); + ESP_ERROR_CHECK(ssd1306_send_cmd(0x00)); + ESP_ERROR_CHECK(ssd1306_send_cmd(0x10)); + const uint8_t *line = &s_framebuf[page * CONFIG_DISPLAY_WIDTH]; + ESP_ERROR_CHECK(ssd1306_send_data(line, CONFIG_DISPLAY_WIDTH)); + } +} + +void ui_init(void) +{ + i2c_init(); + if (!s_i2c_ok) { + ESP_LOGE(TAG, "UI disabled: I2C init failed"); + return; + } + oled_reset(); + ssd1306_init_sequence(); + clear_buffer(); + ssd1306_flush(); + s_dirty = true; +} + +void ui_show_role(const char *role) +{ + if (!s_i2c_ok) { + return; + } + ESP_LOGI(TAG, "UI: role %s", role); + sanitize_role(role); + s_dirty = true; +} + +void ui_show_status(const char *line1, const char *line2, const char *line3, const char *line4, const char *line5, const char *line6) +{ + if (!s_i2c_ok) { + return; + } + const char *lines[6] = {line1, line2, line3, line4, line5, line6}; + char safe[6][48] = {{0}}; + bool changed = s_dirty; + + if (strncmp(s_prev_role, s_role, sizeof(s_prev_role)) != 0) { + changed = true; + strlcpy(s_prev_role, s_role, sizeof(s_prev_role)); + } + + for (int i = 0; i < 6; i++) { + sanitize_ascii(lines[i], safe[i], sizeof(safe[i])); + if (strncmp(s_prev_lines[i], safe[i], sizeof(s_prev_lines[i])) != 0) { + changed = true; + strlcpy(s_prev_lines[i], safe[i], sizeof(s_prev_lines[i])); + } + } + + if (!changed) { + return; + } + + clear_buffer(); + + // Header + draw_text_scaled(0, 0, s_role, 2); + + // Рядки починаються нижче заголовка, щоб не накладались + int y = 16; + const int row_height = 8; + for (int i = 0; i < 6; i++) { + if (safe[i][0] != '\0') { + draw_text_scaled(0, y, safe[i], 1); + } + y += row_height + 2; + } + + ssd1306_flush(); + s_dirty = false; + ESP_LOGI(TAG, "UI: %s | %s | %s | %s | %s | %s", + safe[0], safe[1], safe[2], safe[3], safe[4], safe[5]); +} diff --git a/components/usb_api/CMakeLists.txt b/components/usb_api/CMakeLists.txt new file mode 100644 index 0000000..bb3e4bb --- /dev/null +++ b/components/usb_api/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "usb_api.c" + INCLUDE_DIRS "include" + REQUIRES driver +) diff --git a/components/usb_api/include/usb_api.h b/components/usb_api/include/usb_api.h new file mode 100644 index 0000000..d15ad44 --- /dev/null +++ b/components/usb_api/include/usb_api.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +typedef void (*usb_api_line_handler_t)(const char *line); + +// Initialize USB Serial/JTAG line reader; pass handler for complete lines. +void usb_api_init(usb_api_line_handler_t handler); + +// Non-blocking poll; call from main loop/task. +void usb_api_tick(void); + +// Send a line to host (no automatic newline added). +void usb_api_send_line(const char *line); + +// Return true when host is connected over USB Serial/JTAG. +bool usb_api_is_connected(void); diff --git a/components/usb_api/usb_api.c b/components/usb_api/usb_api.c new file mode 100644 index 0000000..6258961 --- /dev/null +++ b/components/usb_api/usb_api.c @@ -0,0 +1,75 @@ +#include "usb_api.h" +#include +#include "esp_err.h" +#include "esp_log.h" +#include "driver/usb_serial_jtag.h" + +static const char *TAG = "usb_api"; +static usb_api_line_handler_t s_handler = NULL; +static char s_line_buf[256]; +static size_t s_line_len = 0; + +void usb_api_init(usb_api_line_handler_t handler) +{ + s_handler = handler; + s_line_len = 0; + usb_serial_jtag_driver_config_t cfg = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); + esp_err_t err = usb_serial_jtag_driver_install(&cfg); + if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { + ESP_LOGE(TAG, "usb driver install failed: %s", esp_err_to_name(err)); + } +} + +bool usb_api_is_connected(void) +{ + return usb_serial_jtag_is_connected(); +} + +void usb_api_send_line(const char *line) +{ + if (!line) { + return; + } + size_t len = strlen(line); + if (len == 0) { + return; + } + int written = usb_serial_jtag_write_bytes((const uint8_t *)line, len, 0); + if (written < 0) { + ESP_LOGW(TAG, "usb write failed"); + } +} + +static void handle_complete_line(void) +{ + if (s_line_len == 0) { + return; + } + s_line_buf[s_line_len] = '\0'; + if (s_handler) { + s_handler(s_line_buf); + } + s_line_len = 0; +} + +void usb_api_tick(void) +{ + uint8_t buf[64]; + int n = usb_serial_jtag_read_bytes(buf, sizeof(buf), 0); + if (n <= 0) { + return; + } + for (int i = 0; i < n; i++) { + char c = (char)buf[i]; + if (c == '\r' || c == '\n') { + handle_complete_line(); + continue; + } + if (s_line_len + 1 >= sizeof(s_line_buf)) { + // drop line on overflow + s_line_len = 0; + continue; + } + s_line_buf[s_line_len++] = c; + } +} diff --git a/idf_component.yml b/idf_component.yml new file mode 100644 index 0000000..f0c20ca --- /dev/null +++ b/idf_component.yml @@ -0,0 +1,18 @@ +## IDF Component Manager Manifest File +dependencies: + ## Required IDF version + idf: + version: '>=4.1.0' + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true + jgromes/radiolib: ^7.1.2 + waveshare/esp_lora_1121: ^1.0.0 diff --git a/py_app/README.md b/py_app/README.md new file mode 100644 index 0000000..5d5b7e5 --- /dev/null +++ b/py_app/README.md @@ -0,0 +1,25 @@ +# Py Qt configurator for RX/TX firmware + +Desktop GUI (PyQt6) that talks to the device over USB CDC (virtual COM). It sends line-delimited JSON commands and applies changes immediately when you edit controls. + +## Setup +``` +cd py_app +python3 -m venv .venv +source .venv/bin/activate # or .venv\Scripts\activate on Windows +pip install -r requirements.txt +python main.py +``` + +## Protocol expected on the device side +The firmware should read UTF-8 lines from the USB CDC serial port and handle JSON commands: +- `{"cmd": "set_params", "params": {freq_mhz, band, bw_khz, sf, cr, tx_power_dbm, period_ms, tx_enabled, payload}}` — apply and persist as needed. +- `{"cmd": "get_status"}` — respond with JSON status (e.g. metrics, current params). +- `{"cmd": "reboot_bootloader"}` — reboot into ROM bootloader for flashing. + +The GUI logs any text received, so returning JSON or human-readable lines works. + +## Notes +- Bands offered: 430/868/915/L/S/2.4G; frequency control is in MHz (150–2500). +- Payload length is limited to 31 chars to match the firmware UI constraint. +- Changes are debounced by 150 ms; dragging a spinbox will send the last value when you stop. diff --git a/py_app/main.py b/py_app/main.py new file mode 100644 index 0000000..df1cc15 --- /dev/null +++ b/py_app/main.py @@ -0,0 +1,426 @@ +#!/usr/bin/env python3 +""" +PyQt6 desktop tool for configuring the RX/TX firmware over USB CDC. +Protocol: line-delimited JSON. Expected commands (device-side to implement): + {"cmd": "set_params", "params": {freq_mhz, bw_khz, sf, cr, tx_power_dbm, payload, period_ms, tx_enabled, band}} + {"cmd": "get_status"} + {"cmd": "reboot_bootloader"} +The GUI sends updates automatically when fields change. +""" +from __future__ import annotations + +import json +import sys +import threading +from dataclasses import dataclass +from typing import Dict, Optional + +from PyQt6.QtCore import QTimer, pyqtSignal, QObject +from PyQt6.QtWidgets import ( + QApplication, + QCheckBox, + QComboBox, + QGridLayout, + QGroupBox, + QHBoxLayout, + QLabel, + QLineEdit, + QMainWindow, + QPushButton, + QSpinBox, + QTextEdit, + QVBoxLayout, + QWidget, +) + +import serial +from serial.tools import list_ports + + +BANDS = [ + ("430", 430), + ("868", 868), + ("915", 915), + ("L" , 1550), # MHz midpoint + ("S" , 2000), + ("2.4G", 2442), +] + + +@dataclass +class DeviceParams: + freq_mhz: int = 433 + band: str = "430" + bw_khz: int = 125 + sf: int = 7 + cr: int = 5 + tx_power_dbm: int = 14 + period_ms: int = 1000 + tx_enabled: bool = True + payload: str = "PING 1" + + def to_dict(self) -> Dict[str, object]: + return { + "freq_mhz": self.freq_mhz, + "band": self.band, + "bw_khz": self.bw_khz, + "sf": self.sf, + "cr": self.cr, + "tx_power_dbm": self.tx_power_dbm, + "period_ms": self.period_ms, + "tx_enabled": self.tx_enabled, + "payload": self.payload, + } + + +class DeviceConnection(QObject): + status_changed = pyqtSignal(str) + data_received = pyqtSignal(str) + connected_changed = pyqtSignal(bool) + + def __init__(self) -> None: + super().__init__() + self._ser: Optional[serial.Serial] = None + self._rx_thread: Optional[threading.Thread] = None + self._stop = threading.Event() + + @staticmethod + def available_ports(): + return list_ports.comports() + + def connect(self, port: str, baud: int = 115200) -> None: + self.disconnect() + try: + self._ser = serial.Serial(port=port, baudrate=baud, timeout=0.1) + except serial.SerialException as exc: + self.status_changed.emit(f"Connect failed: {exc}") + self._ser = None + return + self._stop.clear() + self._rx_thread = threading.Thread(target=self._rx_loop, daemon=True) + self._rx_thread.start() + self.status_changed.emit(f"Connected to {port} @ {baud}") + self.connected_changed.emit(True) + + def disconnect(self) -> None: + self._stop.set() + if self._rx_thread and self._rx_thread.is_alive(): + self._rx_thread.join(timeout=0.5) + self._rx_thread = None + if self._ser: + try: + self._ser.close() + except Exception: + pass + was_connected = self._ser is not None + self._ser = None + if was_connected: + self.connected_changed.emit(False) + self.status_changed.emit("Disconnected") + + def is_connected(self) -> bool: + return self._ser is not None and self._ser.is_open + + def send_json(self, obj: Dict[str, object]) -> None: + if not self.is_connected(): + self.status_changed.emit("Not connected") + return + try: + line = json.dumps(obj) + "\n" + self._ser.write(line.encode("utf-8")) + except Exception as exc: + self.status_changed.emit(f"Send failed: {exc}") + + def _rx_loop(self) -> None: + assert self._ser is not None + while not self._stop.is_set(): + try: + raw = self._ser.readline() + except Exception as exc: + self.status_changed.emit(f"Read error: {exc}") + break + if not raw: + continue + try: + text = raw.decode("utf-8", errors="replace").strip() + except Exception: + continue + if text: + self.data_received.emit(text) + self.connected_changed.emit(False) + + +class MainWindow(QMainWindow): + def __init__(self) -> None: + super().__init__() + self.setWindowTitle("LoRa RX/TX Config") + self.conn = DeviceConnection() + self.params = DeviceParams() + self._tx_widgets = [] + self._apply_timer = QTimer(self) + self._apply_timer.setSingleShot(True) + self._apply_timer.timeout.connect(self.send_params) + self._build_ui() + self._wire() + + def _build_ui(self) -> None: + container = QWidget() + main_layout = QVBoxLayout(container) + + # Connection controls + conn_row = QHBoxLayout() + self.port_combo = QComboBox() + self.refresh_ports() + self.btn_refresh = QPushButton("Refresh") + self.btn_connect = QPushButton("Connect") + conn_row.addWidget(QLabel("Port:")) + conn_row.addWidget(self.port_combo, stretch=1) + conn_row.addWidget(self.btn_refresh) + conn_row.addWidget(self.btn_connect) + main_layout.addLayout(conn_row) + + # Parameters + params_group = QGroupBox("Radio parameters") + grid = QGridLayout(params_group) + + self.spin_freq = QSpinBox() + self.spin_freq.setRange(150, 2500) + self.spin_freq.setSuffix(" MHz") + self.spin_freq.setValue(self.params.freq_mhz) + + self.combo_band = QComboBox() + for name, _ in BANDS: + self.combo_band.addItem(name) + self.combo_band.setCurrentText(self.params.band) + + self.combo_bw = QComboBox() + for bw in (125, 250, 500): + self.combo_bw.addItem(f"{bw} kHz", bw) + self.combo_bw.setCurrentIndex(0) + + self.combo_sf = QComboBox() + for sf in range(5, 13): + self.combo_sf.addItem(f"SF{sf}", sf) + self.combo_sf.setCurrentText("SF7") + + self.combo_cr = QComboBox() + for cr in range(5, 9): + self.combo_cr.addItem(f"4/{cr}", cr) + self.combo_cr.setCurrentIndex(0) + + self.spin_power = QSpinBox() + self.spin_power.setRange(-17, 22) + self.spin_power.setSuffix(" dBm") + self.spin_power.setValue(self.params.tx_power_dbm) + + self.spin_period = QSpinBox() + self.spin_period.setRange(100, 60000) + self.spin_period.setSingleStep(100) + self.spin_period.setSuffix(" ms") + self.spin_period.setValue(self.params.period_ms) + + self.chk_tx_enabled = QCheckBox("TX enabled") + self.chk_tx_enabled.setChecked(self.params.tx_enabled) + + self.edit_payload = QLineEdit(self.params.payload) + self.edit_payload.setMaxLength(31) + + grid.addWidget(QLabel("Band"), 0, 0) + grid.addWidget(self.combo_band, 0, 1) + grid.addWidget(QLabel("Frequency"), 1, 0) + grid.addWidget(self.spin_freq, 1, 1) + grid.addWidget(QLabel("Bandwidth"), 2, 0) + grid.addWidget(self.combo_bw, 2, 1) + grid.addWidget(QLabel("Spreading factor"), 3, 0) + grid.addWidget(self.combo_sf, 3, 1) + grid.addWidget(QLabel("Coding rate"), 4, 0) + grid.addWidget(self.combo_cr, 4, 1) + self.lbl_tx_power = QLabel("TX power") + grid.addWidget(self.lbl_tx_power, 5, 0) + grid.addWidget(self.spin_power, 5, 1) + self.lbl_payload = QLabel("Payload") + grid.addWidget(self.lbl_payload, 6, 0) + grid.addWidget(self.edit_payload, 6, 1) + self.lbl_period = QLabel("Period") + grid.addWidget(self.lbl_period, 7, 0) + grid.addWidget(self.spin_period, 7, 1) + grid.addWidget(self.chk_tx_enabled, 8, 1) + + main_layout.addWidget(params_group) + + # Actions + actions = QHBoxLayout() + self.btn_boot = QPushButton("Bootloader") + actions.addWidget(self.btn_boot) + main_layout.addLayout(actions) + + # Status widgets for live metrics + metrics_row = QHBoxLayout() + self.lbl_role = QLabel("role: ?") + self.lbl_snr = QLabel("SNR: -") + self.lbl_rssi = QLabel("RSSI: -") + self.lbl_status = QLabel("IRQ: -") + metrics_row.addWidget(self.lbl_role) + metrics_row.addWidget(self.lbl_snr) + metrics_row.addWidget(self.lbl_rssi) + metrics_row.addWidget(self.lbl_status) + metrics_row.addStretch() + main_layout.addLayout(metrics_row) + + self.lbl_rx_payload = QLabel("Payload: -") + self.lbl_rx_payload.setWordWrap(True) + main_layout.addWidget(self.lbl_rx_payload) + + self.log_view = QTextEdit() + self.log_view.setReadOnly(True) + self.log_view.setPlaceholderText("Incoming lines...") + main_layout.addWidget(self.log_view) + + self.status_label = QLabel("Idle") + main_layout.addWidget(self.status_label) + + self.setCentralWidget(container) + self._tx_widgets = [ + self.lbl_tx_power, + self.spin_power, + self.lbl_payload, + self.edit_payload, + self.lbl_period, + self.spin_period, + self.chk_tx_enabled, + ] + self._set_tx_controls_visible(True) + + def _wire(self) -> None: + self.btn_refresh.clicked.connect(self.refresh_ports) + self.btn_connect.clicked.connect(self.toggle_connect) + self.btn_boot.clicked.connect(self.request_bootloader) + + for widget in ( + self.combo_band, + self.combo_bw, + self.combo_sf, + self.combo_cr, + ): + widget.currentIndexChanged.connect(self.schedule_apply) + + for widget in ( + self.spin_freq, + self.spin_power, + self.spin_period, + ): + widget.valueChanged.connect(self.schedule_apply) + + self.chk_tx_enabled.stateChanged.connect(self.schedule_apply) + self.edit_payload.textChanged.connect(self.schedule_apply) + + self.conn.status_changed.connect(self.append_status) + self.conn.data_received.connect(self.append_rx) + self.conn.connected_changed.connect(self.on_connected_changed) + + self.poll_timer = QTimer(self) + self.poll_timer.timeout.connect(self.request_status) + + def refresh_ports(self) -> None: + current = self.port_combo.currentText() + self.port_combo.clear() + for p in self.conn.available_ports(): + self.port_combo.addItem(p.device) + if current: + idx = self.port_combo.findText(current) + if idx >= 0: + self.port_combo.setCurrentIndex(idx) + + def toggle_connect(self) -> None: + if self.conn.is_connected(): + self.conn.disconnect() + return + port = self.port_combo.currentText() + if not port: + self.append_status("Select a port first") + return + self.conn.connect(port) + + def on_connected_changed(self, connected: bool) -> None: + self.btn_connect.setText("Disconnect" if connected else "Connect") + if connected: + self.send_params() + self.poll_timer.start(1000) + else: + self.poll_timer.stop() + self._set_tx_controls_visible(True) + self.lbl_rx_payload.setText("Payload: -") + + def schedule_apply(self) -> None: + # debounce rapid changes (spinner drags) + self._apply_timer.start(150) + + def gather_params(self) -> DeviceParams: + p = DeviceParams() + p.band = self.combo_band.currentText() + p.freq_mhz = self.spin_freq.value() + p.bw_khz = int(self.combo_bw.currentData()) + p.sf = int(self.combo_sf.currentData()) + p.cr = int(self.combo_cr.currentData()) + p.tx_power_dbm = self.spin_power.value() + p.period_ms = self.spin_period.value() + p.tx_enabled = self.chk_tx_enabled.isChecked() + p.payload = self.edit_payload.text() + return p + + def send_params(self) -> None: + self.params = self.gather_params() + self.conn.send_json({"cmd": "set_params", "params": self.params.to_dict()}) + + def request_status(self) -> None: + self.conn.send_json({"cmd": "get_status"}) + + def request_bootloader(self) -> None: + self.conn.send_json({"cmd": "reboot_bootloader"}) + + def append_status(self, text: str) -> None: + self.status_label.setText(text) + + def append_rx(self, text: str) -> None: + # Try to parse JSON status responses to populate labels + try: + obj = json.loads(text) + except Exception: + self.log_view.append(f"[rx] {text}") + return + + if obj.get("resp") == "status": + role = obj.get("role", "?") + snr = obj.get("snr_db", None) + rssi = obj.get("rssi_dbm", None) + irq = obj.get("last_status", None) + payload = obj.get("payload", None) + self.lbl_role.setText(f"role: {role}") + self.lbl_snr.setText(f"SNR: {snr} dB" if snr is not None else "SNR: -") + self.lbl_rssi.setText(f"RSSI: {rssi} dBm" if rssi is not None else "RSSI: -") + self.lbl_status.setText(f"IRQ: 0x{irq:02X}" if irq is not None else "IRQ: -") + if payload is not None: + self.lbl_rx_payload.setText(f"Payload: {payload}") + else: + self.lbl_rx_payload.setText("Payload: -") + role_text = str(role).lower() + is_rx = role_text.startswith("rx") or role_text == "receiver" + self._set_tx_controls_visible(not is_rx) + else: + self.status_label.setText(text) + + def _set_tx_controls_visible(self, visible: bool) -> None: + for widget in self._tx_widgets: + widget.setVisible(visible) + + +def main() -> int: + app = QApplication(sys.argv) + win = MainWindow() + win.setFixedSize(520, 520) + win.show() + return app.exec() + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/py_app/requirements.txt b/py_app/requirements.txt new file mode 100644 index 0000000..876e7e3 --- /dev/null +++ b/py_app/requirements.txt @@ -0,0 +1,2 @@ +PyQt6==6.6.1 +pyserial==3.5 diff --git a/sdkconfig b/sdkconfig new file mode 100644 index 0000000..c245f55 --- /dev/null +++ b/sdkconfig @@ -0,0 +1,1265 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration +# +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_MAX_DATA_WIDTH=24 +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=1 +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=0 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=9 +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=1 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=1 +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D4=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.5.1" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V1_SUPPORTED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# !!! MINIMAL_BUILD is enabled !!! +# + +# +# Only common components and those transitively required by the main component are listed +# + +# +# If a component configuration is missing, please add it to the main component's requirements +# + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +# CONFIG_XTAL_FREQ_32 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=0 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-MM: Memory Management Configurations +# +# end of ESP-MM: Memory Management Configurations + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +# end of Power Management + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_TG0_LAC=y +# end of ESP Timer (High Resolution Timer) + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=100 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# End of deprecated options diff --git a/sdkconfig.ci b/sdkconfig.ci new file mode 100755 index 0000000..e69de29