SID - 芯片唯一ID
对于全志的 SoC 来说,Sunxi Serial 用于该 SoC 的唯一标识,如 V821 的 Sunxi Serial 用于标识任一颗 V821 SoC 在所有的 V821中是唯一的
Sunxi Serial 仅保证同一型号 SoC 中的 Sunxi Serial 唯一。
可以通过查看 sunxi_batchno
确认芯片是否为同一型号
cat /sys/class/sunxi_info/sys_info | grep sunxi_batchno
在全志 SoC 中,提供有 Sunxi Serial 唯一 ID 功能,是由 Sunxi ChipID
与 Sunxi ChipType
共同组成了 128 位的芯片唯一 ID。
Sunxi Serial 一共 128 位,其中前 16 位是 Sunxi ChipType
,与芯片版本封装有关,后 112 位是 Sunxi ChipID
,这个 Sunxi ChipID
包含每一颗芯片的晶圆型号,批次号等等,是独立且唯一的。
所以在获取芯片唯一 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
- 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
用户可以通过 SYSFS 节点获取当前芯片的 Sunxi Serial,节点路径如下:
/sys/class/sunxi_info/sys_info
执行命令即可获取 sys_info
,其中的 sunxi_serial
即是 Sunxi Serial,一共 80 位有效位
cat /sys/class/sunxi_info/sys_info
如果需要获取 SDK 1.2 的完整 128 位 SID,请修改驱动文件 bsp/drivers/sid/sunxi-sid.c
的 sid_chipid_init
函数:
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, ®);
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 读出的有排布差异,转换方式如下:
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];