基于i.MX6 的智能车载多媒体系统中视频的设计与应用

2020-03-08 09:49霍淑珍
机电产品开发与创新 2020年1期
关键词:驱动程序摄像头处理器

霍淑珍

(天津职业大学, 天津 300402)

0 引言

车载多媒体系统融合了语音识别、卫星定位、语音通话、蓝牙、WIFI 等现代技术,可以进行实时监控、人机对话、导航服务、行车记录等功能,用于对汽车的现代化的智能管理,是汽车必不可少的系统设备,为汽车驾驶人和乘坐人提供了一定的安全保障和娱乐服务等[1,2]。 现代车载多媒体系统普遍采用了液晶显示技术, 而且屏幕本身的尺寸越来越大,分辨率和刷新频率越来越高,为驾乘人提供了更好的视觉体验。 本系统中采用先进的i.MX6 处理器,设计了基于LVDS 视频显示技术及Linux 系统下的多媒体系统,LVDS 通讯方式联结使得系统与屏幕分离,可以通过软件配置以适应不同屏幕尺寸的需求, 较传统系统解决了针对不同用户屏幕需要单独设计产品硬件的问题,扩展了系统应用范围。 本文主要介绍该多媒体系统下的视频处理模块。

1 车载多媒体系统的模块结构

系统主核心处理器使用了以ARM Cortex A9 为核心的双核处理器i.MX6,该处理器工作频率达到800MHz,工作温度范围-40~125℃,是专用于汽车仪表以及信息娱乐的处理器,具有2D 和3D 引擎,拥有非常强的2D,3D 图形加速和硬件编解码能力。 i.MX6 视频处理单元(VPU)是一种高性能的多标准视频编解码器引擎, 能够执行多种标准的编码和解码操作,完全支持MJPG,MPEG-4,H.263和H.264 编码格式,编码的速率最高可达30f/s[3]。IPU 单元能够连接多种接口形式的视频设备,可以进行图像处理,信号转换,图像增强等算法操作。

系统的内存系统采用四片Micron 公司生产的DDR3L型的SDRAM 同步动态随机存取存储器, 型号为MT41K256M16,组成系统2G 容量64 位宽的内存系统,该内存单元为Linux 系统的运行提供了快速运行解决方案。系统存储介质采用Micron 公司生产的NAND 存储器MT29F8G08,NAND 型存储器相比于NOR 存储器具有存储容量大,价格便宜,擦除速度快等优点。 在具有操作系统,地图导航等大容量存储需求的系统中,NAND 存储器提供了高性价比解决方案。

系统采用了R7F7010233 系列单片机作为系统的外围管理处理器SOC,负责与车辆其他系统进行通讯,电源管理,外设及I/O 操作管理等功能。 系统具有双LVDS 接口,支持双屏幕操作。 结构图如图1 所示。

图1 系统结构图Fig.1 System architecture

2 LVDS 的应用

LVDS 技术采用极低的电压摆幅高速差动传输数据,可以实现点对点或一点对多点的连接,远距离传输信号。具有低功耗、低误码率、低串扰和低辐射等特点。其传输介质可以是铜质的PCB 连线,也可以是平衡电缆[4,5]。将LVDS 技术应用到数字视频传输系统中,通过合理的方案设计使系统能满足图像数据实时、稳定、高速传输的要求。

图2 视频输出电路图Fig.2 Video output

本系统中使用的i.MX6 处理器具有两套LVDS 接口, 将系统的IPU 处理单元与外部显示相连接。 每套LVDS 接口具有一个时钟接口及4 个数据接口,i.MX6 系统内的串行化器将24 位RGB 数据和4 组控制数据串行化为4 组串行LVDS 数据,并输出到具有LVDS 接口的显示屏上。本车载视频应用中,系统要求显示器与视频主机分离, 这使得系统即使使用了LVDS 规范的线缆进行数据传输,依然不能够满足系统对于线缆的要求。系统采用了并转串芯片MAX9249,该芯片允许最大串行数据载荷达到2.5Gbps,可以使用屏蔽双绞线作为介质,通讯线缆长度可达15m。 在4 通道LVDS 模式下通讯时钟达到78MHz。MAX9249 与i.MX6 的LVDS 硬件连接如图2 所示, 图中MAX9249 的4 对RXIN 数据输入端分别与LVDS 的TX输出端相连接,LVDS 的时钟信号提供给MAX9249 的数据时钟输入端RXCLK。MAX9249 的输出端OUT 通过系统的输出连接器, 屏蔽线缆连接到具有串转并LVDS 信号的显示器相连接,实现视频信号的输出。 该芯片初始化通过i.MX6 的I2C 总线进行控制。

3 摄像头电路

本系统应用于汽车多媒体领域,系统采用模拟CVBS差分摄像头,相较于数字摄像头具有价格便宜,传输距离远,线路简单等优点。 i.MX6 处理器提供了CSI2/MIPI 接口,CSI(COMS Sensor Interface)接口通常从COMS 传感器,视频编码器和其它视频输出设备收集数据, 其能够支持多种制式的摄像头标准。 系统采用了ADV7182 视频模拟数字转换芯片, 该芯片将模拟摄像头的模拟信号转换成适用于CSI2 接口的数字信号交由i.MX6 进行视频处理,CSI2 接口可接受多种模式的视频输入, 如BT.656,BT1120,YUV422,RGB888,YUV444 等。ADV7182 具有四路输入信号,可以支持Y/C (S-Video)和YPrPb 视频信号及差分或伪差分CVBS 信号等多种信号模式。 当采用差分信号输入时ADV7182 与i.MX6 的硬件电路如图3 所示, 输入端AIN1 与AIN2 分别与摄像头输出正负端相连接, 数字视频像素数据输出端P0-P8 与i.MX6 的视频输入端CSI0_D[12]-CSI0D[19]相连接,行信号与场信号输出与i.MX6 对应的输入信号相连。本系统中该芯片的输出为8-bit ITUR BT.656 YCrCb 4:2:2 数字视频流,i.MX6 的CSI 视频接口配置成该模式的输入信号。

图3 摄像头硬件电路图Fig.3 Camera input schematic

4 系统软件

4.1 摄像头驱动

系统移植Linux 操作系统作为其软件平台,V4L2(Video For Linux 2) 是Linux 2.6 内核中广泛采用的内核视频驱动模型[6]。 V4L2 在Linux 中被设计成一个字符设备,使用字符设备的操作函数对其进行操作, 通过统一的接口函数该框架为视频设备提供了Linux 标准操作框架。 为了将ADV7182 的驱动函数与V4L2 视频驱动框架结合, 需要根据本系统的使用的视频数字转换芯片提供用于该芯片的一组核心硬件驱动函数,然后在编译系统时将该芯片的驱动编译到Linux 内核中。 驱动程序与V4L2 的驱动框架如图4 所示,驱动程序在系统启动时完成注册,应用程序通过V4L2 调用摄像头驱动。ADV7182 摄像头驱动程序主要操作函数包括两部分,如Linux 中结构体定义:

static const struct v4l2_subdev_ops sensor_ops = {

.core = &sensor_core_ops,

.video = &sensor_video_ops,

};

图4 摄像头驱动框架图Fig.4 Camera driver structure

sensor_core_ops 结构体其中包括ADV7182 的初始化,复位,电源管理,ioctl 的具体实现等操作。

sensor_video_ops 结构体实现图像数据格式,帧频率等参数信息。

在驱动程序被调用时,首先完成ADV7182 芯片的初始化、 摄像头接口的初始化、视频数据帧内存缓冲区的申请,并将其映射到用户空间。 通过ioctl 命令VIDIOC_STREAMON 开始视频数据的采集。

4.2 LVDS 显示驱动

Linux 中使用Framebuffer 帧缓冲接口作为显示设备的驱动接口。 这种接口使用户可以将它看成为用于显示的一段内存,映射到进程用户空间后,可以直接进行读写操作,而写操作可以立即反应在屏幕上。Framebuffer 调用由驱动源码厂家提供的IPU FB Driver 驱动程序,该驱动程序实现图像的旋转,格式转化,图像融合等操作接口,并且将合成的最终显示数据发送给MXC Display Driver去相应配置的显示器实现图像显示。 MXC Display Driver驱动函数提供了一组供IPU 调用的驱动函数, 使得不同的显示接口对于IPU 具有相同的调用接口。 驱动显示的相互调用框架如图5 所示。本系统使用了单LVDS 显示器或双LVDS 显示器, 所以需要在系统的uboot 中配置LVDS 参数及匹配显示屏参数。

video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666

video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666

若要正确的显示图像, 需要将显示器信息正确的传递给Linux 系统, 该参数的设置用到ldb.c 中关于显示参数设置的结构体fb_videomode,该结构体包含分辨率,像素时钟频率,行扫描脉冲宽度,帧扫描脉冲宽度,显示模式等显示模式的关键参数。 在显示图像时, 打开/dev/fbx 设备,将Framebuffer 的内存空间映射到用户空间, 用户向该空间写如图像数据,IPU 经过设置的图像转换等操作并将处理后数据传输到显示器实现显示。

图5 LVDS 显示驱动框架图Fig.5 LVDS video driver structure

4.3 倒车影像用程序

QT 开发环境具有跨平台, 通用的C++编程语言,特有的信号与槽机制等优点, 因此在嵌入式开发领域内得到了较为广泛的应用[7]。 在本系统中使用了QT5.5 版本,下载QT 的源码, 编译并配置QT 支持Imx6 平台-make libs-device imx6。 通过./app -platform linuxfb 使得QT5 支持Linux 视频缓冲区Framebuffer。 在QT 内使用QPainter类在Qimage 窗口中绘制所要显示的图像。 并通过Updata()函数重新绘制图像。

QImage img;

img.loadFromData(rdc_from_Fb);

label->setPixmap(QPixmap::fromImage(img));

当Linux 守候程序通过IPC 硬件联结收到来自片上SOC 单片机R7F7010233 监控到的CAN 总线倒车命令时,该倒车影像程序被唤醒执行,程序中启动定时函数,该定时函数每33ms 被执行一次,将Camera 的视频信息显示到屏幕上,该定时函数通过超时触发槽函数ShowFrame()定时读取摄像头驱动得到的视频数据,通过QIamge 类更新倒车影像图像。 通过槽函数定时调用如下面程序片段所示。

QTimer*timer=new QTimer(this);

connect(timer,SIGNAL(timeout()),this,SLOT(ShowFrame()));timer->start(33);

5 结论

经过产品的硬件及软件的不断优化改进, 整机系统满足系统设计的各项指标, 摄像及显示系统能够清楚的捕捉并且显示图像,LVDS 数据输出端波形正常,LVDS 信号及串行化芯片具有抗干扰能力强,屏幕显示清新,经过不同的软件配置,实现了对于不同规格显示屏的驱动,其中包括1024×768 的标准七寸屏,1920×1080 的十寸高清屏等。 产品模块化设计,适应不同用户的需求。

猜你喜欢
驱动程序摄像头处理器
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
阻止Windows Update更新驱动程序
计算机硬件设备驱动程序分析
奔驰360°摄像头系统介绍
ADI推出新一代SigmaDSP处理器
火线热讯
找出摄像头花屏的“罪魁祸首”
妙用鼠标驱动
驱动程序更新与推荐