2024年6月6日发(作者:)
2020年第4期
信息与电脑
China Computer & Communication
软件开发与应用
基于MIPI接口的Android显示驱动设计
甘春江
1
高振龙
2
(1.国网南京供电公司,江苏 南京 210001;2.国网淮安供电公司,江苏 淮安 223001)
摘 要:
针对现有RGB(Red Green Blue)显示接口与LVDS(Low Voltage Differential Singnaling)显示接
口无法满足嵌入式高清显示需求的问题,在Arm架构的RK3288目标系统上开发了MIPI(Mobile Industry Processor
Interface)接口显示驱动。笔者首先分析了MIPI架构,整理了MIPI四层架构的任务划分,进而研究了Android整个显
示机制的工作流程,将驱动开发任务锁定在内核层,最后分别在U-boot阶段和Kernel阶段编写显示驱动,U-boot阶段
负责开机Logo显示,Kernel阶段负责主界面显示。系统的运行情况表明,显示驱动编写正确,显示功能正常。
关键词:
Arm架构;显示机制;显示驱动
中图分类
号:F426.61;F270.7 文献标识码:A 文章编号:1003-9767(2020)04-067-03
Design of Android Display Driver Based on MIPI Interface
Gan Chunjiang
1
, Gao Zhenlong
2
(1. State Grid Nanjing Power Supply Company, Nanjing Jiangsu 210001, China;
Abstract:
Aiming at the problem that the existing RGB (red green blue) display interface and LVDS (low voltage differential
2. State Grid Huai
’
an Power Supply Company, Huai
’
an Jiangsu 223001, China)
singling) display interface can not meet the requirements of embedded HD display, Mipi (mobile industry processor interface)
display driver is developed on the rk3288 target system of arm architecture. Firstly, the author analyzes the Mipi architecture, sorts
out the task division of Mipi four layer architecture, and then studies the workflow of the entire display mechanism of Android. The
display. The operation of the system shows that the display driver is programmed correctly and the display function is normal.
Key words:
Arm architecture; display mechanism; display driver
driver development task is locked in the kernel layer. Finally, the display driver is written in the u-boot stage and the kernel stage
respectively. The u-boot stage is responsible for the startup logo display, and the kernel stage is responsible for the main interface
0 引言
随着信息技术、操作系统技术以及集成电路技术的快速
发展,电子显示产品开始应用到人们生活的方方面面,从随
身的智能手机到巨屏电视。人们对显示需求也越来越高,随
之而来产生了一系列的功耗与接口问题,驱动开发者需要处
理不同接口标准的显示驱动程序,并最终将这些标准关联到
FB,FB是内核为显示驱动开发提供的标准框架,位于内核
态或用户态的程序均需要通过FB访问显示屏驱动器。同时,
全世界每天会开发很多新的Android设备,Android设备驱
动的设计与维护是一项重要的工作,各种硬件与操作系统之
间的通讯均离不开驱动程序的支撑,驱动作为软硬件之间沟
通的桥梁,在Android程序开发中占有重要的地位。
由于Android显示驱动的各种机制相互耦合,需要深入
分析各种机制的工作原理,从而进行驱动的任务划分并开发
对应驱动。本文在MIPI机制研究和SurfaceFlinger研究的
基础上,将显示驱动划分为U-boot阶段和Kernel阶段,并
分别开发了对应驱动程序,最终在RK3288平台上,点亮了
MIPI屏,显示功能一切正常。
1 MIPI接口优势
随着现代微电子技术的发展,硅片的体积在不断缩小,
引出的引脚数目也越来越少,传统并行传输接口开始被高速
串行传输接口取代,例如曾经广泛用于硬盘的IDE接口被
SATA接口取代等。MIPI接口的主要竞争对象是传统的RGB
接口,传统RGB接口的工作电压为1.8~3.3 V,电压摆幅为0。
作者简介:
甘春江(1976—),男,江西乐平人,本科,高级工程师。研究方向:用电安全及用户侧电力保障研究。
高振龙(1976—),男,河北保定人,本科,高级工程师。研究方向:用电侧电力保障及供电可靠性研究。
— 67 —
软件开发与应用
信息与电脑
China Computer & Communication
2020年第4期
而MIPI接口的工作电压为1.2 V,在高速通讯模式下,其电
压摆幅为100~300 mV,产品功耗大大降低。对于RGB666
模式来说,至少设计18根数据线用于传输数据,对PCB的
布局和布线带来了一定的挑战,而采用串行接口的MIPI最
少4根数据与时钟线即可完成数据通讯,在相同显示效果的
前提下,降低了PCB的开发难度。
用于设定缓存之间的交换间隔,其中实现的setUpdateRect方
法用于设定刷新区域。通过mapFrameBuffer函数可进行内
存映射操作。
对FB来说,应用层对其进行的操作共可分为四步。(1)
打开对应设备节点,位于“/dev/fb%d”或“/dev/graphics/
fb%d”中。(2)通过调用ioctl获得驱动层的配置参数:
fb_var_screeninfo(xres用来描述上一行像素个数、yres用
来描述上一列像素个数、bits_per_pixel用来描述像素点位
数、height用来描述屏幕高度、width用来描述屏幕宽度、
pixclock用来描述时钟频率)、fb_fix_screeninfo(包含缓冲
区物理地址、缓冲区长度、虚拟地址、虚拟地址长度等信息,
通过fb_var_screeninfo中的xres、yres以及bits_per_pixel计
算而得),并将其存储到framebuffer_device_t中。(3)根
据系统需求对fb_var_screeninfo重新设定,并通过ioctl指令
重新放入内核。(4)通过mmap指令建立物理地址和虚拟
地址的映射关系,便于Gralloc访问FB。HWComposer在完
成FB初始化之后,会将获取的高度、宽度以及像素格式存
放到DisplayDevice中,进行Open GL ES的初始化,以便访
问Open GL ES。
通过步骤二可以得出,Gralloc的数据是通过内核层的
fb_var_screeninfo与fb_fix_screeninfo获得的,编写显示驱
动的时候,不需要修改应用层。
2 MIPI架构
MIPI是一种用于移动处理器的显示信息通信标准,由行
业巨头ST、ARM、TI共同制定,意在统一移动设备的接口
与通信标准,减少设计的复杂度。例如用于摄像头的CSI2
[1]
(Camera Serial Interface 2)、用于显示器的DSI(Display
Serial Interface)、用于射频设备的DigRF和用于麦克风的
SLIMbus。
DSI兼容Command与Video两种模式,其中Command
为双向传输模式,传输速率可达10 Mbps,Video为单向
传输模式,传输速率可以达到1 Gbps。Lane0可以工作
在Command与Video任意一种模式,Lane1-Lane3只能在
Video模式下工作。CSI2与DSI的Video模式类似,其参数
和命令仍然采用I2C总线进行传输。
DSI与CSI2共被划分为四层:物理层、通道管理层、
协议层、应用层。对于DSI来说,CPU为主机,液晶驱动芯
片为从机;对于CSI2来说,CPU为从机,Camera驱动芯片
为主机。主机应用层负责从缓存中获取数据并发送到协议层,
从机的应用层负责从协议层提取数据。主机的协议层负责打
包数据并加上相应校验,从机的协议层负责数据校验与数据
传输。主机的通道管理层负责将数据分解到Lane0到Lane3
的通道上,从机的通信管理层负责将Lane0到Lane3的信息
合并为数据。DSI与CSI2共享物理层D-PHY,采用一对差
分时钟线以及数对差分数据线传输数据。本文使用了其中3
条通道Lane0、Lane1、Lane2,Lane0工作在双向数据传输
模式,Lane1与Lane2工作在高速数据传输模式。
4 显示驱动
由于开机时有显示Logo界面的要求,显示驱动分为
U-boot阶段与Kernel阶段。其中U-boot是一个微型操作系统,
用来引导Kernel,Kernel是Android的内核,用来处理应用层、
内核层以及硬件之间的交互操作。
4.1 U-boot阶段
LCD控制器位于CPU内部,LCD驱动器与液晶屏贴合
在一起,CPU通过LCD控制器设置液晶驱动器的色彩方案、
电压值、通道数目、休眠与唤醒。
本文采用MIPI接口,采用DSI控制器作为LCD控制器,
控制LCM(Liquid Crystal Display Module)中的LCD驱动器。
U-boot阶段分为五步:一是定义LCM相关初始化数据,二
是计算FB大小与基地址,三是进行LCM初始化,四是进行
显示图层的初始化,五是发送显示信息。
(1)定义LCM_DRIVER结构体对应对象,封装DSI
与LCM初始化相关函数,包括DSI配置、LCM初始化、
LCM挂起、LCM恢复,其中LCM初始化函数、LCM挂起
函数以及LCM恢复函数均会利用DSI控制器发送控制信息。
(2)获取LCM_DRIVER结构体对应对象,调用其中的
DSI配置函数与GPIO控制函数,通过配置参数获得FB的大
小,通过memory_size()-FB size获得FB基地址,通过GPIO
控制函数控制背光的开启与关闭,保证在图形刷新之前背光
处于关闭状态,从而避免出现花屏现象。
3 SurfaceFlinger
在SurfaceFlinger的初始化阶段会对HWComposer进
行配置,用于管理HAL层的Gralloc。Gralloc(Graphics
Allocate)是位于HAL层的硬件抽象模块,其会被编译成so
文件供SurfaceFlinger调用,其不仅提供图形缓存分配接口,
还提供图形缓存内存映射接口与FB操作接口。Gralloc中
的alloc和free方法可用于FB缓存的分配与释放,上层通过
gralloc_device_open函数调用Gralloc的alloc方法。
Android通过HAL层接口调用设备驱动程序,在用户
空间的HAL层代码中实现驱动对应的open、close、read、
write、ioctl行为,从而访问内核代码。fb_device_open接口
将会分配fb_context_t对象,fb_context_t对象的framebuffer_
device_t被用作framebuffer描述,其中实现的post方法用于
将显示数据发送到DB中,其中实现的setSwapInterval方法
— 68 —
2020年第4期
信息与电脑
China Computer & Communication
软件开发与应用
(3)利用初始化结构体中的数据对DSI控制器初始化,
设置DSI时钟和DSI传输模式,设置DSI传输时序(水平前
肩、水平后肩、水平分辨率、垂直前肩、垂直后肩以及垂直
分辨率等),读写方式,信号极性。
(4)将图像缓存分为两部分,一部分用于Logo显示,
以FB起始地址为基地址,开辟内存缓冲空间,另一部分
用作控制台显示,以FB起始地址+FB size为基地址。采
用memset指令清空缓冲区,进行刷黑操作,方便后续加载
图像。同时,分别对这两个图层设置像素格式、间距以及原
点偏移量。
(5)将Logo数据从Flash中读取到Logo显示图层的
缓冲区,通过DSI传输函数传输显示数据,总体运行流程如
图1所示。
开始
数完成FB的注册,总体运行流程如图2所示。FB缓存空间
申请与内存映射操作均通过应用层调用HAL层Gralloc接口
函数实现,在Kernel阶段不需要进行此步操作。对于需要进
行ID匹配的特殊MIPI接口驱动器,可参考张东艳的研究成
果
[3]
,至此,Kernel阶段的MIPI驱动全部实现,应用层可
通过HAL层的Gralloc接口函数实现图形显示。
开始
FB驱动注册
否
DSI是否初始化
是
DSI初始化
保存DSI参数
为FB分配空间
定义LCM相关初始
化数据
获取FB参数
计算FB大小与基地
址
填充fb_info,注册
FB
结束
LCM初始化
图2 FB驱动注册
否
是否成功
是
进行显示图层的初
始化
打印出错信息
5 测试
亮度测试:分别将屏幕调到最暗与最亮,用色彩分析仪
进行亮度测试。背光均匀度测试:将屏幕调到最亮,测试屏
幕各部分的亮度。色彩饱和度测试:将屏幕调到最亮,播放
红橙黄绿蓝靛紫纯色图片,与对照机进行对照。侧偏测试:
播放纯白图片,从侧面观察屏幕颜色,是否存在偏色现象。
休眠唤醒测试:观察休眠唤醒过程中屏幕能否正常点亮与熄
灭,需要反复验证10次以上。横纹检测:观察休眠唤醒过
程中是否有横纹出现,需要反复验证10次以上。
发送显示信息
结束
图1 图像显示流程
4.2 Kernel阶段
在Kernel阶段,首先检查DSI控制器是否已经初始化,
由于在U-boot阶段已经完成此步操作,这里需要备份DSI控
制器的参数,以便在休眠与唤醒过程中重新设置DSI控制器。
然后,填充fb_info结构体,调用platform_driver_register函
数进行驱动注册,在对应probe函数中检查DSI控制器是否
已经初始化,如果没被初始化的话采用U-boot的方法进行初
始化,设置DSI时钟、DSI传输模式、DSI传输时序、读写
方式和信号极性,如果已经完成初始化的话则保存DSI控制
器的参数,为后续休眠、唤醒操作做准备。
调用函数framebuffer_alloc为FB结构体申请空间,调
用setup_fb_info函数获取fb_info结构体对应的固定参数与
可变参数,进行fb_info填充,调用register_framebuffer函
6 结 语
市场上每天会开发以及生产新的嵌入式显示产品,存
在大量的显示驱动开发需求,虽然RGB与LVDS仍在现有
基础上不断改进,却始终无法应对现代嵌入式系统对功耗以
及布线的苛刻需求,驱动开发所面临的任务十分艰巨。基于
MIPI接口的显示驱动开发既能减少系统整体功耗,又能降
低整体硬件布线成本,为开发嵌入式显示产品提供了一种新
方案。
参考文献
[1]张东艳.Android智能手机驱动开发的研究与实现[D].
秦皇岛:燕山大学,2017:23.
— 69 —
发布评论