基于MIPI-CSI2转换FPDLINK的智能
车载视觉驱动软件说明书
目录
一、软件简介
此软件是基于公司设计的LI-TX2-Carrier-Board嵌入式硬件平台,以SONY公司的IMX728图像传感器作为无人驾驶视觉图像视频采集模块,该芯片支持2468 x 2468分辨率,输出高清HDR视频,被广泛应用于各种高分辨率视觉设计中;以TI公司的TI9701与TI9702串行化编解码传输芯片来拓展数据信号传输长度,4Line或4*2Line 2.5 Gbps/lane 以及大于15m传输距离的MIPI-CSI2转换GMSL2信号高速传输特性。图像传感器采集到的是10位的raw数据,传输到nvidia的TX2 SOM处理,可以在同一时间传输多达4路的视频流,感知更多周围的环境,该sensor默认工作在Slave模式下(也可以切换到Master 模式),设备驱动程序可以把采集的图像视频数据发送给应用程序显示出来,例如Argus/Nvgst-Capture等测试软件,也可以通过驱动接口获取图像后进行进一步的开发处理。
该软件是嵌入式软件,需要使用本公司生产的LI-TX2-CB-4CAM V1.0载板 IMX728高清摄像机硬件模组一起使用,该整套模组产品可用于智能驾驶车载视觉,机器视觉,科学研究等多种场合。
1.1 技术背景
随着无人驾驶技术和智能汽车的快速发展,其中车载视觉采集系统又是智能驾驶技术的关键。为此,本文主要了介绍基于Jetson Nvidia TX2平台融合IMX728摄像头实现智能车载视觉采集系统驱动软件设计及功能验证。
1.2 软件概述
本文主要介绍基于LI-IMX728-Camera智能车载视觉采集系统驱动软件设计及测试应用说明。主要包括:驱动软件开发接口,驱动软件开发编译,驱动软件设计原理,驱动软件测试及软件应用等内容。
本驱动软件底层依赖JETSON-NVIDIA TX2硬件接口,依据电路原理实现Sensor寄存器或I2C接口,MIPI转换FPDLINK, GPIO设置,FPGA控制编程实现驱动机制。应用层基于串口通信指令操控摄像头,重点描述驱动软件开发接口与测试原理、Camera出图验证、及Camera Global Shutter功能验证。
驱动软件测试组件包括,以串口测试软件工具X-Shell7;IMX728-Sensor,MIPI-CSI2连接线;Senor和HDMI 接口测试结果需要外接HDMI显示器验证。
驱动软件支持的关键特性
- 嵌入式多核ARM Cortex-A53 1.2GHz ,带1MB L2缓存
- 多通道ISP,最高支持800MPixel/s输入像素速率
- 支持高清分辨率3840_1920_30P,30fps
- 6路Camera基于GSML2长距离(>=15m)连接,支持多路Camera
- Sensor支持RCCB低照度
- 串化、解串器支持4-lane ,4x2-lane or 2x4-lane MIPI CSI-2 V1.3端口
- 串化、解串器支持D-PHY V1.2 at 80 Mbps–2.5 Gbps/lane
- 串化、解串器支持用户数据包自定义类型,RAW8/10/12/14/16/20, RGB565/666/888, YUV422 8/10-bit
- 串化、解串器支持16-channel CSI-2虚拟通道
- 支持MIPI-CSI2转换FPDLINK-V数据传输
- 带闪烁引擎的LED灯
二、软件说明
2.1 硬件环境
- 处理器最好Intel i5或以上
- 内存容量4G以上
- HDMI 显示器
2.2 软件环境
- 操作系统:(Win7,Win8,Win10,Win2000,Windows XP)Microsoft WINDOWS 10 (32bit/64bit)
- 测试软件:Xshell6(Free for Home/School)
- LI-Camera-tool(USB3.0)
- 开发环境与工具:Microsoft WINDOWS 10 (64bit),VMware Workstation 16 Pro,ubuntu1804、NVIDIA-TX2 BSP,gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabi
- 开发语言:C语言
2.3 测试组件
- 摄像头: IMX728 Sensor,Nvidia-TX2,TX2 SOM
- 适配板: 1 x LI-JTX1-MIPI-ADPT REV1.2, LI-TI9702-IPX-DESER V1.0, LI-TI971-FKR V1.2
- 连接线: 1 x FAW-1233 cable , 1 x LI-IMX728-FPDLINKIV
2.4 参考资料
- <<IMX728-MIPI-R32.4.3-TX2-NV-20220217_Driver_Guide.docx >>
- <<IMX728_RGGB_TechnicalDocument_release_note_E_210310.pdf>>
- <<IMX728_RegisterMap_E_Rev0.0.2.xlsx >>
三、测试环境
3.1 软件安装
系统软件:NVIDIA-JETSON-TX2刷机成R32.6.1内核版本系统。
调试软件:安装Xshell7(Free for Home/School)版本,串行线通信端口连接TX2,查看驱动调试信息。
3.2 硬件安装
1)安装NVIDIA-JETSON-TX2 Board,连接19V电源线,HDMI接口线,串口线连接调试线;安装IMX728摄像头经GMLS2连接TI9702解串板,后MIPI-CSI2连接线至MIPI-ADPT板,且需独立连接12V供电电源等测试设备。待开机系统启动后、Sensor出图,则HDMI显示器验证。如下3-2图整机测试连接图:
3-2整机测试连接图
2)在WINDOWS虚拟机搭建JETSON驱动编译环境,编译IMX728-CAMERA驱动文件,编译好的驱动程序一起打包至Firmware。
四、驱动开发
4.1 编译环境
Vmware虚拟机安装ubuntu 16.04完成后,安装配置编译环境系统依赖库,安装系统教程编译环境,顺序配置JETSON-TX2-R32.6.1内核SDK(Hardware and Kernel),设置编译环境变量,设置arm-linux编译器;下载系统编译依赖包,待系统更新完成后,新建build目录,解压三个编译文件包;Source编译环境变量“source ../../ jetson.sh”;执行预编译配置命令,执行SDK驱动编译。如下图4-1所示:
4-1编译环境配置图
4.2 编译生成
如下图4-2驱动文件与主要配置图所示,主要编译步骤与命令配置驱动文件包括,添加修改过的驱动文件(Sensor-IMX728源文件)至SDK对应的文件目录,执行编译,将生成的firmware (../Kernel_out/arch/arm64/boot/dts/tegra186-quill-p3310-1000-c03-00-base.dtb ../Image)文件烧录至JETSON-TX2-SOM主板(USB Port)。烧录Firmware方法,请参考《IMX728-MIPI-R32.4.3-TX2-NV-20220217_Driver_Guide.pdf》。
4.3 软件设计
4.3.1总统设计
基于linux标准V4L2驱动框架的IMX728 Sensor驱动结构,如下图4-1 基于V4L2框架的IMX 728 Sensor驱动模型架构所示,遵循基于标准V4L2驱动框架驱动结构,内核侧以I2C总线注册device 并做IOCTL访问内核MAP映射地址内存访问;应用侧以/dev/node给应用层访问调用。
图4-3-1 基于V4L2框架的IMX728 Sensor驱动模型
JETSON-TX2-IMX728 Camera驱动主要包括内容,有Sensor驱动初始化和Sensor寄存器配置、主板配置相关;基于FPDLINK-V串行器TI9701与解串器TI9702配置与寄存器读写配置,DTS解析接口,电源使能开关接口,分辨率模式设置接口;以及基于Sensor曝光、GAIN、Framerate等特性寄存器读写相关内容。基于JETSON-TX2-SDK与IMX728-Sensor驱动结合实现单路、多路出流等功能实现。
4.3.2驱动接口
基于NVIDIA Tegracam 驱动架构封装Linxu内核V4L2驱动模式。NVIDIA Tegracam 内核用户模式库提供应用程序和linux内核模式V4L2驱动程序之间所有控件和数据处理。由Sensor传感器提供RAW格式数据通过TI9701串行器芯片FPDLINK传输TI9702解串器转换MIPI-CSI总线交给TX2 SOM GPU处理的整个过程。
驱动接口主要有IMX728 Sensor驱动接口。驱动接口模块主要包括:驱动启动入口,驱动使能,驱动上电,驱动掉电,驱动寄存器读写,获取电源,设置电源,解析DTS,设置RES模式,启动流,获取流;初始化fpdlink_init接口,TI9702寄存器读写接口,TI9701寄存器读写接口组成。
4.3.2.1 初始化接口
如下图4-3-2-1 Sensor初始化接口图所示。
接口功能:Sensor驱动入口函数,主板上电、注册V4L2驱动设备、读写I2C寄存器,以及移除驱动设备。
函数名称:static int imx728_probe(struct i2c_client *client,
const struct i2c_device_id *id)
主要参数:输入参数,struct i2c_client *client,const struct i2c_device_id *id;输出参数none;返回值0或 -1。
4-3-2-1 Sensor初始化接口图
4.3.2.2 上电接口
如下图4-3-2-2 Sensor上电接口图所示。
接口功能:Sensor上电启动,GPIO复位。
函数名称:static int imx728_power_on(struct camera_common_data *s_data)主要参数:输入参数,struct camera_common_data *s_data;输出参数, none;返回值,0或-1。
4-3-2-2 Sensor上电接口图
4.3.2.3 掉电接口
如下图4-3-2-3 Sensor掉电接口图所示。
接口功能:Sensor断电
函数名称:static int imx728_power_off(struct camera_common_data *s_data)
主要参数:输入参数,struct camera_common_data *s_data;输出参数, none;返回值,0或-1。
4-3-2-3 Sensor停用接口图
4.3.2.4 设置电压接口
如下图4-3-2-4 Sensor状态接口图所示。
接口功能:设置Sensor驱动电压
函数名称:static int imx728_power_put(struct tegracam_device *tc_dev)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针 返回值,0或-1。
4-3-2-4 Sensor状态接口图
4.3.2.5 获取电压接口
如下图4-3-2-5 Sensor模式接口图所示。
接口功能:获取Sensor电压
函数名称:static int imx728_power_get(struct tegracam_device *tc_dev)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针 返回值,0或-1。
4-3-2-5 Sensor获取电压接口图
4.3.2.6 解析DTS接口
如下图4-3-2-6 Sensor设备信息接口所示。
接口功能:解析DTS接口。
函数名称:Static struct camera_common_pdata *imx728_parse_dt(struct tegracam_device *tc_dev)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针 返回值,0或-1。
4-3-2-6 Sensor DTS解析接口图
4.3.2.7 设置模式接口
如下4-3-2-7 Sensor 设置模式接口图所示。
接口功能:设置DTS Mode接口
函数名称:static int imx728_set_mode(struct tegracam_device *tc_dev)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针 返回值,0或-1。
4-3-2-7 Sensor 设置模式接口图
4.3.2.8 获取增益接口
如下4-3-2-8 Sensor 获取增益接口图所示。
接口功能:获取Sensor Gain增益接口
函数名称:static int imx728_get_gain(struct tegracam_device *tc_dev, s64 val)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针,输入Gain值Val; 返回值,0或-1。
4-3-2-8 Sensor 获取增益接口图
4.3.2.9 增益设置接口
如下4-3-2-9 Sensor增益设置寄存器接口图所示。
接口功能:设置Gain增益寄存器接口。
函数名称:static int imx728_set_gain(struct tegracam_device *tc_dev, s64 val)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针,输入Gain值val。
4-3-2-9 Sensor增益设置寄存器接口图
4.3.2.10 FPDLINK初始化接口
接口功能:初始化fpdlink接口
函数名称:int fpdlink_init(struct i2c_client *client)
主要参数:输入参数struct i2c_client *client;返回值,OK(0)/NG(-1)。
4-3-2-10初始化fpdlink接口图
4.3.2.11 TI9702初始化接口
接口功能:解串TI9702芯片初始化
函数名称:int fpdlink_init(struct i2c_client *client)
主要参数:输入参数struct i2c_client *client;返回值,OK(0)/NG(-1)。
4-3-2-11解串TI9702芯片初始化图
4.3.2.12 TI9702写寄存器接口
接口功能:解串TI9702芯片写寄存器接口
函数名称:static int TI9702_reg_write(struct i2c_client *client, u8 addr, u8 val)
主要参数:输入参数struct i2c_client *client, u8 addr, u8 val;返回值,OK(0)/NG(-1)。
4-3-2-12解串TI9702芯片写寄存器接口图
4.3.2.13 TI9702读寄存器接口
接口功能:解串TI9702芯片读寄存器接口
函数名称:static int TI9702_reg_read(struct i2c_client *client, u8 addr, u8 *val)
主要参数:输入参数I2C设备struct i2c_client *client, 地址u8 addr,寄存器值 u8 *val;返回值,OK(0)/NG(-1)。
4-3-2-13串行化TI9702芯片写寄存器接口图
4.3.2.14 设置曝光接口
如下4-3-2-14 Sensor驱动配置接口图所示。
接口功能:Sensor驱动设置曝光接口
函数名称:static int imx728_set_exposure(struct tegracam_device *tc_dev, s64 val)主要参数:输入参数,tegracam_device *tc_dev 设备ID指针,输入曝光值val。
4-3-2-14 Sensor驱动设置曝光接口图
4.3.2.15 设置帧率接口
如下图4-3-2-15设置帧率接口图所示。
接口功能:设置帧率接口
函数名称:static int imx728_set_frame_rate(struct tegracam_device *tc_dev, s64 val)
主要参数:输入参数,tegracam_device *tc_dev 设备ID指针,设置帧率值val。
4-3-2-15设置帧率接口图
4.3.2.16 读寄存器接口
如下图4-3-2-16读寄存器接口图所示。
接口功能:读寄存器接口
函数名称:static inline int imx728_read_reg(struct camera_common_data *s_data, u16 addr, u8 *val)
主要参数:输入参数数据指针struct camera_common_data *s_data,寄存器地址,寄存器值;返回值,0,-1。
4-3-2-16读寄存器接口图
4.3.2.17 写寄存器接口
如下图4-3-2-17写器寄存器接口图所示。
接口功能:写Sensor器寄存器接口
函数名称:static int imx728_write_reg(struct camera_common_data *s_data, u16 addr, u8 val)
主要参数:输入参数数据指针struct camera_common_data *s_data,寄存器地址,寄存器值;返回值,0,-1。
4-3-2-17写器寄存器接口图
4.3.2.18 Camera取流接口
如下图4-3-2-18 Camera取流接口图所示。
接口功能:Camera取流接口
函数名称:static int imx728_start_streaming(struct tegracam_device *tc_dev)
主要参数:输入参数,struct tegracam_device *tc_dev;返回值, 0,-1。
4-3-2-18 Camera取流接口图
4.3.2.19 Camera停流接口
如下图4-3-2-19 Camera停流接口图所示。
接口功能:Camera停流接口
函数名称:static int imx728_stop_streaming(struct tegracam_device *tc_dev)
主要参数:输入参数,struct tegracam_device *tc_dev;返回值,0或-1。
4-3-2-19 Camera停流接口图
4.3.2. 20 打开设备接口
如下4-3-2-20 打开设备图所示。
接口功能:打开驱动设备接口
函数名称:static int imx728_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
主要参数:输入参数struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh;返回值,0,-1。
4-3-2-20 Sensor打开设备接口图
4.3.2.21 移除设备接口
如下4-3-2-21 移除设备接口图所示。
接口功能:移除驱动设备接口
函数名称:static int imx728_remove(struct i2c_client *client)
主要参数:输入参数struct i2c_client *client;返回值,0,-1。
4-3-2-21 Sensor移除设备驱动接口图
4.3.2.22 TI9701写寄存器接口
如下解串TI9701芯片写寄存器接口图示。
接口功能:解串TI9701芯片写寄存器接口
函数名称:static int TI971_reg_write(struct i2c_client *client, u8 addr, u8 val)
主要参数:输入参数I2C设备struct i2c_client *client, 地址u8 addr,寄存器值 u8 *val;返回值,OK(0)/NG(-1)
4-3-2-22 解串TI9701芯片写寄存器接口图
五、驱动测试
5.1测试原理
如下图5-1-1测试原理图所示,前端IMX728 Sensor采集视频数据经TI9701串行化传输给TI9702解串化处理后,交给TX2进行视频编解码,有显示处理模块封装后HDMI显示输出。
5-1-1测试原理图
5.2测试验证
5.2.1 Camera设备验证
5.2.1.1查看设备节点
登录TX2系统界面,命令行输入命令:ls -l /dev/video* 查阅驱动设备节点。
5.2.1.1查看设备节点图
5.2.1.2查看I2C地址
查看驱动加载信息命令dmesg -Hw | grep i2c
5-2-1-2 查看I2C地址图示
5.2.2 Camera出图验证
配置ISP文件,安装Argus出图软件验证出图。拷贝文件至s /var/nvidia/nvcam/settings/目录,如下5-2-2 Camra出图验证图示修改camera_overrides.jsp文件属性后,再次加载运行出图argus软件得到出图效果。
5-2-2-1 Camra出图验证图示
Argus-camera 出图命令:Argus-camera -d0 ,如下图5-2-2-2图示。
5-2-2-2 Argus出图图示
nvgstcapture-1.0出图,命令终端输入; Nvgstcapture-1.0如下图5-2-2-3图示。
Gstpipeline 出图,命令终端输入; gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! 'video/x-raw(memory:NVMM), width=(int)3872, height=(int)2144, framerate=50/1' ! nvvidconv flip-method=0 ! 'video/x-raw, format=(string)I420' ! xvimagesink –e如下图5-2-2-4图示。
图5-2-2-3图示
V4L2抓RAW数据:
命令终端输入; v4l2-ctl --set-fmt-video=width=3868,height=2176,pixelformat=RG10 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=3 --stream-to=imx728.raw -d /dev/video0
5.2.3 Camera设置GAIN
手动设置Gain用 Argus 测试,在Argus软件界面, 将 AE 调成 off,勾选 AE Lock。调节Gain的最小值与最大值。
5-2-3-1 Sensor 曝光设置命令图示
5.2.4 Camera设置EXPOSURE
手动设置exposure用 Argus 测试,在Argus软件界面, 将 AE 调成 off,勾选 AE Lock。调节exposure的最小值与最大值。
5-2-4 Camera设置EXPOSURE 图示
5.2.5 Camera设置FRAMERATE
手动设置Framerate用 Argus 测试,在Argus软件界面,勾选KPI按钮。调节不同mode或者设置framerate的最小值与最大值。
5-2-5 Camera设置FRAMERATE图