|
发表于 2022-8-11 11:37:08
只看该作者
板凳
好啦,我自己搞定了:' Y# A& j. H5 ]6 m
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
8 F7 T4 m$ |6 w4 t9 w) Krk_get_eth_addr: rk_vendor_read eth mac address failed (-1)) {# h M9 Q/ E
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
: Q/ `/ H" N0 `rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
7 p0 c% l( v* o2、执行grep rk_get_eth_addr -r ./ 定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里" d) B- |1 C; ^2 Y& _
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:1 x( s* ~ x; y7 N5 [% i ^
/*modified by woodrow*/5 J* X6 m4 a3 r4 @1 n8 u( { Q
union {
3 q8 K5 m% \; _0 S unsigned long ul;
* P8 \' L$ \8 H+ L+ h unsigned char uc[8];) b" B* M1 _. j% @4 a/ z, f8 S
} cc;
' P, I: Z. D/ s7 Q( v //random_ether_addr(addr);+ `; n. I2 u% l
// dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",$ |4 P, F: _% L+ J7 x! J# u& Y
// __func__, addr[0], addr[1], addr[2],
1 e0 N- l% y7 Y T // addr[3], addr[4], addr[5]);5 I( o: O5 o# M" u( c3 v) _) r5 ^1 _
unsigned long system_low = (unsigned long)system_serial_low;
6 ?, e& g1 a6 b8 | unsigned long system_high = (unsigned long)system_serial_high;
2 ^6 p& i. Y3 ?* V1 k! p dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);' v/ s, @! l" x; p6 c1 N
dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);4 e. d# n$ B( b1 q9 O p1 z
cc.ul = system_low;
9 T; a$ ^0 s/ T# m addr[0] = 0xcc;; }' O9 C2 |% Q
addr[1] = 0x10;
6 z. E9 n( }4 w addr[2] = cc.uc[3]; r1 q1 C& K* K
addr[3] = cc.uc[2];
- J( F+ Y1 N Q addr[4] = cc.uc[1];0 E" a1 e8 Y) X3 h) R9 y4 V
addr[5] = cc.uc[0];6 F. E" u% ]% \( |3 S
/*modified by woodrow*/, B7 J& e9 S8 D1 i' v: }
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。 |
|