diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp index e93713d27..1cdeb26e8 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp @@ -47,20 +47,28 @@ extern "C" { #define beget16(addr) (*addr * 256 + *(addr+1)) -ESP8266AVRISP::ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq): - _reset_pin(reset_pin), _server(WiFiServer(port)), _state(AVRISP_STATE_IDLE), - _spi_freq(spi_freq) +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), + _server(WiFiServer(port)), _state(AVRISP_STATE_IDLE) { + pinMode(_reset_pin, OUTPUT); + setReset(_reset_state); } void ESP8266AVRISP::begin() { - pinMode(_reset_pin, OUTPUT); - digitalWrite(_reset_pin, AVRISP_RESET_OFF); _server.begin(); } +void ESP8266AVRISP::setSpiFrequency(uint32_t freq) { + _spi_freq = freq; + if (_state == AVRISP_STATE_ACTIVE) { + SPI.setFrequency(freq); + } +} + void ESP8266AVRISP::setReset(bool rst) { - if (rst) { + _reset_state = rst; + if (_reset_state) { digitalWrite(_reset_pin, AVRISP_RESET_ON); } else { digitalWrite(_reset_pin, AVRISP_RESET_OFF); @@ -88,9 +96,14 @@ AVRISPState_t ESP8266AVRISP::update() { if (!_client.connected()) { _client.stop(); AVRISP_DEBUG("client disconnect"); - SPI.end(); - digitalWrite(_reset_pin, AVRISP_RESET_OFF); + if (pmode) { + SPI.end(); + pmode = 0; + } + setReset(_reset_state); _state = AVRISP_STATE_IDLE; + } else { + _reject_incoming(); } break; } @@ -104,11 +117,6 @@ AVRISPState_t ESP8266AVRISP::serve() { // should not be called when idle, error? break; case AVRISP_STATE_PENDING: { - // enter reset, setup SPI - SPI.begin(); - SPI.setFrequency(_spi_freq); - SPI.setHwCs(false); - digitalWrite(_reset_pin, AVRISP_RESET_ON); _state = AVRISP_STATE_ACTIVE; // fallthrough } @@ -213,31 +221,14 @@ void ESP8266AVRISP::set_parameters() { + buff[17] * 0x00010000 + buff[18] * 0x00000100 + buff[19]; - - // AVRISP_DEBUG("devicecode = %d", param.devicecode); - // AVRISP_DEBUG("revision = %d", param.revision); - // AVRISP_DEBUG("progtype = %d", param.progtype); - // AVRISP_DEBUG("parmode = %d", param.parmode); - // AVRISP_DEBUG("polling = %d", param.polling); - // AVRISP_DEBUG("selftimed = %d", param.selftimed); - // AVRISP_DEBUG("lockbytes = %d", param.lockbytes); - // AVRISP_DEBUG("fusebytes = %d", param.fusebytes); - // AVRISP_DEBUG("flashpoll = %d", param.flashpoll); - // AVRISP_DEBUG("eeprompoll = %d", param.eeprompoll); - // AVRISP_DEBUG("pagesize = %d", param.pagesize); - // AVRISP_DEBUG("eepromsize = %d", param.eepromsize); - - // AVRISP_DEBUG("flashsize = %d", param.flashsize); - } void ESP8266AVRISP::start_pmode() { + SPI.begin(); + SPI.setFrequency(_spi_freq); + SPI.setHwCs(false); - // SPI already begun when entering ACTIVE state - //SPI.begin(); - //SPI.setFrequency(AVRISP_SPI_FREQ); - - // following delays may not work on all targets... + // try to sync the bus SPI.transfer(0x00); digitalWrite(_reset_pin, AVRISP_RESET_OFF); delayMicroseconds(50); @@ -250,7 +241,7 @@ void ESP8266AVRISP::start_pmode() { void ESP8266AVRISP::end_pmode() { SPI.end(); - digitalWrite(_reset_pin, AVRISP_RESET_OFF); + setReset(_reset_state); pmode = 0; } diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h index 4c8ebe161..d2bc6f1bc 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.h @@ -18,7 +18,7 @@ Original version: // #define AVRISP_ACTIVE_HIGH_RESET // SPI clock frequency in Hz -#define AVRISP_SPI_FREQ 1e6 +#define AVRISP_SPI_FREQ 300e3 // programmer states typedef enum { @@ -47,10 +47,13 @@ typedef struct { class ESP8266AVRISP { public: - ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq=AVRISP_SPI_FREQ); + ESP8266AVRISP(uint16_t port, uint8_t reset_pin, uint32_t spi_freq=AVRISP_SPI_FREQ, bool reset_state=false); void begin(); + // set the SPI clock frequency + void setSpiFrequency(uint32_t); + // control the state of the RESET pin of the target // see AVRISP_ACTIVE_HIGH_RESET void setReset(bool); @@ -104,6 +107,7 @@ protected: WiFiClient _client; AVRISPState_t _state; uint8_t _reset_pin; + bool _reset_state; // programmer settings, set by remote end AVRISP_parameter_t param;