APP下载

一种基于i.MX6Q 的智能电子后视镜系统设计方法

2022-11-18张宏宽楼勇亮胡权顾晨舒信阳

电子设计工程 2022年22期
关键词:光感缓冲区显示屏

张宏宽,楼勇亮,胡权,顾晨,舒信阳

(数源科技股份有限公司,浙江杭州 310012)

公交和旅游大巴等大型车辆的车身长,转弯时前内轮转弯半径与后内轮转弯半径不同,存在“内轮差”。传统后视镜采用的是玻璃反光镜,特别是在雨雪、大雾等天气情况下,存在视野盲区和视觉模糊问题,驾驶员无法实时了解车外障碍物和行人车辆信息[1],存在安全隐患。随着嵌入式流媒体技术和智能化技术的快速发展[2-3],电子后视镜[4-6]能够为司机提供行车安全辅助作用,通过在车内左、右A 柱两侧安装显示屏,实时采集车外盲区的视频图像,可以让司机实时了解到车外状况,为安全驾驶提供了保障[7]。

1 系统整体设计

该文所设计的电子后视镜,采用一路主机驱动两路高清屏的设计方案,主要由i.MX6Q CPU 主控模块、左右显示屏、光感、SD 卡、4 路720P 的数字摄像头组成。系统采用NXP 公司的车规SOC 处理器i.MX6Q,其为ARM Cortex-A9架构,有四个内核,主频是1.2 GHz。它拥有三个Vivante的GPU,分别是GC2000、GC320、GC355。GC2000 负责3D 图形的加速,GC320负责2D 图形的加速,GC355 负责矢量图形的加速[8]。i.MX6Q 有两个IPU,能够接收MIPI CSI-2 格式数据,通过LDB 控制到左显示屏,HDMI 控制输出到右显示屏。i.MX6Q 视频处理单元VPU 支持MJPG、MPEG-4、H.263 和H.264 编解码格式[9-10],可以将采集到的数据进行编码压缩存储到SD 卡。电子后视镜的整体系统框架图如图1 所示。

BH1750FVI 光感模块安装在显示屏上,用于感知光照强度。光感能够根据光照的强弱动态改变数值,用于i.MX6Q 自动调节显示屏的背光亮度,实现环境光自适应控制。

系统的主要信号流向为4 路分辨率为720P、帧率为30 FPS 的数字摄像头产生的数字视频图像通过同轴线缆传输到i.MX6Q 主机,再进行格式转换,输出到左右显示屏,同时将视频流进行压缩编码存储到SD 卡并且通过光感调节屏幕的背光亮度。

2 硬件设计

i.MX6Q 主机由内存DDR、EMMC 和i.MX6Q CPU组成的最小子系统,加上Maxim 的MAX9286 和TI 的DS90UB947 和DS90UB949 组成。MAX9286 芯片集成四通道1.5 Gbps GMSL 解串器,能够接收和自动同步来自四个串行器的视频输入和CSI-2 输出[11],主机的框架图如图2 所示。

在设计中MAX9286 接收4 路分辨率为720P、帧率为30 FPS 的数字摄像头产生的影像数据,并且进行格式转换成CSI-2 输出到i.MX6Q,经IPU 单元将CSI-2 格式的数据转换成4 路720P 的YUV422 格式数据,通过使用DMA 方式传输到各自指定的内存块上,便于GPU 进行处理。同时,IPU 需要把内存中720P、YUV422 的格式数据转换成480P、YUV420 格式,通过DMA 方式传输到指定的内存物理地址上,用于VPU 进行编码压缩处理,并存储到SD 卡内。

i.MX6Q 内部的硬件GPU 模块GC320 主要负责2D 图像的处理,它将IPU 处理后传输到内存中的720P、YUV422 数据转成RGB 格式,并且对其中的2路视频数据进行镜像操作,通过使用DMA 方式将RGB 数据传输到framebuffer 指定的物理内存地址上,用于显示屏的显示。

显示接口主要是使用串行总线FPD-Link III(Flat Panel Display Link III),以实现单个差分链路高速视频数据传输和双向全双工的通信。DS90UB947是一款OpenLDI 到FPD-Link III 的桥接器件,可串行化OpenLDI(LVDS)的输入并支持WUXGA 和1080P的视频分辨率(24 位色深)[12]。DS90UB949 是HDMI到FPD-Link III 的桥接器件。该器件可串行化HDMI v1.4b 的输入同时支持WUXGA 和1 080P 的视频分辨率(24位色深)[13]。DS90UB948是FPD-Link III解串器,与DS90UB949/947 串行器配合使用,可将单通道或双通道FPD-Link III 流转换成FPD-Link(OpenLDI) 接口格式[14],它能够从单通道或双通道FPD-Link III 串行流中恢复数据,然后将其转换为双像素8 个LVDS 数据通道+时钟。

该文采用双屏驱动显示方案,采用DS90UB947串行器和DS90UB948 解串器配合,DS90UB949 串行器和DS90UB948 解串器配合。i.MX6Q 的显示输出有多种方式,该文通过i.MX6Q 的LDB 模块输出低压差分信号(LVDS)到DS90UB947 串行器,经过FPDLink III 串行总线到DS90UB948 解串器,最后输出LVDS信号到左显示屏。另一路通过i.MX6Q的HDMI控制器输出HDMI 信号到DS90UB949 串行器,经过FPD-Link III 串行总线到DS90UB948 解串器,最后输出LVDS 信号到右显示屏,完成双屏显示功能。

FPD-Link III 接口支持通过同一条差分链路实现双向全双工的通信。将BH1750FVI 光感通过I2C接口接入DS90UB948解串器,CPU 就能够把I2C 信号通过DS90UB947 串行器、FPD-Link 总线以及DS90 UB948 解串器透传到光感传感器,间接实现对它的控制。通过读取光感传感器值获得光照强度值,达到对显示屏的背光亮度进行调节。

3 软件设计

在i.MX6Q 主机采用Linux 系统,版本为V4.1.15,设计采用的数字摄像头帧率为30 FPS,分辨率为720P。为充分利用CPU 的多核架构,软件上采用多线程设计,软件架构图如图3 所示。在应用程序Main 主线程中派生出一个视频处理线程、一个背光控制线程、两个视频接口自动侦测与恢复机制的线程和四个视频存储线程。由于在视频处理线程中采集到的数据既要用于显示,又需要提供给视频存储线程,这就涉及到多个线程抢占一个资源的情况和线程间的同步问题。电子后视镜的主要用途是显示,在视频处理线程中不能对公共资源进行限制,不然会影响显示的延时时间,而对于视频存储线程又需要采集数据。因此为了兼顾视频存储的需求,在视频存储线程中需要增加缓冲区,将视频处理线程中采集到的数据复制到缓冲区中,在不影响显示延时时间的同时保证视频存储线程的正常工作。背光控制线程和视频接口自动侦测与恢复机制的线程是各自独立的,能分别进行工作。

3.1 视频处理线程

视频处理线程分为初始化参数、视频图像的采集、图像格式的转换处理和图像显示四部分。V4L2是Linux 中关于视频设备的内核驱动模块。该文是基于V4L2 框架与显示系统来进行编程的,步骤主要如下:

1)分别打开视频设备文件(/dev/video0—video3),获得四个文件的描述符;

2)通过获得视频设备文件描述符查询视频设备的信息和功能,例如,判断是否是一个视频捕捉设备并且具有数据流控制模式;

3)设置视频的制式和帧格式;

4)分别打开显示设备文件(/dev/fb0 和fb2),获得两个显示文件描述符;

5)从Framebuffer 中获取相应显示设备的可变信息(Framebuffer 的长度、宽度以及颜色深度);

6)从Framebuffer 获取相应显示设备的信息(Framebuffer 的起始物理地址);

7)设置Framebuffer 的显存大小是实际屏幕大小的3 倍;

8)向内存申请连续的物理内存;

9)将申请到的物理内存作为帧缓冲区;

10)使帧缓冲区全部入队列,以便存放采集到的数据;

11)开始视频采集;

12)出队列以取得已采集数据的帧缓冲以及原始采集数据;

13)将原始YUV422 格式数据转成RGBA8888,用于屏幕显示;

14)将原始采集的YUV422格式数据转成YUV420,将分辨率装换为480P,并复制到用于录像线程的缓冲区中作为原始数据;

15)将帧缓冲区重新入队列,这样可以循环采集;

16)停止视频的采集;

17)关闭视频设备。

电子后视镜的4 路摄像头需要分别投在车内A柱的左、右两个屏上显示,因此需要作分屏操作。以车身为参照物,1/3 屏显示A 柱前盲区,对应映射的摄像头需朝前,采集到的数据显示到车内屏上会产生左右镜像。2/3 屏显示后面的盲区,对应映射的摄像头需朝后,不会产生镜像。因此需要对朝前摄像头采集到的数据进行镜像矫正后再显示到屏上。

3.2 背光控制线程

在背光控制线程中,需要将光感传感器的驱动注册到内核中,再根据数据手册进行上电,读ID 判断光感传感器设备是否可以正常工作。在应用程序中就可以对光感进行定制化了,主要步骤如下:

1)打开光感传感器所挂载的I2C 总线,获得文件描述符;

2)打开背光亮度值文件描述符;

3)通过宏I2C_SLAVE,设置光感的设备地址;

4)读取光感传感器的亮度值;

5)根据光感传感器和背光亮度值的对照表,调节显示器背光亮度;

6)延时200 ms,回到第4)步。

3.3 视频接口自动侦测与恢复机制的线程

由i.MX6Q 输出视频信号到DS90UB947,经过FPD-link 线再到DS90UB948,最后输出到显示屏上。在FPD-link 线束接口一侧,由于车辆行驶过程中车载设备受到路面颠簸振动,会导致视频接口的瞬间松动,引起显示屏的图像丢失,为解决线束接口瞬间抖动引起的断线重连,需要对DS90UB948 初始化才能够让显示屏重新显示图像。因此需要通过DS90UB947 不断侦测DS90UB948 是否连接正常,当出现线束松开再接上的异常情况时,需对DS90UB948进行重新初始化才能让显示屏正常工作。该设计中有2 路视频接口自动侦测与恢复机制的线程,其过程是相似的,因此只做其中一路的说明,如图4 所示。

应用程序的具体流程步骤如下:

1)初始化变量flag,并清零;

2)打开DS90UB947 所挂载的I2C 总线,获得文件描述符;

3)通过宏I2C_SLAVE,设置DS90UB947 和DS 90UB948 的设备地址;

4)初始 化DS90UB947 和DS90UB948 的相关寄存器;

5)读取DS90UB947 的寄存器,判断连接是否正常;

6)如果连接断开,将设置flag 为1,并回到第5)步。如果连接正常,将到第7)步执行;

7)判断flag 是否为1,如果flag 不为1,则回到第5)步执行;

8)设置DS90UB948 的相关寄存器,能让屏幕重新点亮,并把flag 清零,再回到第5)步执行。

3.4 视频存储线程

在视频存储线程中,需要对摄像头采集的数据进行H264 编码。有两种编码的方式:使用CPU 或者VPU 硬件模块。由于使用CPU 编码的方式,会导致编码的实时性不够,编码的图像缺失严重。而使用VPU 模块编码的效率高,能够满足要求。因此,采用VPU 模块来实现编码[15-16]。由于四个视频存储线程是相似的,因此流程图中只画了其中的一路,如图5所示。

具体的编程步骤如下:

1)使用读写方式打开文件,路径为SD 卡所在系统文件目录;

2)对VPU 硬件资源进行初始化;

3)打开一个编码器实例;

4)获得编码器的关键参数,如需要的帧缓冲区大小等;

5)依据上一步操作获取的信息,申请帧缓冲区;

6)将IPU 转换后的YUV420、480P 格式数据拷贝到帧缓冲区中;

7)生成图像编码后的数据结构;

8)开始当前图像的H264 编码;

9)等待当前图像编码完成,则产生中断;

10)检查编码信息并将编码压缩后的数据写到SD 卡里;

11)回到第5)步进行循环操作;

12)关闭当前打开的编码器实例;

13)释放VPU 的硬件资源。

通过上述几个线程的循环操作,实现了4 路摄像头的数据采集、显示以及存储压缩,并能根据环境光动态地调节屏幕背光亮度。

4 测试验证

车载设备关键的技术指标是温度参数,因此实验阶段将模拟高低温环境对设备的影响。车载设备要求能够在-30~80 ℃范围内都能够稳定运行,因此需要对-30 ℃、常温25 ℃和80 ℃分别进行实验,以保证设备的可靠运行。

首先,对常温25 ℃下设备的运行进行了测试,如图6 所示。可以看出在设备启动阶段CPU 的温度为25 ℃,在经过4 小时运行后,稳定在50 ℃。在整个24 小时的实验过程中,设备运行稳定。

再通过恒温箱将温度设置在80 ℃下进行设备的可靠性实验,如图7 所示。设备在启动阶段CPU的温度为80 ℃,经过30 分钟运行后,CPU 温度稳定在91.2 ℃。在整个24 小时的实验过程中,设备运行稳定。

最后,通过恒温箱将温度设置在-30 ℃下进行设备的可靠性实验,如图8 所示。设备在启动阶段CPU的温度为-30 ℃,经过30 分钟运行后,CPU 温度稳定在-21 ℃。在24 小时的实验过程中,设备运行稳定。

5 结束语

针对传统玻璃后视镜视野盲区问题,该文给出了基于i.MX6Q 的智能电子后视镜系统设计方法,通过设计一机双屏系统架构和视频接口的自动侦测和恢复机制,有效解决了车内视频信号的抗噪声和传输稳定性问题,通过环境实验和跑车测试,系统性能得到了验证,能够满足预期目标,对车辆运营起到安全辅助作用,具有很好的市场应用前景。

猜你喜欢

光感缓冲区显示屏
嵌入式系统环形缓冲区快速读写方法的设计与实现
一块布就是一个显示屏?
苍蝇迷恋显示屏
一种基于51单片机的光感和声感的辅助冲便器装置
卡姿兰光感气色胭脂透现光晕粉颊 让你气色飞扬
未来五年LED显示屏出货将保持16%增长
关键链技术缓冲区的确定方法研究
基于AT89S52的手势可控LED滚动显示屏设计
地理信息系统绘图缓冲区技术设计与实现
AVS标准中的视频码流缓冲区校验模型分析