查看Atlas 200 AI加速模块的版本
Atlas 200 AI加速模块的版本号可以通过boardid进行判断,也可以通过Atlas 200 AI加速模块的PCB版本号进行判断,下面分别介绍两种查询方式。
方式一(通过命令查看)
- 以HwHiAiUser用户ssh登录到Atlas 200 DK开发者板。
- 执行如下命令查看Atlas 200 AI加速模块的版本。
cat /proc/cmdline
console=ttyAMA0,115200 root=/dev/mmcblk1p1 rw rootdelay=1 syslog no_console_suspend earlycon=pl011,mmio32,0x10cf80000 initrd=0x880004000,200M cma=256M@0x1FC00000 log_redirect=0x1fc000@0x6fe04000 default_hugepagesz=2M reboot_reason=AP_S_COLDBOOT himntn=1110001000000000000000000000000000000000000000000000000000000000 kmemdump=0x7C00020 slotid=00 boardid=000 nr_hugepages=25
通过boardid的值判断Atlas 200 AI加速模块的版本:
- boardid=000,表示Atlas 200 AI加速模块的版本为VC及VC以前的版本。
- boardid=004,表示Atlas 200 AI加速模块的版本为VD版本。
方式二(通过查看Atlas 200 AI加速模块的PCB版本号)
- 新建查询开发者板版本号的代码文件。
以普通用户在Ubuntu服务器任一目录新建i2c_tool_mini.c文件。
touch i2c_tool_mini.c
将以下代码拷贝到i2c_tool_mini.c文件中。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/select.h> #include <sys/time.h> #include <errno.h> #include <string.h> #define I2C0_DEV_NAME "/dev/i2c-0" #define I2C1_DEV_NAME "/dev/i2c-1" #define I2C2_DEV_NAME "/dev/i2c-2" #define I2C3_DEV_NAME "/dev/i2c-3" #define I2C_RETRIES 0x0701 #define I2C_TIMEOUT 0x0702 #define I2C_SLAVE 0x21 #define I2C_RDWR 0x0707 #define I2C_BUS_MODE 0x0780 #define I2C_M_RD 0x01 #define PCB_ID_VER_A 0x10 #define PCB_ID_VER_B 0x20 #define PCB_ID_VER_C 0x30 #define PCB_ID_VER_D 0x40 typedef unsigned char uint8; typedef unsigned short uint16; struct i2c_msg { uint16 addr; /* slave address */ uint16 flags; uint16 len; uint8 *buf; /*message data pointer*/ }; struct i2c_rdwr_ioctl_data { struct i2c_msg *msgs; /*i2c_msg[] pointer*/ int nmsgs; /*i2c_msg Nums*/ }; static uint8 i2c_init(char *i2cdev_name); static uint8 i2c_write(uint8 slave, unsigned char reg, unsigned char value); static uint8 i2c_read(uint8 slave, unsigned char reg,unsigned char *buf); int fd = 0; static uint8 i2c_write(uint8 slave, unsigned char reg, unsigned char value) { int ret; struct i2c_rdwr_ioctl_data ssm_msg; unsigned char buf[2]={0}; ssm_msg.nmsgs=1; ssm_msg.msgs=(struct i2c_msg*)malloc(ssm_msg.nmsgs*sizeof(struct i2c_msg)); if(!ssm_msg.msgs) { printf("Memory alloc error!\n"); return -1; } buf[0] = reg; buf[1] = value; (ssm_msg.msgs[0]).flags=0; (ssm_msg.msgs[0]).addr=(uint16)slave; (ssm_msg.msgs[0]).buf=buf; (ssm_msg.msgs[0]).len=2; ret=ioctl(fd, I2C_RDWR, &ssm_msg); if(ret<0) { printf("write error, ret=%#x, errorno=%#x, %s!\n",ret, errno, strerror(errno)); free(ssm_msg.msgs); return -1; } free(ssm_msg.msgs); return 0; } static uint8 i2c_read(unsigned char slave, unsigned char reg,unsigned char *buf) { int ret; struct i2c_rdwr_ioctl_data ssm_msg; unsigned char regs[2] = {0}; regs[0] = reg; regs[1] = reg; ssm_msg.nmsgs=2; ssm_msg.msgs=(struct i2c_msg*)malloc(ssm_msg.nmsgs*sizeof(struct i2c_msg)); if(!ssm_msg.msgs) { printf("Memory alloc error!\n"); return -1; } (ssm_msg.msgs[0]).flags=0; (ssm_msg.msgs[0]).addr=slave; (ssm_msg.msgs[0]).buf= regs; (ssm_msg.msgs[0]).len=1; (ssm_msg.msgs[1]).flags=I2C_M_RD; (ssm_msg.msgs[1]).addr=slave; (ssm_msg.msgs[1]).buf=buf; (ssm_msg.msgs[1]).len=1; ret=ioctl(fd, I2C_RDWR, &ssm_msg); if(ret<0) { printf("read data error,ret=%#x, errorno=%#x, %s!\n",ret, errno, strerror(errno)); free(ssm_msg.msgs); return -1; } free(ssm_msg.msgs); return 0; } static uint8 i2c_init(char *i2cdev_name) { fd = open(i2cdev_name, O_RDWR); if(fd < 0) { printf("Can't open %s!\n", i2cdev_name); return -1; } if(ioctl(fd, I2C_RETRIES, 1)<0) { printf("set i2c retry fail!\n"); return -1; } if(ioctl(fd, I2C_TIMEOUT, 1)<0) { printf("set i2c timeout fail!\n"); return -1; } return 0; } int main(int argc, char *argv[]) { char *dev_name = I2C0_DEV_NAME; uint8 slave; uint8 reg; uint8 data; int ret; if (i2c_init(dev_name)) { printf("i2c init fail!\n"); close(fd); return -1; } usleep(1000*100); // Read PCB ID slave = I2C_SLAVE; reg = 0x07; data = 0x5A; ret = i2c_read(slave, reg, &data); if (ret != 0) { printf("read %s %#x %#x to %#x fail!\n", dev_name, slave, data, reg); } slave = I2C_SLAVE; reg = 0x07; data = data|0xF0; ret = i2c_write(slave, reg, data); if (ret != 0) { printf("write %s %#x %#x to %#x fail!\n", dev_name, slave, data, reg); } slave = I2C_SLAVE; reg = 0x01; data = 0x5A; ret = i2c_read(slave, reg, &data); if (ret != 0) { printf("read %s %#x %#x to %#x fail!\n", dev_name, slave, data, reg); } close(fd); // show PCB ID; switch (data & 0xF0) { case PCB_ID_VER_A: printf("PCB version is: Ver.A !\n"); break; case PCB_ID_VER_B: printf("PCB version is: Ver.B !\n"); break; case PCB_ID_VER_C: printf("PCB version is: Ver.C !\n"); break; case PCB_ID_VER_D: printf("PCB version is: Ver.D !\n"); break; default: break; } return 0; }
- 编译生成获取PCB版本号的可执行文件。
执行如下命令将i2c_tool_mini.c文件编译生成在开发者板中可执行的文件。
aarch64-linux-gnu-gcc i2c_tool_mini.c -o mini_version_tool
mini_version_tool为生成的可执行文件的名称。
- 将2生成的可执行文件上传至开发者板。
例如上传到开发者板的HwHiAiUser用户的家目录下。
scp mini_version_tool HwHiAiUser@192.168.1.2:/home/HwHiAiUser
- 以HwHiAiUser用户ssh登录到开发者板,并执行查询开发者板PCB版本号的操作。
ssh HwHiAiUser@192.168.1.2
切换到root用户,并执行查询脚本。
su root
./mini_version_tool
如下所示,表示当前AI加速模块的版本为VC版本。
root@davinci-mini:/home/HwHiAiUser# ./mini_version_tool PCB version is: Ver.C !
