Bug 2064, 2063 - PinManager usage (#2066)
* Fix 2063 - Do not free pins unless allocated * Fix 2064: Allocate pins used for Ethernet * Fix obvious compilation errors. * Fix multiple bugs... * pinsAllocated[2] set twice due to copy/paste bug. * wrong pin allocated for ETH_CLOCK_GPIO17_OUT due to copy/paste bug * Stylistic change per PR review * Stylistic change per PR review * attempt to allocate pin for "default" button * remove extra local variable * check return value from ETH.begin() Co-authored-by: Christian Schwinne <dev.aircoookie@gmail.com>
This commit is contained in:
parent
a17f83cedd
commit
3ad336a1eb
@ -119,13 +119,13 @@ class BusDigital : public Bus {
|
|||||||
public:
|
public:
|
||||||
BusDigital(BusConfig &bc, uint8_t nr) : Bus(bc.type, bc.start) {
|
BusDigital(BusConfig &bc, uint8_t nr) : Bus(bc.type, bc.start) {
|
||||||
if (!IS_DIGITAL(bc.type) || !bc.count) return;
|
if (!IS_DIGITAL(bc.type) || !bc.count) return;
|
||||||
|
if (!pinManager.allocatePin(bc.pins[0])) return;
|
||||||
_pins[0] = bc.pins[0];
|
_pins[0] = bc.pins[0];
|
||||||
if (!pinManager.allocatePin(_pins[0])) return;
|
|
||||||
if (IS_2PIN(bc.type)) {
|
if (IS_2PIN(bc.type)) {
|
||||||
_pins[1] = bc.pins[1];
|
if (!pinManager.allocatePin(bc.pins[1])) {
|
||||||
if (!pinManager.allocatePin(_pins[1])) {
|
|
||||||
cleanup(); return;
|
cleanup(); return;
|
||||||
}
|
}
|
||||||
|
_pins[1] = bc.pins[1];
|
||||||
}
|
}
|
||||||
reversed = bc.reversed;
|
reversed = bc.reversed;
|
||||||
_skip = bc.skipAmount; //sacrificial pixels
|
_skip = bc.skipAmount; //sacrificial pixels
|
||||||
@ -241,10 +241,11 @@ class BusPwm : public Bus {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (uint8_t i = 0; i < numPins; i++) {
|
for (uint8_t i = 0; i < numPins; i++) {
|
||||||
_pins[i] = bc.pins[i];
|
uint8_t currentPin = bc.pins[i];
|
||||||
if (!pinManager.allocatePin(_pins[i])) {
|
if (!pinManager.allocatePin(currentPin)) {
|
||||||
deallocatePins(); return;
|
deallocatePins(); return;
|
||||||
}
|
}
|
||||||
|
_pins[i] = currentPin; // store only after allocatePin() succeeds
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
pinMode(_pins[i], OUTPUT);
|
pinMode(_pins[i], OUTPUT);
|
||||||
#else
|
#else
|
||||||
|
@ -152,14 +152,20 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// new install/missing configuration (button 0 has defaults)
|
// new install/missing configuration (button 0 has defaults)
|
||||||
if (fromFS)
|
if (fromFS) {
|
||||||
for (uint8_t s=1; s<WLED_MAX_BUTTONS; s++) {
|
// relies upon only being called once with fromFS == true, which is currently true.
|
||||||
|
uint8_t s = 0;
|
||||||
|
if (pinManager.allocatePin(btnPin[0],false)) { // initialized to #define value BTNPIN, or zero if not defined(!)
|
||||||
|
++s; // do not clear default button if allocated successfully
|
||||||
|
}
|
||||||
|
for (; s<WLED_MAX_BUTTONS; s++) {
|
||||||
btnPin[s] = -1;
|
btnPin[s] = -1;
|
||||||
buttonType[s] = BTN_TYPE_NONE;
|
buttonType[s] = BTN_TYPE_NONE;
|
||||||
macroButton[s] = 0;
|
macroButton[s] = 0;
|
||||||
macroLongPress[s] = 0;
|
macroLongPress[s] = 0;
|
||||||
macroDoublePress[s] = 0;
|
macroDoublePress[s] = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CJSON(touchThreshold,btn_obj[F("tt")]);
|
CJSON(touchThreshold,btn_obj[F("tt")]);
|
||||||
CJSON(buttonPublishMqtt,btn_obj["mqtt"]);
|
CJSON(buttonPublishMqtt,btn_obj["mqtt"]);
|
||||||
|
@ -446,14 +446,60 @@ void WLED::initConnection()
|
|||||||
// Only initialize ethernet board if not NONE
|
// Only initialize ethernet board if not NONE
|
||||||
if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) {
|
if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) {
|
||||||
ethernet_settings es = ethernetBoards[ethernetType];
|
ethernet_settings es = ethernetBoards[ethernetType];
|
||||||
ETH.begin(
|
// Use PinManager to ensure pins are available for
|
||||||
(uint8_t) es.eth_address,
|
// ethernet AND to prevent other uses of these pins.
|
||||||
(int) es.eth_power,
|
bool s = true;
|
||||||
(int) es.eth_mdc,
|
byte pinsAllocated[4] { 255, 255, 255, 255 };
|
||||||
(int) es.eth_mdio,
|
|
||||||
(eth_phy_type_t) es.eth_type,
|
if (s && (s = pinManager.allocatePin((byte)es.eth_power))) {
|
||||||
(eth_clock_mode_t) es.eth_clk_mode
|
pinsAllocated[0] = (byte)es.eth_power;
|
||||||
);
|
}
|
||||||
|
if (s && (s = pinManager.allocatePin((byte)es.eth_mdc))) {
|
||||||
|
pinsAllocated[1] = (byte)es.eth_mdc;
|
||||||
|
}
|
||||||
|
if (s && (s = pinManager.allocatePin((byte)es.eth_mdio))) {
|
||||||
|
pinsAllocated[2] = (byte)es.eth_mdio;
|
||||||
|
}
|
||||||
|
switch(es.eth_clk_mode) {
|
||||||
|
case ETH_CLOCK_GPIO0_IN:
|
||||||
|
s = pinManager.allocatePin(0, false);
|
||||||
|
pinsAllocated[3] = 0;
|
||||||
|
break;
|
||||||
|
case ETH_CLOCK_GPIO0_OUT:
|
||||||
|
s = pinManager.allocatePin(0);
|
||||||
|
pinsAllocated[3] = 0;
|
||||||
|
break;
|
||||||
|
case ETH_CLOCK_GPIO16_OUT:
|
||||||
|
s = pinManager.allocatePin(16);
|
||||||
|
pinsAllocated[3] = 16;
|
||||||
|
break;
|
||||||
|
case ETH_CLOCK_GPIO17_OUT:
|
||||||
|
s = pinManager.allocatePin(17);
|
||||||
|
pinsAllocated[3] = 17;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
s = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s) {
|
||||||
|
s = ETH.begin(
|
||||||
|
(uint8_t) es.eth_address,
|
||||||
|
(int) es.eth_power,
|
||||||
|
(int) es.eth_mdc,
|
||||||
|
(int) es.eth_mdio,
|
||||||
|
(eth_phy_type_t) es.eth_type,
|
||||||
|
(eth_clock_mode_t) es.eth_clk_mode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
DEBUG_PRINTLN(F("Ethernet init failed"));
|
||||||
|
// de-allocate only those pins allocated before the failure
|
||||||
|
for (byte p : pinsAllocated) {
|
||||||
|
pinManager.deallocatePin(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -20,8 +20,16 @@ ethernet_settings ethernetBoards[] = {
|
|||||||
// WT32-EHT01
|
// WT32-EHT01
|
||||||
// Please note, from my testing only these pins work for LED outputs:
|
// Please note, from my testing only these pins work for LED outputs:
|
||||||
// IO2, IO4, IO12, IO14, IO15
|
// IO2, IO4, IO12, IO14, IO15
|
||||||
// These pins do not appear to work from my testing:
|
// Pins IO34 through IO39 are input-only on ESP32, so
|
||||||
// IO35, IO36, IO39
|
// the following exposed pins won't work to drive WLEDs
|
||||||
|
// IO35(*), IO36, IO39
|
||||||
|
// The following pins are also exposed via the headers,
|
||||||
|
// and likely can be used as general purpose IO:
|
||||||
|
// IO05(*), IO32 (CFG), IO33 (485_EN), IO33 (TXD)
|
||||||
|
//
|
||||||
|
// (*) silkscreen on board revision v1.2 may be wrong:
|
||||||
|
// IO5 silkscreen on v1.2 says IO35
|
||||||
|
// IO35 silkscreen on v1.2 says RXD
|
||||||
{
|
{
|
||||||
1, // eth_address,
|
1, // eth_address,
|
||||||
16, // eth_power,
|
16, // eth_power,
|
||||||
|
Loading…
Reference in New Issue
Block a user