[ESP32S3 Undocumented] Airplane mode на ESP32-S3

Накопалась очередная недокументированная (да и честно говоря - не используемая нигде) фича ESP32-S3 (и других версий тоже, но адреса регистров другие) - включение\выключение RF части в обход драйвера WiFi

Код я проверил в Arduino IDE, но потом копипастил. Надеюсь, что скомпилируется :slight_smile:

//
// Пример использования недокументированных возможностей 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);
}

1 лайк

Опечаточка. Единичку нужно убрать. Нет там никаких параметров.

Какой нибудь реальный профит с этого можно поиметь простому смертному ардуинщику? Чем это лучше обычного отключения wifi?

Обычное отключение погасит весь IP стек. Плюс, это не гарантирует ничего.

Аппаратное отключение же - гарантирует что радио будет молчать. А IP стек ничего не узнает и тут же продолжит работу по включении радио. Ну, если отключение было долгим, то TCP соединения поотваливаются, конечно.

Т.е. это что-то типа рубильника на выходном каскаде передатчика.

Все продолжает работать как есть, просто RF не излучает в эфир.