海思HI3519DV500相机使用MPP芯片API调试详解:读取chip_id实例解析
一、前言
前几篇文章在调试相机驱动,但是有问题,评论区的大佬说了一些打印相机信息的一些指令,其中有一个是查询chip_id。作为一个小白,文档都读不明白,但是不断的百度查资料和查看海思文档,结合现有信息和大胆猜测,最终实现了API的使用和chip_id的读取。本文比较烦琐,主要是还原心路历程,后面会出个纯净版(海思的坑太多,但凡我少一条信息我就做不出来)。申明一下的是,我用的方法是笨方法,目的是实现功能,肯定有更简洁的,这个我后面再探索实现,比如此次编译没用makefile。
硬件SOC:HI3519DV500
整体思路:根据《MPP 媒体处理软件 V6.0 开发参考》,找到要实现的api,然后在上位机的虚拟机中进行交叉编译成可执行文件,这其中要链接一些库,最后将可执行文件、库、头文件传送到板端进行实现。
看上去简单,其实有各种小坑
二、上位机程序编写
2.1 找到API参考信息
首先根据海思文档《MPP 媒体处理软件 V6.0 开发参考》,找到我们要实现的功能的api介绍。
一些介绍:
跳转到介绍这个API的地方,介绍的信息就大概一页:
这里手册有举例,直接使用举例程序,然后程序前面要引用里面所说的两个头文件,库文件是编译的时候链接用的。既然要编译,那肯定是需要环境的。我采用的是在PC端VSCODE使用ssh连接到PC端上的虚拟机Ubuntu,这个里面已经有了交叉编译的环境和海思的SDK(前面的文章有介绍,不多赘述了)。
2.2 编写程序
随便在SDK中找个位置新建个文件夹chipid,然后新建个.c文件,就叫chip.c吧。因为我之前一直在搞驱动,所以我就放驱动附近的文件夹里了。
程序就按照刚才文档里的来,这里出现了第一个坑,千万注意!
文档中写的头文件ss_mpi_sys.h,并且函数为ret = ss_mpi_sys_get_chip_id(&chip_id),但是我在SDK中根本没找到这个头文件,还好我早知道海思比较坑
我用后面的关键词“mpi_sys.h”在SDK中搜索,找到了相似的头文件“hi_mpi_sys.h”
路径在Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/include/hi_mpi_sys.h。估计是版本变动,名称也变动了但是文档没跟上更新,相应函数名下面的改为
ret = hi_mpi_sys_get_chip_id(&chip_id)。见图:
2.3 编译程序成可执行文件
接下来就是在该路径下的终端中进行编译,编译是需要指定头文件和库文件路径的,如果能用makefile更好,我这里直接编译的。
参考指令为:
aarch64-v01c01-linux-musl-gcc chip.c -o chip \
-I/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/include \
-L/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/lib \
-lss_mpi
也就是说此处要确定三个东西——头文件的路径和引用的库文件的路径,还有引用的库。
1.下面的头文件的文件路径在一起
即
/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/include/
2.库文件路径和库
此处也是坑,我找了很久libss_mpi.a这个库,搜索了也找不到,后面把ss换成hi才找到。路径在
/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/lib/下
所以 命令就成为了:
aarch64-v01c01-linux-musl-gcc chip.c -o chip \
-I/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/include \
-L/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/lib \
-lhi_mpi
在终端运行,报错:
反正就是说未定义一堆东西,这里我参考了参考链接
也就是说我引用的库不全,海思的那个文档只写了一个库libss_mpi.a,但是一个库根本不够(甚至唯一的库的名字也是错的)!坑+1
那么根据这个参考链接,还有个要点
strncpy_s等几个函数的引用库是libsecurec.so(或静态库libsecurec.a),并且该基础库要往最右端放
那就根据这条信息,多链接个库,命令最下面变成
同时我也就理解了什么叫做“最右端”
运行,还是报错,但是显然未定义的东西要少了,因为链接了libsecurec库,所以未定义strncpy_s的报错也没再报,显然还有库没加上。
大胆猜测一下,这个mmap的东西像api,直接在《MPP 媒体处理软件 V6.0 开发参考》中搜索mmap,找到有相似的
直接把这个库文件也链接上,再编译(当然ss也要改成hi,即libhi_mpi_sysmem,也在同一lib路径下)还是把基础库放最右端
可以看到编译成功,没有报错,并且在chip目录下也生成了可执行文件
三、可执行程序运行
用VScode将chip下载到PC的win桌面下的文件夹中,连接好相机,上位机用Mobaxterm连接到板端(前面文章有写环境和tftp如何发送)。
PC端打开Tftp64,选好文件夹,选好IP。
在Mobaxterm终端的home路径下执行命令,就可以将chip可执行程序下载到板端。:
tftp -g 192.168.1.1 -r chip
更改脚本权限:
紧接着运行,但是报错
看起来光可执行文件不行,不仅需要两个库文件还需要hi_mpi_sys.h这个头文件(包含了函数hi_mpi_sys_get_chip_id),将这三个文件传送到板端,再添加权限运行(图里少个头文件后面我传了,这里没有)
此时我推测应该要路径一致(只是小白的猜测),所以我根据vscode编译时候的路径进行一层层文件夹创建,然后移动两个库文件到对应的路径下。也就是在home文件夹创建
/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/lib这个路径,把库文件放里面,再一层层创建
/home/rv1126/HI3519_20240627/Hi3519DV500_SDK_V1.0.1.0/smp/a55_linux/source/out/include文件,将头文件放进去,这样就和上位机交叉编译的时候路径一致了(下图是之前上位机交叉编译的路径,这里是再回头看了一眼)
然后此时相机板端的home只有两个,一个chip可执行文件,一个rv1126文件夹,里面一层层文件放着两个库文件和一个头文件:
再将变量生效,再执chip文件就有结果了:
四、总结
总之折腾了很多,不过好在整出来了。海思文档版本同时文档内容也有不全的地方。经过这次对调用api熟悉了一些,但是刚接触有很多不足,比如有很多可以简化的地方,我第一次尝试没有细细去研究,有更多欢迎大家评论区讨论。
如果有搞海思驱动的大佬可以看看我前面的文章,适配海思新sensor 的内容。
如果帮助到你的话,欢迎点赞 收藏 关注,让更多人看到是我更新的动力!
作者:电子猫头鹰