rk3368 用Chip ID生成Wi-Fi或者以太网MAC地址

本文介绍了基于RK3368平台,如何利用芯片的eFuse中的Chip ID生成Android 6.0系统中Wi-Fi和以太网的MAC地址。通过解析3.10.0内核的dtsi和efuse.c文件,可以理解Chip ID如何被用于设置系统Serial,并进一步应用于Wi-Fi(rfkill-wlan.c)和以太网(eth_mac.c)的MAC地址生成过程。

Platform: RK3368

OS: Android 6.0

Kernel: 3.10.0


rk3368的Chip ID是从芯片eFuse中读取出来的。然后赋值给system_serial_low和system_serial_high.
/proc/cpuinfo中的Serial字段就是用的这两个值。

arch/arm64/boot/dts/rk3368.dtsi

	efuse_256@ffb00000 {
		compatible = "rockchip,rk3368-efuse-256";
		reg = <0x0 0xffb00000 0x0 0x8>;
	};

arch/arm/mach-rockchip/efuse.c

static void __init rk3288_efuse_init(void)
{
	int ret;
	pr_err("%s\n", __func__);

	ret = rk3288_efuse_readregs(0, 32, efuse_buf);
	if (ret == 32) {
		if (efuse_buf[2] == 0x33 && efuse_buf[3] == 0x86)
			efuse.get_leakage = rk3368_get_leakage;
		else
			efuse.get_leakage = rk3288_get_leakage;
		efuse.efuse_version = rk3288_get_efuse_version();
		efuse.process_version = rk3288_get_process_version();
		rockchip_set_cpu_version((efuse_buf[6] >> 4) & 3);
		rk3288_set_system_serial();
	} else {
		pr_err("failed to read eFuse, return %d\n", ret);
	}
}

static void __init rk3288_set_system_serial(void)
{
	int i;
	u8 buf[16];

	for (i = 0; i < 8; i++) {
		buf[i] = efuse_buf[8 + (i << 1)];
		buf[i + 8] = efuse_buf[7 + (i << 1)];
	}

	system_serial_low = crc32(0, buf, 8);
	system_serial_high = crc32(system_serial_low, buf + 8, 8);
}

所以可以用Chip ID来生成wifi或者以太网的mac地址:

Wi-Fi:
net/rfkill/rfkill-wlan.c

static int create_wifi_addr_from_system_serial()
{
	if (system_serial_low != 0 && system_serial_high != 0) {
		wifi_custom_mac_addr[0] = (system_serial_high >> 8) & 0xfe;/* clear multicast bit */
		wifi_custom_mac_addr[1] = system_serial_high | 0x02;/* set local assignment bit (IEEE802) */
		wifi_custom_mac_addr[2] = system_serial_low >> 24;
		wifi_custom_mac_addr[3] = system_serial_low >> 16;
		wifi_custom_mac_addr[4] = system_serial_low >> 8;
		wifi_custom_mac_addr[5] = system_serial_low;
	}
	return 0;
}

 int rockchip_wifi_mac_addr(unsigned char *buf)
 {
     char mac_buf[20] = {0};
@@ -620,6 +635,11 @@ int rockchip_wifi_mac_addr(unsigned char *buf)
     wifi_custom_mac_addr[2],wifi_custom_mac_addr[3],wifi_custom_mac_addr[4],wifi_custom_mac_addr[5]);
     LOG("falsh wifi_custom_mac_addr=[%s]\n", mac_buf);
 
+       // from the system serial number
+       if (!is_valid_ether_addr(wifi_custom_mac_addr)) {
+               create_wifi_mac_from_system_serial(wifi_custom_mac_addr);
+       }
+
 #ifdef ENABLE_WIFI_RAND_MAC

以太网:
drivers/net/ethernet/rockchip/eth_mac.c

int eth_mac_from_system_serial(u8 *addr)
{
	if (system_serial_low != 0 && system_serial_high != 0) {
		pr_info("[eth]Create an address from the system serial number.\n");
		addr[0] = (system_serial_high >> 24) & 0xfe;/* clear multicast bit */
		addr[1] = (system_serial_high >> 16) | 0x02;/* set local assignment bit (IEEE802) */
		addr[2] = system_serial_low >> 24;
		addr[3] = system_serial_low >> 16;
		addr[4] = system_serial_low >> 8;
		addr[5] = system_serial_low;
	}
	return 0;
}
+++ b/drivers/net/ethernet/rockchip/gmac/stmmac_main.c
@@ -1691,6 +1691,8 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv)
                if (!is_valid_ether_addr(priv->dev->dev_addr))
                        eth_mac_idb(priv->dev->dev_addr);
                if (!is_valid_ether_addr(priv->dev->dev_addr))
+                       eth_mac_from_system_serial(priv->dev->dev_addr);
+               if (!is_valid_ether_addr(priv->dev->dev_addr))
                        eth_hw_addr_random(priv->dev);
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值