android uboot获取mac地址,uboot生成随机的MAC地址

uboot生成随机的MAC地址

R.wen

由于设备量产需要每台机器的MAC地址都不一样,所以我们给Uboot增加一个环境变量sysready,用来表示如果系统没有ready,就做一些额外的初始化工作,如生成一个随机的MAC地址,并保存到环境变量中。

一、 在s2410中找一个随机源也不容易,它不像x86一样有个硬件计数器可以作为随机源。这里我们使用了s2410的timer,经过测试也可以得到很好的随机数。

Timer部分的代码在cpu/arm920t/s24x0/interrupt.c中,首先要在lib_arm/board.c的初始化函数中加入初始化定时器的函数:

interrupt_init ();

接着就可以通过

Ret = get_ticks();

得到中断计数和。

由于系统总有一些不确定因素的影响,所以总会得到不同的计数和。

二、得到随机数

上面得到的随机数值差别非常小,但是经过下面的计算,就可以得到看起来很随机的数。

static unsigned char random(void)

{

unsigned long long rand = get_ticks() * 100000;

unsigned char a;

//   See "Numerical Recipes in C", second edition, p. 284

rand = rand * + ;

a = rand >> 24; //不是最低8位

//为了得到 ‘0~9, a ~ f, A ~ F’ 的值

if (a < 'A')

a = a % 10 + 48;

else if (a < 'F')

a = a % 6 + 65;

else if (a < 'a' || a > 'f')

a = a % 6 + 97;

return a;

}

三、设置随机MAC地址:

s = getenv("sysready");

sysready = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;

if (sysready == 0) /* system not ready */

{

/*set mac addr */

char mac[18]={'0','0',};

int i;

for (i=3; i<17; i++)

{

udelay(10);

mac= random();

}

mac[2] = mac[5] = mac[8] = mac[11] = mac[14] = ':';

mac[17] = '\0';

setenv("ethaddr", mac);

setenv("sysready", "1");

saveenv();

}

四、应用

完成了上面的设置之后, 在系统第一次加载的时候,由于sysready为0,所以会重新生成一个随机的MAC地址,随后uboot会将sysready置为1。

如果需要重新生成一个MAC地址,则只需要将sysready重置为0,然后保存环境变量即可,即执行:

setenv sysready 0; saveenv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值