技术专栏
海思3516的开箱测试代码>>>>开发板测评
有小伙伴说, 直接跑官方的代码跑不起来, 这里以vio代码为例, 说说怎么从源码编译海思的应用.
首先环境是单摄GC2053, 接CSI1, 如下图:
在sdk里面找到
hi3516sdk/smp/a7_linux/mpp/sample/Makefile.param
修改摄像头为你的摄像头型号, 比如GC2053
SENSOR0_TYPE ?= GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT
SENSOR1_TYPE ?= GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT
- 1
- 2
修改
hi3516sdk/smp/a7_linux/mpp/sample/common/sample_comm_vi.c
文件, 修改下面的变量值
/*****************************************************************************
* function : init mipi
*****************************************************************************/
HI_S32 SAMPLE_COMM_VI_StartMIPI(SAMPLE_VI_CONFIG_S *pstViConfig)
{
HI_S32 s32Ret = HI_SUCCESS;
lane_divide_mode_t lane_divide_mode = LANE_DIVIDE_MODE_0;
if (!pstViConfig)
{
SAMPLE_PRT("%s: null ptr\n", __FUNCTION__);
return HI_FAILURE;
}
// 加入这一行
lane_divide_mode = LANE_DIVIDE_MODE_1;
SAMPLE_PRT("lane_divide_mode:%d \n", lane_divide_mode);
// lane_divide_mode = SAMPLE_COMM_VI_GetMipiLaneDivideMode(pstViConfig);
s32Ret = SAMPLE_COMM_VI_SetMipiHsMode(lane_divide_mode);
if (HI_SUCCESS != s32Ret)
{
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
<
在sample文件夹中建一个子文件夹, 名字无所谓, 然后建一个c文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "sample_comm.h"
HI_VOID SAMPLE_VIO_MsgInit(HI_VOID)
{
}
HI_VOID SAMPLE_VIO_MsgExit(HI_VOID)
{
}
void SAMPLE_VIO_HandleSig(HI_S32 signo)
{
signal(SIGINT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
if (SIGINT == signo || SIGTERM == signo)
{
SAMPLE_COMM_VENC_StopGetStream();
SAMPLE_COMM_All_ISP_Stop();
SAMPLE_COMM_VO_HdmiStop();
SAMPLE_COMM_SYS_Exit();
SAMPLE_PRT("\033[0;31mprogram termination abnormally!\033[0;39m\n");
}
exit(-1);
}
HI_S32 SAMPLE_VIO_ViOnlineVpssOnlineRoute(HI_U32 u32VoIntfType)
{
HI_S32 s32Ret = HI_SUCCESS;
HI_S32 s32ViCnt = 1;
VI_DEV ViDev = 1;
VI_PIPE ViPipe = 0;
VI_CHN ViChn = 0;
HI_S32 s32WorkSnsId = 0;
SAMPLE_VI_CONFIG_S stViConfig;
SIZE_S stSize;
VB_CONFIG_S stVbConf;
PIC_SIZE_E enPicSize;
HI_U32 u32BlkSize;
VO_CHN VoChn = 0;
SAMPLE_VO_CONFIG_S stVoConfig;
WDR_MODE_E enWDRMode = WDR_MODE_NONE;
DYNAMIC_RANGE_E enDynamicRange = DYNAMIC_RANGE_SDR8;
PIXEL_FORMAT_E enPixFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
VIDEO_FORMAT_E enVideoFormat = VIDEO_FORMAT_LINEAR;
COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE;
VI_VPSS_MODE_E enMastPipeMode = VI_ONLINE_VPSS_ONLINE;
VPSS_GRP VpssGrp = 0;
VPSS_GRP_ATTR_S stVpssGrpAttr;
VPSS_CHN VpssChn = VPSS_CHN0;
HI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0};
VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM];
VENC_CHN VencChn[1] = {0};
PAYLOAD_TYPE_E enType = PT_H265;
SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR;
HI_U32 u32Profile = 0;
HI_BOOL bRcnRefShareBuf = HI_FALSE;
VENC_GOP_ATTR_S stGopAttr;
/*config vi*/
SAMPLE_COMM_VI_GetSensorInfo(&stViConfig);
SAMPLE_PRT("ViDev:%d, ViPipe:%d, ViChn:%d, s32WorkSnsId:%d", ViDev, ViPipe, ViChn, s32WorkSnsId);
stViConfig.s32WorkingViNum = s32ViCnt;
stViConfig.as32WorkingViId[0] = 0;
stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.MipiDev = ViDev;
stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.s32BusId = 1;
stViConfig.astViInfo[s32WorkSnsId].stDevInfo.ViDev = ViDev;
stViConfig.astViInfo[s32WorkSnsId].stDevInfo.enWDRMode = enWDRMode;
stViConfig.astViInfo[s32WorkSnsId].stPipeInfo.enMastPipeMode = enMastPipeMode;
stViConfig.astViInfo[s32WorkSnsId].stPipeInfo.aPipe[0] = ViPipe;
stViConfig.astViInfo[s32WorkSnsId].stPipeInfo.aPipe[1] = -1;
stViConfig.astViInfo[s32WorkSnsId].stPipeInfo.aPipe[2] = -1;
stViConfig.astViInfo[s32WorkSnsId].stPipeInfo.aPipe[3] = -1;
stViConfig.astViInfo[s32WorkSnsId].stChnInfo.ViChn = ViChn;
stViConfig.astViInfo[s32WorkSnsId].stChnInfo.enPixFormat = enPixFormat;
stViConfig.astViInfo[s32WorkSnsId].stChnInfo.enDynamicRange = enDynamicRange;
stViConfig.astViInfo[s32WorkSnsId].stChnInfo.enVideoFormat = enVideoFormat;
stViConfig.astViInfo[s32WorkSnsId].stChnInfo.enCompressMode = enCompressMode;
/*get picture size*/
s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.enSnsType, &enPicSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get picture size by sensor failed!\n");
return s32Ret;
}
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get picture size failed!\n");
return s32Ret;
}
/*config vb*/
memset_s(&stVbConf, sizeof(VB_CONFIG_S), 0, sizeof(VB_CONFIG_S));
stVbConf.u32MaxPoolCnt = 2;
u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8, COMPRESS_MODE_SEG, DEFAULT_ALIGN);
stVbConf.astCommPool[0].u64BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 10;
u32BlkSize = VI_GetRawBufferSize(stSize.u32Width, stSize.u32Height, PIXEL_FORMAT_RGB_BAYER_16BPP, COMPRESS_MODE_NONE, DEFAULT_ALIGN);
stVbConf.astCommPool[1].u64BlkSize = u32BlkSize;
stVbConf.astCommPool[1].u32BlkCnt = 4;
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
return s32Ret;
}
/*start vi*/
s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed.s32Ret:0x%x !\n", s32Ret);
goto EXIT;
}
/*config vpss*/
memset_s(&stVpssGrpAttr, sizeof(VPSS_GRP_ATTR_S), 0, sizeof(VPSS_GRP_ATTR_S));
stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1;
stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1;
stVpssGrpAttr.enDynamicRange = DYNAMIC_RANGE_SDR8;
stVpssGrpAttr.enPixelFormat = enPixFormat;
stVpssGrpAttr.u32MaxW = stSize.u32Width;
stVpssGrpAttr.u32MaxH = stSize.u32Height;
stVpssGrpAttr.bNrEn = HI_TRUE;
stVpssGrpAttr.stNrAttr.enCompressMode = COMPRESS_MODE_FRAME;
stVpssGrpAttr.stNrAttr.enNrMotionMode = NR_MOTION_MODE_NORMAL;
astVpssChnAttr[VpssChn].u32Width = stSize.u32Width;
astVpssChnAttr[VpssChn].u32Height = stSize.u32Height;
astVpssChnAttr[VpssChn].enChnMode = VPSS_CHN_MODE_USER;
astVpssChnAttr[VpssChn].enCompressMode = enCompressMode;
astVpssChnAttr[VpssChn].enDynamicRange = enDynamicRange;
astVpssChnAttr[VpssChn].enVideoFormat = enVideoFormat;
astVpssChnAttr[VpssChn].enPixelFormat = enPixFormat;
astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30;
astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30;
astVpssChnAttr[VpssChn].u32Depth = 0;
astVpssChnAttr[VpssChn].bMirror = HI_FALSE;
astVpssChnAttr[VpssChn].bFlip = HI_FALSE;
astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_NONE;
/*start vpss*/
abChnEnable[0] = HI_TRUE;
s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret);
goto EXIT1;
}
/*config venc */
stGopAttr.enGopMode = VENC_GOPMODE_SMARTP;
stGopAttr.stSmartP.s32BgQpDelta = 7;
stGopAttr.stSmartP.s32ViQpDelta = 2;
stGopAttr.stSmartP.u32BgInterval = 1200;
s32Ret = SAMPLE_COMM_VENC_Start(VencChn[0], enType, enPicSize, enRcMode, u32Profile, bRcnRefShareBuf, &stGopAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start venc failed. s32Ret: 0x%x !\n", s32Ret);
goto EXIT2;
}
s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(VpssGrp, VpssChn, VencChn[0]);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Venc bind Vpss failed. s32Ret: 0x%x !n", s32Ret);
goto EXIT3;
}
/*config vo*/
SAMPLE_COMM_VO_GetDefConfig(&stVoConfig);
stVoConfig.enDstDynamicRange = enDynamicRange;
if (1 == u32VoIntfType)
{
stVoConfig.enVoIntfType = VO_INTF_BT1120;
stVoConfig.enIntfSync = VO_OUTPUT_1080P25;
}
else
{
stVoConfig.enVoIntfType = VO_INTF_HDMI;
}
stVoConfig.enPicSize = enPicSize;
/*start vo*/
s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo failed. s32Ret: 0x%x !\n", s32Ret);
goto EXIT4;
}
/*vpss bind vo*/
s32Ret = SAMPLE_COMM_VPSS_Bind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("vo bind vpss failed. s32Ret: 0x%x !\n", s32Ret);
goto EXIT5;
}
s32Ret = SAMPLE_COMM_VENC_StartGetStream(VencChn, sizeof(VencChn) / sizeof(VENC_CHN));
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Get venc stream failed!\n");
goto EXIT6;
}
PAUSE();
SAMPLE_COMM_VENC_StopGetStream();
EXIT6:
SAMPLE_COMM_VPSS_UnBind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn);
EXIT5:
SAMPLE_COMM_VO_StopVO(&stVoConfig);
EXIT4:
SAMPLE_COMM_VPSS_UnBind_VENC(VpssGrp, VpssChn, VencChn[0]);
EXIT3:
SAMPLE_COMM_VENC_Stop(VencChn[0]);
EXIT2:
SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable);
EXIT1:
SAMPLE_COMM_VI_StopVi(&stViConfig);
EXIT:
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
int main(void)
{
HI_U32 u32VoIntfType = 0;
HI_U32 u32ChipId;
HI_MPI_SYS_GetChipId(&u32ChipId);
if (HI3516C_V500 == u32ChipId)
{
u32VoIntfType = 1;
}
else
{
u32VoIntfType = 0;
}
SAMPLE_VIO_ViOnlineVpssOnlineRoute(0);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
<
在同一个文件夹下面加入Makefile编译文件
# Hisilicon Hi35xx sample Makefile
include ../Makefile.param
SMP_SRCS := $(wildcard *.c)
TARGET := $(SMP_SRCS:%.c=%)
TARGET_PATH := $(PWD)
# compile linux or HuaweiLite
include $(PWD)/../$(ARM_ARCH)_$(OSTYPE).mak
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
然后就make一下, 把生成的可执行文件复制到你板子上就可以跑起来了, 同时会在同一个目录生成h.265的码流.
串口看到的log应该差不多这样:
/sd/vio_demo # ./my_vio_csi1
[SAMPLE_VIO_ViOnlineVpssOnlineRoute]-80: ViDev:1, ViPipe:0, ViChn:0, s32WorkSnsId:0[SAMPLE_COMM_VI_StartVi]-3577: SAMPLE_COMM_VI_StartMIPI
[SAMPLE_COMM_VI_StartMIPI]-2050: lane_divide_mode:1
[SAMPLE_COMM_VI_StartMIPI]-2062: SAMPLE_COMM_VI_EnableMipiClock
[SAMPLE_COMM_VI_EnableMipiClock]-1521: s32WorkingViNum: 1
[SAMPLE_COMM_VI_EnableMipiClock]-1525: i: 0
[SAMPLE_COMM_VI_EnableMipiClock]-1528: s32ViNum: 0
[SAMPLE_COMM_VI_EnableMipiClock]-1534: devno: 1
[SAMPLE_COMM_VI_EnableMipiClock]-1538: MIPI_ENABLE_CLOCK:1
[SAMPLE_COMM_VI_StartMIPI]-2071: SAMPLE_COMM_VI_ResetMipi
[SAMPLE_COMM_VI_StartMIPI]-2081: SAMPLE_COMM_VI_EnableSensorClock
[SAMPLE_COMM_VI_StartMIPI]-2091: SAMPLE_COMM_VI_ResetSensor
[SAMPLE_COMM_VI_SetMipiAttr]-2000: ============= MipiDev 1, SetMipiAttr enWDRMode: 0
[SAMPLE_COMM_VI_StartVi]-3585: SAMPLE_COMM_VI_SetParam
GC2053_SENSOR_1080P_30FPS_LINEAR_MODE
=== Galaxycore GC2053_1080P_30FPS_10BIT_LINE_Init_OK!===
GC2053 init succuss!
[SAMPLE_COMM_ISP_Thread]-526: ISP Dev 0 running !
[SAMPLE_COMM_VO_StartChn]-540: u32Width:1920, u32Height:1080, u32Square:1
---------------press Enter key to exit!---------------
[SAMPLE_COMM_VENC_GetVencStreamProc]-1985: s32ChnTotal:1
[SAMPLE_COMM_VENC_GetVencStreamProc]-2032: VencFd i:0 fd:16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
<
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
2
评论
打赏
- 分享
- 举报
评论
1个
手气红包
-
小书生 2025-04-07 23:45:03回复 举报请教一下我的板子是3516DV300 按照你的这个帖子点sensor了后会出现自动重启的现象 下面是串口的log,请问下这个是啥问题呀? ~ # mount -o vers=4 192.168.100.11:/home/weican/nfs /HI3516 ~ # cd /HI3516/ /HI3516 # ls gc2503 /HI3516 # ./gc2503 random: fast init done [SAMPLE_VIO_ViOnlineVpssOnlineRoute]-80: ViDev:1, ViPipe:0, ViChn:0, s32WorkSnsId:0[SAMPLE_COMM_VI_StartMIPI]-2511: lane_divide_mode:1 [SAMPLE_COMM_VI_SetMipiAttr]-2461: ============= MipiDev 1, SetMipiAttr enWDRMode: 0 GC2053_SENSOR_1080P_30FPS_LINEAR_MODE === Galaxycore GC2053_1080P_30FPS_10BIT_LINE_Init_OK!=== GC2053 init succuss! [SAMPLE_COMM_ISP_Thread]-526: ISP Dev 0 running ! [SAMPLE_COMM_VO_StartChn]-544: u32Width:1920, u32Height:1080, u32Square:1 System startup Uncompress Ok! U-Boot 2016.11 (Sep 19 2024 - 16:44:10 +0800)hi3516dv300 Relocation Offset is: 0f6c0000 Relocating to 8fec0000, new gd at 8fe1fef0, sp at 8fe1fed0 SPI Nor: Boot Media isn't SPI Nor NAND: hifmc_ip_ver_check(44): Check Flash Memory Controller v100 ...hifmc_ip_ver_check(50): Found SPI Nand ID Table Version 2.7 SPI Nand(cs 0) ID: 0xe5 0xf4 Name:"DS35Q4GM" Block:128KB Page:2KB OOB:128B ECC:24bit/1K Chipsize:512 MiB MMC: *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: eth0
相关专栏
-
浏览量:4347次2020-08-14 11:25:29
-
浏览量:5100次2020-08-11 10:32:41
-
浏览量:5617次2020-08-11 10:30:44
-
浏览量:3986次2020-08-11 10:29:05
-
浏览量:1098次2024-02-23 16:58:46
-
浏览量:4179次2022-05-11 09:11:45
-
浏览量:7444次2018-06-14 23:13:10
-
浏览量:2276次2023-04-07 17:30:05
-
浏览量:7709次2020-09-06 16:25:23
-
2018-04-04 14:06:53
-
浏览量:5414次2022-07-13 15:47:15
-
2018-06-18 22:47:22
-
浏览量:9686次2018-06-02 19:08:30
-
浏览量:4454次2018-03-31 20:59:15
-
浏览量:1114次2023-05-16 14:05:36
-
浏览量:6624次2018-06-14 22:53:53
-
浏览量:6387次2019-12-28 10:35:51
-
浏览量:955次2024-02-05 17:05:51
-
浏览量:2807次2017-12-02 22:05:15
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者

Marc
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注