首页 > 代码库 > OSD(on screen display)

OSD(on screen display)

随着汽车产业的发展,车载导航设备得到了更多的应用。比如车载导航设备集成有DVD功能(对视频处理提出较高要求,需要选择高性能平台和高性能视频处理器),通过OSD技术实现音量的可视性控制和DVD控制。优点是在不影响DVD画面的基础上叠加在屏幕上,降低主处理器的工作量。

OSD是一种在屏显示技术,其核心就是在图像上叠加文字、鼠标、简单的图片等,使显示屏幕为用户提供更多的附加信息,为用户提供极大便利。目前,相机、电视机、显示器、监视器等图像或视频系统中应用非常广泛。

PXA270处理用具有领先的高性能和低功耗功能,宏芯T128D具有强大的视频处理功能,同时集成了两层OSD处理引擎,两者通过I2C总线连接可以大大进步车载导航设备的多媒体处理功能,本文陈述了在两者基础上通过I2C总线连接实现OSD显示驱动的方法。

1 基本原理

1.1 OSD显示原理

  OSD(On Screen Display)是屏幕显示技术的一种,用于在显示终端上显示字符、图形和图像。实现的过程为:存储器(一般为内存的一段)的内容与显示终端上的像素逐一对应。

  当要输出图文信息时,将字符图标的位图信息送至OSD位图区域的相应位置。OSD位图区域由其头部定义,每个OSD头主要包括OSD显示矩形区域的起始位置、大小及两个分别指向顶场和底场图像数据的指针,还有一个指向下一个OSD位图数据头的指针。由于采用了这种基于指针的OSD数据治理结构,理论上OSD位图数据块的数目不受限制,实际上它要受到内存大小的限制。TerawinsT128提供的内存空间为8k*16 b。头部不仅定义了位图区域的尺寸、位置以及颜色信息,而且提供了颜色表更新等功能。字符的颜色设置使用OSD处理单元(LUT)的颜色查找表,也称作调色板。如图1所示,4位的LUT意味着有16种颜色可以选择,并且位图中的每个像素占有存储单元的4位。某个Byte中的低四bit内容与一个像素逐一对应,其值为“3”,那么数字“3”所代表的颜色便由色板来决定,然后再驱动OSD屏幕将像素设置为制定颜色。OSD中的2个像素对应1 B,所以一行显示内容所占的存储空间为320/2=160 B,设pOSDBuffer指向OSD对应存储空间的首地址,为了将OSD上坐标(x,y)的像素设置值为PixelValue(值的范围为0x00~0x0f),即改变该像素的颜色,则需要先确定坐标(x,y)像素对应的字节存储空间地址为:

1.2 I2C总线通讯原理

  I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。各种被控制电路均并联在这条总线上,每个电路和模块都有惟一的地址。CPU会发出地址码用来选址,即接通需要控制的电路。所以,各控制电路固然挂在同一条总线上,却彼此独立,互不相关。

  I2C总线定义了严格的传输信号来完成一次传输。如图2所示,SCL为高电平时,SDA由高电平向低电平跳变,这是开始信号,开始传送数据。SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

 

  留意:SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变会被识别为起始和停止条件。接收数据的IC在接收到8 b数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判定。若未收到应答信号,则判定为受控单元出现故障。

2 具体实现

2.1 接口电路

  PXA270芯片通过SCL和SDA两根线(I2C)向T128D发送指令,通知其显示OSD或者擦除OSD画面。在本论文使用的方法里,是由PXA270通过I2C向T128D写寄存器,将读OSD符号的首地址传输给T128D。PXA270要显示的RGB或者YPrBr信号也连接到T128D上,通过LVSYNC垂直同步信号和LYSYNC横向同步信号实现同步。通过T128D的处理,将DVD的YPrBr信号和PXA270的RGB565信号处理为模拟RGB信号,再连接LCD屏,由LCD屏显示出来。

 

2.2 软件实现框架

  本文的OSD驱动实现使用流接口驱动,OSD流接口驱动的框架如图4所示。该驱动在系统启动时或者启动后的任何时候由设备治理器动态加载。以DLL动态链接库的形式存在,系统加载它们后,这些驱动程序以用户态的角色运行。这个OSD流驱动通过文件操纵API来从设备治理器和应用程序获得命令。流接口驱动有一套标准的接口,比如XXX_Init,XXX_Open,XXX_PowerUp,XXX_IOControl,XXX_Write等。对于I/O设备尤其是数据流设备来说是非常合适的,操纵接口和文件系统API十分类似,比如ReadFile,IO_Control等。应用程序可以和流接口驱动进行交互,并且可以把流接口驱动当作文件来操纵。

 

  本文着重要提到的流接口是OSD_Init,OSD_IOControl,OSD_write。OSD_Init在加载驱动时通知设备治理器在为设备初始化时分配资源。OSD_IOControl是文件系统发送I/O控制指令的接口。OSDWrite是文件系统写数据到T128D的接口。在本文中OSD_Write不进行具体的写操纵,只是将写命令压人FIFO队列。

2.3 具体操纵

2.3.1 I2C总线的通讯流程

  由于I2C总线上挂的设备很多,可能会造成两个设备同时占用I2C总线的情况,这样系统会错乱。为了避免这种情况,针对一次读写操纵,考虑到其不可打断性以防止数据的破坏,采用Mutex互斥锁。即每次只答应一个读写操纵占用I2C总线。在一次读写操纵开始之前,等待互斥锁,直到读写操纵完毕,开释互斥锁。这样当在一次读写没有完成之前,其余设备无法占用I2C总线,而只能等待。本驱动申请互斥锁的流程见图5。

2.3.2  初始化和卸载

  T128设备的初始化,主要是首先映射GPIO和T128相关寄存器到虚拟地址空间,然后检测I2C总线驱动有没有初始化,创建互斥体,并建立一个写线程OsdWriteProc(),同时建立一个OSD写命令非空事件g_hevOsdQueueEmpty这样检测到非空事件时就可以调用OSD写进程。初始化设备失败或者设备卸载的时候调用设备卸载函数,卸载时要开释虚拟GPIO寄存器的空间,调用I2C的卸载函数,并封闭互斥体。

2.3.3  OSD写进流程

  实践中发现在写OSD时需要停止T128 MCU,写完后恢复其运行,否则OSD会错乱。假如要停止T128MCU时,它正在切换视频、检测视频信号,操纵未完成时被停掉,则液晶屏显示会错乱,图像分成几个部分。而上层应用的写OSD请求不能丢弃,否则上层的状态又会错乱,该隐躲的未隐躲,该显示的没显示。因此需要设计一种机制,既保证上层的写OSD操纵不丢弃,又不与T128 MCU冲突。

  如图5所示,设计一个缓冲队列,接收到上传人的OSD数据压进队列。OSD驱动留给上层的Write接口,不负责实际的写操纵,将数据压进队列(此时会激活队列非空事件)后立即返回。创建一个OSD写线程,等待缓冲队列非空事件激活后,查询T128 MCU状态,待其空闲后,获取关键代码段,执行写操纵,写完后退出关键代码段,进进下一轮循环。

3 性能分析

  T128通过3根主线跟CPU通讯,由T128处理从DVD和PXA270来的视频信号,这样OSD就可以在各个源的信号上叠加。由于T128处理了很大一部分视频信号,降低了CPU的负担,同时也圆满解决了OSD在DVD信号上的叠加题目。由于I2C的多主控特点,不会影响挂在I2C上的其他外设的工作和性能。

4 OSD主要实现方法和类型

目前有两种主要的OSD实现方法:外部OSD发生器与视频处理器间的叠加合成;视频处理器内部支持OSD,直接在视频缓存内部叠加OSD信息。

(1)外部OSD发生器与视频处理器间的叠加合成的实现原理是:由一个MCU内建的字符发生器及显示缓存,利用快速消隐(Fast-Blank)信号切换电视的画面和OSD显示内容,使OSD的字符等内容叠加在最终的显示画面上,在OSD和显示画面叠加处理过程中,通过调整两者之间的比例可以实现OSD的半透明(Blending)效果。同时,对OSD信号中的红绿蓝信号进行重新编码,可以得到不同的OSD颜色效果。

(2)另外一种实现方法是视频处理器内部支持OSD,直接在视频缓存内部叠加OSD信息。这一类视频处理通常具有外部存储器或内部少量的行缓存,同时具有OSD发生器,OSD的合成和控制直接在视频缓存内完成,同样具有上述的半透明和颜色控制功能。

OSD具有字符型(Font-Based)和位图型(Bit-Map)两种类型。

字符型OSD:为了节约显示缓存,早期及低成本的解决方案中使用字符型OSD发生器,其原理是将OSD中显示内容按照特定的格式(12×18、12×16等)进行分割成块,例如数字0-9、字母a-z、常用的亮度、对比度符号等,并把这些内容固化在ROM或Flash中,在显示缓存中仅存放对应的索引号,这样的“字典”结构可以大幅度减少显示缓存的需求。同时,为了提供对每个字符的颜色等属性的控制,通常还具有一个与显示缓存一样大小的属性缓存,其属性(前景颜色、背景颜色、闪烁等)对整个字符中的每个像素有效。为了弥补这种方式不能为每个像素指定颜色的缺点,OSD发生器的设计者提供了采用多个显示缓存合并的方式呈现多色字符的方案。其原理是每个显示缓存确定一种颜色方案,当两个甚至更多个显示缓存合并以后就可以“拼凑”出超过两种颜色的多色字符。

字符型OSD优点是可以使用OSD内部较少的显示缓存,并且MCU只需要指定显示内容的索引即可显示对应OSD信息,可以在比较低速的MCU上实现。但正是由于上述的显示信息和颜色编码方式不够直观,会给字符型OSD的固件开发带来一些麻烦。通常液晶显示器、低成本的平板电视和CRT传统电视上均使用这一类OSD,目前仍占据着市场主流地位。

相较字符型OSD,位图OSD的处理原理较直观和简单:通过对最终显示内容上特定区域的每个像素点进行改变,直接将OSD信息叠加到最终的显示画面上,其按像素进行控制的方式可以保证具有多色及足够的表现能力。位图OSD发生器通常内建在视频处理器内部,并共享使用其主显示缓存。也有独立在视频处理器之外的专业OSD位图发生器,如美信的MAX4455,通常这一类芯片需要外部SDRAM作为显示缓存。

位图OSD的显示效果理论上可以做到非常完美的程度,可以提供类似Windows中具有立体感的各种物件,如具有阴影的按钮、颜色丰富的图形和文字等,其缺点是必须具有足够的OSD显示缓存,以及按像素进行处理而对MCU带来的速度要求。通常在大尺寸的高端平板电视和专业显示器上会使用这一类OSD。随着技术的不断发展和存储器的成本的不断下降,未来的OSD应该都是位图型的。

OSD的UI基本元素及定义

 

显示OSD的目的是需要向用户表达信息,那么哪些信息需要表达呢?通常包括提示、警告信息、控制参数的数值显示等。尽管无论其显示形状是什么,其本质都是一些字符或像素点的组合,但是对于这些信息的分类和属性定义有助于固件开发人员的统一编码和代码处理。本文尝试分类,分析这些元素并在下面给出统一的固件处理方法。

1. OSD基本概念

UI语言:指OSD内容中的文字部分使用的语言类型。

UI模式:指OSD内容适用的环境,例如不同的信号源(电视、DVD、PC)带来的模式变化,其作用主要区分不同的环境下OSD的不同表现。

UI场景:特定语言模式下及较多信息页面情况下,当前OSD适用的特定页面。

UI事件:用户利用输入设备向UI系统提供的操作命令。

UI动作表:指在特定UI场景中,对于UI输入的命令进行对应处理的索引表。

OSD画布:指整个OSD呈现的区域,通常为一个矩形区域。

OSD位置:通常指在OSD画布中,相较左上角原点的相对位置。

OSD物件:呈现在画布上,表达特定信息,具有特定属性的像素组合。

2. OSD包含的基本元素

OSD信息中主要包括以下一些基本元素(可能本文的提法未必准确,希望读者可以体会到其意思):区域、标签、图标、文字、进度条、动画、数字、可选图标、导航信息等。下面分别给出这些元素的定义、作用、属性和响应事件。

a. 区域

定义:在OSD画布中,以特定的属性(颜色、闪烁、大小等)标示出的矩形或任意形状的区域。

作用:对OSD内容进行分类或标示,例如标题区域,内容区域等。

属性:位置、颜色、闪烁特性等。

b. 标签(Label)

定义:固定不变的文字信息,可以是一行或多行。

作用:对OSD内容进行必要的文字说明。

属性:位置、颜色、闪烁特性、语言类别、大小写、对齐方式等。

响应事件:作为固定的信息内容,通常对UI输入的控制无响应。

c. 图标(Icon)

定义:以特定的字符或像素组合构成形状,以表达可识别的信息。

作用:对OSD内容进行形象的提示,如播放、禁止等特定符号。

属性:位置、颜色、闪烁特性等。

响应事件:作为固定的信息内容,通常对UI输入的控制无响应。

d. 文字(Text)

定义:相较标签,其同样为文字信息,但是可以随用户的操作而改变。

作用:以随选择而改变的文字内容,提供关于用户选择的文字提示

属性:位置、颜色、语言类别、大小写、对齐方式等。

响应事件:用户的选择,通常为上一个或下一个选择。

e. 进度条(Bar)

定义:矩形条状的物件,随其数值的不同而改变相关特性,未来也许会有其它形状的此类物件,

如油量表状等,但它们都具有同样的属性。

作用:以形象的图形界面,给出关于某项数值的图形说明。

属性:位置、颜色、上下限、当前值、类型、大小、是否显示数值等。

响应事件:数值的改变。

f. 动画(Movie)

定义:随时间而改变的图标组合。

作用:以活动的图形使OSD界面更生动,提高信息的表达效果。

属性:位置、颜色、具有的图标数目、变化速度等。

响应事件:作为固定的信息内容,通常对UI输入的控制无响应。

g. 数字

定义:随有关参数或用户选择改变而改变的数字组合,可以为十进制或其它进制,亦可以是百分比或其它数值形式。

作用:直观地给出关于某项参数的数值量化指示,通常与进度条联合使用,以达到直观与形象的双重效果。

属性:位置、颜色、上下限、当前值、进制选择等。

响应事件:对应参数的数值的改变。

h. 可选图标(Option)

定义:随有关参数或用户选择改变而改变的图标组合。

作用:用户选择的图形化表达,例如选择、未选择、开启、关闭等信息的图形化表达。

属性:位置、颜色、闪烁、选择数目等。

响应事件:对应参数的选择改变。

i. 导航信息

定义:呈现在OSD画布上,对当前UI场景中的用户操作进行提示的信息。

作用:指引用户操作相关按键,进行OSD内容操作。通常具有可用按键的指示以及必要的文字说明,通常作为OSD提示信息的完善和人机界面友好化的措施。

属性:位置、颜色、闪烁等。

响应事件:UI场景、按键的改变。

使用基于对象的方法处理OSD UI

传统的处理手法是将特定场景下的OSD物件逐一用代码“画”出来,在遇到特定的UI事件时,再利用一堆if else判断出特定场景和操作对象,并做相应的OSD处理。在OSD较简单的情况下,其不失为一个可行的方法。但在遇到OSD场景和模式较多的情况下,这个if else的结构会变得很大,而且更为重要的是极易出错以及维护成本提高。随着OSD越来越复杂以及代码工作量的不断提高,人们意识到我们需要花费太多时间在这些“表面文章”上,而真正重要的应用层和设备驱动层的开发时间会受到影响,进而影响新产品的开发进度。固件工程师也不愿不断重复编写同样代码来满足不断改变客户的特定OSD需要。笔者早期也曾遭遇同样的困扰,面对部门里工程师毫无效率地做着同样的事情,感觉到开发一个统一的OSD UI平台的重要性。现在对于上述OSD UI进行的分析,可以让我们开发出独立于特定数字视频处理器平台和OSD发生机制的硬件环境的独立统一开发工具。事实上,平板显示芯片方案的重要提供者如Genesis、Pixelworks等为了加速其产品的开发和应用速度,已经提供了具有这样功能的基于Windows的固件开发工具。本文试图探讨这一类工具的运作原理,或许读者基于本文可以开发出自己所需要的工具,当然其应用具有更广泛的代表性。