4. 工具应用参考

4.1. 工具的参数如何导入导出?

4.1.1. 使用工具导入导出参数

CviPQ Tool支持在PC端的json格式配置文件导入和导出,并且支持将工具的参数固化到板端。

如果用户想要导出或导入CviPQ Tool的参数文件,可参考章节 2.4.3.1.2.4.3.2. 的说明进行操作。

如果用户想要将参数导入到板端或者从板端导出到PC端进行备份,请使用二进制实用工具(Bin Utility工具)进行操作。具体的操作说明如下:

  • 导入导出板端参数的BIN文件

在已连接到板端的情况下,点击菜单栏中的Bin Utility,即可打开二进制实用工具窗口,如 所示:

_images/fig1.png

图 4.1 二进制实用工具

在Bin Import Export群组里有两个按钮,分别点击按钮可完成如下操作:

  • 导入参数bin文件到板端:点击“Import Bin File”在弹出的打开文件对话框中选择需要导入的正确参数bin文件,当工具完成发送文件到板端时,参数会立即生效。

  • 导出板端参数bin文件:点击bin type下拉框选择导出类型,然后点击“Export Bin File”在弹出的保存文件对话框中选择一个保存路径,工具会将板端上选中类型的参数保存在指定的路径。

  • 将参数配置固化到Flash

在Bin Fix群组内填写作者、描述信息和时间信息后,可点击“Fix Bin to Flash”向板端发送指令,将当前板端的参数信息写入到Flash中。

4.1.2. 使用库导入导出图像质量参数

板端工具提供导入导出参数库文件,以下两种方式可根据自己的需要进行选择。注意:以下接口必须在调用CVI_ISP_Init接口之后才能调用。

  1. 获取和保存所有模块bin数据(ISP x、VPSS、VO等):

  1. 获取和保存单个模块bin数据(ISP x、VPSS、VO等):

可参考推荐使用流程,如下图所示。

_images/fig2.png

其他相关接口API:

4.1.3. API参考

4.1.3.1. CVI_BIN_GetBinTotalLen

【描述】

获取bin数据的总长度。

【语法】

CVI_U32 CVI_BIN_GetBinTotalLen(void);

【参数】

参数名称

描述

输入/输出

【返回值】

返回值

描述

CVI_U32

bin文件的总长度

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

此函数必须在调用 CVI_BIN_ExportBinData 接口前调用。

【举例】

CVI_U32 u32BinLen = 0;

u32BinLen = CVI_BIN_GetBinTotalLen();

【相关主题】

4.1.3.2. CVI_BIN_ExportBinData

【描述】

导出所有模块bin数据。

【语法】

CVI_S32 CVI_BIN_ExportBinData(CVI_U8*pu8Buffer, CVI_U32 u32DataLength);

【参数】

参数名称

描述

输入/输出

pu8Buffer

保存pqbin资料的buffer

输入

u32DataLength

pqbin资料的总长度

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,其值请参见 错误码1

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

调用此函数必须先调用 CVI_BIN_GetBinTotalLen 函数,获取数据的大小,否则可能出现内存问题。

【举例】

CVI_S32 ret = CVI_SUCCESS;

CVI_BIN_HEADER header;

CVI_U32 u32BinLen = 0, u32TempLen = 0;

CVI_U8 *pBuffer;

memset(&header, 0, sizeof(CVI_BIN_HEADER));

u32BinLen = CVI_BIN_GetBinTotalLen();

pBuffer = (CVI_U8 *)malloc(u32BinLen);

if (pBuffer == NULL) {

ISP_DAEMON_DEBUG(LOG_ALERT, "malloc err!\\n");

return CVI_FAILURE;

}

header.extraInfo = *binExtra;

memcpy(pBuffer, &header, sizeof(CVI_BIN_HEADER));

ret = CVI_BIN_ExportBinData(pBuffer, u32BinLen);

if (ret != CVI_SUCCESS) {

ISP_DAEMON_DEBUG_EX(LOG_ALERT, "CVI_BIN_ExportBinData err(%#x)!\\n", ret);

} else {

u32TempLen = fwrite(pBuffer, 1, u32BinLen, fp);

if (u32TempLen != u32BinLen) {

ISP_DAEMON_DEBUG(LOG_ALERT, "writeIspRegToBin fail\\n");

ret = CVI_FAILURE;

}

}

if (pBuffer != NULL) {

free(pBuffer);

}

ISP_DAEMON_UNUSED(numDevice);

return ret;

【相关主题】

4.1.3.3. CVI_BIN_ImportBinData

【描述】

导入所有模块bin数据,会根据bin中的模块数据和当前所有的模块进行匹配,将所有符合条件的数据导入。

【语法】

CVI_S32 CVI_BIN_ImportBinData(CVI_U8*pu8Buffer, CVI_U32 u32DataLength);

【参数】

参数名称

描述

输入/输出

pu8Buffer

Bin的内存空间

输入

u32DataLength

Bin大小

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,其值请参见 错误码2

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so libcvi_bin_isp.so

【注意】

【举例】

CVI_S32 ret = CVI_SUCCESS;

FILE *fp = NULL;

CVI_U8 *buf = NULL;

CVI_CHAR binName[BIN_FILE_LENGTH] = { 0 };

CVI_U32 u32TempLen = 0, u32FileSize = 0;

ret = CVI_BIN_GetBinName(binName);

if (ret != CVI_SUCCESS) {

CVI_TRACE_SYS(CVI_DBG_WARN, "GetBinName(%s) fail\\n", binName);

}

fp = fopen((const CVI_CHAR *)binName, "rb");

if (fp == NULL) {

CVI_TRACE_SYS(CVI_DBG_WARN, "Can't find bin(%s)\\n", binName);

ret = CVI_FAILURE;

goto ERROR_HANDLER;

} else {

CVI_TRACE_SYS(CVI_DBG_WARN, "Bin exist (%s)\\n", binName);

}

getFileSize(fp, &u32FileSize);

buf = (CVI_U8 *)malloc(u32FileSize);

if (buf == NULL) {

ret = CVI_FAILURE;

CVI_TRACE_SYS(CVI_DBG_WARN, "Allocate memory fail\\n");

goto ERROR_HANDLER;

}

u32TempLen = fread(buf, u32FileSize, 1, fp);

if (u32TempLen <= 0) {

CVI_TRACE_SYS(CVI_DBG_WARN, "read data to buff fail!\\n");

ret = CVI_FAILURE;

goto ERROR_HANDLER;

}

ret = CVI_BIN_ImportBinData(buf, (CVI_U32)u32FileSize);

if (ret != CVI_SUCCESS) {

CVI_TRACE_SYS(CVI_DBG_WARN, "CVI_BIN_ImportBinData error! value:(0x%x)\\n", ret);

goto ERROR_HANDLER;

}

ERROR_HANDLER:

if (fp != NULL) {

fclose(fp);

}

if (buf != NULL) {

free(buf);

}

return ret;

【相关主题】

4.1.3.4. CVI_BIN_GetSingleISPBinLen

【描述】

获取某个模块的bin数据的长度。

【语法】

CVI_S32 CVI_BIN_GetSingleISPBinLen(enum CVI_BIN_SECTION_ID id);

【参数】

参数名称

描述

输入/输出

id

模块ID

输入

【返回值】

返回值

描述

CVI_U32

某个模块的bin文件长度

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

此函数必须在调用 CVI_BIN_ExportSingleISPBinData 接口前调用。

【举例】

CVI_U32 u32BinLen = 0;

enum CVI_BIN_SECTION_ID id = CVI_BIN_ID_ISP0;

u32BinLen = CVI_BIN_GetBinTotalLen(id);

【相关主题】

4.1.3.5. CVI_BIN_ExportSingleISPBinData

【描述】

导出单个模块的bin数据。

【语法】

CVI_BIN_ExportSingleISPBinData(enum CVI_BIN_SECTION_ID id, CVI_U8*pu8Buffer, CVI_U32 u32DataLength);

【参数】

参数名称

描述

输入/输出

id

模块ID

输入

pu8Buffer

保存pqbin资料的buffer

输入

u32DataLength

pqbin资料的总长度

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,其值请参见 错误码1

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

调用此函数必须先调用 CVI_BIN_GetSingleISPBinLen 函数,获取数据的大小,否则可能出现内存问题。

【举例】

CVI_S32 ret = CVI_SUCCESS;

CVI_BIN_HEADER header;

CVI_U32 u32BinLen = 0, u32TempLen = 0;

CVI_U8 *pBuffer;

enum CVI_BIN_SECTION_ID id = CVI_BIN_ID_ISP0;

memset(&header, 0, sizeof(CVI_BIN_HEADER));

u32BinLen = CVI_BIN_GetSingleISPBinLen(id);

pBuffer = (CVI_U8 *)malloc(u32BinLen);

if (pBuffer == NULL) {

ISP_DAEMON_DEBUG(LOG_ALERT, "malloc err!\\n");

return CVI_FAILURE;

}

header.extraInfo = *binExtra;

memcpy(pBuffer, &header, sizeof(CVI_BIN_HEADER));

ret = CVI_BIN_ExportSingleISPBinData(id, pBuffer, u32BinLen);

if (ret != CVI_SUCCESS) {

ISP_DAEMON_DEBUG_EX(LOG_ALERT, "CVI_BIN_ExportBinData err(%#x)!\\n", ret);

} else {

u32TempLen = fwrite(pBuffer, 1, u32BinLen, fp);

if (u32TempLen != u32BinLen) {

ISP_DAEMON_DEBUG(LOG_ALERT, "writeIspRegToBin fail\\n");

ret = CVI_FAILURE;

}

}

if (pBuffer != NULL) {

free(pBuffer);

}

ISP_DAEMON_UNUSED(numDevice);

return ret;

【相关主题】

4.1.3.6. CVI_BIN_SaveParamToBin

【描述】

导出单个模块的bin数据

【语法】

CVI_S32 CVI_BIN_SaveParamToBin(FILE*fp, CVI_BIN_EXTRA_S*extraInfo);

【参数】

参数名称

描述

输入/输出

fp

PQBin文件指针

输入

extraInfo

PQBin 信息和描述

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,其值请参见 错误码1

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

CVI_BIN_EXTRA_S BinExtra = {

"User",

"test-default",

"2021-04-19",

};

FILE *fd = fopen(TEST_BIN, "wb");

if (fd == NULL) {

ISP_DEBUG(LOG_ERR, "Open file failed\\n");

}

CVI_BIN_SaveParamToBin(fd, &BinExtra);

fclose(fd);

【相关主题】

4.1.3.7. CVI_BIN_LoadParamFromBin

【描述】

导入单个模块bin数据。

【语法】

CVI_S32 CVI_BIN_LoadParamFromBin(enum CVI_BIN_SECTION_ID id, CVI_U8*buf);

【参数】

参数名称

描述

输入/输出

id

模块ID

输入

buf

PQBin的数据内容

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码2

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

须先将PQBin从数据读到缓存内存空间,再呼叫此函数式。此 API 的功能之后会由 CVI_BIN_LoadParamFromBinEx 所取代 , 建议改用。

【举例】

CVI_S32 result = CVI_FAILURE;

CVI_U32 size = 0;

FILE *fp;

ISP_DEBUG(LOG_DEBUG, "try load default value from bin %s\\n", TEST_BIN);

fp = fopen(TEST_BIN, "rb");

if (fp == NULL) {

ISP_DEBUG(LOG_WARNING, "Cant find bin(%s)\\n", TEST_BIN);

} else {

ISP_DEBUG(LOG_INFO, "Bin exist (%s)\\n", TEST_BIN);

}

fseek(fp, 0L, SEEK_END);

size = ftell(fp);

rewind(fp);

if (size > 0) {

// allocate buffer

CVI_U8 *binBuffer = malloc(size);

fread(binBuffer, size, 1, fp);

for (CVI_U32 idx = CVI_BIN_ID_MIN ; idx < CVI_BIN_ID_MAX ; idx++) {

result = CVI_BIN_LoadParamFromBin((enum CVI_BIN_SECTION_ID)idx, binBuffer);

}

// free buffer

free(binBuffer);

if (result == CVI_SUCCESS) {

ISP_DEBUG(LOG_DEBUG, "load default value from bin %s\\n", TEST_BIN);

}

【相关主题】

4.1.3.8. CVI_BIN_LoadParamFromBinEx

【描述】

CVI_BIN_LoadParamFromBin

【语法】

CVI_S32 CVI_BIN_LoadParamFromBin(enum CVI_BIN_SECTION_ID id, CVI_U8*buf, CVI_U32 u32DataLength);

【参数】

参数名称

描述

输入/输出

id

模块ID

输入

buf

PQBin的数据内容

输入

u32DataLength

buf的大小

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码2

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

CVI_BIN_LoadParamFromBin

【举例】

请参考 CVI_BIN_LoadParamFromBin ,注意的是:需将buf的大小传入。

4.1.3.9. CVI_BIN_SetBinName

【描述】

设置PQBin存放的路径和文件名。

【语法】

CVI_S32 CVI_BIN_SetBinName(WDR_MODE_E wdrMode, const CVI_CHAR *binName);

【参数】

参数名称

描述

输入/输出

wdrMode

Sensor wdr mode

输入

binName

设定和wdr mode对应pqbin的路径和文件名

例如”/mnt/data/cvi_sdr_bin”

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见错误码。

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

【相关主题】

CVI_BIN_GetBinName

4.1.3.10. CVI_BIN_GetBinName

【描述】

获取PQBin存放的路径和文件名。

【语法】

CVI_S32 CVI_BIN_GetBinName(CVI_CHAR*binName);

【参数】

参数名称

描述

输入/输出

binName

pqbin路径和文件名

输出

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见错误码。

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

【相关主题】

CVI_BIN_SetBinName

4.1.3.11. CVI_BIN_GetBinExtraAttr

【描述】

获取bin头数据信息。

【语法】

CVI_S32 CVI_BIN_GetBinExtraAttr(FILE*fp, CVI_BIN_EXTRA_S*extraInfo)

【参数】

参数名称

描述

输入/输出

fp

PQBin文件指针

输入

extraInfo

bin头信息的内存空间

输入

【返回值】

返回值

描述

0

成功。

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

CVI_BIN_EXTRA_S BinExtraAttr = {};

FILE *fd = fopen("/mnt/data/bin/cvi_sdr_bin", "rb");

CVI_BIN_GetBinExtraAttr(fd, &BinExtraAttr);

【相关主题】

CVI_BIN_EnSingleMode

4.1.3.12. CVI_BIN_EnSingleMode

【描述】

设置PQBin为单模块模式。

【语法】

CVI_S32 CVI_BIN_EnSingleMode(void)

【参数】

参数名称

描述

输入/输出

【返回值】

返回值

描述

0

成功。

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

【相关主题】

4.1.3.13. CVI_BIN_DisSingleMode

【描述】

取消PQBin的单模块模式。

【语法】

CVI_S32 CVI_BIN_DisSingleMode(void)

【参数】

参数名称

描述

输入/输出

【返回值】

返回值

描述

0

成功。

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

【相关主题】

4.1.3.14. CVI_ISP_BIN_SetBypassParams

【描述】

设置bin加载时参数的失效与否,默认都生效。

【语法】

CVI_S32 CVI_ISP_BIN_SetBypassParams(enum CVI_BIN_SECTION_ID id, ISP_BIN_BYPASS_U * ispBinBypass)

【参数】

参数名称

描述

输入/输出

id

模块id

输入

ispBinBypass

bin参数生效信息

输入

【返回值】

返回值

描述

0

成功

-1

失败

0xCB000013

id错误

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

CVI_S32 ret = CVI_SUCCESS;

ISP_BIN_BYPASS_U ispBinBypass = {0};

ispBinBypass.bitBypassFrameRate = CVI_TRUE;

ret = CVI_ISP_BIN_SetBypassParams(CVI_BIN_ID_ISP0, &ispBinBypass);

【相关主题】

4.1.3.15. CVI_ISP_BIN_GetBypassParams

【描述】

设置bin加载时参数的失效与否,默认都生效。

【语法】

CVI_S32 CVI_ISP_BIN_GetBypassParams(enum CVI_BIN_SECTION_ID id, ISP_BIN_BYPASS_U * ispBinBypass)

【参数】

参数名称

描述

输入/输出

id

模块id

输入

ispBinBypass

bin参数生效信息

输出

【返回值】

返回值

描述

0

成功

-1

失败

0xCB000013

id错误

【需求】

  • 头文件:cvi_bin.h

  • 库文件:libcvi_bin.so,libcvi_bin_isp.so

【注意】

【举例】

CVI_S32 ret = CVI_SUCCESS;

ISP_BIN_BYPASS_U ispBinBypass = {0};

ret = CVI_ISP_BIN_GetBypassParams(CVI_BIN_ID_ISP0, &ispBinBypass);

【相关主题】

4.1.3.16. 错误码1

接口返回值

含义

0xCB000001

入参指针为空

0xCB000003

未分配到内存空间

0xCB00000B

json压缩失败

0xCB00000D

输入的buffer空间不足

0xCB00000F

更新参数到PQbin文件失败

0xCB000012

创建json句柄失败

0xCB000013

输入的模块id无效

0xCB000014

从文件中读参数失败

4.1.3.17. 错误码2

接口返回值

含义

0xCB000001

入参指针为空

0xCB000003

未分配到内存空间

0xCB000006

输入buf的大小为0

0xCB000008

PQbin中的数据有异常

0xCB00000C

json解压缩失败

0xCB00000F

更新参数到PQbin文件失败

0xCB000010

无法找到bin文件

0xCB000011

当前PQbin文件中json参数是无效的

0xCB000012

创建json句柄失败

0xCB000013

输入的模块id无效

0xCB000014

从文件中读参数失败

0xCB000015

当前所用的PQbin文件是无效的

0xCB000016

Sensor数目超出PQbin文件指定的数目