Binary to update ESP8266 firmware to Espressif firmware. Requires user to press buttons.

Dependencies:   BufferedSerial mbed

Fork of ESPQuickFlash by Christopher Haster

How to Use

This program will update the firmware on a connected ESP8266 to the Espressif Firmware. The user will need to put the ESP8266 board into FW Update mode and follow instructions as given on the serial console.

Between each block transfer power cycle the ESP8266 and put back into FW Update mode. On the Seeed Grove Serial WiFi module this requires a short press followed by a long press on the esp8266 reset button untill the light on the module goes red.

Terminal Settings

9600 baud 8-N-1

Video of how its done

slip.h

Committer:
mbedAustin
Date:
2016-04-18
Revision:
1:7cb29c3c51ac
Parent:
0:d84cdaf22096

File content as of revision 1:7cb29c3c51ac:

#ifndef SLIP_H
#define SLIP_H

// Packet wrapping using the SLIP protocol
template <typename SERIAL>
class SLIPPacket {
private:
    SERIAL _serial;
    
public:
    SLIPPacket(PinName tx, PinName rx) : _serial(tx, rx) {}
    
    int checkgetc() {
        Timer timer;
        timer.start();
        
        while (!_serial.readable()) {
            if (timer.read_ms() > 1500)
                return -1;
        }
            
        int c = _serial.getc();
#ifdef DEBUG
        printf("<- 0x%02x\r\n", c);
#endif
        return c;
    }
    
    int checkputc(char c) {
        wait_us(100);
        
        while (!_serial.writeable())
            ;

#ifdef DEBUG
        printf("-> 0x%02x\r\n", c);
#endif
        return _serial.putc(c);
    }
    
    void flush() {
        while (_serial.readable())
            _serial.getc();
    }

public:
    bool req_start() {
#ifdef LED_STATUS
        led_blue = 0; // Show progress
#endif
        return !(checkputc(0xc0) < 0);
    }
    
    bool req_finish() {
#ifdef LED_STATUS
        led_blue = 1; // Show progress
#endif
        return !(checkputc(0xc0) < 0);
    }
    
    bool putc(char c) {
        switch (c) {
            case 0xdb: return checkputc(0xdb) >= 0 && checkputc(0xdd) >= 0;
            case 0xc0: return checkputc(0xdb) >= 0 && checkputc(0xdc) >= 0;
            default:   return checkputc(c) >= 0;
        }
    }
    
    bool send(const void *data, int len) {
        for (int i = 0; i < len; i++) {
            if (!putc(((char *)data)[i]))
                return false;
        }
        
        return true;
    }
 
public:
    bool resp_start() {
        return checkgetc() == 0xc0;
    }
    
    bool resp_finish() {
        return checkgetc() == 0xc0;
    }
    
    int getc() {
        int c = checkgetc();
        
        if (c < 0) {
            return -1;
        } else if (c == 0xdb) {
            c = checkgetc();
            switch (c) {
                case 0xdd: return 0xdb;
                case 0xdc: return 0xc0;
                default:   return -1;
            }
        } else {
            return c;
        }
    }
    
    bool recv(void *resp, int len) {
        for (int i = 0; i < len; i++) {
            int c = getc();
            
            if (c < 0)
                return false;
            
            if (resp)
                ((char *)resp)[i] = c;
        }
        
        return true;
    }
};

#endif