固定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 <asm/system_info.h>
+#include <linux/ctype.h>
+#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; i<len; i++, temp=0)
+        {
+                temp = c2i( *(hex + i) );
+                bits = (len - i - 1) * 4;
+                temp = temp << bits;
+
+                num = num | temp;
+        }
+
+        return num;
+}
+
+
+int eth_mac_from_cpu_serial(char *addr)
+{
+   char serial_low[9] = {0};
+   char serial_high[9] = {0};
+        char addr1[3],addr2[3],addr3[3],addr4[3],addr5[3],addr6[3];
+   int final_addr1 = 0;
+   int i = 0;
+   long long system_serial_low_final = system_serial_low;
+   long long system_serial_high_final = system_serial_high;
+   if (system_serial_low_final == 0 && system_serial_high_final == 0)
+        {
+       printk("system_serial_low system_serial_high read err\n");
+       return -ENODEV;
+   }
+   if(system_serial_low_final < 0)
+   {
+       system_serial_low_final = -system_serial_low_final;
+   }
+   for(i=0;system_serial_low_final < 268435456;i++)
+   {
+
+       system_serial_low_final = system_serial_low_final * 16 + i;
+       printk("for system_serial_low = %lld\n ",system_serial_low_final);
+   }
+   if(system_serial_high_final < 0)
+   {
+       system_serial_high_final = -system_serial_high_final;
+   }
+   for(i=0;system_serial_high_final < 268435456;i++)
+        {
+                system_serial_high_final = system_serial_high_final * 16 + i;
+       printk("for system_serial_high = %lld\n ",system_serial_high_final);
+       msleep(500);
+        }
+
+   printk("system_serial_low = %d,system_serial_high = %d\n",system_serial_low,system_serial_high);
+   printk("system_serial_low_final = %lld,system_serial_high_final = %lld\n",system_serial_low_final,system_serial_high_final);
+
+   int_to_hex_str(system_serial_low_final,serial_low);
+   int_to_hex_str(system_serial_high_final,serial_high);
+   printk("system_serial_low = %s,system_serial_high = %s\n",serial_low,serial_high);
+   if(serial_high[0] != '-')
+   {
+       addr1[0] = serial_high[0];
+       addr1[1] = serial_high[1];
+       addr1[2] = '\0';
+       addr2[0] = serial_high[2];
+       addr2[1] = serial_high[3];
+       addr2[2] = '\0';
+       addr3[0] = serial_high[4];
+       addr3[1] = serial_high[5];
+       addr3[2] = '\0';
+       addr4[0] = serial_high[6];
+       addr4[1] = serial_high[7];
+       addr4[2] = '\0';
+   }
+   else
+   {
+       addr1[0] = serial_high[1];
+       addr1[1] = serial_high[2];
+       addr1[2] = '\0';
+       addr2[0] = serial_high[3];
+       addr2[1] = serial_high[4];
+       addr2[2] = '\0';
+       addr3[0] = serial_high[5];
+       addr3[1] = serial_high[6];
+       addr3[2] = '\0';
+       addr4[0] = serial_high[7];
+       addr4[1] = serial_high[8];
+       addr4[2] = '\0';
+
+
+   }
+   if(serial_low[0] != '-')
+   {
+       addr5[0] = serial_low[4];
+       addr5[1] = serial_low[5];
+       addr5[2] = '\0';
+       addr6[0] = serial_low[6];
+       addr6[1] = serial_low[7];
+       addr6[2] = '\0';
+   }
+   else
+   {
+       addr5[0] = serial_low[5];
+       addr5[1] = serial_low[6];
+       addr5[2] = '\0';
+       addr6[0] = serial_low[7];
+       addr6[1] = serial_low[8];
+       addr6[2] = '\0';
+
+   }
+   final_addr1 = hex2dec(addr1);
+   if(final_addr1 % 2 != 0)
+   {
+       addr[0] = final_addr1 -1 ;
+   }
+   else
+   {
+       addr[0] = final_addr1;
+   }
+   addr[1] = hex2dec(addr2);
+   addr[2] = hex2dec(addr3);
+   addr[3] = hex2dec(addr4);
+   addr[4] = hex2dec(addr5);
+   addr[5] = hex2dec(addr6);
+        return 0;
+
+
+}
+
+/*** stmmac_check_ether_addr: check if the MAC addr is valid* @priv: driver private structure
@@ -1577,8 +1769,15 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv)priv->hw->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);}

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

  1. 以太网MAC地址组成与交换机

    目录 一,数据链路层 二,以太网格式 三,交换机的工作原理 交换机以太网接口的工作模式 交换机以太网接口速率 四,交换机基本命令 一,数据链路层 功能: 数据链路的建立,建立与拆除 帧包装,帧传输,帧 ...

  2. Android5.1修改以太网MAC地址(SElinux)【转】

    本文转载自:http://blog.csdn.net/LoongEmbedded/article/details/71477203 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求 ...

  3. Android5.1修改以太网MAC地址(SElinux)

    点击打开链接 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求,大致流程是windows写到一块flash片区去保存序列号和以太网MAC地址,然后Android客户端通过相关接口去 ...

  4. 【计算机网络】数据链路层 : 以太网 ( 无连接、不可靠服务 | 以太网发展 | 10BASE-T 以太网 | MAC 地址 | 以太网 MAC 帧 | 高速以太网 )

    文章目录 一. 以太网 ( Ethernet ) 概述 二. 以太网 ( Ethernet ) 服务 三. 以太网 ( Ethernet ) 发展 四. 10BASE-T 以太网 五. 适配器 与 M ...

  5. 汽车以太网- MAC地址

    MAC地址,乍听起来感觉熟悉又陌生,相信这是很多新人朋友的第一感觉吧.当然,如果你是一名资深IT人士或者网络达人,可能这个概念对你来说就显得太过简单.我这里简单梳理一下自己对此概念的一些理解,也希望大 ...

  6. 嵌入式设备的机器码、cpu的id号以及网卡mac地址

    gd->bd->bi_arch_number (1)bi_arch_number是board_info中的一个元素,含义是:开发板的机器码.所谓机器码就是uboot给这个开发板定义的一个唯 ...

  7. 手机的串号IMEI/ESN标示位置图解-摩托罗拉官方教程

    手机的串号IMEI/ESN标示位置图解-摩托罗拉官方教程 2012-01-01 19:47:26 作者:佚名  http://www.pksou.cn/html/wzck/js/tx/2744.htm ...

  8. Android11 Wifi Mac地址设置随机或者固定分析

    Android11 Wifi Mac地址设置随机或者固定分析 本文对Android11 wifi MAC地址设置是否随机问题进行分析. 文章目录 Android11 Wifi Mac地址设置随机或者固 ...

  9. 手机串号英文简称“IMEI”

    手机串号英文简称"IMEI",存储在手机的EEPROM(俗称码片)里,每一个移动设备都对应一个唯一的IMEI.其组成结构为TAC(6位数字)+FAC(两位数字)+SNR(6位数字) ...

最新文章

  1. 2022-2028年中国塑料导爆管行业市场调查研究及前瞻分析报告
  2. OpenCV(十六)边缘检测2 -- Laplace(拉普拉斯)二阶微分算子
  3. python selenium 进入新标签页_Python 爬虫 | 用selenium实现批改网的自动翻译
  4. Intersection of Two Linked Lists——经典问题
  5. redis为什么使用单线程 ,还那么快,单线程是怎么实现的
  6. PYthon3:函数实现“自动售卖机”功能
  7. 浏览器常见bug及解决办法
  8. fullyRelease
  9. 学习ASP.NET Core Razor 编程系列十八——并发解决方案
  10. AM335x(TQ335x)学习笔记——GPIO关键驱动移植
  11. matlab标准化出现负值,为什么我求出来的约束条件是负值
  12. spark学习 Java版SparkSQL程序读取Hbase表注册成表SQL查询
  13. 超详细的jenkins持续集成工作原理、功能、部署方式等介绍
  14. 仪器开发 之 DICOM 三维重建 HPP
  15. win10家庭版远程连接 要求的函数不受支持
  16. Steam游戏存档位置大全
  17. oracle19c报价_官宣:Oracle数据库19c在Oracle Exadata上发布啦!
  18. [BZOJ3717] [PA2014] Pakowanie [状态压缩][dp]
  19. 丑小鸭课件软件测试,丑小鸭免费课件
  20. 二次开发----在帆软报表设计器上添加自己的按钮

热门文章

  1. Delphi 简单的编译指令
  2. Hp服务器机箱风扇维修,HP服务器机箱改装(3)
  3. 在课堂中用计算机软件给学生,计算机在实验课堂中的应用
  4. MEMS惯性器件选型笔记
  5. python二元函数求导_tensorflow的函数自动求导是如何实现的?
  6. 开源软件使用的风险和应对方法
  7. 【爬虫】封装了一些 python 爬虫技巧,开箱即用
  8. html唤醒计算机,闹钟唤醒.html
  9. FuInt会员营销系统
  10. Python8-10行代码生成任意形状的文字云图