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