mac address: add the number of MAC address generated from efuse for user to choose

1. Add the number of MAC address generated from efuse for user to choose.

2. Add MAC address derive method.
This commit is contained in:
XiaXiaotian
2017-03-02 14:57:45 +08:00
parent 6d061ec903
commit d3eede2110
6 changed files with 115 additions and 58 deletions

View File

@@ -74,42 +74,82 @@ esp_err_t esp_efuse_read_mac(uint8_t* mac)
esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__((alias("esp_efuse_read_mac")));
esp_err_t esp_read_mac(uint8_t* mac, int interface)
esp_err_t esp_derive_mac(uint8_t* dst_mac, const uint8_t* src_mac)
{
uint8_t idx;
if (dst_mac == NULL || src_mac == NULL) {
ESP_LOGE(TAG, "mac address param is NULL");
return ESP_ERR_INVALID_ARG;
}
memcpy(dst_mac, src_mac, 6);
for (idx = 0; idx < 64; idx++) {
dst_mac[0] = src_mac[0] | 0x02;
dst_mac[0] ^= idx << 2;
if (memcmp(dst_mac, src_mac, 6)) {
break;
}
}
return ESP_OK;
}
esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type)
{
uint8_t efuse_mac[6];
if (mac == NULL) {
ESP_LOGE(TAG, "mac address param is NULL");
abort();
return ESP_ERR_INVALID_ARG;
}
if (type < ESP_MAC_WIFI_STA || type > ESP_MAC_ETH) {
ESP_LOGE(TAG, "mac type is incorrect");
return ESP_ERR_INVALID_ARG;
}
_Static_assert(NUM_MAC_ADDRESS_FROM_EFUSE == FOUR_MAC_ADDRESS_FROM_EFUSE \
|| NUM_MAC_ADDRESS_FROM_EFUSE == TWO_MAC_ADDRESS_FROM_EFUSE, \
"incorrect NUM_MAC_ADDRESS_FROM_EFUSE value");
esp_efuse_read_mac(efuse_mac);
switch (interface) {
#if CONFIG_WIFI_ENABLED
switch (type) {
case ESP_MAC_WIFI_STA:
memcpy(mac, efuse_mac, 6);
mac[5] += CONFIG_ESP_MAC_OFFSET_WIFI_STA;
break;
case ESP_MAC_WIFI_SOFTAP:
memcpy(mac, efuse_mac, 6);
mac[5] += CONFIG_ESP_MAC_OFFSET_WIFI_SOFTAP;
if (NUM_MAC_ADDRESS_FROM_EFUSE == FOUR_MAC_ADDRESS_FROM_EFUSE) {
memcpy(mac, efuse_mac, 6);
mac[5] += 1;
}
else if (NUM_MAC_ADDRESS_FROM_EFUSE == TWO_MAC_ADDRESS_FROM_EFUSE) {
esp_derive_mac(mac, efuse_mac);
}
break;
#endif
#if CONFIG_BT_ENABLED
case ESP_MAC_BT:
memcpy(mac, efuse_mac, 6);
mac[5] += CONFIG_ESP_MAC_OFFSET_BT;
if (NUM_MAC_ADDRESS_FROM_EFUSE == FOUR_MAC_ADDRESS_FROM_EFUSE) {
mac[5] += 2;
}
else if (NUM_MAC_ADDRESS_FROM_EFUSE == TWO_MAC_ADDRESS_FROM_EFUSE) {
mac[5] += 1;
}
break;
#endif
#if CONFIG_ETHERNET
case ESP_MAC_ETH:
memcpy(mac, efuse_mac, 6);
mac[5] += CONFIG_ESP_MAC_OFFSET_ETH;
if (NUM_MAC_ADDRESS_FROM_EFUSE == FOUR_MAC_ADDRESS_FROM_EFUSE) {
memcpy(mac, efuse_mac, 6);
mac[5] += 3;
}
else if (NUM_MAC_ADDRESS_FROM_EFUSE == TWO_MAC_ADDRESS_FROM_EFUSE) {
efuse_mac[5] += 1;
esp_derive_mac(mac, efuse_mac);
}
break;
#endif
default:
ESP_LOGW(TAG, "wrong mac type");
ESP_LOGW(TAG, "incorrect mac type");
break;
}