mirror of
https://github.com/rstrouse/ESPSomfy-RTS.git
synced 2026-10-31 13:52:15 +01:00
fix: warn of radio pins that can stop the board booting (#34)
GPIO12 is a strapping pin on the original ESP32: high at reset, it powers the flash at 1.8 V. A CC1101 can hold GDO2 high at power-up, so a board with RX on 12 bootloops after a power cut until EN is pressed. It was the default RX pin. - RX defaults to GPIO35 on the original ESP32. Saved settings keep their pins. - The log warns each time the radio starts, and the radio settings show a warning, while TX, RX or MISO is on a pin whose level at reset can stop the chip booting (src/BootPins.h, data-src/js/pins.js). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
a92c7a26f6
commit
8a59f51111
10 changed files with 234 additions and 7 deletions
34
src/BootPins.h
Normal file
34
src/BootPins.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef BOOT_PINS_H
|
||||
#define BOOT_PINS_H
|
||||
#include <stdint.h>
|
||||
#if __has_include(<sdkconfig.h>)
|
||||
#include <sdkconfig.h>
|
||||
#endif
|
||||
|
||||
// The strapping pins whose level at reset can keep the chip from starting
|
||||
// the firmware. The ROM reads them before any code runs, so a radio that
|
||||
// drives one at power-up stops the board booting until EN is pressed (issue
|
||||
// #34). The strapping pins that only pick a download mode, quiet the boot
|
||||
// log or set the SDIO timing aren't listed. web UI: data-src/js/pins.js.
|
||||
//
|
||||
// Returns what the pin does at reset, or nullptr for a pin that can't stop
|
||||
// the boot.
|
||||
inline const char *bootPinEffect(uint8_t pin) {
|
||||
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
|
||||
if(pin == 0) return "low at reset starts the download mode";
|
||||
if(pin == 45) return "high at reset powers the flash at 1.8 V";
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||
if(pin == 9) return "low at reset starts the download mode";
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||
if(pin == 28) return "low at reset starts the download mode";
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||
if(pin == 35) return "low at reset starts the download mode";
|
||||
#else
|
||||
// The original ESP32. MTDI picks the flash voltage unless the
|
||||
// VDD_SDIO efuses are burned.
|
||||
if(pin == 0) return "low at reset starts the download mode";
|
||||
if(pin == 12) return "high at reset powers the flash at 1.8 V";
|
||||
#endif
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -8,6 +8,7 @@
|
|||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "Utils.h"
|
||||
#include "BootPins.h"
|
||||
#include "ConfigSettings.h"
|
||||
#include "Somfy.h"
|
||||
#include "outputs/ProtoSocket.h"
|
||||
|
|
@ -523,8 +524,11 @@ void transceiver_config_t::load() {
|
|||
break;
|
||||
#endif
|
||||
default:
|
||||
// RX was on 12, a strapping pin (issue #34). A board that saved its
|
||||
// radio settings keeps its pins. 35 is input only, which RX is; 36
|
||||
// and 39 take false interrupts.
|
||||
this->TXPin = 13;
|
||||
this->RXPin = 12;
|
||||
this->RXPin = 35;
|
||||
this->MOSIPin = 23;
|
||||
this->MISOPin = 19;
|
||||
this->SCKPin = 18;
|
||||
|
|
@ -571,6 +575,10 @@ void transceiver_config_t::load() {
|
|||
pref.end();
|
||||
//this->printBuffer = somfy.transceiver.printBuffer;
|
||||
}
|
||||
static void warnBootPin(const char *name, uint8_t pin) {
|
||||
const char *effect = bootPinEffect(pin);
|
||||
if(effect) ESP_LOGW(TAG, "Radio %s is on GPIO%u, a strapping pin: %s. The radio can hold it there and stop the board booting after a power cut, so move it to another pin.", name, pin, effect);
|
||||
}
|
||||
void transceiver_config_t::apply() {
|
||||
Preferences pref;
|
||||
// A transmission in flight stops after its current frame so the radio can
|
||||
|
|
@ -595,6 +603,12 @@ void transceiver_config_t::apply() {
|
|||
pref.end();
|
||||
if(!radioInit) return;
|
||||
ESP_LOGD(TAG, "Applying radio settings - Setting Data Pins RX:%u TX:%u", this->RXPin, this->TXPin);
|
||||
// The pins the CC1101 drives at power-up, before it is set up: GDO0
|
||||
// puts out a clock, GDO2 CHIP_RDYn, and SO follows CHIP_RDYn while CSN
|
||||
// is low.
|
||||
warnBootPin("TX", this->TXPin);
|
||||
if(this->RXPin != this->TXPin) warnBootPin("RX", this->RXPin);
|
||||
warnBootPin("MISO", this->MISOPin);
|
||||
//if(this->TXPin != this->RXPin)
|
||||
// pinMode(this->TXPin, OUTPUT);
|
||||
//pinMode(this->RXPin, INPUT);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ struct transceiver_config_t {
|
|||
radio_proto proto = radio_proto::RTS;
|
||||
uint8_t SCKPin = 18;
|
||||
uint8_t TXPin = 13;
|
||||
uint8_t RXPin = 12;
|
||||
uint8_t RXPin = 35;
|
||||
uint8_t MOSIPin = 23;
|
||||
uint8_t MISOPin = 19;
|
||||
uint8_t CSNPin = 5;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue