这里写自定义目录标题
高通由于驱动模块位于QNX侧,所以高通本身实现了一套以hypervisor为基础的传输数据的模块。
AIS就是其中用于传输摄像头数据的接口。本文章基于sa8155p实现QCARCAM的数据。
QNX介绍
QNX是由加拿大的Quantum Software Systems公司创建的实时操作系统。该公司的创始人是Dan Dodge和Gordon Bell。1980年代初,他们开始研究实时操作系统,并于1982年创建了Quantum Software Systems公司。该公司的第一个产品是QNX操作系统。
QNX最初是用于数控机床和其他实时控制应用的,但很快就被应用在其他领域,如通讯设备、医疗设备、汽车电子等。
1999年,QNX被收购并成为黑莓的子公司。目前,QNX已经成为汽车电子市场的领先供应商,其操作系统被广泛应用于汽车的娱乐系统、驾驶员信息系统、车载通信等领域。
AIS介绍
高通AIS是高通公司的人工智能解决方案,它包括一系列的硬件和软件技术,用于在移动设备、物联网和汽车等领域中实现人工智能的应用。高通AIS的核心是高通骁龙移动平台上的人工智能引擎,它可以加速深度学习任务的执行,提高计算效率和节能效果。高通AIS还提供了一系列丰富的开发工具和样例代码,帮助开发者更快地构建人工智能应用。
SA8155P参数指标
- CPU
- Custom 64-bit Kryo octa-core CPU
- 7nm FINFET with advanced power savings
- SOC virtualization support
- 384 KB L1 I/D + 1.875 MB L2 + 2 MB L3
- 3 MB system cache
- GPU
- Adreno 640 GPU: OpenGL ES 3.x OpenCL 2.0 Full, Vulkan, RenderScript, 64-bit virtual addressing, plus hardware tessellation, geometry shaders, programmable blending, and decreased power consumption
- High granularity for preemption with HW queues and doorbell features
- DSP + NPU
- Qualcomm® Hexagon™ 6 DSP with Hexagon Vector eXtensions (HVX)—Four instances
- Neural Processing Engine (NPU) for machine learning acceleration
AIS结构
ais侧用ais_client去获取视频数据流。
AIS获取数据过程
AIS对应获取接口
API接口说明
qcarcam_ret_t qcarcam_initialize(qcarcam_init_t* p_init_params);
qcarcam初始化
qcarcam_ret_t qcarcam_query_inputs(qcarcam_input_t* p_inputs, unsigned int size, unsigned int* ret_size);
查询有效camera,驱动配置了多少个camera,并获取相机得基本属性
qcarcam_hndl_t qcarcam_open(qcarcam_input_desc_t desc);
打开camera,输入参数为camera_id,oms为0, dms为1
qcarcam_ret_t qcarcam_s_buffers(qcarcam_hndl_t hndl, qcarcam_buffers_t* p_buffers);
设置buffer参数,重要的是buffer缓冲个数不得少于2,建议个数设置为5
qcarcam_ret_t qcarcam_start(qcarcam_hndl_t hndl);
开启照相机
qcarcam_ret_t qcarcam_get_frame(qcarcam_hndl_t hndl, qcarcam_frame_info_t* p_frame_info, unsigned long long int timeout, unsigned int flags);
获取视频帧,默认超时时间设置为500000000
qcarcam_ret_t qcarcam_release_frame(qcarcam_hndl_t hndl, unsigned int idx);
释放帧数据,在获取帧数据拷贝后,一定要执行release操作
qcarcam_ret_t qcarcam_stop(qcarcam_hndl_t hndl);
停止获取摄像头视频帧
qcarcam_ret_t qcarcam_close(qcarcam_hndl_t hndl);
关闭摄像头
qcarcam_ret_t qcarcam_uninitialize(void);
释放ais资源
QNX和Android不同的设置共享内存的方式
即
qcarcam_s_buffers
设置buffer的不同方式
Android侧共享内存
int ionDev = open("/dev/ion", O_RDONLY);
int aret = alloc_ion_buffer(ionDev, ion_buf);
mQcarcamOutBufs.buffers[i].planes[0].p_buf = (void *)(uintptr_t)(ion_buf->fd);
mpQcarcamMmapBufs[i].size = mQcarcamOutBufs.buffers[i].planes[0].size;
mpQcarcamMmapBufs[i].ptr = mmap(NULL, mpQcarcamMmapBufs[i].size, PROT_READ | PROT_WRITE, MAP_SHARED, ion_buf->fd, 0);
Android 侧需要通过读取/dev/ion指定文件获取文件的fd,再通过map映射关系来获取指针。
QNX侧共享内存
ion_bufs[i].ptr[0] = pmem_malloc_ext_v2(mQcarcamOutBufs.buffers[i].planes[0].size + mQcarcamOutBufs.buffers[i].planes[1].size,
PMEM_CAMERA_ID, PMEM_FLAGS_SHMEM | PMEM_FLAGS_PHYS_NON_CONTIG | PMEM_FLAGS_CACHE_NONE,
PMEM_ALIGNMENT_4K, 0, (pmem_handle_t *)&ion_bufs[i].mem_handle, NULL);
mQcarcamOutBufs.buffers[i].planes[0].p_buf = ion_bufs[i].mem_handle;
区别于Android的方式,由于视频驱动位于QNX侧,所以QNX获取视频数据不需要通过V4l2结构来获取,直接可以通过pmen内存共享的方式获取