SDK 编译可以直接参考这里大佬的博客,特别详细,
https://blog.csdn.net/wirner/article/details/107024607
注意编译的时候,make all要带上CHIP=hi3516ev300,否则default编译的是 hi3516ev200的。
make all CHIP=hi3516ev300
1、烧录官方SDK 编译镜像
SDK编译完成后,在osdrv/pub/hi3516ev300_spi_image_uclibc 目录下,会有生成的 uboot.bin, kernel.bin, rootfs.ext4. 用HiTool 直接烧录即可。
烧录后,在uboot中设置对应的boot cmd和 bootargs即可正常启动。
比如我使用的boot cmd和 bootargs如下
setenv bootargs 'mem=96M console=ttyAMA0,115200 root=/dev/mtdblock3 rw rootfstype=yaffs2 mtdparts=hinand:512K(Uboot),512K(env),5120K(kernel),-(rootfs)'
setenv bootcmd 'nand read 41000000 100000 500000;bootm 41000000'
saveenv
2、拷贝 KO,开机 自动加载 ISP需要使用的KO
启动后,把 SDK中 isp相关的ko全都拷贝(tftp传)到文件系统中。
把SDK /mpp/ko/* 下所有ko打包,传到板子上。
load3516ev300 脚本是需要使用的,修改load3516ev300脚本中的内存地址,保持和uboot中一致即可。
mem_total=128 # 128M, total mem
mem_start=0x40000000 # phy mem start
os_mem_size=96 # 32M, os mem
mmz_start=0x46000000; # mmz start addr
mmz_size=32M;
设置开机自动加载ko
vi /etc/init.d/rcS
cd /ko
./load3516ev300 -i -sensor0 imx307
3、环境终于建好了,下面是修改、运行官方的Demo了。
在SDK mpp/sample目录是各种例程,其中,mpp/sample/ive/sample_ive_main.c就是 移动侦测的例程。
打印的 usage中,0是遮挡检测,6是Motion detected, 这里我们重点关注6.
printf("Usage : %s <index> [complete] [encode] [vo]\n", pchPrgName);
printf("index:\n");
printf("\t 0)Occlusion detected.(VI->VPSS->IVE->VO_HDMI).\n");
printf("\t 1)Canny,<complete>:0, part canny;1,complete canny.(FILE->IVE->FILE).\n");
printf("\t 2)Gmm2.(FILE->IVE->FILE).\n");
printf("\t 3)MemoryTest.(FILE->IVE->FILE).\n");
printf("\t 4)Sobel.(FILE->IVE->FILE).\n");
printf("\t 5)St Lk.(FILE->IVE->FILE).\n");
printf("\t 6)Motion detected.(VI->VPSS->IVE->VGS->VO_HDMI).\n");
Motion detected 显示的 数据流:VI->VPSS->IVE->VGS->VO_HDMI, 但当前没有显示屏,没有HDMI,无法看到结果,所以还需要改一改代码。
目标是移动侦测结果输出到文件中,
要改两处:
1、初始化时,关掉VO,打开Venc的初始化
ive/sample/sample_ive_md.c 中
- static SAMPLE_IVE_SWITCH_S s_stMdSwitch = {HI_FALSE,HI_TRUE};
+ static SAMPLE_IVE_SWITCH_S s_stMdSwitch = {HI_TRUE,HI_FALSE};
打开上面开关后,在下面函数里会自动完成其他事情。
SAMPLE_COMM_IVE_StartViVpssVencVo()
2、获取移动侦测的图像后, 输出到Venc进行编码并保存。
SAMPLE_IVE_MdProc函数中,添加图像送到Venc模块
if (HI_TRUE == s_stMdSwitch.bVo){
s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stBaseFrmInfo,s32MilliSec);
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
"HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret);
}
+ if (HI_TRUE == s_stMdSwitch.bVenc){
+ s32Ret = HI_MPI_VENC_SendFrame(0,&stBaseFrmInfo, s32MilliSec);
+ SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
+ "HI_MPI_VENC_SendFrame fail,Error(%#x)\n",s32Ret);
+ }
修改完上面后,重新make, 此时的 Motion detected就会把侦测结果输出到文件中保存。当然,不输出到文件,改成RTSP实时输出也是可以的。
效果如下, 左边窗帘上不是误检测,是手的影子在动,所以有检测框:
离线