-
Notifications
You must be signed in to change notification settings - Fork 8
Description
[RKMEDIA][SYS][Info]:text is all=3
[RKMEDIA][SYS][Info]:module is all, log_level is 3
[New LWP 672]
[ 2945.879077] pgd = bda53909
[ 2945.879135] [00000000] *pgd=2d73a835, pte=00000000, ppte=00000000
[ 2945.879172] CPU: 1 PID: 669 Comm: rvrpem_rockit Tainted: G W O 4.19.111 #32
[ 2945.879193] Hardware name: Generic DT based system
[ 2945.879210] PC is
Thread 1 "rvrpem_rockit" received signal SIGSEGV, Segmentaation fault.
t 0x9be60494
[ 2945.879222] LR is at 0x9be602c0
[ 2945.879233] pc : [<9be60494>] lr : [<9be602c0>] psr: 600b0010
[ 2945.879246] sp : aec08a88 ip : 9c06ed94 fp : 00000000
[ 2945.879258] r10: a6fb0000 r9 : 00000000 r8 : 00000000
[ 2945.879273] r7 : aec08acc r6 : 00000000 r5 : 00000000 r4 : 00000000
[ 2945.879286] r3 : 00000000 r2 : 00000000 r1 : aec08acc r0 : 00000000
[ 2945.879300] Flags: nZCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[ 2945.879314] Control: 10c5387d Table: 2ca1406a DAC: 00000055
[ 2945.879332] CPU: 1 PID: 669 Comm: rvrpem_rockit Tainted: G W O 4.19.111 #32
[ 2945.879343] Hardware name: Generic DT based system
[ 2945.879379] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[ 2945.879411] [] (show_stack) from [] (dump_stack+0x90/0xa4)
[ 2945.879436] [] (dump_stack) from [] (__do_user_fault+0x130/0x134)
[ 2945.879460] [] (__do_user_fault) from [] (do_page_fault+0x240/0x348)
[ 2945.879483] [] (do_page_fault) from [] (do_DataAbort+0x4c/0xec)
[ 2945.879512] [] (do_DataAbort) from [] (__dabt_usr+0x3c/0x40)
[ 2945.879527] Exception stack(0xee903fb0 to 0xee903ff8)
[ 2945.879544] 3fa0: 00000000 aec08acc 00000000 00000000
[ 2945.879561] 3fc0: 00000000 00000000 00000000 aec08acc 00000000 00000000 a6fb0000 00000000
[ 2945.879577] 3fe0: 9c06ed94 aec08a88 9be602c0 9be60494 600b0010 ffffffff
0x9be60494 in vi_set_dev_attr () from /usr/lib/librockit.so
(gdb)
(gdb) bt
#0 0x9be60494 in vi_set_dev_attr () from /usr/lib/librockit.so
#1 0x00071d94 in rv11xx_rockit_vi_main(int, char) ()
#2 0x9a49b4e4 in __libc_start_main () from /lib/libc.so.6
#3 0x0001816c in _start () at ../sysdeps/arm/start.S:124
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
很简单的源码:
int rv11xx_rockit_vi_main(int argc, char *argv[])
{
int ret = 0;
int devId = 0;
int chnId = 1;
int loopCount = 0;
int waitTime = 33;
VI_FRAME_S stViFrame;
VI_CHN_ATTR_S stViChnAttr;
VI_DEV_ATTR_S stViDevAttr;
VI_CHN_STATUS_S stViChnStatus;
VI_DEV_BIND_PIPE_S stViBindPipe;
if (RK_MPI_SYS_Init() != RK_SUCCESS) {
return -1;
}
// 0.获取设备配置状态
ret = RK_MPI_VI_GetDevAttr(devId, &stViDevAttr);
if (ret == RK_ERR_VI_NOT_CONFIG) {
// 0-1.配置设备
ret = RK_MPI_VI_SetDevAttr(devId, &stViDevAttr);
if (ret != RK_SUCCESS) {
goto FAILED_EXIT;
}
} else {
printf("RK_MPI_VI_SetDevAttr already\n");
}
// 1.获取设备使能状态
ret = RK_MPI_VI_GetDevIsEnable(devId);
if (ret != RK_SUCCESS) {
// 1-2.使能设备
ret = RK_MPI_VI_EnableDev(devId);
if (ret != RK_SUCCESS) {
goto FAILED_EXIT;
}
// 1-3.绑定设备管道
stViBindPipe.u32Num = devId;
stViBindPipe.PipeId[0] = devId;
ret = RK_MPI_VI_SetDevBindPipe(devId, &stViBindPipe);
if (ret != RK_SUCCESS) {
goto FAILED_EXIT;
}
} else {
printf("RK_MPI_VI_EnableDev already\n");
}
// 2.配置通道
strcpy(stViChnAttr.stIspOpt.aEntityName, "/dev/video0");
stViChnAttr.stIspOpt.u32BufCount = 3;
stViChnAttr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_MMAP;
stViChnAttr.u32Depth = 2;
stViChnAttr.enPixelFormat = RK_FMT_YUV420SP;
stViChnAttr.stFrameRate.s32SrcFrameRate = -1;
stViChnAttr.stFrameRate.s32DstFrameRate = -1;
stViChnAttr.stSize.u32Width = 1280;
stViChnAttr.stSize.u32Height = 720;
ret = RK_MPI_VI_SetChnAttr(devId, chnId, &stViChnAttr);
if (ret != RK_SUCCESS) {
goto FAILED_EXIT;
}
// 3.使能通道
ret = RK_MPI_VI_EnableChn(devId, chnId);
if (ret != RK_SUCCESS) {
goto FAILED_EXIT;
}
while (loopCount < 100) {
// 5.获取帧
ret = RK_MPI_VI_GetChnFrame(devId, chnId, &stViFrame, waitTime);
if (ret == RK_SUCCESS) {
void *data = RK_MPI_MB_Handle2VirAddr(stViFrame.pMbBlk);
printf("loop:[%03d], seq:[%d], pts:[%lld]ms\n", loopCount, stViFrame.s32Seq, stViFrame.s64PTS / 1000);
// 6.获取通道状态
ret = RK_MPI_VI_QueryChnStatus(devId, chnId, &stViChnStatus);
printf("return:[%d], w:[%d], h:[%d], state:[%d], lost:[%d], frameRate:[%d], vbfail:[%d]\n", ret,
stViChnStatus.stSize.u32Width, stViChnStatus.stSize.u32Height, stViChnStatus.bEnable,
stViChnStatus.u32LostFrame, stViChnStatus.u32FrameRate, stViChnStatus.u32VbFail);
// 7.释放帧
ret = RK_MPI_VI_ReleaseChnFrame(devId, chnId, &stViFrame);
if (ret != RK_SUCCESS) {
printf("RK_MPI_VI_ReleaseChnFrame failed, return:[%d]\n", ret);
}
loopCount++;
} else {
printf("RK_MPI_VI_GetChnFrame failed, timeout, return[%d]\n", ret);
}
usleep(10 * 1000);
}
// 8.停止通道
ret = RK_MPI_VI_DisableChn(devId, chnId);
// 9.停止设备
ret = RK_MPI_VI_DisableDev(devId);
FAILED_EXIT:
RK_MPI_SYS_Exit();
return ret;
}