OSD(onscreendisplay)
随着汽车产业的发展,车载导航设备得到了更多的应⽤。⽐如车载导航设备集成有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的固件开发⼯具。本⽂试图探讨这⼀类⼯具的运作原理,或许读者基于本⽂可以开发出⾃⼰所需要的⼯具,当然其应⽤具有更⼴泛的代表性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论