@@ -47,20 +47,28 @@ extern "C" {
47
47
48
48
#define beget16 (addr ) (*addr * 256 + *(addr+1 ))
49
49
50
- ESP8266AVRISP::ESP8266AVRISP (uint16_t port, uint8_t reset_pin, uint32_t spi_freq):
51
- _reset_pin(reset_pin), _server(WiFiServer(port)), _state(AVRISP_STATE_IDLE ),
52
- _spi_freq(spi_freq )
50
+ ESP8266AVRISP::ESP8266AVRISP (uint16_t port, uint8_t reset_pin, uint32_t spi_freq, bool reset_state ):
51
+ _reset_pin(reset_pin), _reset_state(reset_state), _spi_freq(spi_freq ),
52
+ _server(WiFiServer(port)), _state(AVRISP_STATE_IDLE )
53
53
{
54
+ pinMode (_reset_pin, OUTPUT);
55
+ setReset (_reset_state);
54
56
}
55
57
56
58
void ESP8266AVRISP::begin () {
57
- pinMode (_reset_pin, OUTPUT);
58
- digitalWrite (_reset_pin, AVRISP_RESET_OFF);
59
59
_server.begin ();
60
60
}
61
61
62
+ void ESP8266AVRISP::setSpiFrequency (uint32_t freq) {
63
+ _spi_freq = freq;
64
+ if (_state == AVRISP_STATE_ACTIVE) {
65
+ SPI.setFrequency (freq);
66
+ }
67
+ }
68
+
62
69
void ESP8266AVRISP::setReset (bool rst) {
63
- if (rst) {
70
+ _reset_state = rst;
71
+ if (_reset_state) {
64
72
digitalWrite (_reset_pin, AVRISP_RESET_ON);
65
73
} else {
66
74
digitalWrite (_reset_pin, AVRISP_RESET_OFF);
@@ -88,9 +96,14 @@ AVRISPState_t ESP8266AVRISP::update() {
88
96
if (!_client.connected ()) {
89
97
_client.stop ();
90
98
AVRISP_DEBUG (" client disconnect" );
91
- SPI.end ();
92
- digitalWrite (_reset_pin, AVRISP_RESET_OFF);
99
+ if (pmode) {
100
+ SPI.end ();
101
+ pmode = 0 ;
102
+ }
103
+ setReset (_reset_state);
93
104
_state = AVRISP_STATE_IDLE;
105
+ } else {
106
+ _reject_incoming ();
94
107
}
95
108
break ;
96
109
}
@@ -104,11 +117,6 @@ AVRISPState_t ESP8266AVRISP::serve() {
104
117
// should not be called when idle, error?
105
118
break ;
106
119
case AVRISP_STATE_PENDING: {
107
- // enter reset, setup SPI
108
- SPI.begin ();
109
- SPI.setFrequency (_spi_freq);
110
- SPI.setHwCs (false );
111
- digitalWrite (_reset_pin, AVRISP_RESET_ON);
112
120
_state = AVRISP_STATE_ACTIVE;
113
121
// fallthrough
114
122
}
@@ -213,31 +221,14 @@ void ESP8266AVRISP::set_parameters() {
213
221
+ buff[17 ] * 0x00010000
214
222
+ buff[18 ] * 0x00000100
215
223
+ buff[19 ];
216
-
217
- // AVRISP_DEBUG("devicecode = %d", param.devicecode);
218
- // AVRISP_DEBUG("revision = %d", param.revision);
219
- // AVRISP_DEBUG("progtype = %d", param.progtype);
220
- // AVRISP_DEBUG("parmode = %d", param.parmode);
221
- // AVRISP_DEBUG("polling = %d", param.polling);
222
- // AVRISP_DEBUG("selftimed = %d", param.selftimed);
223
- // AVRISP_DEBUG("lockbytes = %d", param.lockbytes);
224
- // AVRISP_DEBUG("fusebytes = %d", param.fusebytes);
225
- // AVRISP_DEBUG("flashpoll = %d", param.flashpoll);
226
- // AVRISP_DEBUG("eeprompoll = %d", param.eeprompoll);
227
- // AVRISP_DEBUG("pagesize = %d", param.pagesize);
228
- // AVRISP_DEBUG("eepromsize = %d", param.eepromsize);
229
-
230
- // AVRISP_DEBUG("flashsize = %d", param.flashsize);
231
-
232
224
}
233
225
234
226
void ESP8266AVRISP::start_pmode () {
227
+ SPI.begin ();
228
+ SPI.setFrequency (_spi_freq);
229
+ SPI.setHwCs (false );
235
230
236
- // SPI already begun when entering ACTIVE state
237
- // SPI.begin();
238
- // SPI.setFrequency(AVRISP_SPI_FREQ);
239
-
240
- // following delays may not work on all targets...
231
+ // try to sync the bus
241
232
SPI.transfer (0x00 );
242
233
digitalWrite (_reset_pin, AVRISP_RESET_OFF);
243
234
delayMicroseconds (50 );
@@ -250,7 +241,7 @@ void ESP8266AVRISP::start_pmode() {
250
241
251
242
void ESP8266AVRISP::end_pmode () {
252
243
SPI.end ();
253
- digitalWrite (_reset_pin, AVRISP_RESET_OFF );
244
+ setReset (_reset_state );
254
245
pmode = 0 ;
255
246
}
256
247
0 commit comments