mirror of
https://github.com/apache/nuttx.git
synced 2026-05-29 20:56:47 +08:00
1.xtensa/esp32s3: configure the number of universal management
(IEEE) MAC addresses when there are multipleinterfaces. 2.Optimize Lan9250 to adapt to ESP32S3 universalMAC address.
This commit is contained in:
@@ -1682,6 +1682,44 @@ config ESP32S3_BLE_INTERRUPT_SAVE_STATUS
|
|||||||
|
|
||||||
endmenu # BLE Configuration
|
endmenu # BLE Configuration
|
||||||
|
|
||||||
|
choice ESP32S3_UNIVERSAL_MAC_ADDRESSES
|
||||||
|
bool "Number of universally administered (by IEEE) MAC address"
|
||||||
|
default ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR
|
||||||
|
depends on ESP32S3_WIFI || ESP32S3_BLE
|
||||||
|
help
|
||||||
|
Configure the number of universally administered (by IEEE) MAC addresses.
|
||||||
|
During initialization, MAC addresses for each network interface are generated or derived from a
|
||||||
|
single base MAC address.
|
||||||
|
If the number of universal MAC addresses is four, all four interfaces (WiFi station, WiFi softap,
|
||||||
|
Bluetooth and Ethernet) receive a universally administered MAC address. These are generated
|
||||||
|
sequentially by adding 0, 1, 2 and 3 (respectively) to the final octet of the base MAC address.
|
||||||
|
If the number of universal MAC addresses is two, only two interfaces (WiFi station and Bluetooth)
|
||||||
|
receive a universally administered MAC address. These are generated sequentially by adding 0
|
||||||
|
and 1 (respectively) to the base MAC address. The remaining two interfaces (WiFi softap and Ethernet)
|
||||||
|
receive local MAC addresses. These are derived from the universal WiFi station and Bluetooth MAC
|
||||||
|
addresses, respectively.
|
||||||
|
When using the default (Espressif-assigned) base MAC address, either setting can be used. When using
|
||||||
|
a custom universal MAC address range, the correct setting will depend on the allocation of MAC
|
||||||
|
addresses in this range (either 2 or 4 per device.)
|
||||||
|
|
||||||
|
config ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO
|
||||||
|
bool "Two"
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_WIFI_STA
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_BT
|
||||||
|
|
||||||
|
config ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR
|
||||||
|
bool "Four"
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_WIFI_STA
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_WIFI_AP
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_BT
|
||||||
|
select ESP_MAC_ADDR_UNIVERSE_ETH
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config ESP32S3_UNIVERSAL_MAC_ADDRESSES
|
||||||
|
int
|
||||||
|
default 2 if ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO
|
||||||
|
default 4 if ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR
|
||||||
|
|
||||||
menu "PHY"
|
menu "PHY"
|
||||||
depends on ESP32S3_PARTITION_TABLE
|
depends on ESP32S3_PARTITION_TABLE
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ static int lan9250_attach(const struct lan9250_lower_s *lower,
|
|||||||
xcpt_t handler, void *arg);
|
xcpt_t handler, void *arg);
|
||||||
static void lan9250_enable(const struct lan9250_lower_s *lower);
|
static void lan9250_enable(const struct lan9250_lower_s *lower);
|
||||||
static void lan9250_disable(const struct lan9250_lower_s *lower);
|
static void lan9250_disable(const struct lan9250_lower_s *lower);
|
||||||
static void lan9250_getmac(const struct lan9250_lower_s *lower,
|
static int lan9250_getmac(const struct lan9250_lower_s *lower,
|
||||||
uint8_t *mac);
|
uint8_t *mac);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -175,18 +175,44 @@ static void lan9250_disable(const struct lan9250_lower_s *lower)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void lan9250_getmac(const struct lan9250_lower_s *lower, uint8_t *mac)
|
static int lan9250_getmac(const struct lan9250_lower_s *lower, uint8_t *mac)
|
||||||
{
|
{
|
||||||
uint32_t regval[2];
|
uint32_t regval[2];
|
||||||
uint8_t *data = (uint8_t *)regval;
|
uint8_t *data = (uint8_t *)regval;
|
||||||
|
int i;
|
||||||
|
|
||||||
regval[0] = esp32s3_efuse_read_reg(EFUSE_BLK1, 0);
|
regval[0] = esp32s3_efuse_read_reg(EFUSE_BLK1, 0);
|
||||||
regval[1] = esp32s3_efuse_read_reg(EFUSE_BLK1, 1);
|
regval[1] = esp32s3_efuse_read_reg(EFUSE_BLK1, 1);
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
mac[i] = data[i];
|
mac[i] = data[5 - i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR
|
||||||
|
mac[5] += 3;
|
||||||
|
#else
|
||||||
|
mac[5] += 1;
|
||||||
|
uint8_t tmp = mac[0];
|
||||||
|
for (i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
mac[0] = tmp | 0x02;
|
||||||
|
mac[0] ^= i << 2;
|
||||||
|
|
||||||
|
if (mac[0] != tmp)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 64)
|
||||||
|
{
|
||||||
|
wlerr("Failed to generate ethernet MAC\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -2472,7 +2472,11 @@ int lan9250_initialize(
|
|||||||
|
|
||||||
if (lower->getmac)
|
if (lower->getmac)
|
||||||
{
|
{
|
||||||
lower->getmac(lower, priv->dev.d_mac.ether.ether_addr_octet);
|
if (lower->getmac(lower, priv->dev.d_mac.ether.ether_addr_octet) < 0)
|
||||||
|
{
|
||||||
|
nerr("ERROR: Failed read MAC address\n");
|
||||||
|
return -EAGAIN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register the device with the OS so that socket IOCTLs can be performed */
|
/* Register the device with the OS so that socket IOCTLs can be performed */
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ struct lan9250_lower_s
|
|||||||
* driver will not read the MAC from the CPU.
|
* driver will not read the MAC from the CPU.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CODE void (*getmac)(FAR const struct lan9250_lower_s *lower,
|
CODE int (*getmac)(FAR const struct lan9250_lower_s *lower,
|
||||||
FAR uint8_t *mac);
|
FAR uint8_t *mac);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user