2017-04-26 45 views
0

我的公司以低數量構建定製硬件,以至於購買一整塊MAC地址沒有任何經濟意義。我可以將什麼樣的芯片設計到我的嵌入式Linux板上,以便在啓動時自動分配全球唯一的MAC地址?Linux或U-Boot支持在啓動時從芯片讀取MAC地址嗎?

我搜索了Linux和MAC地址芯片和EUI-48芯片的u-boot驅動程序支持,但想出空。 MicroChip部件號24AA02E48是一款I2C芯片,可將EUI-48地址保存爲MAC地址。還有一個DS2502-48,一個串行1線芯片,我們以前通過編寫單獨的u-boot應用程序來讀取其MAC地址,並將其分配給U-Boot ethaddr環境變量,但這是一本手冊我想消除的一步。 1線時序非常緊密,以致u-boot應用程序偶爾無法正確讀取MAC地址,所以我們從未完全自動化該過程。

是否有任何Linux或u-boot的驅動程序相比,可以配置爲在啓動時自動讀取MAC地址芯片?

+0

我敢肯定,沒有什麼通用的;它是基於每個板子的。在真正舊版的U-Boot(例如1.1.5)中,曾經有一個'load_sernum_ethaddr()',可以作爲一個自定義的板子例程來實現。通常情況下,例程執行'i2c_read()'來檢索包含MAC地址的「製造商數據塊」。在最新版本的U-Boot中,board/tqc/tqm8xx仍然有類似的功能。在「setenv」和「ethaddr」的U-Boot源代碼上執行文本搜索,以查看其他板如何實現此目的。 – sawdust

回答

1

據我所知,你並不需要一個芯片都沒有。 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 
+0

當你聲明「u-boot存儲了它找到的MAC」時,這意味着在u-boot中有某種MAC地址發現邏輯。這樣的邏輯是否存在,或者我誤解了你的評論? – edj

+0

是的,u-boot有查找它的邏輯。確切的位置因董事會而異,因此u-boot的大部分工作就是將抽象層放在硬件特定的細節中。例如,華碩Tinker主板包含一個Rockchip RK3288,它內置了eeprom存儲的MAC。 U-boot在源文件「u-boot/board/rockchip/tinker_rk3288/tinker-rk3288.c」中定義該位置,並使用函數「get_ethaddr_from_eeprom」查找它。 有關更多示例,請搜索https://github.com/u-boot/u-boot,查找「eth_setenv_enetaddr」之類的術語。許多命中是靠近查找MAC的代碼。 –

+0

謝謝你的線索! – edj