1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

ESP8266AVRISP: allow setting SPI freq and reset, postpone SPI init

This commit is contained in:
Kiril Zyapkov 2015-08-04 23:23:46 +03:00
parent d5ab22f4ae
commit 4bf286954e
2 changed files with 32 additions and 37 deletions

View File

@ -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;
}

View File

@ -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;