Накопалась очередная недокументированная (да и честно говоря - не используемая нигде) фича ESP32-S3 (и других версий тоже, но адреса регистров другие) - включение\выключение RF части в обход драйвера WiFi
Код я проверил в Arduino IDE, но потом копипастил. Надеюсь, что скомпилируется ![]()
//
// Пример использования недокументированных возможностей ESP32-S3
// Включение и выключение Airplane-Mode (отключение приема и передачи на уровне PHY).
// Уровень MAC и софт не будут знать, о том, что включен ероплан-режим, что удобно.
//
// При включении режима все продолжает работать как ни в чем ни бывало.
//
//
//
#include <Arduino.h>
// Запись значения в регистр переферии
//
static inline void reg_store(uintptr_t const reg, uint32_t const val) {
asm volatile ("memw" ::: "memory"); // барьер
*(volatile uint32_t *)reg = val;
}
// Чтение регистра
//
static inline uint32_t reg_load(uintptr_t const reg) {
asm volatile ("memw" ::: "memory"); // и тут
return *(volatile uint32_t *)reg;
}
#ifdef __cplusplus
extern "C" {
#endif
//Если компилятор ругается на эту функцию, то раскомментируйте ее
//extern void ets_delay_us(uint32_t usec);
#ifdef __cplusplus
};
#endif
// Функция выключения RF части ESP32-S3.
//
//
static void esp32s3_rf_off(bool arg) {
uint32_t val;
uintptr_t reg = 0x60006110;
val = reg_load(reg) & 0xfffff0ffUL;
if (arg) {
reg_store(0x60006110, val | 0x800);
ets_delay_us(1);
reg_store(0x60006110, val | 0xa00);
} else {
reg_store(0x60006110, val | 0x200);
ets_delay_us(1);
reg_store(0x60006110, val | 0x000);
}
ets_delay_us(1);
return;
}
static void esp32s3_rf_on() {
reg_store(0x60006110, 0x1000050);
}
// Пример использования:
//
void airplane_mode_on() {
esp32_rf_off(0);
delay(1); // скетч без делея - не скетч.
esp32_rf_off(1);
}
void airplane_mode_off() {
esp32_rf_on(1);
}