mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
Drive WB_IO2 (slot power switch) HIGH via early constructor before the Arduino framework initializes. Without this, the board brownouts on POE-only power because the slot MOSFET isn't enabled early enough for the RAK13800 POE module to deliver power to the baseboard. Also remove the W5100S hardware reset pulse from Ethernet init — the chip comes out of power-on reset cleanly, and toggling reset kills the PHY link which breaks POE power delivery.
67 lines
No EOL
2 KiB
C++
67 lines
No EOL
2 KiB
C++
#include <Arduino.h>
|
|
#include <Wire.h>
|
|
#include "nrf_gpio.h"
|
|
|
|
#include "RAK4631Board.h"
|
|
|
|
#ifdef ETHERNET_ENABLED
|
|
// Drive WB_IO2 HIGH as early as possible using direct register access.
|
|
// WB_IO2 (P1.02, Arduino pin 34) controls the WisBlock slot power switch.
|
|
// With POE through RAK13800, this must be enabled before the framework
|
|
// initializes or the board will brownout from insufficient power delivery.
|
|
// Priority 102 runs just after SystemInit.
|
|
static void __attribute__((constructor(102))) rak4631_early_poe_power() {
|
|
nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(1, 2)); // WB_IO2 = P1.02
|
|
nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(1, 2));
|
|
}
|
|
#endif
|
|
|
|
#ifdef NRF52_POWER_MANAGEMENT
|
|
// Static configuration for power management
|
|
// Values set in variant.h defines
|
|
const PowerMgtConfig power_config = {
|
|
.lpcomp_ain_channel = PWRMGT_LPCOMP_AIN,
|
|
.lpcomp_refsel = PWRMGT_LPCOMP_REFSEL,
|
|
.voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK
|
|
};
|
|
|
|
void RAK4631Board::initiateShutdown(uint8_t reason) {
|
|
// Disable LoRa module power before shutdown
|
|
digitalWrite(SX126X_POWER_EN, LOW);
|
|
|
|
if (reason == SHUTDOWN_REASON_LOW_VOLTAGE ||
|
|
reason == SHUTDOWN_REASON_BOOT_PROTECT) {
|
|
configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel);
|
|
}
|
|
|
|
enterSystemOff(reason);
|
|
}
|
|
#endif // NRF52_POWER_MANAGEMENT
|
|
|
|
void RAK4631Board::begin() {
|
|
NRF52BoardDCDC::begin();
|
|
pinMode(PIN_VBAT_READ, INPUT);
|
|
#ifdef PIN_USER_BTN
|
|
pinMode(PIN_USER_BTN, INPUT_PULLUP);
|
|
#endif
|
|
|
|
#ifdef PIN_USER_BTN_ANA
|
|
pinMode(PIN_USER_BTN_ANA, INPUT_PULLUP);
|
|
#endif
|
|
|
|
|
|
#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
|
|
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL);
|
|
#endif
|
|
|
|
Wire.begin();
|
|
|
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
|
#ifdef NRF52_POWER_MANAGEMENT
|
|
// Boot voltage protection check (may not return if voltage too low)
|
|
// We need to call this after we configure SX126X_POWER_EN as output but before we pull high
|
|
checkBootVoltage(&power_config);
|
|
#endif
|
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
|
delay(10); // give sx1262 some time to power up
|
|
} |