软件设计
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图示