跳到主要内容

SID - 芯片唯一ID

对于全志的 SoC 来说,Sunxi Serial 用于该 SoC 的唯一标识,用于标识任一颗 SoC 在所有的同型号芯片中是唯一的

注意
备注

注意

备注

Sunxi Serial 仅保证同一型号 SoC 中的 Sunxi Serial 唯一。

可以通过查看 sunxi_batchno 确认芯片是否为同一型号

cat /sys/class/sunxi_info/sys_info | grep sunxi_batchno

image-20250527141621348

:::

在全志 SoC 中,提供有 Sunxi Serial 唯一 ID 功能,是由 Sunxi ChipID 与 Sunxi ChipType 共同组成了 128 位的芯片唯一 ID。

Sunxi Serial 一共 128 位,其中前 16 位是 Sunxi ChipType,与芯片版本封装有关,后 112 位是 Sunxi ChipID,这个 Sunxi ChipID 包含每一颗芯片的晶圆型号,批次号等等,是独立且唯一的。

image-20250527140211904

所以在获取芯片唯一 ID 的时候,可以获取 112 位的 Sunxi ChipID 也可以获取完整的 128 位的 Sunxi Serial。一般为了方便使用 128 位即可。

通过 IOCTL 获取 Sunxi Serial​

可以通过 IOCTL 方式获取 Sunxi Serial 串号,示例代码如下

#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

enum {
CHECK_SOC_SECURE_ATTR,
CHECK_SOC_VERSION,
CHECK_SOC_BONDING = 3,
CHECK_SOC_CHIPID,
CHECK_SOC_FT_ZONE,
CHECK_SOC_CHIPID_ORIGIN = 8,
};

int main(int argc, char *argv[]) {
int c;
int cmd;
int fd;
char buf[33] = {0};
int ret = 0;

memset(buf, 0, sizeof(buf));

fd = open("/dev/sunxi_soc_info", O_RDONLY);
if (fd < 0) {
printf("open /dev/sunxi_soc_info failed!");
return -1;
}

ret = ioctl(fd, CHECK_SOC_CHIPID_ORIGIN, buf);

if (ret < 0) {
printf("ioctl err!\n");
close(fd);
return ret;
}

printf("soc chipid:%s\n", buf);

close(fd);
return 0;
}

通过 SYSFS 获取 Sunxi Serial​

提示
备注

SYSFS 接口在 SDK 1.2 进行了一次更新,将原本节点获取的 80 位扩展到完整的 128 位 SID,以匹配 IOCTL 获取到的完整数据。请选择你的 SDK 版本查看具体内容

:::

  • SDK 1.2
  • SDK 1.1

用户可以通过 SYSFS 节点获取当前芯片的 Sunxi Serial,节点路径如下:

/sys/class/sunxi_info/sys_info

执行命令即可获取 sys_info,其中的 sunxi_serial 即是 Sunxi Serial,一共 128 位有效位

cat /sys/class/sunxi_info/sys_info

image-20250528170505546

用户可以通过 SYSFS 节点获取当前芯片的 Sunxi Serial,节点路径如下:

/sys/class/sunxi_info/sys_info

执行命令即可获取 sys_info,其中的 sunxi_serial 即是 Sunxi Serial,一共 80 位有效位

cat /sys/class/sunxi_info/sys_info

img

如果需要获取 SDK 1.2 的完整 128 位 SID,请修改驱动文件 bsp/drivers/sid/sunxi-sid.c 的 sid_chipid_init 函数:

bsp/drivers/sid/sunxi-sid.c

static void sid_chipid_init(void)
{
u32 type = 0, offset = 0, max_size;
static s32 init_flag;
static struct soc_ver_reg reg = {0};

if (init_flag == 1) {
SID_DBG("It's already inited.\n");
return;
}
sid_read_key("chipid", sunxi_soc_chipid, 16, sunxi_soc_is_secure());

// 修改这里
sunxi_serial[0] = sunxi_soc_chipid[3];
sunxi_serial[1] = sunxi_soc_chipid[2];
sunxi_serial[2] = sunxi_soc_chipid[1];
sunxi_serial[3] = sunxi_soc_chipid[0];

get_key_map_info("chipid", EFUSE_SID_BASE, &offset, &max_size);
get_soc_ver_regs("soc_bin", SRAM_CTRL_BASE, &reg);

type = sid_rd_bits(EFUSE_SID_BASE, reg.offset + offset, reg.shift,
reg.mask, sunxi_soc_is_secure());

switch (type) {
case 0b000001:
sunxi_soc_bin = 1;
break;
case 0b000011:
sunxi_soc_bin = 2;
break;
case 0b000111:
sunxi_soc_bin = 3;
break;
default:
break;
}
SID_DBG("soc bin: %d\n", sunxi_soc_bin);

init_flag = 1;
}

通过 sunxi_dump 读寄存器获取 Sunxi Serial​

可以通过 sunxi_dump 节点,读取寄存器,获取完整的 128 位 Sunxi Serial,Sunxi Serial 寄存器位于 0x43006200 长度 0x10

echo 0x43006200,0x43006210 > /sys/class/sunxi_dump/dump
cat /sys/class/sunxi_dump/dump
提示
备注

提示

备注

通过寄存器读出来的 Sunxi Serial 排布方式与 SYSFS 读出的有排布差异,转换方式如下:

image-20250528102914334

sunxi_serial[0] = sunxi_soc_chipid_reg[3];
sunxi_serial[1] = sunxi_soc_chipid_reg[2];
sunxi_serial[2] = sunxi_soc_chipid_reg[1];
sunxi_serial[3] = sunxi_soc_chipid_reg[0];

:::