summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2025-03-21 22:22:51 +0100
committerxengineering <me@xengineering.eu>2025-03-21 22:22:51 +0100
commit07d694f3d21ffc1b69638b8732ffd630affc9768 (patch)
treee841b07e78b694fb2d1c2f34c75aff77c70bd272
parentb309e027582b656b8a6094e268b495173f30bde7 (diff)
downloadiot-contact-07d694f3d21ffc1b69638b8732ffd630affc9768.tar
iot-contact-07d694f3d21ffc1b69638b8732ffd630affc9768.tar.zst
iot-contact-07d694f3d21ffc1b69638b8732ffd630affc9768.zip
fw: mac: Implement MAC address setting
The used MAC address is from an example range. Later it can easily be combined with reading from a MAC-providing EEPROM chip to using a unique hardware MAC on the device.
-rw-r--r--fw/CMakeLists.txt1
-rw-r--r--fw/prj.conf1
-rw-r--r--fw/src/mac.c56
3 files changed, 58 insertions, 0 deletions
diff --git a/fw/CMakeLists.txt b/fw/CMakeLists.txt
index 522a4dd..32a4571 100644
--- a/fw/CMakeLists.txt
+++ b/fw/CMakeLists.txt
@@ -21,4 +21,5 @@ target_sources(app
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/src/syslog.c"
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/mac.c"
)
diff --git a/fw/prj.conf b/fw/prj.conf
index b074671..405e696 100644
--- a/fw/prj.conf
+++ b/fw/prj.conf
@@ -9,6 +9,7 @@ CONFIG_NETWORKING=y
CONFIG_NET_SHELL=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_CONNECTION_MANAGER=y
+CONFIG_NET_L2_ETHERNET_MGMT=y
CONFIG_LOG=y
CONFIG_LOG_BACKEND_NET=y
diff --git a/fw/src/mac.c b/fw/src/mac.c
new file mode 100644
index 0000000..e34fa0d
--- /dev/null
+++ b/fw/src/mac.c
@@ -0,0 +1,56 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public License,
+ * v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ * obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+
+#include <stdint.h>
+#include <string.h>
+
+#include <zephyr/init.h>
+#include <zephyr/logging/log.h>
+#include <zephyr/net/net_if.h>
+#include <zephyr/net/net_linkaddr.h>
+#include <zephyr/net/net_mgmt.h>
+#include <zephyr/net/ethernet.h>
+#include <zephyr/net/ethernet_mgmt.h>
+#include <zephyr/sys/util.h>
+
+
+LOG_MODULE_REGISTER(mac);
+
+
+/* will be read from an EEPROM chip in the future */
+static const uint8_t mac_address[NET_ETH_ADDR_LEN] = {0x00, 0x00, 0x5e, 0x00, 0x53, 0x01};
+
+int init_mac_address(void)
+{
+ LOG_DBG("Setting custom MAC address");
+
+ struct net_if *interface = net_if_get_default();
+
+ int ret = net_if_down(interface);
+ if (ret < 0) {
+ LOG_ERR("Failed to set interface down to set MAC address (%d)", ret);
+ return ret;
+ }
+
+ struct ethernet_req_params params = {0};
+ memcpy(params.mac_address.addr, mac_address, 6);
+ ret = net_mgmt(NET_REQUEST_ETHERNET_SET_MAC_ADDRESS, interface, &params, sizeof(params));
+ if (ret < 0) {
+ LOG_ERR("Failed to set MAC address (%d)", ret);
+ return ret;
+ }
+
+ ret = net_if_up(interface);
+ if (ret < 0) {
+ LOG_ERR("Failed to set interface up after setting MAC address (%d)", ret);
+ return ret;
+ }
+
+ LOG_INF("Successfully set MAC address");
+ return 0;
+}
+SYS_INIT(init_mac_address, APPLICATION, 0);