Tuan PM
/
esptool
esptool
Diff: esptool.cpp
- Revision:
- 0:f6a51823dfa8
diff -r 000000000000 -r f6a51823dfa8 esptool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/esptool.cpp Mon Apr 06 06:43:53 2015 +0000 @@ -0,0 +1,81 @@ +#include "esptool.h" + +ESPTOOL::ESPTOOL(Serial& serial, PinName pinEnable, PinName pinProgram): _pinEn(pinEnable, _pinPro(pinProgram) { + _serial = serial; + _serial.baud(115200); +} +uint8_t ESPTOOL::read(){ + uint8_t data = _serial.getc(); + if(data == 0xDB){ + data = _serial.getc(); + if(data == 0xDC) + return 0xC0; + else if(data == 0xDD) + return 0xDB; + else + while(1); + } else + return data; +} +void ESPTOOL::read(uint8_t *data, uint32_t len){ + while(len --) + *data ++ = read(); +} + +void ESPTOOL:write(uint8_t *data, uint32_t len){ + uint8_t* buf_send = data, data_send; + + while(len--){ + data_send = *buf_send++; + if(data_send == 0xDB){ + _serial.putc(0xDB); + _serial.putc(0xDD); + } else if(data_send == 0xC0) { + _serial.putc(0xDB); + _serial.putc(0xDC); + } else { + _serial.putc(data_send); + } + } + +} +uint8_t ESPTOOL::command(uint8_t op, uint8_t *data, uint16_t data_len, uint32_t ck, uint8_t *recv_data, uint16_t *recv_len) { + uint8_t header[8]; + _serial.putc(0xC0); + _serial.putc(0x00); + write(&op, 1); + write((uint8_t*)&data_len, 2); + write((uint8_t*)&ck, 4); + _serial.putc(0xC0); + + if(_serial.getc() != 0xC0) + return 0; + read(header, 8); + + if(header[0] != 0x01 || header[1] != op) + return 0; + recv_len = (uint16_t*)&header[2]; + read(recv_data, *recv_len); + if(_serial.getc() != 0xC0) + return 0; + + return 1; +} + +uint8_t ESPTOOL::connect() { + _pinEn = 0; + _pinPro = 0; + wait(0.2); + _pinEn = 1; + while(_serial.available()) + _serial.getc(); + +} +uint8_t ESPTOOL::sync(){ + uint8_t i; + uint8_t sync_frame[5] = {0x07, 0x07, 0x12, 0x20, 0x55*32}; + uint8_t recv_frame[5]; + uint8_t recv_len; + for(i=0; i<7; i++) + command(ESP_SYNC, sync_frame, 5, 0, recv_frame, &faerecv_len); +} \ No newline at end of file