據我所知,你並不需要一個芯片都沒有。 MAC標準允許您生成一個「本地管理的」MAC地址,該地址不符合保證的全球唯一性。對於像你這樣的小型製造商來說,這幾乎總是夠好的,這就是標準允許的原因。
當選擇一個數字時(例如將U/L位設置爲「1」以確保它不能匹配註冊地址(U/L位==「0」))時,請務必遵循這些標準。生成有效本地MAC地址的「tl; dr」方法是使前三對「02:00:00:」和最後三對隨機十六進制數字;但如果你正在構建硬件,我建議花時間閱讀標準或至少維基百科頁面。
在僞隨機數字的巧合發生衝突的情況下,如果在所有可能給顧客一種方法來改變默認的MAC選擇。即使你有註冊地址,讓客戶改變它仍然是件好事。有時候,管理員會調整MAC的方式,使路由和/或負載平衡更容易,也很occasoinally他們需要躲避的人誰認爲這是確定硬碼「00生成的MAC:00:00:00:00: 00「或挑選12個隨機十六進制數字。
至於從Linux的驅動程序或U-Boot的讀取MAC,我不知道你的設備,但我覺得它最容易使用的U-Boot,因爲它工作在較低的水平。 U-Boot將它在環境變量「ethaddr」,「eth1addr」和「eth2addr」中找到的MAC存儲起來。命令「printenv」是查看它們的一種方法。下面是一個恰好在我眼前的電路板示例:
U-Boot# printenv ethaddr eth1addr eth2addr
ethaddr=98:5d:ad:43:dd:38
eth1addr=98:5d:ad:43:dd:3a
## Error: "eth2addr" not defined
U-Boot命令「bdinfo」也可能有用。再次從板在我的前面:
U-Boot# bdinfo
arch_number = 0x0000106E
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x20000000
eth0name = cpsw
ethaddr = 98:5d:ad:43:dd:38
current eth = cpsw
ip_addr = <NULL>
baudrate = 115200 bps
TLB addr = 0x9FFF0000
relocaddr = 0x9F753000
reloc off = 0x1EF53000
irq_sp = 0x9F332F38
sp start = 0x9F332F28
的U-Boot甚至包括一個可選的「gen_eth_addr」工具來生成有效局部施用地址。這裏有一個用法示例,摘自他們的維基頁面:https://www.denx.de/wiki/DULG/WhereCanIGetAValidMACAddress
$ make tools/gen_eth_addr
cc tools/gen_eth_addr.c -o tools/gen_eth_addr
$ tools/gen_eth_addr
ba:d0:4a:9c:4e:ce
我敢肯定,沒有什麼通用的;它是基於每個板子的。在真正舊版的U-Boot(例如1.1.5)中,曾經有一個'load_sernum_ethaddr()',可以作爲一個自定義的板子例程來實現。通常情況下,例程執行'i2c_read()'來檢索包含MAC地址的「製造商數據塊」。在最新版本的U-Boot中,board/tqc/tqm8xx仍然有類似的功能。在「setenv」和「ethaddr」的U-Boot源代碼上執行文本搜索,以查看其他板如何實現此目的。 – sawdust