20151204全志A80的以太网使用固定MAC地址.txt

来源:互联网 发布:免费tk域名 编辑:程序博客网 时间:2024/04/27 22:33
20151204全志A80的以太网使用固定MAC地址.txt
2015/12/3 16:09


开发板:美睿的商业开发板
OS:android4.4.2(美睿提供)
linux:3.4.39


发现全志平台的A80的以太网的MAC地址是变化的,由于需要做MAC地址和IP绑定的问题。
问了一些人,可以通过外挂EEPROM。外挂器件硬件不同意。(改版或者面积占用的问题)
当然在其它平台:比如freescale平台可以将eMMC分一个私有分区保存数据,在 恢复出厂设置 的时候,不会被擦除,感觉全志平台也应该有(只找到A80的,A80的没有找到)。
http://bbs.elecfans.com/jishu_427503_1_1.html
[Android问答] 关于全志A20的分区问题(sys_partition.fex)
;    keydata     = 1            ; //私有数据分区,重新量产数据将不丢失


http://blog.csdn.net/memechashang/article/details/23999857
http://yobin.sinaapp.com/topic/2780/android%E7%9A%84deviceid%E7%9A%84%E6%B7%BB%E5%8A%A0
Android的DeviceID的添加


找了好久,可以看见文件:/proc/cpuinfo中的CPU的ID号是唯一的。
测试:先刷美睿的系统,然后再刷原生的系统(支持4K录像,但是美睿没有移植驱动的系统),发现序列号没变。
序列号查看的方法:设置→关于平板电脑→状态信息→序列号:38608c0010503dd3d65c 中看到。


shell@kylin-merrii:/ $ cat /proc/cpuinfo                                       
Processor : ARMv7 Processor rev 5 (v7l)
processor : 0
BogoMIPS : 4800.00


Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5


Hardware : sun9i
Revision : 0000
Serial : 38608c0010503dd3d65c
shell@kylin-merrii:/ $ 


换了一台机器,序列号:38608 c0010 501dd 3560e


感觉序列号应该是唯一的!^_这里不做担保。
思路:于是想办法读取序列号,取后12位作为MAC地址!








MAC地址的有效性:
http://blog.csdn.net/skyflying2012/article/details/40322563
MAC地址格式小结
在IPv4的环境中,区分单播和组播地址就是校检最低位的二进制数字,0代表单播地址,1代表组播地址。
也就是说第二个数字一定是0、2、4、6、8、A、C、E其中的一个。


全志A80的BSP中的有效性验证:
Z:\wyb\finish_a80_4k_bsp\meirrii_merrii_a80_merrii\lichee\linux-3.4\include\linux\etherdevice.h
Z:\wyb\finish_a80_4k_bsp\meirrii_merrii_a80_merrii\lichee\linux-3.4\drivers\net\ethernet\sunxi\eth\sunxi_geth.c
addr [0] &= 0xfe;/* clear multicast bit */
addr [0] |= 0x02;/* set local assignment bit (IEEE802) */


感觉要么就是全志的BUG,要么就是全志的设置更加严格,这样下来第二个数字一定是2、6、A、E(不能是0、4、8、C)其中的一个。








实现原理:
曾经研究过内核中如何生成随机的MAC地址,android层中的setting如何获取序列号,然后准备在framework中拦截,走不通了。
http://bbs.csdn.net/topics/360240853
android 获取平板电脑序列号


http://blog.csdn.net/zhanghao_hulk/article/details/8286916
[置顶] android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法


http://www.cnblogs.com/Amandaliu/archive/2012/12/04/2802322.html
【Android】获取Mac地址【2】


后来想起来,调试 以太网卡驱动的时候,曾经出现过手工加载 insmod /system/vendor/modules/sunxi_gmac.ko 就可以获取MAC地址上网。
既然这样,就在init.rc的服务中启动一个C程序来获取序列号,然后配置在模块 sunxi_gmac.ko 中。


Z:\wyb\finish_a80_4k_bsp\meirrii_merrii_a80_merrii\android4.4\device\softwinner\kylin-merrii\init.sun9i.rc
关闭init.rc中的以太网卡驱动的加载,
# insmod network
    insmod /system/vendor/modules/bcmdhd.ko
    insmod /system/vendor/modules/bcm_btlpm.ko
    insmod /system/vendor/modules/usbnet.ko
    insmod /system/vendor/modules/asix.ko
    insmod /system/vendor/modules/qf9700.ko
    insmod /system/vendor/modules/mcs7830.ko
    insmod /system/vendor/modules/rtl8150.ko
    insmod /system/vendor/modules/cdc_ether.ko
    # insmod /system/vendor/modules/sunxi_gmac.ko




然后在 init.rc 的最后面做一个服务,在系统启动的时候,
#2015/12/3 11:49 edit the ethernet's MAC address!!!!
service wenyuanbo /system/bin/chip_id_as_mac
    class main
    user root
    group root
    oneshot








文件名:Android.mk
LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE_TAGS := optional


LOCAL_MODULE = chip_id_as_mac


# LOCAL_SRC_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES := chip_id_as_mac.c


include $(BUILD_EXECUTABLE)








文件名:chip_id_as_mac.c
// http://blog.csdn.net/21cnbao/article/details/7919055
// Z:\wyb\finish_a80_4k_bsp\meirrii_merrii_a80_merrii\android4.4\system\core\init


#include <stdio.h>  
#include <linux/types.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/ioctl.h>  
#include <errno.h>  
#include <assert.h>  
#include <string.h>  
#include <linux/i2c.h>  


#include <ctype.h>








static int get_chip_id(char *buf, size_t size)
{
char *path = "/proc/cpuinfo";
FILE *fd;
char data[128];
char *key, *value, *end;
int len = -1;


fd = fopen(path, "r");
if (fd == NULL) 
{
printf("****wyb %s:%d/%s()! ERROR !!!! cannot open %s\n", __FILE__, __LINE__, __func__, path); 

return -1;
}


while (fgets(data, sizeof(data), fd)) {
key = data;
value = strchr(key, ':');
if (value == 0)
continue;
*value++ = 0;


if (strncmp(key, "Serial", 6))
continue;


while (isspace(*value))
value++;


end = strchr(value, '\n');
*end = 0;
len = snprintf(buf, size, "%s", value);
// printf("****wyb %s:%d/%s()! buf=%s len=%d\n", __FILE__, __LINE__, __func__, buf, len); 

break;
}

fclose(fd);

return 0;
}








int main(int argc, char **argv)
{
int ret;

char buf[32] = {0};
char buf2[32] = {0};
int i = 0;
// unsigned char ucTemp = 0;
char ucTemp = 0;
char path[200] = "insmod /system/vendor/modules/sunxi_gmac.ko mac_str=\"";
        
if (get_chip_id(buf, sizeof(buf)) < 0) 
{
printf("****wyb %s:%d/%s()! ERROR!!!!\n", __FILE__, __LINE__, __func__); 

else 
{
printf("****wyb %s:%d/%s()! 2015/12/2 16:51 get_chip_id=%s sizeof(buf)=%d\n", __FILE__, __LINE__, __func__, buf, sizeof(buf));

// for(i=0; i<6; i++)
for(i=0; i<5; i++)
{
buf2[3*i+0] = buf[2*i+8+0];
buf2[3*i+1] = buf[2*i+8+1];
buf2[3*i+2] = ':';
}

buf2[3*5+0] = buf[2*5+8+0];
buf2[3*5+1] = buf[2*5+8+1];
buf2[3*5+2] = '\0';


switch(buf2[1])
{
case '0':
case '1':
case '2':
buf2[1] = '2';
break;
case '3':
case '4':
case '5':
case '6':
buf2[1] = '6';
break;
case '7':
case '8':
case '9':
case 'a':
case 'A':
buf2[1] = 'A';
break;
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
buf2[1] = 'E';
break;
default:
break;
}


printf("****wyb %s:%d/%s()! 2015/12/2 17:13 get_chip_id/buf2=%s sizeof(buf2)=%d\n", __FILE__, __LINE__, __func__, buf2, sizeof(buf2));

// strcat(d,s);
// strcat(path, buf2);
strncat(path, buf2, 17);
strcat(path, "\"");

printf("****wyb %s:%d/%s()! 2015/12/3 15:11 get_chip_id/buf2=%s sizeof(buf2)=%d path=%s\n", __FILE__, __LINE__, __func__, buf2, sizeof(buf2), path);

system(path);
}
        
return 0;
}




生成MAC地址:12:50:3d:d3:d6:5c


需要执行的命令:
Z:\wyb\finish_a80_4k_bsp\rj45_merrii_a80_merrii\android4.4\out\target\product\kylin-merrii\system\bin>adb push chip_id_as_mac /system/bin/


C:\Users\wenyb>adb remount
remount succeeded


C:\Users\wenyb>adb shell
root@kylin-merrii:/ # cd /system/bin
cd /system/bin
root@kylin-merrii:/system/bin # chmod 777 chip_id_as_mac
chmod 777 chip_id_as_mac
root@kylin-merrii:/system/bin # ll chip*
ll chip*
-rwxrwxrwx root     root         5368 2015-12-03 15:23 chip_id_as_mac
root@kylin-merrii:/system/bin # sync
sync
root@kylin-merrii:/system/bin # reboot








困惑,下面这个程序的执行之后,MAC地址就成为了:1F:50:3d:d3:d6:5c。找了好久也找不到原因。
// http://blog.csdn.net/21cnbao/article/details/7919055
// Z:\wyb\finish_a80_4k_bsp\meirrii_merrii_a80_merrii\android4.4\system\core\init


#include <stdio.h>  
#include <linux/types.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/ioctl.h>  
#include <errno.h>  
#include <assert.h>  
#include <string.h>  
#include <linux/i2c.h>  


#include <ctype.h>








static int get_chip_id(char *buf, size_t size)
{
char *path = "/proc/cpuinfo";
FILE *fd;
char data[128];
char *key, *value, *end;
int len = -1;


fd = fopen(path, "r");
if (fd == NULL) 
{
printf("****wyb %s:%d/%s()! ERROR !!!! cannot open %s\n", __FILE__, __LINE__, __func__, path); 

return -1;
}


while (fgets(data, sizeof(data), fd)) {
key = data;
value = strchr(key, ':');
if (value == 0)
continue;
*value++ = 0;


if (strncmp(key, "Serial", 6))
continue;


while (isspace(*value))
value++;


end = strchr(value, '\n');
*end = 0;
len = snprintf(buf, size, "%s", value);
// printf("****wyb %s:%d/%s()! buf=%s len=%d\n", __FILE__, __LINE__, __func__, buf, len); 

break;
}

fclose(fd);

return 0;
}








int main(int argc, char **argv)
{
int ret;

char buf[32] = {0};
char buf2[32] = {0};
int i = 0;
// unsigned char ucTemp = 0;
char ucTemp = 0;
char path[200] = "insmod /system/vendor/modules/sunxi_gmac.ko mac_str=\"";
        
if (get_chip_id(buf, sizeof(buf)) < 0) 
{
printf("****wyb %s:%d/%s()! ERROR!!!!\n", __FILE__, __LINE__, __func__); 

else 
{
printf("****wyb %s:%d/%s()! 2015/12/2 16:51 get_chip_id=%s sizeof(buf)=%d\n", __FILE__, __LINE__, __func__, buf, sizeof(buf));

// for(i=0; i<6; i++)
for(i=0; i<5; i++)
{
buf2[3*i+0] = buf[2*i+8+0];
buf2[3*i+1] = buf[2*i+8+1];
buf2[3*i+2] = ':';
}

buf2[3*5+0] = buf[2*5+8+0];
buf2[3*5+1] = buf[2*5+8+1];
buf2[3*5+2] = '\0';


ucTemp = buf[1];
if( (ucTemp>='a') && (ucTemp<='f') )
{
ucTemp -= 'a';
ucTemp += 10;
}
else if( (ucTemp>='A') && (ucTemp<='F') )
{
ucTemp -= 'A';
ucTemp += 10;
}
else if( (ucTemp>='0') && (ucTemp<='9') )
{
ucTemp -= '0';
}
else
{
return 0;
}

// addr [0] &= 0xfe;/* clear multicast bit */
// addr [0] |= 0x02;/* set local assignment bit (IEEE802) */
ucTemp &= 0x0E;
ucTemp |= 0x02;

if(ucTemp>9)
{
ucTemp = (ucTemp-10) + 'A';
}
else
{
ucTemp += '0';
}

buf2[1] = ucTemp;


printf("****wyb %s:%d/%s()! 2015/12/2 17:13 get_chip_id/buf2=%s sizeof(buf2)=%d\n", __FILE__, __LINE__, __func__, buf2, sizeof(buf2));

// strcat(d,s);
// strcat(path, buf2);
strncat(path, buf2, 17);
strcat(path, "\"");

printf("****wyb %s:%d/%s()! 2015/12/3 15:11 get_chip_id/buf2=%s sizeof(buf2)=%d path=%s\n", __FILE__, __LINE__, __func__, buf2, sizeof(buf2), path);

system(path);
}
        
return 0;
}








http://download.csdn.net/detail/wb4916/9323837
全志A80平台固定以太网的MAC地址ethernet_a80_merrii_20151203_1607.7z 


0 0
原创粉丝点击