分类: LINUX
2008-06-23 17:31:14
根据Davinci平台特点,DFB 将显卡驱动接口分为三个逻辑设备:Screen、OSDLayer和VideoLayer,分别针对DFB特点对Davinci驱动进行了接口封装。
他们的驱动调用接口定义如下:
Screen
ScreenFuncs davinciScreenFuncs
驱动接口 |
功能描述 |
备注 |
InitScreen |
初始化Screen的显示方式和名称 |
显示方式:DSCCAPS_VSYNC 设备描述:"TI Davinci Screen" |
GetScreenSize |
获取显示设备支持的分辨率 |
720x576 |
WaitVSync |
通过Ioctl控制OSD0刷屏 |
只对OSD0进行刷屏 |
OSDLayer
DisplayLayerFuncs davinciOSDLayerFuncs
驱动接口 |
功能描述 |
备注 | |
LayerDataSize |
获取OSD信息结构体DavinciOSDLayerData的大小 |
typedef struct { struct fb_var_screeninfo var0; struct fb_var_screeninfo var1; bool alpha; bool enable; } DavinciOSDLayerData; | |
itLayer |
初始化OSD0和OSD1的像素格式,分辨率,缓冲模式,是否带Alpha通道 |
获取OSD0/1的fb_var_screeninfo,并设置为关闭显示状态 | |
初始化OSD的显示能力为 | |||
DLCAPS_SURFACE |
可直接在该Layer的Surface上画图 | ||
DLCAPS_ALPHACHANNEL |
该Layer支持带Alpha Channel的像素格式,且能够以像素为单位和底层Layer进行Blending操作 | ||
DLCAPS_OPACITY |
该Layer可支持整体透明度设置 | ||
DLCAPS_SCREEN_POSITION |
该Layer在Screen上的指定起始位置显示 | ||
DLCAPS_SRC_COLORKEY; |
支持自定义的透明色 | ||
指定该Layer的显示类型为静态图像显示:DLTF_GRAPHICS | |||
设定默认分辨率为640x480 | |||
默认像素格式为ARGB32 | |||
BufferMode为DLBM_FRONTONLY | |||
TestRegion |
测试LayerRegion尺寸、像素格式是否符合Davinci平台的要求 |
| |
SetRegion |
根据LayerRegion的数据格式、Alpha Channel、透明度、坐标、尺寸等数据对davinci的OSD显示控制寄存器进行配置 |
用到的ioctl有: FBIO_SET_BITMAP_BLEND_FACTOR FBIO_ENABLE_DISABLE_ATTRIBUTE_WIN FBIO_SETPOS FBIOPUT_VSCREENINFO FBIOGET_FSCREENINFO | |
RemoveRegion |
关闭OSD0、1的显示 |
| |
FlipRegion |
根据当前Surface Buffer的像素格式采取不同的显示策略,然后打开OSD0、1的显示 |
如果surface中的像素格式不为davinci所支持的RGB16,则调用update_buffers对buffer进行格式转换,如果支持DSP acceleration(需要c64x_drv.bin )则由DSP进行转换运算,否则使用软件转换,转换后的结果直接输出到OSD Layer的显存内 | |
UpdateRegion |
功能同FlipRegion,区别在于Flip使用的是多缓冲切换显示机制,Update始终对同一Buffer进行显示刷新 |
|
VideoLayer
DisplayLayerFuncs davinciVideoLayerFuncs
驱动接口 |
功能描述 |
备注 | |
LayerDataSize |
获取Video信息结构体DavinciVideoLayerData的大小 |
typedef struct { struct fb_var_screeninfo var; bool enable; } DavinciVideoLayerData; | |
InitLayer |
初始化Video0和Video1的像素格式,分辨率,缓冲模式 |
分辨率:720x576 | |
像素格式:DSPF_UYVY | |||
缓冲模式:DLBM_FRONTONLY | |||
指定支持的显示类型 | |||
DLTF_VIDEO |
动态视频图像 | ||
DLTF_STILL_PICTURE |
单帧静态图像 | ||
DLCAPS_SURFACE |
/*同OSD解释*/ | ||
DLCAPS_SCREEN_POSITION |
/*同OSD解释*/ | ||
TestRegion |
测试LayerRegion尺寸、像素格式是否符合Davinci视频层的要求 |
| |
SetRegion |
调用视频驱动设置VID1的尺寸、坐标、数据格式 |
| |
RemoveRegion |
关闭视频显示 |
| |
FlipRegion |
显示Surface中的视频数据 |
| |
UpdateRegion |
显示Surface中的视频数据 |
|
DFB通过c64x驱动将DSP寄存器的地址映射到内核地址空间进行控制,同时
从外部加载固件程序c64x_drv.bin到DSP中运行。该固件程序的作用是转换OSD Layer上的像素格式。如将Surface Buffer上格式为ARGB32的图像数据快速转换为Davinci支持的数据RGB16和3bit的Alpha Attribute数据,直接传送到OSD0和OSD1的fb中。
目前我们还没有得到“c64x_drv.bin”这个固件程序,而且该程序可能会影响DSP原有的音视频编解码程序的运行。
OSD 层: /*source color keying和global alpha factor不能同时生效,当设置前者时后者失效*/
- Has a surface.
- Supports blending based on alpha channel. 透明通道目前传给驱动的pixelformat只能是RGB16,正在找问题的原因和解决办法
- Supports source color keying.
- Supports blending based on global alpha factor.
- Supports Set Background Color or Background Image
-Supports Double Buffer
Video层:
- Has a surface.
- Supports Set Background Color or Background Image
OSD层:
Source Data Format |
Dest Format |
Support |
DSPF_RGB444 |
DSPF_RGB16 |
N/A |
DSPF_RGB555 |
DSPF_RGB16 |
N/A |
DSPF_RGB16 |
DSPF_RGB16 |
Y |
DSPF_RGB32 |
DSPF_RGB16 |
N/A |
DSPF_ARGB4444 |
DSPF_RGB16 |
N/A |
DSPF_ARGB1555 |
DSPF_RGB16 |
N/A |
DSPF_ARGB32 |
DSPF_RGB16 |
Y |
Video层:
Source Data Format |
Dest Format |
Support |
DSPF_UYVY |
DSPF_UYVY |
Y |
DSPF_RGB16 |
DSPF_UYVY |
Y |
DSPF_ARGB32 |
DSPF_UYVY |
Y |
OSD层:
Source Data Format |
Dest Format |
Image Size |
刷屏次数 |
Cose Time(ms) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Video层:
Source Data Format |
Dest Format |
Image Size |
刷屏次数 |
CoseTime(ms) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OSD层可以被多个进程共享:
第一个创建DFB Super Interface的进程为Master,后面创建DFB super interface的进程都为
Slave。
Master程序退出,则所有Slave的进程都将退出。Slave进程退出Master进程不受影响。
多进程共享情况下进行了简单的压力测试和系统稳定性测试。
测试过程 |
20个进程同时运行对OSD的操作,两个应用程序,一个循环设置OSD透明度,一个重复刷屏,时间间隔都为1S |
测试时间 |
60分钟 |
测试结果 |
发现多进程刷屏的内容混合出现在一个画面,可能是电视刷新率不足以跟的上Buffer的刷新频率导致的。 无进程退出 没有发现内存泄露 操作系统运行正常 |
注:当使用的显示设备为电视的时候davinci 每次刷屏后使用FBIO_WAITFORVSYNC等待一次刷屏的结束,但这种方式对于多进程共享显示设备时就不起作用,其他进程对显存刷新动作并不会等待当前刷屏结束,所以才会产生上面测试出现的多进程刷屏的内容出现在一个屏幕内的现象。
Video层正在测试:
在字体引擎、解码库的帮助下,支持矢量字体显示,PNG、JPEG等图片显示、常见视频解码输出。
以多帧GIF文件的播放为例分析一下VideoProvider的运行机制:
目前原有STB功能除了AlphaChannel还有些问题没实现(需要进一步研究是DFB问题还是使用方法上的问题),其他功能DFB都能满足,。。。。
最大的优点就是多进程间不需要互斥访问显示设备。