Tuan PM
/
esptool
esptool
esptool.cpp@0:f6a51823dfa8, 2015-04-06 (annotated)
- Committer:
- TuanPM
- Date:
- Mon Apr 06 06:43:53 2015 +0000
- Revision:
- 0:f6a51823dfa8
ok
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TuanPM | 0:f6a51823dfa8 | 1 | #include "esptool.h" |
TuanPM | 0:f6a51823dfa8 | 2 | |
TuanPM | 0:f6a51823dfa8 | 3 | ESPTOOL::ESPTOOL(Serial& serial, PinName pinEnable, PinName pinProgram): _pinEn(pinEnable, _pinPro(pinProgram) { |
TuanPM | 0:f6a51823dfa8 | 4 | _serial = serial; |
TuanPM | 0:f6a51823dfa8 | 5 | _serial.baud(115200); |
TuanPM | 0:f6a51823dfa8 | 6 | } |
TuanPM | 0:f6a51823dfa8 | 7 | uint8_t ESPTOOL::read(){ |
TuanPM | 0:f6a51823dfa8 | 8 | uint8_t data = _serial.getc(); |
TuanPM | 0:f6a51823dfa8 | 9 | if(data == 0xDB){ |
TuanPM | 0:f6a51823dfa8 | 10 | data = _serial.getc(); |
TuanPM | 0:f6a51823dfa8 | 11 | if(data == 0xDC) |
TuanPM | 0:f6a51823dfa8 | 12 | return 0xC0; |
TuanPM | 0:f6a51823dfa8 | 13 | else if(data == 0xDD) |
TuanPM | 0:f6a51823dfa8 | 14 | return 0xDB; |
TuanPM | 0:f6a51823dfa8 | 15 | else |
TuanPM | 0:f6a51823dfa8 | 16 | while(1); |
TuanPM | 0:f6a51823dfa8 | 17 | } else |
TuanPM | 0:f6a51823dfa8 | 18 | return data; |
TuanPM | 0:f6a51823dfa8 | 19 | } |
TuanPM | 0:f6a51823dfa8 | 20 | void ESPTOOL::read(uint8_t *data, uint32_t len){ |
TuanPM | 0:f6a51823dfa8 | 21 | while(len --) |
TuanPM | 0:f6a51823dfa8 | 22 | *data ++ = read(); |
TuanPM | 0:f6a51823dfa8 | 23 | } |
TuanPM | 0:f6a51823dfa8 | 24 | |
TuanPM | 0:f6a51823dfa8 | 25 | void ESPTOOL:write(uint8_t *data, uint32_t len){ |
TuanPM | 0:f6a51823dfa8 | 26 | uint8_t* buf_send = data, data_send; |
TuanPM | 0:f6a51823dfa8 | 27 | |
TuanPM | 0:f6a51823dfa8 | 28 | while(len--){ |
TuanPM | 0:f6a51823dfa8 | 29 | data_send = *buf_send++; |
TuanPM | 0:f6a51823dfa8 | 30 | if(data_send == 0xDB){ |
TuanPM | 0:f6a51823dfa8 | 31 | _serial.putc(0xDB); |
TuanPM | 0:f6a51823dfa8 | 32 | _serial.putc(0xDD); |
TuanPM | 0:f6a51823dfa8 | 33 | } else if(data_send == 0xC0) { |
TuanPM | 0:f6a51823dfa8 | 34 | _serial.putc(0xDB); |
TuanPM | 0:f6a51823dfa8 | 35 | _serial.putc(0xDC); |
TuanPM | 0:f6a51823dfa8 | 36 | } else { |
TuanPM | 0:f6a51823dfa8 | 37 | _serial.putc(data_send); |
TuanPM | 0:f6a51823dfa8 | 38 | } |
TuanPM | 0:f6a51823dfa8 | 39 | } |
TuanPM | 0:f6a51823dfa8 | 40 | |
TuanPM | 0:f6a51823dfa8 | 41 | } |
TuanPM | 0:f6a51823dfa8 | 42 | 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) { |
TuanPM | 0:f6a51823dfa8 | 43 | uint8_t header[8]; |
TuanPM | 0:f6a51823dfa8 | 44 | _serial.putc(0xC0); |
TuanPM | 0:f6a51823dfa8 | 45 | _serial.putc(0x00); |
TuanPM | 0:f6a51823dfa8 | 46 | write(&op, 1); |
TuanPM | 0:f6a51823dfa8 | 47 | write((uint8_t*)&data_len, 2); |
TuanPM | 0:f6a51823dfa8 | 48 | write((uint8_t*)&ck, 4); |
TuanPM | 0:f6a51823dfa8 | 49 | _serial.putc(0xC0); |
TuanPM | 0:f6a51823dfa8 | 50 | |
TuanPM | 0:f6a51823dfa8 | 51 | if(_serial.getc() != 0xC0) |
TuanPM | 0:f6a51823dfa8 | 52 | return 0; |
TuanPM | 0:f6a51823dfa8 | 53 | read(header, 8); |
TuanPM | 0:f6a51823dfa8 | 54 | |
TuanPM | 0:f6a51823dfa8 | 55 | if(header[0] != 0x01 || header[1] != op) |
TuanPM | 0:f6a51823dfa8 | 56 | return 0; |
TuanPM | 0:f6a51823dfa8 | 57 | recv_len = (uint16_t*)&header[2]; |
TuanPM | 0:f6a51823dfa8 | 58 | read(recv_data, *recv_len); |
TuanPM | 0:f6a51823dfa8 | 59 | if(_serial.getc() != 0xC0) |
TuanPM | 0:f6a51823dfa8 | 60 | return 0; |
TuanPM | 0:f6a51823dfa8 | 61 | |
TuanPM | 0:f6a51823dfa8 | 62 | return 1; |
TuanPM | 0:f6a51823dfa8 | 63 | } |
TuanPM | 0:f6a51823dfa8 | 64 | |
TuanPM | 0:f6a51823dfa8 | 65 | uint8_t ESPTOOL::connect() { |
TuanPM | 0:f6a51823dfa8 | 66 | _pinEn = 0; |
TuanPM | 0:f6a51823dfa8 | 67 | _pinPro = 0; |
TuanPM | 0:f6a51823dfa8 | 68 | wait(0.2); |
TuanPM | 0:f6a51823dfa8 | 69 | _pinEn = 1; |
TuanPM | 0:f6a51823dfa8 | 70 | while(_serial.available()) |
TuanPM | 0:f6a51823dfa8 | 71 | _serial.getc(); |
TuanPM | 0:f6a51823dfa8 | 72 | |
TuanPM | 0:f6a51823dfa8 | 73 | } |
TuanPM | 0:f6a51823dfa8 | 74 | uint8_t ESPTOOL::sync(){ |
TuanPM | 0:f6a51823dfa8 | 75 | uint8_t i; |
TuanPM | 0:f6a51823dfa8 | 76 | uint8_t sync_frame[5] = {0x07, 0x07, 0x12, 0x20, 0x55*32}; |
TuanPM | 0:f6a51823dfa8 | 77 | uint8_t recv_frame[5]; |
TuanPM | 0:f6a51823dfa8 | 78 | uint8_t recv_len; |
TuanPM | 0:f6a51823dfa8 | 79 | for(i=0; i<7; i++) |
TuanPM | 0:f6a51823dfa8 | 80 | command(ESP_SYNC, sync_frame, 5, 0, recv_frame, &faerecv_len); |
TuanPM | 0:f6a51823dfa8 | 81 | } |