当前位置: 技术问答>linux和unix
关于uboot如何获取MAC
来源: 互联网 发布时间:2016-06-21
本文导语: 各位大侠好,我在网上搜了一下关于uboot获取mac的方法,说是在board.c中的下面这一段实现了获取mac的功能, /* MAC Address */ { int i; ulong reg; char *s, *e; char tmp[64]; i = getenv_r ("ethaddr", tmp, sizeof (tmp)); s =...
各位大侠好,我在网上搜了一下关于uboot获取mac的方法,说是在board.c中的下面这一段实现了获取mac的功能,
/* MAC Address */
{
int i;
ulong reg;
char *s, *e;
char tmp[64];
i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;
for (reg = 0; reg bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
其中getenv_r()函数是:
int getenv_r (char *name, char *buf, unsigned len)
{
int i, nxt;
for (i=0; env_get_char(i) != ''; i=nxt+1) {
int val, n;
for (nxt=i; env_get_char(nxt) != ''; ++nxt) {
if (nxt >= CFG_ENV_SIZE) {
return (-1);
}
}
if ((val=envmatch((uchar *)name, i)) n++) && (*buf++ = env_get_char(val++)) != '')
;
if (len == n)
*buf = '';
return (n);
}
return (-1);
}
我怎么看都看不大明白,也许是自己水平有限,麻烦各位大侠帮我注释一下,或是有讲解资料的也说明一下,说一下获取mac到底是个怎么个过程,感激不尽!!!!!!!!!谢谢!!!!!!!
/* MAC Address */
{
int i;
ulong reg;
char *s, *e;
char tmp[64];
i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;
for (reg = 0; reg bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
其中getenv_r()函数是:
int getenv_r (char *name, char *buf, unsigned len)
{
int i, nxt;
for (i=0; env_get_char(i) != ''; i=nxt+1) {
int val, n;
for (nxt=i; env_get_char(nxt) != ''; ++nxt) {
if (nxt >= CFG_ENV_SIZE) {
return (-1);
}
}
if ((val=envmatch((uchar *)name, i)) n++) && (*buf++ = env_get_char(val++)) != '')
;
if (len == n)
*buf = '';
return (n);
}
return (-1);
}
我怎么看都看不大明白,也许是自己水平有限,麻烦各位大侠帮我注释一下,或是有讲解资料的也说明一下,说一下获取mac到底是个怎么个过程,感激不尽!!!!!!!!!谢谢!!!!!!!
|
uboot有一些环境变量存储在flash的一个sector上,ethaddr是其中的一个,uboot启动时会读取这些内容放到SDRAM中,上面的代码只不过是从这些放在SDRAM的参数中把ethaddr读出来而已。
|
可以这么设置setenv ethaddr
read_srom_word()应该是从eeprom里面读取MAC地址,所以你要跟着下源码,
正常的运行应该是uboot启动后,如果ethaddr环境变量存在和读eeprom不是会同时进行的
|
看起来是的,这个靠你用环境变量设置。