SPI Flash unique id на ESP8266

btomaev

✩✩✩✩✩✩✩
17 Фев 2023
5
0
Есть ли какой нибудь способ прочитать uid флеш памяти esp8266?
Важный момент, код пишу из под arduino ide.
Для idf вроде как есть способ, но с иде никак не получается.
ChipId, Mac и обычный id (не uid) для моих нужд не подходят.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Для idf вроде как есть способ, но с иде никак не получается.
Вы путаете горячее с зеленым. IDF это SDK, фреймворк на основе которого все разрабатывается для ESP. А IDE это среда для разработки, причем ArduinoIDE использует IDF при написании кода для ESP.

И да, нет гарантии что uid флеши будет уникальный, или вообще будет при использовании дешевых китайских модулей.

Опишите, для чего вам использование uid флеши?
 

btomaev

✩✩✩✩✩✩✩
17 Фев 2023
5
0
Вы путаете горячее с зеленым. IDF это SDK, фреймворк на основе которого все разрабатывается для ESP. А IDE это среда для разработки, причем ArduinoIDE использует IDF при написании кода для ESP.
Дружище, я прекрасно понимаю о чем говорю. Функции в ядре для есп это оболочка для IDFовских функций, просто не все они реализованы.

И да, нет гарантии что uid флеши будет уникальный, или вообще будет при использовании дешевых китайских модулей.
Мне будет достаточно его уникальности, тем более вместе с маком. Ну а про китайские модули я пожалуй промолчу...

Опишите, для чего вам использование uid флеши?
Для однозначной идентификации устройства. Нужно чтобы каждое устройство могло генерировать что-то вроде HWID.
Сейчас используется ChipId * FlashId * uint8_t (id группы устройств). Но это мягко говоря не лучший способ.
Просто хранить идентификатор не подходит, так как каждое устройство должно выполнять самопроверку, в рантайме генерируя и сверяя с записанным этот самый id.
 

btomaev

✩✩✩✩✩✩✩
17 Фев 2023
5
0
Так что мешает использовать функции idf?
Я так и не разобрался как это сделать. Не могу импортировать idf библиотеки и использовать функции оттуда.
Если вы знаете как, буду рад вашей помощи.

Chipid не уникальный, а вот мак-адрес обязан быть уникальным, поэтому для идентификации лучше использовать его.
Ну во первых его можно поменять в загрузчике (если есть способ считать дефолтный из под ардуиновского ядра было бы здорово), а во вторых мне на днях пришла партия из 30 штук и около 9 имеют полностью идентичный мак, но меняют его если подключены к одной сети.
Хотя возможно это просто китай...

Если как-то можно считать дефолтный мак, он вроде в efuse хранится, но не уверен, это тоже подойдет.
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
У флеш памяти нет юида, если ее не по спецзаказу делали.
Под 8266 IDF нет! Идф только под чипы семейства есп32. Маки у точки доступа и клиента различаются, то что зашито вашито ефьюз и есть по умолчанию.
 
  • Лойс +1
Реакции: btomaev

btomaev

✩✩✩✩✩✩✩
17 Фев 2023
5
0
У флеш памяти нет юида, если ее не по спецзаказу делали.
Под 8266 IDF нет! Идф только под чипы семейства есп32. Маки у точки доступа и клиента различаются, то что зашито вашито ефьюз и есть по умолчанию.
Благодарю, очень информативно, есть ли способ прочитать мак из efuse?
т.к. результат wifi_get_macaddr() может быть изменен
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
Можно.
C++:
MacID _mac;
_mac.u64 = ESP.getEfuseMac();
Но это фукция из IDF и будет работать только для есп32. Для 8266 не помню есть аналог или нет, смотрите nonos sdk
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
есть ли способ прочитать мак из efuse?
Вот тут смотрите: https://docs.espressif.com/projects...ml#_CPPv425esp_efuse_mac_get_defaultP7uint8_t

esp_err_t esp_efuse_mac_get_default(uint8_t *mac)
Return base MAC address which is factory-programmed by Espressif in EFUSE.

ReturnESP_OK on successParameters
  • mac: base MAC address, length: 6 bytes.
А вообще, на будущее, учитесь с ESP работать не в ArduinoIDE, а в нормальной IDE.
 
Изменено:

btomaev

✩✩✩✩✩✩✩
17 Фев 2023
5
0
Ура! получилось)
Спасибо всем за помощь! Особенно Геннадию.
Если кому интересно

C++:
#define    REG_READ(_r)        (*(volatile    uint32    *)(_r))

#define DR_REG_EFUSE_BASE   0x3FF00050
#define EFUSE_DATA0_REG     (DR_REG_EFUSE_BASE + 0x000)
#define EFUSE_DATA1_REG     (DR_REG_EFUSE_BASE + 0x004)
#define EFUSE_DATA2_REG     (DR_REG_EFUSE_BASE + 0x008)
#define EFUSE_DATA3_REG     (DR_REG_EFUSE_BASE + 0x00C)

#include <ESP8266WiFi.h>

uint64_t getEfuseMac() {
  uint32_t efuse[4];
  uint8_t mac[6];
  uint64_t out = 0;

  efuse[0] = REG_READ(EFUSE_DATA0_REG);
  efuse[1] = REG_READ(EFUSE_DATA1_REG);
  efuse[2] = REG_READ(EFUSE_DATA2_REG);
  efuse[3] = REG_READ(EFUSE_DATA3_REG);

  mac[0] = efuse[3] >> 16;
  mac[1] = efuse[3] >> 8;
  mac[2] = efuse[3];
  mac[3] = efuse[1] >> 8;
  mac[4] = efuse[1];
  mac[5] = efuse[0] >> 24;

  memcpy(&out, mac, sizeof(mac));

  return out;
}

void setup() {
    Serial.begin(115200);
    Serial.println(WiFi.macAddress());
    Serial.println(String(getEfuseMac(), HEX));
}

void loop() {
  
}
Сразу скажу, тут нет части проверок из этого кода, но кому они необходимы думаю справится и сам.
 
Изменено: