实际操作现最后说明。
一、
Timer部分的代码在ccpu/arm_cortexa8/mx51/timer.c中,
二、得到随机数
- static unsigned char random(void)
- {
-
unsigned long long rand = get_timer(0) * 100000; -
unsigned char a; -
// See "Numerical Recipes in C", second edition, p. 284 -
rand = rand * 1664525L + 1013904223L; -
a = rand >> 24; //不是最低8位 -
//为了得到 ‘0~9, a ~ f, A ~ F’ 的值 -
if (a <</SPAN> 'A') -
a = a % 10 + 48; -
else if (a <</SPAN> 'F') -
a = a % 6 + 65; -
else if (a <</SPAN> 'a' || a > 'f') -
a = a % 6 + 97; -
return a; - }
三、设置随机MAC地址:
- void autoset_mac_addr(void)
- {
- #define XMK_STR(x) #x
- #define MK_STR(x) XMK_STR(x)
-
char cmd_buf[128]; -
int i = 0; -
char *p_val; -
p_val = getenv ("ethaddr"); -
//如果mac地址为缺省值,则随机生成mac地址(后两位)
-
if(strcmp(p_val, MK_STR(CONFIG_ETHADDR)) == 0 ) -
{
-
char new_ethaddr[20], new_ip[20]; -
int rand_val = 0; -
memset(new_ethaddr, 0, sizeof(new_ethaddr)); -
memset(new_ip, 0, sizeof(new_ip)); -
strcpy(new_ethaddr, MK_STR(CONFIG_ETHADDR)); -
new_ethaddr[12] = 0; -
//随机生成mac地址后两位
-
sprintf(new_ethaddr, "%sx:x", new_ethaddr, random(), random()); -
printf("new_ethaddr = %s\n", new_ethaddr); -
setenv("ethaddr", new_ethaddr); -
setenv("fec_addr", new_ethaddr); -
while(1) -
{ -
//随机生成IP地址(根据server地址生成,只更改最后一位)
-
strcpy(new_ip, MK_STR(CONFIG_SERVERIP)); -
p_val = strrchr(new_ip, '.'); -
*(p_val + 1) = 0; -
rand_val = random(); -
//最后位不能为0和255
-
if( (rand_val != 0) && (rand_val != 0xFF) ) -
{
-
sprintf(new_ip, "%s%d", new_ip, rand_val); -
}
-
//不能和SERVERIP冲突
-
if(strcmp(p_val, MK_STR(CONFIG_SERVERIP)) != 0) -
{ -
break; -
} -
} -
printf("new_ip = %s\n", new_ip); -
setenv("ipaddr", new_ip); } //saveenv();保存环境变量到非失设备中,如:SD,Nnad中 - }
四、应用
说明:经测试发现以下方法实现uboot随机生成mac地址出现的问题很多,随把方法修改为: