基于linux的全彩LED显示屏脱机控制系统设计
所有的显示项目,无论其内容如何,都可以抽象为一个随时间变化的状态机。每个显示项目在时间的推移下在其所属的区域中完成自身的显示,也就是完成一个从初始化到结束的状态转换过程。因此,playitem是一个抽象基类。每种类型的显示项目只需重新实现playitem提供的公共调用接口即可。
每个区域具有一个播放线程,该线程不断地从playlist中取出一个显示项目,执行其状态转换接口完成显示过程。这种设计允许不同类型的显示项目混合排列在同一个显示列表下,极大的增加了播放过程安排的灵活性。
多区域显示设计模型如图2示。
图2 多区域显示模型
4.2.2基于SM501的2D加速显示接口设计
显示层的设计旨在提供一套可移植的、使用方便的2D显示接口,包括基于区域内部坐标的应用显示层接口和基于屏幕坐标而与硬件无关的底层显示接口。应用显示层给显示项目playitem提供简单的基于区域坐标的显示接口。基于屏幕坐标的底层显示直接工作在SM501硬件之上,最大化利用了SM501硬件加速能力,同时还提供了可移植的接口。在移植到其他的2D硬件上只需要重新实现底层显示接口即可。
由于硬件设计上SM501处于slave mode与S3C2440连接,SM501不能访问系统内存,所有要进行加速操作的显示内容必须存放在SM501的独立显存上,这样不方便移植 DirectFB作为底层显示接口。因此本文按照通用的2D显示接口,独立实现了一套基于屏幕坐标的通用底层2D显示接口。
在实现上通过mmap把SM501的控制寄存器和独立显存全部从内核空间映射到用户空间,这样在程序中可以直接访问SM501的寄存器和管理本地显存,避免了在显示时应用程序与内核之间的数据交换,显示加速作用得以充分发挥。基于对SM501的直接访问,底层显示层实现了一套基本接口,包括显存分配与释放和基本2D加速操作如画线(line)、矩形填充(fill_rect),位图复制(bitblt)、缩放(bitblt_stretch)、色空间转换(CSC)等。其中对视频播放性能影响最大的是缩放和色空间转换。
SM501的绘图引擎(Draw Engine)包括两个部分,2D绘图引擎和CSC颜色空间转换模块。2D绘图引擎主要用来绘制直线(基于Bresenham算法),矩形填充,复制(Bitblt),旋转复制(Rotation bitblt)。缩放与颜色空间转换功能都是通过CSC模块来实现。CSC模块可以实现YUV422,YUV420,RGB565,RGB888几种色彩空间及格式转换到RGB565和RGB888,色空间转换隐含了缩放功能。
显存分配与释放管理是对映射到用户空间的Frame buffer进行的。实现上使用空闲链表的方法,并且采用最先适应的原则。最先适应分配算法有利于保留更大的连续内存块给那些一次性内存需求量大的分配请求。由于视频解码后色空间转换和缩放必须使用硬件加速来实现,因此总是预留1M的显存空间给视频显示使用。在显存不足的情况下,通过malloc分配系统内存。相应的所有显示层接口的地址参数均被设计成为自动识别地址属于系统内存还是独立显存,如果地址属于系统内存,则表明当前显存不足,于是使用软件的方法实现绘图操作。在释放显存时,程序若识别参数地址为系统内存,将调用free去完成释放。
在多个显示区域同时显示的情况下,显存的分配与释放管理以及所有的基于硬件加速的2D操作均被互斥地调用,以避免多线程同时对SM501资源进行争用带来的与时间相关的执行错误。
由于SM501加速操作只能使用本地帧存的物理地址,而通过mmap映射得到的是进程空间的虚拟地址,显存分配得到的地址也是基于映射后的地址,因此写入SM501寄存器中作为地址的操作数必须将进程空间地址转化为实现的帧存物理地址。转化方法就是用显
linux操作系统文章专题:linux操作系统详解(linux不再难懂)led显示器相关文章:led显示器原理
评论