问题背景 很多Wi-Fi/BT模组默认出厂是不带MAC地址的,整机厂需要根据需求,烧写特定的MAC地址。
MAC地址通路 Linux-4.9后,全志平台模组MAC地址定制流程如下
系统启动后,引导程序会加载env中定义的key,并传递给cmdline和内核dts。 如果安全存储中没有mac/wifi_mac/bt_mac这几个key,或者值解析失败,我们将尝试从私有分区加载并解析这些key。在内核空间中,addr_mgt驱动程序读取cmdline或dts中与Mac相关的键,对其进行解析并导出到其他驱动程序以使用。 为了让用户空间可以访问这些地址值,创建了sysfs来保存地址值。
配置 uboot env 请确保env.cfg中有如下配置项存在:
dts dts配置参考如下
其中,type_addr_xx表示mac地址的来源,值含义如下
烧写 使用全志烧号工具DragonSN或DragonKey烧写mac/wifi_mac/bt_mac到私有分区或secure storge中。合法的mac地址格式为xx:xx:xx:xx:xx:xx, x 是16禁止值,0-9,a-f。
使用
内核空间
Linux-4.9
int get_wifi_custom_mac_address(char *addr_str)
int get_bt_custom_mac_address(char *addr_str)
int get_eth_custom_mac_address(char *addr_str)
Linux-5.4
int get_custom_mac_address(int fmt, char *name, char *addr)
fmt: 0为str,1为16进制值 name: “wifi”、“bt”、“eth”
用户空间 可以通过sysfs文件节点访问对应值,linux-4.9下主要节点如下:
root@venus-a1:/sys/class/addr_mgt# ls -l
total 0
-rw-r--r-- 1 root root 4096 2019-01-15 17:22 addr_bt
-rw-r--r-- 1 root root 4096 2019-01-15 17:22 addr_eth
-r--r--r-- 1 root root 4096 2019-01-15 17:22 addr_type
-rw-r--r-- 1 root root 4096 2019-01-15 17:22 addr_wifi
linux-5.4下主要节点如下:
console:/ # ls -l /sys/class/addr_mgt/
total 0
-rw-r--r-- 1 bluetooth net_bt_admin 4096 2020-12-22 19:33 addr_bt
-rw-r--r-- 1 root root 4096 2020-12-23 13:10 addr_eth
-rw-r--r-- 1 root root 4096 2020-12-23 13:10 addr_wifi
-r--r--r-- 1 root root 4096 2020-12-23 13:10 summary