使用Linux源码编写Qnx 系统下摄像头的方法
Qnx系统虽然稳定可靠但是因为收费的原因导致用户量少,这样在调试外部驱动的使用因为资料少往往比较困难,本文介绍如何使用手头上的linux 源码来写Qnx源码,本文已经假定你对linux源码很了解。
1. 先阅读Qnx摄像头说明文档如下图:

上图中说明摄像头工作时需要3个*.so文件,分别功能是:
libcapture-board-*-*.so
接口库,用于传递命令给下面两个库,对应下面的 libcapture-board-imx8qxp-mek-ov5640.so
libcapture-decoder-*.so
是操作decoder 解码器的库文件,对应下图 libcapture-camera-ov5640.so
libcapture-soc-*.so
是操作imx8qxp soc芯片的库文件,对应下图 libcapture-soc-imx8qxp.so

2. 修改编写库文件
libcapture-soc-imx8qxp.so 是不提供源码的,直接使用库文件即可。
主要就是写 libcapture-board-imx8qxp-mek-ov5640.so 和 libcapture-camera-ov5640.so 两个库。
先搞 libcapture-board-imx8qxp-mek-ov5640.so 这个 库文件 ,这个库文件的源码在:src\hardware\wfd\imx8x\caplib\board\imx8qxp-mek-ov5640\board.c
主要修改如下:
2.1 修改打开decoder 的地址和使用那个i2c设备节点操作

2.2 修改加载那个库文件

2.3 修改参数设置

2.4 根据摄像头OV5640或者DS90UB940-Q1 摄像头解码器的要求设置:
CAPTURE_PROPERTY_CSI2_VCHANNEL_NUM 设置CSI Virtual Channel Identifier
(虚拟通道标识符) 参考 CSI-2 协议我理解是MIPI数据的通道MIPI_CSI0_DATA0 ~ MIPI_CSI0_DATA4
传输顺序。
CAPTURE_PROPERTY_CSI2_NUM_DATA_LANES 设置Number of CSI2 data lanes
(CSI2数据通道的数量) 如:OV5640就是2 (MIPI_CSI0_DATA0 ~MIPI_CSI0_DATA1 )
DS90UB940-Q1就是4 (MIPI_CSI0_DATA0 ~ MIPI_CSI0_DATA4)

参考linux系统下
CAPTURE_PROPERTY_CSI2_NUM_DATA_LANES
和CAPTURE_PROPERTY_CSI2_VCHANNEL_NUM
两个参数设置(OV5640)当然virtual-channel
和data-lanes
都在dts有设置这里只是读取过来进行使用而已。




3.经过上面修改基本差不多了主要精力修改 libcapture-camera-ov5640.so 上
源码在hardware\capture 里面源码结构如下:

经过我对源码分析发现只需要修改ov5640.c就行camera.c不需要修改。
代码调用过程是
camera.c -> decoder_update (函数) -> ov5640.c
主要修改 ov5640.c中的decoder_update函数:
decoder_update 函数主要工作如下3个步骤:
3.1打开读取设备

3.2复位和初始化

3.3 根据传递过来的参数对设备设置

3.4 经过上述修改后进行测试问题解决。
4.参考linux 源码编写decoder_update
需要说明的是linux源码对摄像头初始化部分在ov5640_mipi_v3.c 里porbe完成如下所示:
只参考probe这部分即可
4.1 复位操作

4.2读取摄像头ID

4.3初始化摄像头设备
