海思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 的内容。

如果帮助到你的话,欢迎点赞 收藏 关注,让更多人看到是我更新的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值