Skip to content

Commit dea79c6

Browse files
author
Veijo Pesonen
committed
Improves firmware version check
Adds granularity and allows usage of newer firmware with current driver.
1 parent f5ba963 commit dea79c6

File tree

3 files changed

+88
-17
lines changed

3 files changed

+88
-17
lines changed

ESP8266/ESP8266.cpp

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ ESP8266::ESP8266(PinName tx, PinName rx, bool debug, PinName rts, PinName cts)
3232
_parser(&_serial),
3333
_packets(0),
3434
_packets_end(&_packets),
35+
_sdk_v(-1,-1,-1),
36+
_at_v(-1,-1,-1),
3537
_connect_error(0),
3638
_fail(false),
3739
_closed(false),
@@ -67,22 +69,45 @@ bool ESP8266::at_available()
6769
return ready;
6870
}
6971

70-
int ESP8266::get_firmware_version()
72+
struct ESP8266::fw_sdk_version ESP8266::sdk_version()
7173
{
72-
int version;
74+
int major;
75+
int minor;
76+
int patch;
7377

7478
_smutex.lock();
75-
bool done = _parser.send("AT+GMR")
76-
&& _parser.recv("SDK version:%d", &version)
77-
&& _parser.recv("OK\n");
79+
bool done = _parser.send("AT+GMR");
80+
done &= _parser.recv("SDK version:%d.%d.%d", &major, &minor, &patch);
81+
done &= _parser.recv("OK\n");
82+
_smutex.unlock();
83+
84+
if(done) {
85+
_sdk_v.major = major;
86+
_sdk_v.minor = minor;
87+
_sdk_v.patch = patch;
88+
}
89+
return _sdk_v;
90+
}
91+
92+
struct ESP8266::fw_at_version ESP8266::at_version()
93+
{
94+
int major;
95+
int minor;
96+
int patch;
97+
int nused;
98+
99+
_smutex.lock();
100+
bool done = _parser.send("AT+GMR");
101+
done &= _parser.recv("AT version:%d.%d.%d.%d", &major, &minor, &patch, &nused);
102+
done &= _parser.recv("OK\n");
78103
_smutex.unlock();
79104

80105
if(done) {
81-
return version;
82-
} else {
83-
// Older firmware versions do not prefix the version with "SDK version: "
84-
return -1;
106+
_at_v.major = major;
107+
_at_v.minor = minor;
108+
_at_v.patch = patch;
85109
}
110+
return _at_v;
86111
}
87112

88113
bool ESP8266::stop_uart_hw_flow_ctrl(void)

ESP8266/ESP8266.h

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,34 @@ class ESP8266
4343
public:
4444
ESP8266(PinName tx, PinName rx, bool debug=false, PinName rts=NC, PinName cts=NC);
4545

46+
/**
47+
* ESP8266 firmware SDK version
48+
*
49+
* @param major Major version number
50+
* @param minor Minor version number
51+
* @param patch Patch version number
52+
*/
53+
struct fw_sdk_version {
54+
int major;
55+
int minor;
56+
int patch;
57+
fw_sdk_version (int major, int minor, int patch) : major(major), minor(minor), patch(patch) {}
58+
};
59+
60+
/**
61+
* ESP8266 firmware AT version
62+
*
63+
* @param major Major version number
64+
* @param minor Minor version number
65+
* @param patch Patch version number
66+
*/
67+
struct fw_at_version {
68+
int major;
69+
int minor;
70+
int patch;
71+
fw_at_version (int major, int minor, int patch) : major(major), minor(minor), patch(patch) {}
72+
};
73+
4674
/**
4775
* Check AT command interface of ESP8266
4876
*
@@ -51,12 +79,19 @@ class ESP8266
5179
bool at_available(void);
5280

5381
/**
54-
* Check firmware version of ESP8266
82+
* Check sdk version from which firmware is created
5583
*
56-
* @return integer firmware version or -1 if firmware query command gives outdated response
84+
* @return fw_sdk_version which tells major, minor and patch version
5785
*/
58-
int get_firmware_version(void);
59-
86+
struct fw_sdk_version sdk_version(void);
87+
88+
/**
89+
* Check AT instruction set version from which firmware is created
90+
*
91+
* @return fw_at_version which tells major, minor and patch version
92+
*/
93+
struct fw_at_version at_version(void);
94+
6095
/**
6196
* Startup the ESP8266
6297
*
@@ -305,6 +340,9 @@ class ESP8266
305340
uint32_t alloc_len; // Original length
306341
// data follows
307342
} *_packets, **_packets_end;
343+
344+
struct fw_sdk_version _sdk_v;
345+
struct fw_at_version _at_v;
308346
void _packet_handler();
309347
void _connect_error_handler();
310348
bool recv_ap(nsapi_wifi_ap_t *ap);

ESP8266Interface.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
#endif
3939

4040
// Firmware version
41-
#define ESP8266_VERSION 2
41+
#define ESP8266_SDK_VERSION_MAJOR 2
42+
#define ESP8266_AT_VERSION_MAJOR 1
4243

4344
ESP8266Interface::ESP8266Interface()
4445
: _esp(MBED_CONF_ESP8266_TX, MBED_CONF_ESP8266_RX, MBED_CONF_ESP8266_DEBUG, MBED_CONF_ESP8266_RTS, MBED_CONF_ESP8266_CTS),
@@ -239,9 +240,16 @@ int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count)
239240

240241
bool ESP8266Interface::_get_firmware_ok()
241242
{
242-
if (_esp.get_firmware_version() < ESP8266_VERSION) {
243-
debug("ESP8266: ERROR: Firmware incompatible with this driver.\
244-
\r\nUpdate at least to v%d - https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update\r\n",ESP8266_VERSION);
243+
ESP8266::fw_at_version at_v = _esp.at_version();
244+
if (at_v.major < ESP8266_AT_VERSION_MAJOR) {
245+
debug("ESP8266: ERROR: AT Firmware v%d incompatible with this driver.", at_v.major);
246+
debug("Update at least to v%d - https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update\n", ESP8266_AT_VERSION_MAJOR);
247+
return false;
248+
}
249+
ESP8266::fw_sdk_version sdk_v = _esp.sdk_version();
250+
if (sdk_v.major < ESP8266_SDK_VERSION_MAJOR) {
251+
debug("ESP8266: ERROR: Firmware v%d incompatible with this driver.", sdk_v.major);
252+
debug("Update at least to v%d - https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update\n", ESP8266_SDK_VERSION_MAJOR);
245253
return false;
246254
}
247255

0 commit comments

Comments
 (0)