1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-22 21:23:07 +03:00
Allman-astyler eea9999dc5 Revert "Allman now (#6080)" (#6090)
This reverts commit 98125f88605cd7e46e9be4e1b3ad0600dd5d2b51.
2019-05-14 00:09:54 +02:00

127 lines
3.3 KiB
C++

/*
AVR In-System Programming over WiFi for ESP8266
Copyright (c) Kiril Zyapkov <kiril@robotev.com>
Original version:
ArduinoISP version 04m3
Copyright (c) 2008-2011 Randall Bohn
If you require a license, see
http://www.opensource.org/licenses/bsd-license.php
*/
#ifndef _ESP8266AVRISP_H
#define _ESP8266AVRISP_H
#include <Arduino.h>
// uncomment if you use an n-mos to level-shift the reset line
// #define AVRISP_ACTIVE_HIGH_RESET
// SPI clock frequency in Hz
#define AVRISP_SPI_FREQ 300e3
// programmer states
typedef enum {
AVRISP_STATE_IDLE = 0, // no active TCP session
AVRISP_STATE_PENDING, // TCP connected, pending SPI activation
AVRISP_STATE_ACTIVE // programmer is active and owns the SPI bus
} AVRISPState_t;
// stk500 parameters
typedef struct {
uint8_t devicecode;
uint8_t revision;
uint8_t progtype;
uint8_t parmode;
uint8_t polling;
uint8_t selftimed;
uint8_t lockbytes;
uint8_t fusebytes;
int flashpoll;
int eeprompoll;
int pagesize;
int eepromsize;
int flashsize;
} AVRISP_parameter_t;
class ESP8266AVRISP {
public:
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();
// 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);
// check for pending clients if IDLE, check for disconnect otherwise
// returns the updated state
AVRISPState_t update();
// transition to ACTIVE if PENDING
// serve STK500 commands from buffer if ACTIVE
// returns the updated state
AVRISPState_t serve();
protected:
inline void _reject_incoming(void); // reject any incoming tcp connections
void avrisp(void); // handle incoming STK500 commands
uint8_t getch(void); // retrieve a character from the remote end
uint8_t spi_transaction(uint8_t, uint8_t, uint8_t, uint8_t);
void empty_reply(void);
void breply(uint8_t);
void get_parameter(uint8_t);
void set_parameters(void);
int addr_page(int);
void flash(uint8_t, int, uint8_t);
void write_flash(int);
uint8_t write_flash_pages(int length);
uint8_t write_eeprom(int length);
uint8_t write_eeprom_chunk(int start, int length);
void commit(int addr);
void program_page();
uint8_t flash_read(uint8_t hilo, int addr);
void flash_read_page(int length);
void eeprom_read_page(int length);
void read_page();
void read_signature();
void universal(void);
void fill(int); // fill the buffer with n bytes
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;
WiFiClient _client;
AVRISPState_t _state;
uint8_t _reset_pin;
bool _reset_state;
bool _reset_activehigh;
// programmer settings, set by remote end
AVRISP_parameter_t param;
// page buffer
uint8_t buff[256];
int error = 0;
bool pmode = 0;
// address for reading and writing, set by 'U' command
int here;
};
#endif // _ESP8266AVRISP_H