---
title: DCMI_MAIN_CMD_LP
description: "int dcmi_get_device_info(int card_id, int device_id, enum dcmi_main_cmd main_cmd, unsigned int sub_cmd, void *buf, unsigned int *size)"
url: https://www.hiascend.com/document/detail/zh/HDK/latest/A2/A2DCMI/dcmi_077.html
sourcePath: /source/zh/HDK/2610/A2/A2DCMI/dcmi_077.html
indexId: 4fc0a1b085a7863d36099efd40b3bcdb123aaaeb2e6fd45898f29c8904b4b6df43
---
# DCMI_MAIN_CMD_LP

#### 函数原型

int dcmi_get_device_info(int card_id, int device_id, enum dcmi_main_cmd main_cmd, unsigned int sub_cmd, void *buf, unsigned int *size)


#### 功能说明

获取系统中AICORE、HYBIRD、CPU和DDR的电压和电流的寄存器值等LP相关信息。


#### 参数说明

| 参数名称 | 输入/输出 | 类型 | 描述 |
| --- | --- | --- | --- |
| 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芯片。 |
| main\_cmd | 输入 | enum dcmi\_main\_cmd | DCMI\_MAIN\_CMD\_LP |
| sub\_cmd | 输入 | unsigned int | /\* DCMI sub command for Low power \*/ typedef enum { DCMI\_LP\_SUB\_CMD\_AICORE\_VOLTAGE\_CURRENT = 0, //获取AICORE电压电流的寄存器值 DCMI\_LP\_SUB\_CMD\_HYBIRD\_VOLTAGE\_CURRENT, //获取HYBIRD电压电流的寄存器值 DCMI\_LP\_SUB\_CMD\_TAISHAN\_VOLTAGE\_CURRENT, //获取CPU电压电流的寄存器值 DCMI\_LP\_SUB\_CMD\_DDR\_VOLTAGE\_CURRENT, //获取DDR电压电流的寄存器值 DCMI\_LP\_SUB\_CMD\_ACG, //获取ACG调频计数值 DCMI\_LP\_SUB\_CMD\_STATUS, //获取低功耗总状态 DCMI\_LP\_SUB\_CMD\_TOPS\_DETAILS, //获取所有工作档位 DCMI\_LP\_SUB\_CMD\_SET\_WORK\_TOPS, //设置工作档位 DCMI\_LP\_SUB\_CMD\_GET\_WORK\_TOPS, //获取当前工作档位 DCMI\_LP\_SUB\_CMD\_AICORE\_FREQREDUC\_CAUSE, //获取当前降频原因 DCMI\_LP\_SUB\_CMD\_GET\_POWER\_INFO, //获取功耗信息 DCMI\_LP\_SUB\_CMD\_SET\_IDLE\_SWITCH, //设置IDLE模式开关 DCMI\_LP\_SUB\_CMD\_MAX, //枚举值上限标记 } DCMI\_LP\_SUB\_CMD; 支持DCMI\_LP\_SUB\_CMD\_STATUS、DCMI\_LP\_SUB\_CMD\_AICORE\_FREQREDUC\_CAUSE、DCMI\_LP\_SUB\_CMD\_GET\_POWER\_INFO命令。 |
| buf | 输入/输出 | void \* | 详见本节约束说明。 |
| size | 输入/输出 | unsigned int \* | buf数组的长度/返回结果实际数据长度。 |


#### 返回值说明

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


#### 异常处理

无。


#### 约束说明

- 通过本接口获取电压和电流信息为寄存器数值。
- AI Core降频原因每100ms更新一次，不能查询历史降频原因。


**表1 sub_cmd对应的buf格式**

| sub\_cmd | buf对应的数据类型 | size | 参数说明 |
| --- | --- | --- | --- |
| DCMI\_LP\_SUB\_CMD\_STATUS | unsigned int | sizeof(unsigned int) | 非空闲：0；空闲：1 |
| DCMI\_LP\_SUB\_CMD\_AICORE\_FREQREDUC\_CAUSE | Unsigned long long | sizeof(unsigned long long) | buf为8Byte内存空间，每个bit对应一种降频原因 |
| DCMI\_LP\_SUB\_CMD\_GET\_POWER\_INFO | DCMI\_LP\_POWER\_INFO\_STRU | sizeof(DCMI\_LP\_POWER\_INFO\_STRU) | \#define DCMI\_LP\_POWER\_RESERVED\_LEN 32 typedef struct DCMI\_lp\_power\_info { unsigned int soc\_rated\_power; unsigned char reserved[DCMI\_LP\_POWER\_RESERVED\_LEN]; } DCMI\_LP\_POWER\_INFO\_STRU; 其中，soc\_rated\_power表示soc额定功率，其余为预留扩展空间。 soc额定功率正确范围[150000,600000] |


子命令DCMI_LP_SUB_CMD_AICORE_FREQREDUC_CAUSE下，AI Core降频原因由一个64位的值表示，每个bit对应一种降频原因。当值为0时，说明AI Core以额定的频率运行。当值为1时，说明是由于某种原因引起AI Core不能以额定频率运行。同时由于降频原因可能由多个因素引起，所以可能存在多个bit被同时置1的情况。


**表2 buf值各bit对应的含义**

| 名称 | Bit位 | 说明 |
| --- | --- | --- |
| IDLE | 0 | AI Core处于空闲状态，通过将AI Core频率降低到空闲时的频率来降低功耗。空闲状态需要持续一段时间，频率才会切换。 |
| THERMAL | 2 | 昇腾AI处理器温度超过了允许的范围导致底层软件将AI Core的频率限制在一定的范围，从而来降低芯片的温度。 |
| SW\_EDP | 3 | 在昇腾AI处理器上，AI Core模块的供电电流超过了允许的范围导致底层软件将AI Core的频率限制在一定的范围，保证AI Core模块供电稳定。 |
| HW\_EDP | 4 | 在昇腾AI处理器上，AI Core模块的瞬态供电电流超过了允许的范围导致主板上的电流传感器触发AI Core模块快速降频。 |
| POWER\_BREAK | 5 | 主板上的功率监测模块监测到供电功率超过了允许的最大上限，通知昇腾AI处理器将AI Core的频率快速降低，维持供电稳定。 |
| SVFD | 8 | 昇腾AI处理器上的AI Core供电监测模块监测到AI Core模块的供电不稳（有噪声），触发AI Core快速降频，维持供电稳定。 |
| POWERCAPPING | 10 | 昇腾AI处理器通过iBMC带外进行的功耗控制。 |


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

| 产品形态 | 物理机场景（裸机）root用户 | 物理机场景（裸机）运行用户组（非root用户） | 物理机+普通容器场景root用户 | 物理机+容器AVI场景root用户 |
| --- | --- | --- | --- | --- |
| Atlas 900 A2 PoD 集群基础单元 | Y | Y | Y | Y |
| Atlas 800T A2 训练服务器 | Y | Y | Y | Y |
| Atlas 800I A2 推理服务器 | Y | Y | Y | Y |
| Atlas 200T A2 Box16 异构子框 | Y | Y | Y | Y |
| A200I A2 Box 异构组件 | Y | Y | Y | Y |
| A300I A2 推理卡 | Y | Y | Y | Y |
| 注：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;
unsigned int sub_cmd=0;
unsigned int voltage_current_buf = 0;
unsigned int buf_size = 8;
ret = dcmi_get_device_info(card_id, device_id, DCMI_MAIN_CMD_LP, sub_cmd, &voltage_current_buf, &buf_size);
if (ret != 0) {
//todo
return ret;
} else {
// todo
return ret;
}
…
```
