Android Mediatek NVRAM 加载 MAC 地址并禁用 MAC 地址更新

简介: Android Mediatek NVRAM 加载 MAC 地址并禁用 MAC 地址更新

这个是让r8152 走nvram读取eth mac地址,这部分代码可以参考用于kernel读取nvram 数据。
updateMac这个不用关心,是客制化的东西。

这个 修改主要在 Android 系统中修改了网络驱动和 MAC 地址更新的相关代码,使得系统在启动时从 NVRAM 中加载 MAC 地址,并禁用了 MAC 地址的更新。

修改的文件:

  1. kernel-3.10/drivers/net/usb/r8152.c
  2. vendor/mediatek/proprietary/external/updateMac/updateMac.cpp

文件修改说明:

  1. r8152.c: 在 r8152 驱动中,添加了从 NVRAM 中读取 MAC 地址的代码。当系统启动时,驱动会首先尝试从 NVRAM 中读取 MAC 地址,如果读取失败或者读取到的 MAC 地址无效,那么系统会生成一个随机的 MAC 地址。
  2. updateMac.cpp: 在 updateMac 程序中,注释掉了更新 MAC 地址的代码,使得系统不再更新 MAC 地址。
---
 kernel-3.10/drivers/net/usb/r8152.c                | 88 +++++++++++++++++++++-
 .../proprietary/external/updateMac/updateMac.cpp   |  4 +-
 2 files changed, 89 insertions(+), 3 deletions(-)
 
diff --git a/kernel-3.10/drivers/net/usb/r8152.c b/kernel-3.10/drivers/net/usb/r8152.c
index 61d3cd6..36b1c30 100755
--- a/kernel-3.10/drivers/net/usb/r8152.c
+++ b/kernel-3.10/drivers/net/usb/r8152.c
@@ -1191,12 +1191,74 @@ out1:
  return ret;
 }
 
+#define IS_SUPPORT_NVRAM  1
+#if IS_SUPPORT_NVRAM
+#define ETHERNET_NVRAM_CUSTOM_NAME "/data/nvram/APCFG/APRDEB/WIFI"
+unsigned char g_nvram_macaddr[6];
+
+static int nvram_read(char *filename, char *buf, ssize_t len, int offset)
+{
+    struct file *fd;
+    //ssize_t ret;
+    int retLen = -1;
+
+    mm_segment_t old_fs = get_fs();
+    set_fs(KERNEL_DS);
+
+    fd = filp_open(filename, O_WRONLY|O_CREAT, 0644);
+
+    if(IS_ERR(fd)) {
+        printk("failed to open!!\n");
+        return -1;
+    }
+    do{
+        if ((fd->f_op == NULL) || (fd->f_op->read == NULL))
+            {
+            printk("file can not be read!!\n");
+            break;
+            }
+
+        if (fd->f_pos != offset) {
+            if (fd->f_op->llseek) {
+                    if(fd->f_op->llseek(fd, offset, 0) != offset) {
+                        printk("[nvram_read] : failed to seek!!\n");
+                        break;
+                    }
+              } else {
+                    fd->f_pos = offset;
+              }
+        }
+
+            retLen = fd->f_op->read(fd,
+                                          buf,
+                                          len,
+                                          &fd->f_pos);
+
+    }while(false);
+
+    filp_close(fd, NULL);
+
+    set_fs(old_fs);
+
+    return retLen;
+}
+
+int load_nvram_macaddr( char * filename, char * buf, int len)
+{
+    return nvram_read( filename, buf, len, sizeof(u16) + sizeof(u16));
+}
+
+#endif
+
 static int set_ethernet_addr(struct r8152 *tp)
 {
  struct net_device *dev = tp->netdev;
  struct sockaddr sa;
  int ret;
-
+#if IS_SUPPORT_NVRAM
+ int i = 0;
+ printk("nvram rtl8152---set_ethernet_addr---\n");
+#endif
  if (tp->version == RTL_VER_01)
    ret = pla_ocp_read(tp, PLA_IDR, 8, sa.sa_data);
  else
@@ -1207,8 +1269,32 @@ static int set_ethernet_addr(struct r8152 *tp)
  } else if (!is_valid_ether_addr(sa.sa_data)) {
    netif_err(tp, probe, dev, "Invalid ether addr %pM\n",
        sa.sa_data);
+#if IS_SUPPORT_NVRAM
+   g_nvram_macaddr[0] = 0;
+   g_nvram_macaddr[1] = 0;
+   g_nvram_macaddr[2] = 0;
+   g_nvram_macaddr[3] = 0;
+   g_nvram_macaddr[4] = 0;
+   g_nvram_macaddr[5] = 0;
+   load_nvram_macaddr(ETHERNET_NVRAM_CUSTOM_NAME,
+            (char *)&g_nvram_macaddr, sizeof(g_nvram_macaddr));
+   printk("Read nvram : g_nvram_macaddr %02x%02x%02x%02x%02x%02x\n",
+            g_nvram_macaddr[0], g_nvram_macaddr[1], g_nvram_macaddr[2],
+            g_nvram_macaddr[3], g_nvram_macaddr[4], g_nvram_macaddr[5]);
+   for(i = 0; i < 6; i++){
+     if(i == 1){
+       sa.sa_data[i] = g_nvram_macaddr[i] + 2;
+     }else{
+       sa.sa_data[i] = g_nvram_macaddr[i];
+     }   
+   }
+   printk("Read nvram : sa.sa_data %02x%02x%02x%02x%02x%02x\n",
+            g_nvram_macaddr[0], g_nvram_macaddr[1], g_nvram_macaddr[2],
+            g_nvram_macaddr[3], g_nvram_macaddr[4], g_nvram_macaddr[5]);
+#else
    eth_hw_addr_random(dev);
    ether_addr_copy(sa.sa_data, dev->dev_addr);
+#endif
    ret = rtl8152_set_mac_address(dev, &sa);
    netif_info(tp, probe, dev, "Random ether addr %pM\n",
         sa.sa_data);
diff --git a/vendor/mediatek/proprietary/external/updateMac/updateMac.cpp b/vendor/mediatek/proprietary/external/updateMac/updateMac.cpp
index f13d55f..163dfda 100755
--- a/vendor/mediatek/proprietary/external/updateMac/updateMac.cpp
+++ b/vendor/mediatek/proprietary/external/updateMac/updateMac.cpp
@@ -76,7 +76,7 @@ int GetMacParamFromNVRam(WIFI_CFG_PARAM_STRUCT *pmacParamNB)
 }
 
 int main(){
- int i =0;
+ /*int i =0;
  struct ifreq ifreq;
  int socket_id;
  int ret;
@@ -127,7 +127,7 @@ int main(){
  strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
  ifreq.ifr_flags |= IFF_UP;     // ifconfig   up
  ret = ioctl(socket_id, SIOCSIFFLAGS, &ifreq);
- close(socket_id);
+ close(socket_id);*/
  return 0;
 }



相关文章
|
7月前
|
Android开发
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
66 0
|
4月前
|
域名解析 网络协议 虚拟化
|
5月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
163 2
|
2月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
3月前
|
缓存 算法 安全
MAC地址_MAC地址格式_以太网的MAC帧_基础知识
MAC地址是全球每块网卡唯一的介质访问控制地址,由6字节构成,前24位为厂商代码,后24位为序列号。网卡需安装驱动程序才能正常工作,并实现物理层和数据链路层功能及传输模式转换。MAC地址通常固化在EEPROM中,属于数据链路层范畴。以太网MAC帧包括前导码、地址、类型、数据和校验码,接收方根据MAC地址处理帧。网卡可设为混杂模式接收所有帧,便于网络分析,但也可能被黑客利用。
242 10
|
4月前
|
Android开发 Windows
mac下Android Studio 快捷键(持续更新)
mac下Android Studio 快捷键(持续更新)
405 1
|
4月前
|
移动开发 JavaScript 开发工具
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
|
4月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
51 0
|
4月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
40 0
|
6月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
53 2