---
title: dcmi_prbs_operate
description: "int dcmi_prbs_operate(int card_id, int device_id, struct dcmi_prbs_operate_param operate_para, struct dcmi_prbs_operate_result *operate_result)"
url: https://www.hiascend.com/document/detail/zh/HDK/latest/A2/A2DCMI/dcmi_135.html
sourcePath: /source/zh/HDK/2610/A2/A2DCMI/dcmi_135.html
indexId: 28109094c7ae03a43291a1a7151304808cd436f6120c088e9d3e24ca9ac2554743
---
# dcmi_prbs_operate

#### 函数原型

int dcmi_prbs_operate(int card_id, int device_id, struct dcmi_prbs_operate_param operate_para, struct dcmi_prbs_operate_result *operate_result)


#### 功能说明

对昇腾NPU芯片打流和获取打流结果。


#### 参数说明

| 参数名称 | 输入/输出 | 类型 | 描述 |
| --- | --- | --- | --- |
| card\_id | 输入 | int | 设备ID，当前实际支持的ID通过dcmi\_get\_card\_list接口获取。 |
| device\_id | 输入 | int | 芯片ID，通过dcmi\_get\_device\_id\_in\_card接口获取。取值范围如下： NPU芯片：[0, device\_id\_max\-1]。 说明： device\_id\_max值为1，当device\_id为0时表示NPU芯片；当device\_id为1时表示MCU芯片。 |
| operate\_para | 输入 | DCMI\_PRBS\_OPERATE\_PARAM | prbs码流操作入参，通过设置以下结构体中的参数区分打流和查询打流结果。 typedef struct dcmi\_serdes\_prbs\_param\_base { unsigned int serdes\_prbs\_macro\_id; //仅支持macro\_0打流 unsigned int serdes\_prbs\_start\_lane\_id;//lane的开始ID，最小值为0，最大值为3 unsigned int serdes\_prbs\_lane\_count;//lane的数量，最小值1，最大值为4 } DCMI\_SERDES\_PRBS\_PARAM\_BASE; typedef DCMI\_SERDES\_PRBS\_PARAM\_BASE DCMI\_SERDES\_PRBS\_GET\_PARAM; // 获取打流结果时仅需传入基础信息param base，具体获取类型通过sub\_cmd区分 typedef struct dcmi\_serdes\_prbs\_set\_param { DCMI\_SERDES\_PRBS\_PARAM\_BASE param\_base;//打流设置基础参数 unsigned int serdes\_prbs\_type;//打流的码型，参考prbs码型枚举 unsigned int serdes\_prbs\_direction;//打流的方向，参考prbs打流方向枚举 } DCMI\_SERDES\_PRBS\_SET\_PARAM; typedef struct dcmi\_prbs\_operate\_param { unsigned int main\_cmd;//打流的命令，参考主命令字枚举 unsigned int sub\_cmd; // 标识是设置打流命令还是查询打流结果命令 union { DCMI\_SERDES\_PRBS\_SET\_PARAM set\_param;//设置打流参数 DCMI\_SERDES\_PRBS\_GET\_PARAM get\_param;//查询打流结果 } operate\_para; } DCMI\_PRBS\_OPERATE\_PARAM; // 主命令字枚举 enum dcmi\_prbs\_main\_cmd\_list { DSMI\_SERDES\_CMD\_PRBS = 0,//打流的命令 DSMI\_SERDES\_CMD\_MAX }; // 子命令字枚举 enum dcmi\_prbs\_sub\_cmd\_list { SERDES\_PRBS\_SET\_CMD = 0,//设置打流的子命令 SERDES\_PRBS\_GET\_RESULT\_CMD, // 查结果 SERDES\_PRBS\_GET\_STATUS\_CMD, // 查码型 SERDES\_PRBS\_SUB\_CMD\_MAX }; // prbs码型枚举 enum dcmi\_serdes\_prbs\_type\_list { SERDES\_PRBS\_TYPE\_END = 0, SERDES\_PRBS\_TYPE\_31 = 8, SERDES\_PRBS\_TYPE\_MAX }; // prbs打流方向枚举 enum dcmi\_serdes\_prbs\_direction { SERDES\_PRBS\_DIRECTION\_TX = 0, SERDES\_PRBS\_DIRECTION\_RX, SERDES\_PRBS\_DIRECTION\_TXRX, SERDES\_PRBS\_DIRECTION\_MAX }; |
| operate\_result | 输出 | DCMI\_PRBS\_OPERATE\_RESULT | 查询打流结果或查询prbs链路状态。 \#define MAX\_LANE\_NUM 8 typedef struct dcmi\_prbs\_operate\_result { union { SERDES\_PRBS\_STATUS\_S result[MAX\_LANE\_NUM];//打流返回结果 DCMI\_SERDES\_PRBS\_LANE\_STATUS lane\_status[MAX\_LANE\_NUM];//lane的状态 } prbs\_result; } DCMI\_PRBS\_OPERATE\_RESULT; struct dcmi\_serdes\_prbs\_lane\_status { unsigned int lane\_prbs\_tx\_status;//tx方向打流码型 unsigned int lane\_prbs\_rx\_status;//rx方向打流码型 }; typedef struct { unsigned int check\_en;//查询打流是否打开 unsigned int check\_type;//查询打流码型 unsigned int error\_status;//查询打流状态 unsigned int error\_cnt;//错误的码型数量统计 unsigned long error\_rate; //打流错误率的倒数，1/error\_rate的值小于10\-5为正常 unsigned int alos\_status; //输入的信号幅度，0表示正常，1表示过低 unsigned long time\_val;//设置打流和查询打流结果之间的时间间隔 } SERDES\_PRBS\_STATUS\_S; |


#### 返回值说明

| 类型 | 描述 |
| --- | --- |
| int | 处理结果： 成功：返回0。 失败：返回码请参见返回码。 |


#### 异常处理

无。


#### 约束说明

- 打流前请关闭所有运行的业务。
- 对于Atlas 200T A2 Box16 异构子框、Atlas 800T A2 训练服务器、Atlas 800I A2 推理服务器、Atlas 900 A2 PoD 集群基础单元、A200I A2 Box 异构组件，该接口支持在物理机+特权容器场景下使用。
- driver包安装或NPU复位之后需要等待120s之后才能做打流动作。
- 打流动作会使NPU网口down，会产生BMC告警；若后续不关闭打流动作，则网口无法up。
- 打流功能支持光模块环回（光模块需要有环回能力）、光模块外接自环头环回、CDR环回场景。
- Atlas 900 A2 PoD 集群基础单元不支持prbs打流，Atlas 900 A2 PoDc 集群基础单元支持prbs打流。


**表1 不同部署场景下的支持情况**

| 产品形态 | 物理机场景（裸机）root用户 | 物理机场景（裸机）运行用户组（非root用户） | 物理机+普通容器场景root用户 | 物理机+容器AVI场景root用户 |
| --- | --- | --- | --- | --- |
| Atlas 900 A2 PoD 集群基础单元 | Y | N | N | N |
| Atlas 800T A2 训练服务器 | Y | N | N | N |
| Atlas 800I A2 推理服务器 | Y | N | N | N |
| Atlas 200T A2 Box16 异构子框 | Y | N | N | N |
| A200I A2 Box 异构组件 | Y | N | N | N |
| A300I A2 推理卡 | N | N | N | N |
| 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 |


#### 调用示例

```
…
int ret = 0;
int card_id = 0;
int device_id = 0;
DCMI_PRBS_OPERATE_PARAM operate_para = {0};
operate_para.main_cmd = DSMI_SERDES_CMD_PRBS;
operate_para.sub_cmd = SERDES_PRBS_SET_CMD;
operate_para.operate_para.set_param.param_base = {0, 0, 1};
operate_para.operate_para.set_param.serdes_prbs_type = SERDES_PRBS_TYPE_31;
operate_para.operate_para.set_param.serdes_prbs_direction = SERDES_PRBS_DIRECTION_TX;
operate_para.operate_para.set_param.serdes_prbs_direction = SERDES_PRBS_DIRECTION_RX;
DCMI_PRBS_OPERATE_RESULT operate_result;
ret = dcmi_prbs_operate(card_id, device_id, operate_para, &operate_result);
if (ret != 0){
//todo：记录日志
return ret;
}
…
```
