RK3288Android5.1 通过cpu串号固定以太网MAC地址

固定mac地址流程:

    关闭原先的读取MAC地址文件->获取cpu串号->根据cpu串号计算一组能用的MAC地址->设置MAC地址。

此种固定方式即使重刷固件也不会改变MAC地址

 

生成MAC流程

1.全局变量system_serial_low为串号的低8位,system_serial_high为串号的高8位,先获取这两个值

2.判断这两个值是否小于0,如果小于0则取其绝对值

3.将这两个值转换为字符串,依次将字符串的两位转化为MAC地址的其中一个数据,

   例如:读到的system_serial_high = 123456789,system_serial_low=789abcdef

           则MAC = 12:34:56:78:ab:cd

 4.最终判断MAC地址第一位是否为偶数,如果不是偶数,就当前这位数减1,使其变成偶数。

5.详细过程查看对应补丁:fixedMac.patch:https://download.csdn.net/download/Mrdeath/12624890

diff --git a/frameworks/base/services/core/java/com/android/server/WatchdogManagerService.java b/frameworks/base/services/core/java/com/android/server/WatchdogManagerService.java
index 2c32ec3d15..57ab825dcd 100644
--- a/frameworks/base/services/core/java/com/android/server/WatchdogManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/WatchdogManagerService.java
@@ -155,8 +155,8 @@ public class WatchdogManagerService extends IWatchdogManager.Stub {
  
         mWatchdogReceiver = new WatchdogReceiver();
        getNetworkManagementService();
-       Message msg = mHandler.obtainMessage(MSG_SET_MAC);
-       mHandler.sendMessageAtTime(msg, SystemClock.uptimeMillis() + 10 * 1000);
+       //Message msg = mHandler.obtainMessage(MSG_SET_MAC);
+       //mHandler.sendMessageAtTime(msg, SystemClock.uptimeMillis() + 10 * 1000);
    }
  
    private boolean checkMacAddress(String macAddr) {
diff --git a/kernel/drivers/net/ethernet/rockchip/gmac/stmmac_main.c b/kernel/drivers/net/ethernet/rockchip/gmac/stmmac_main.c
index 5d2df5b4ff..6860e6e5fd 100755
--- a/kernel/drivers/net/ethernet/rockchip/gmac/stmmac_main.c
+++ b/kernel/drivers/net/ethernet/rockchip/gmac/stmmac_main.c
@@ -51,6 +51,9 @@
 #include "stmmac_ptp.h"
 #include "stmmac.h"
 #include "../eth_mac.h"
+#include 
+#include 
+
  
 #undef STMMAC_DEBUG
 /*#define STMMAC_DEBUG*/
@@ -1564,6 +1567,195 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
    return hw_cap;
 }
  
+
+//整型输入x,输出对应的16进制字符串
+void int_to_hex_str(long int x,char *p)
+{
+   int t,i=0;
+   if(x<0)
+   {
+       x=-x;
+       *p='-';
+       p++;
+   }
+   if(x==0)
+       *p='0';
+   for(i=0;i<10;i++)
+   {
+       t=x%16;
+       x=x/16;
+       if(t<10)
+       *(p+9-i)=t+'0';
+       else
+       *(p+9-i)=t+'A'-10;
+       if(x==0)
+       {
+           t=9-i;
+           break;
+       }
+   }
+   for( i=0;i<10-t;i++)
+   {
+       *(p+i)=*(p+t+i);
+       *(p+t+i)='\0';
+   }
+}
+
+/*
+ * 将字符转换为数值
+ * */ 
+int c2i(char ch) 
+{ 
+        if(isdigit(ch)) 
+                return ch - 48; 
+ 
+        if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' ) 
+                return -1; 
+ 
+        if(isalpha(ch)) 
+                return isupper(ch) ? ch - 55 : ch - 87; 
+ 
+        return -1; 
+} 
+ 
+/*
+ * 功能:将十六进制字符串转换为整型(int)数值
+ * */ 
+int hex2dec(char *hex) 
+{ 
+        int len; 
+        int num = 0; 
+        int temp; 
+        int bits; 
+        int i; 
+         
+        len = strlen(hex); 
+ 
+        for (i=0, temp=0; ihw->mac->get_umac_addr((void __iomem *)
                         priv->dev->base_addr,
                         priv->dev->dev_addr, 0);
-       if (!is_valid_ether_addr(priv->dev->dev_addr))
+       if (!is_valid_ether_addr(priv->dev->dev_addr)){
+           //如果idb里有写入MAC就从idb里获取
            eth_mac_idb(priv->dev->dev_addr);
+       }
+       if (!is_valid_ether_addr(priv->dev->dev_addr)){
+           //如果idb不能设置正确MAC,就自己读取cpu串号,生成MAC
+           eth_mac_from_cpu_serial(priv->dev->dev_addr);
+       }
+
        if (!is_valid_ether_addr(priv->dev->dev_addr))
            eth_hw_addr_random(priv->dev);
    }

 

你可能感兴趣的:(RK3288_Android)