更新时间:2021-10-26 GMT+08:00
分享

查看Atlas 200 AI加速模块的版本

Atlas 200 AI加速模块的版本号可以通过boardid进行判断,也可以通过Atlas 200 AI加速模块的PCB版本号进行判断,下面分别介绍两种查询方式。

方式一(通过命令查看)

  1. 以HwHiAiUser用户ssh登录到Atlas 200 DK开发者板。
  2. 执行如下命令查看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版本号)

  1. 新建查询开发者板版本号的代码文件。

    以普通用户在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;
    }

  2. 编译生成获取PCB版本号的可执行文件。

    执行如下命令将i2c_tool_mini.c文件编译生成在开发者板中可执行的文件。

    aarch64-linux-gnu-gcc i2c_tool_mini.c -o mini_version_tool

    mini_version_tool为生成的可执行文件的名称。

  3. 2生成的可执行文件上传至开发者板。

    例如上传到开发者板的HwHiAiUser用户的家目录下。

    scp mini_version_tool HwHiAiUser@192.168.1.2:/home/HwHiAiUser

  4. 以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 !

分享:

    相关文档

    相关产品

close