From c53a682e7a897035b206b740d33d22f912f88288 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Thu, 16 Aug 2018 10:35:07 -0700 Subject: [PATCH 1/3] Allow GPIO 9 and 10 for waveform generation While most ESP8266 modules use quad-io mode for their SPI flash ROM, there are some which only use dual-io mode. Allow the unused pins (GPIO 9 and 10) to have waveforms generated on them. Should the user try this on a quad-io mode board, expect very bad things to happen. --- cores/esp8266/core_esp8266_waveform.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_waveform.c b/cores/esp8266/core_esp8266_waveform.c index d4d5f5a717..de3ad15e66 100644 --- a/cores/esp8266/core_esp8266_waveform.c +++ b/cores/esp8266/core_esp8266_waveform.c @@ -79,7 +79,11 @@ static Waveform waveform[] = { {0, 0, 1<<3, 0, 0, 0, 0, 0}, {0, 0, 1<<4, 0, 0, 0, 0, 0}, {0, 0, 1<<5, 0, 0, 0, 0, 0}, - // GPIOS 6-11 not allowed, used for flash + // GPIOS 6-8 not allowed, used for flash + // GPIO 9 and 10 only allowed in 2-bit flash mode + {0, 0, 1<<9, 0, 0, 0, 0, 0}, + {0, 0, 1<<10, 0, 0, 0, 0, 0}, + // GPIO 11 not allowed, used for flash {0, 0, 1<<12, 0, 0, 0, 0, 0}, {0, 0, 1<<13, 0, 0, 0, 0, 0}, {0, 0, 1<<14, 0, 0, 0, 0, 0}, From f1d063debf9ba7a32bcfff2d874030888ed2a338 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sun, 9 Sep 2018 14:47:09 -0700 Subject: [PATCH 2/3] Add variant for 8285 to init GPIO 9/10 The 8285 only has 2-bit flash IO, so the other two pins can be used as inputs (9/10). Set them to input to mirror the way other pins are set up. --- boards.txt | 2 +- tools/boards.txt.py | 1 + variants/esp8285/common.h | 83 ++++++++++++++++++++++++++++++ variants/esp8285/initD9D10Pins.cpp | 10 ++++ variants/esp8285/pins_arduino.h | 41 +++++++++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 variants/esp8285/common.h create mode 100644 variants/esp8285/initD9D10Pins.cpp create mode 100644 variants/esp8285/pins_arduino.h diff --git a/boards.txt b/boards.txt index e1f98d11c8..9a2bf8b315 100644 --- a/boards.txt +++ b/boards.txt @@ -373,6 +373,7 @@ generic.menu.UploadSpeed.921600.upload.speed=921600 ############################################################## esp8285.name=Generic ESP8285 Module esp8285.build.board=ESP8266_ESP01 +esp8285.build.variant=esp8285 esp8285.upload.tool=esptool esp8285.upload.maximum_data_size=81920 esp8285.upload.wait_for_upload_port=true @@ -381,7 +382,6 @@ esp8285.serial.disableDTR=true esp8285.serial.disableRTS=true esp8285.build.mcu=esp8266 esp8285.build.core=esp8266 -esp8285.build.variant=generic esp8285.build.spiffs_pagesize=256 esp8285.build.debug_port= esp8285.build.debug_level= diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 1a3715259f..4119cbb028 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -271,6 +271,7 @@ 'name': 'Generic ESP8285 Module', 'opts': { '.build.board': 'ESP8266_ESP01', + '.build.variant': 'esp8285' }, 'macro': [ 'resetmethod_menu', diff --git a/variants/esp8285/common.h b/variants/esp8285/common.h new file mode 100644 index 0000000000..7b324b16cc --- /dev/null +++ b/variants/esp8285/common.h @@ -0,0 +1,83 @@ +/* + common.h - Commoon pin definition functions for ESP8266 boards + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2016. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef GENERIC_COMMON_H +#define GENERIC_COMMON_H + +#define EXTERNAL_NUM_INTERRUPTS 16 +#define NUM_DIGITAL_PINS 17 +#define NUM_ANALOG_INPUTS 1 + +// TODO: this should be <= 9 if flash is in DIO mode +#define isFlashInterfacePin(p) ((p) >= 6 && (p) <= 11) + +#define analogInputToDigitalPin(p) ((p > 0) ? NOT_A_PIN : 0) +#define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)? (p) : NOT_AN_INTERRUPT) +#define digitalPinHasPWM(p) (((p) < NUM_DIGITAL_PINS && !isFlashInterfacePin(p))? 1 : 0) + +#define PIN_SPI_SS (15) +#define PIN_SPI_MOSI (13) +#define PIN_SPI_MISO (12) +#define PIN_SPI_SCK (14) + +static const uint8_t SS = PIN_SPI_SS; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +#ifndef PIN_A0 +#define PIN_A0 (17) +#endif /* PIN_A0 */ + +static const uint8_t A0 = PIN_A0; + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#ifdef LED_BUILTIN +#ifdef __cplusplus +extern "C" +#endif +const int BUILTIN_LED __attribute__((deprecated, weak)) = LED_BUILTIN; +#endif + +#endif /* GENERIC_COMMON_H */ diff --git a/variants/esp8285/initD9D10Pins.cpp b/variants/esp8285/initD9D10Pins.cpp new file mode 100644 index 0000000000..9da4510912 --- /dev/null +++ b/variants/esp8285/initD9D10Pins.cpp @@ -0,0 +1,10 @@ +#include "Arduino.h" + +// The 8285 allows the use of GPIO pins 9 and 10, so set them to inputs +// on startup just like the other pins. This allows their use for interrupts +// as well +void initVariant() { + pinMode(9, INPUT); + pinMode(10, INPUT); +} + diff --git a/variants/esp8285/pins_arduino.h b/variants/esp8285/pins_arduino.h new file mode 100644 index 0000000000..475fff2b58 --- /dev/null +++ b/variants/esp8285/pins_arduino.h @@ -0,0 +1,41 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#define PIN_WIRE_SDA (4) +#define PIN_WIRE_SCL (5) + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +#ifndef LED_BUILTIN +#define LED_BUILTIN 1 +#endif + +#include "common.h" + +#endif /* Pins_Arduino_h */ From 57a387417615ed64dc707239e1df7963ef09b51a Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sun, 9 Sep 2018 19:42:05 -0700 Subject: [PATCH 3/3] Update waveform gen to only allow 9/10 on 8285 Update the common.h in both generic (remove TODO, it's done!) and the 8285 variant to make isFlashInterfacePin macro correct. Use that macro to disable pins 9 and 10 in the common, non-8285 case. --- cores/esp8266/core_esp8266_waveform.c | 2 ++ variants/esp8285/common.h | 4 ++-- variants/generic/common.h | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/core_esp8266_waveform.c b/cores/esp8266/core_esp8266_waveform.c index de3ad15e66..fea483343a 100644 --- a/cores/esp8266/core_esp8266_waveform.c +++ b/cores/esp8266/core_esp8266_waveform.c @@ -81,8 +81,10 @@ static Waveform waveform[] = { {0, 0, 1<<5, 0, 0, 0, 0, 0}, // GPIOS 6-8 not allowed, used for flash // GPIO 9 and 10 only allowed in 2-bit flash mode +#if !isFlashInterfacePin(9) {0, 0, 1<<9, 0, 0, 0, 0, 0}, {0, 0, 1<<10, 0, 0, 0, 0, 0}, +#endif // GPIO 11 not allowed, used for flash {0, 0, 1<<12, 0, 0, 0, 0, 0}, {0, 0, 1<<13, 0, 0, 0, 0, 0}, diff --git a/variants/esp8285/common.h b/variants/esp8285/common.h index 7b324b16cc..26b8d87be1 100644 --- a/variants/esp8285/common.h +++ b/variants/esp8285/common.h @@ -30,8 +30,8 @@ #define NUM_DIGITAL_PINS 17 #define NUM_ANALOG_INPUTS 1 -// TODO: this should be <= 9 if flash is in DIO mode -#define isFlashInterfacePin(p) ((p) >= 6 && (p) <= 11) +// Pins 9 and 10 are available, go to positive logic since it's clearer +#define isFlashInterfacePin(p) ((p) == 6 || (p) == 7 || (p) == 8 || (p) == 11) #define analogInputToDigitalPin(p) ((p > 0) ? NOT_A_PIN : 0) #define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)? (p) : NOT_AN_INTERRUPT) diff --git a/variants/generic/common.h b/variants/generic/common.h index 7b324b16cc..4b0d4a69ad 100644 --- a/variants/generic/common.h +++ b/variants/generic/common.h @@ -30,7 +30,6 @@ #define NUM_DIGITAL_PINS 17 #define NUM_ANALOG_INPUTS 1 -// TODO: this should be <= 9 if flash is in DIO mode #define isFlashInterfacePin(p) ((p) >= 6 && (p) <= 11) #define analogInputToDigitalPin(p) ((p > 0) ? NOT_A_PIN : 0)