From cbbb3799410a76b31f1d2464e06b397e74d1e038 Mon Sep 17 00:00:00 2001 From: Kiril Zyapkov Date: Mon, 31 Aug 2015 14:28:24 +0300 Subject: [PATCH] AVRISP: allow configuring active-high/low reset programatically --- libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp | 23 ++++--------------- libraries/ESP8266AVRISP/src/ESP8266AVRISP.h | 5 ++-- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp index 1cdeb26e8..407d04e0d 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp @@ -26,15 +26,6 @@ extern "C" { #define malloc os_malloc #define free os_free -#ifdef AVRISP_ACTIVE_HIGH_RESET -#define AVRISP_RESET_ON HIGH -#define AVRISP_RESET_OFF LOW -#else -#define AVRISP_RESET_ON LOW -#define AVRISP_RESET_OFF HIGH -#endif - - // #define AVRISP_DEBUG(fmt, ...) os_printf("[AVRP] " fmt "\r\n", ##__VA_ARGS__ ) #define AVRISP_DEBUG(...) @@ -47,8 +38,8 @@ extern "C" { #define beget16(addr) (*addr * 256 + *(addr+1)) -ESP8266AVRISP::ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq, bool reset_state): - _reset_pin(reset_pin), _reset_state(reset_state), _spi_freq(spi_freq), +ESP8266AVRISP::ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq, bool reset_state, bool reset_activehigh): + _reset_pin(reset_pin), _reset_state(reset_state), _spi_freq(spi_freq), _reset_activehigh(reset_activehigh), _server(WiFiServer(port)), _state(AVRISP_STATE_IDLE) { pinMode(_reset_pin, OUTPUT); @@ -68,11 +59,7 @@ void ESP8266AVRISP::setSpiFrequency(uint32_t freq) { void ESP8266AVRISP::setReset(bool rst) { _reset_state = rst; - if (_reset_state) { - digitalWrite(_reset_pin, AVRISP_RESET_ON); - } else { - digitalWrite(_reset_pin, AVRISP_RESET_OFF); - } + digitalWrite(_reset_pin, _resetLevel(_reset_state)); } AVRISPState_t ESP8266AVRISP::update() { @@ -230,9 +217,9 @@ void ESP8266AVRISP::start_pmode() { // try to sync the bus SPI.transfer(0x00); - digitalWrite(_reset_pin, AVRISP_RESET_OFF); + digitalWrite(_reset_pin, _resetLevel(false)); delayMicroseconds(50); - digitalWrite(_reset_pin, AVRISP_RESET_ON); + digitalWrite(_reset_pin, _resetLevel(true)); delay(30); spi_transaction(0xAC, 0x53, 0x00, 0x00); diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h index d2bc6f1bc..74ca085a8 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h @@ -47,7 +47,7 @@ typedef struct { class ESP8266AVRISP { public: - ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq=AVRISP_SPI_FREQ, bool reset_state=false); + ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq=AVRISP_SPI_FREQ, bool reset_state=false, bool reset_activehigh=false); void begin(); @@ -100,7 +100,7 @@ protected: void start_pmode(void); // enter program mode void end_pmode(void); // exit program mode - + inline bool _resetLevel(bool reset_state) { return reset_state == _reset_activehigh; } uint32_t _spi_freq; WiFiServer _server; @@ -108,6 +108,7 @@ protected: AVRISPState_t _state; uint8_t _reset_pin; bool _reset_state; + bool _reset_activehigh; // programmer settings, set by remote end AVRISP_parameter_t param;