1、介绍

WindML即Wind Media Library(媒体库),它支持多媒体程序运行于嵌入式操作系统,风河公司设计它主要是用来提供基本的图形、视频和声频技术以及提供一个设计标准设备驱动程序框架。

WindML API库提供了一个统一的图形硬件接口以及处理输入设备和输入设备事件的能力。 WindML有一下几个设计目的:

  • 简单。WindML提供一个灵活的图形源语集、基本的视频和声频功能;
  • 硬件便宜。可以在多种CPU体系结构上使用;
  • 操作系统便宜。可以在多种RTOS系统上使用;
  • 驱动程序开发的容易。提供给开发者一个定制设备驱动程序的机理。

2、WindML结构

WindML包括两个组件――软件开发包(SDK)和驱动程序开发包(DDK)。

SDK组件用来开发应用程序,它提供了一个全面的API集,包括图形、输入处理、多媒体、字体和内存管理。

DDK组件是用来实现驱动程序的,它提供了一个完整的驱动程序参考集,包括硬件配置和API集,以使得开发者能够迅速的引导和使用自己的驱动程序。

WindML可以概括为如图1-1所示的结构:

图1-1 WindML结构

VxWorks WindML SDK

2.1 SDK

这一层定义了应用程序代码和硬件驱动程序的接口,因此应用程序可以独立于硬件进行开发。

SDK提供了下列API集:

  • 图形芯片的初始化程序
  • 多媒体API,包括

-2D图形

-区域管理

-窗口

-颜色管理

-视频支持

-JPEG支持

-声频

  • 事件服务
  • 内存管理
  • 扩展API
  • 设备管理
2.2 DDK

DDK是处于SDK和硬件之间的中间层,它直接与应用程序目标硬件设备接口,包括监视器、视频、声频、键盘和指示等设备。

对于大多SDK APIs都有相关的驱动程序级结构和API,比如,SDK原语uglRectangle( )就是用来划矩形给显示设备,它访问一个包含rectangle域的驱动程序结构,这个域就是执行划矩形操作的函数指针。

WindML中定义了下列驱动程序种类:

– graphics(图形)

这个驱动程序包括了用来分配颜色的函数指针和变量、执行drawing操作、内存分配和覆盖页管理。如VGA、BIOS、MediaGx 和IGS图形驱动程序。

– video(视频)

这个驱动程序作为一个扩展功能,用来实现图形驱动(在驱动程序结构的扩展部分分配空间)。它实现诸如视频启动、停止和流操作等功能,一个例子就是IGS视频扩展。

– fonts(字体)

这个驱动程序包含字体大小和绘制操作的函数指针和变量,它使用图形驱动程序来显示信息。如BMF和AGFA字体引擎。

– input(输入设备)

这个驱动程序包含获得和格式化输入信息的函数指针和变量。如键盘、指示和触摸屏驱动程序。

– audio(音频)

音频并不是一个真正的设备驱动程序,但是可以通过调用open( ),close( )和ioctl( )来实现。

下面几章将详细介绍这些驱动程序的创建和操作。

第二章 WindML配置

2.1 介绍

在第一次使用前,必须首先配置和编译好WindML库,WindML配置包括:

输出驱动程序的选择和硬件设置;

输入驱动程序的选择和硬件设置,比如指示、键盘或者触摸屏;

音频驱动程序的选择和硬件设置;

应用程序使用的字体。

除了这些配置需要之外,WindML还可以定制成支持一个特殊的应用环境。可定制的部分包括内存管理和定制硬件。配置好后,WindML库必须编译和连接到应用程序或者连接到Vxworks Image。

有两种方法来配置WindML:

使用WindML配置工具(Tornado>Tools>WindML菜单选项),这是配置WindML和相关驱动程序的主要方法。

通过直接编辑配置头和源文件(命令行方法)来实现配置工具不可能实现的定制。

根据你目标程序所需要的WindML内容来决定要使用的配置方法,WindML标准配置就是包含一个图形设备、一个键盘设备和一个指示设备。配置工具允许你配置这个标准的设备集,如果要使用多个设备,你需要直接修改配置文件来实现。

一旦WindML配置好,就可以使用Tornado工程来添加WindML到Vxworks Image。

2.1.1 配置方法比较

表2-1总结了这两种配置方法,对第一次安装和配置,我们推荐使用配置工具。

Table 2-1配置方法比较

VxWorks WindML configuration

2.2 基本配置

基本配置意味着你使用的就是标准的WindML配置,标准配置使用的是WindML提供的支持驱动程序,包括:

一个单一的图形设备

一个指示设备

一个键盘设备

一个音频设备

一个支持的字体引擎

缺省的内存管理器

如果你要使用不被支持的硬件或者不同于下面所列的一个配置,那么就必须做一个非标准配置。

如果你使用配置工具来定义WindML配置,那么配置工具在build过程中产生的文件是用来编译和连接WindML的,如果不使用配置工具,必须编辑文件target/src/ugl/config/uglInit.h.。

2.2.1 配置图形设备

要配置一个图形设备,必须设置下列基本配置选项:

– 图形设备类型,如MediaGx

– 显示分辩率

– 帧缓冲颜色深度,如4,8或16位

– 显示器的刷新率

– 输出设备类型,即CRT或平板显示器

可裁剪的图形驱动功能

WindML提供额外的图形设备功能(取决于硬件设备):

software cursors

overlay succes

video

JPEG

alpha blending

double buffers

这些功能都是可裁剪的。

2.2.2 配置键盘设备

要配置键盘设备,设置下列配置选项:

– 键盘设备类型

– 设备名

缺省的设备名是/keyboard/0。

2.2.3 配置指示设备

要配置指示设备,设置下列选项:

– 指示设备类型

– 设备名

缺省的指示设备名取决于设备类型:

– PS2 是 /pointer/0

– 串口设备指示器/tyCo/0

– 触摸屏设备是/touchscreen/0

2.2.4 配置字体

必须配置字体引擎来显示文本,WindML提供的字体引擎是bitmap(位图)字体引擎,其他可用的字体引擎都是来自第三方。通常来说,必须:

– 选择要使用的字体

– 选择字体引擎类型配置选项

如果你从命令行来配置,那么必须修改字体引擎文件(在target/src/ugl/config目录)来定义要包含的字体和字体引擎特性,文件名就是uglFontengineCfg.c, Fontengine 指的是字体引擎名。比如,对于位图字体引擎,这个文件名就是uglBmfCfgf.c。

2.2.5 配置音频

要配置音频,定义下列选项:

– 音频设备类型

– 音频通道

2.2.6 混杂配置项

下列配置项目可以配置给WindML:

– Event Queue Size(事件队列大小)

确定WindML应用程序中事件数,缺省的事件队列大小是100个事件。

– Memory Manager(内存管理器)

WindML可以使用专有内存池,也可以使用Vxworks系统内存池。当指定使用专有内存池时,WindML执行的所有内存分配都来自于专有内存池,同样地,当指定使用VxWorks系统内存池时,WindML执行的所有内存分配都来自于VxWorks系统内存池。

– Special Processor Requirements(特殊处理器需要)

有的处理器类型有特殊需要,比如PowerPC有两个内存模型,PowerPC Reference Platform (PreP)和Common Hardware Reference Platform (CHRP)。所以当你配置PowerPC时就必须定义正确的内存模型。

2.3 使用配置工具

在Windows 操作系统中,从Tornado菜单中选择Tornado>Tools>WindML ,初始的配置窗口如图2-1。

Figure 2-1 Configurator on a Windows Host

VxWorks WindML configuration

2.3.1 定义一个新的配置

1. 在Configuration File域中,输入一个配置名;

2. 在处理器列表中选择一个处理器类型,这项设备完后,配置域就会出现只适用于该处理器的选项;

3. 选择Graphics配置页并设置如下:

– graphics device

– output device type

– color depth

– resolution

– refresh rate

– optional components

4. 选择Input配置页并设置:

– Pointer设备类型和设备名

– Keyboard设备类型和设备名

5. 从所安装的字体引擎集中选择要使用的字体引擎

对于UGL Bitmap font engine, 选择:

– 是否使用Unicode字体

– 字体cache的大小

– 应用程序要使用的字体

6. 在Audio配置页,选择:

– 音频硬件类型

– 音频设备名

– 使用硬件上通道号

7. 在Miscellaneous配置页选择:

– Build 选项,such as building with debug symbols and the library to build.

– 是否使用专用WindML内存池,如果使用,那么设置内存池大小

对上述配置完后,按Save按钮来存储这个配置。

2.3.2 建立WindML库

建立WindML前,选择Miscellaneous页并且选择下列选项之一:

  • Build VxWorks archive

这个选项将会使任何在objCpuToolvx 目录中的WindML对象重新建立并且加入到libCpuToolvx.a文档中, 这个文档用来建立Vxworks Image。.

  • Build WindML archive

这个选项将会使任何在objCpuToolUgl目录中的WindML对象重新建立并且加入到libCpuToolUgl.a文档中, 这是一个独立的文档,它只包含WindML对象。

  • Build WindML object

这个选项将会使任何在objCpuToolUgl目录中的WindML对象建立。然后,所有在配置工具中配置的SDK对象,设备驱动程序和字体引擎都会被建立在一个可下载的目标程序lib/CpuTool.o中。

  • Build Example Programs

这个选项执行与Build WindML archive同样的操作。

一旦选择好了build选项,你就可以通过击Build按钮来建立WindML库。

2.3.3 移出WindML目标文件

点击Clean按钮就好清除掉所选择的目标,比如,如果选择Build Examples Programs,那么在objCpuToolUgl中目标就会随着libCpuToolUgl.a一起被清除掉。如果Build VxWorks archive选项被选择,所有来自objCpuToolvx目录的WindML目标都会被清除掉,但是来自libCpuToolvx.a文件中的WindML目标不好被清除掉。

2.4 命令行配置

一般来说,不推荐使用命令行配置。如果要使用不只一个图形设备、指示设备或者键盘,那么需要修改源文件而利用命令行进行WindML配置。

至少需要修改uglInit.h 和所选择的字体引擎相关字体配置文件,在有的情况下也需要修改uglInit.c文件,这两个文件都在target/src/ugl/config.目录下。

uglInit.h

这个文件指定了WindML的基本配置。

uglInit.c

这个文件控制了WindML库的初始化,它包含函数uglInitialize( ) 和uglDeinitialize( )。提供了处理标准WindML系统的函数,包括一个图形设备、一个键盘、一个指示器、一个字体引擎和一个音频设备。 通常,要修改这个文件的唯一原因就是处理多个设备(如多个图形设备等)。

2.4.1 编辑uglInit.h文件

uglInit.h 文件允许你选择配置包括图形、键盘、指示器和音频、字体引擎、内存管理器和miscellaneous目标/处理器项目,这个文件被分成几个部分:

– 设备驱动程序选择

– 字体引擎选择

– 输入设备配置

– 图形设备配置

– 音频设备配置

– 字体引擎配置

– 内存管理器配置

– Miscellaneous target/processor配置

选择设备驱动程序

uglInit.h 文件第一个部分就是选择要使用的设备驱动程序,每个所支持的设备驱动程序通过INCLUDE_*来标记。 要选择指定的设备驱动程序,定义(#define)相关INCLUDE_*,而在相关子部分其他的INCLUDE_都必须undefined。

设备驱动程序部分如下:

/* Specify the graphics device to use (Select 1) */
#undef INCLUDE_BIOS_GRAPHICS
#undef INCLUDE_CHIPS_GRAPHICS
#undef INCLUDE_CUSTOM_GRAPHICS /* User defined graphics device */
#undef INCLUDE_IGS_GRAPHICS
#undef INCLUDE_MEDIAGX_GRAPHICS
#undef INCLUDE_SA11XX_GRAPHICS
#undef INCLUDE_SIMULATOR_GRAPHICS
#undef INCLUDE_Q2SD_GRAPHICS
#undef INCLUDE_M821_GRAPHICS
#define INCLUDE_VGA_GRAPHICS
/* Specify the keyboard type (Select 1) */
#define INCLUDE_PC_AT_KEYBOARD /* Standard PC AT style */
#undef INCLUDE_CUSTOM_KEYBOARD /* User defined keyboard device */
#undef INCLUDE_SIMULATOR_KEYBOARD /* Simulator keyboard device */
/* Specify the type of pointer device (Select 1) */
#undef INCLUDE_ASSABET_POINTER /* Assabet touchscreen */
#undef INCLUDE_CUSTOM_POINTER /* User defined pointer device */
#undef INCLUDE_MS_POINTER /* Microsoft serial mouse */
#define INCLUDE_PS2_POINTER /* PS-2 type mouse */
#undef INCLUDE_SIMULATOR_POINTER /* Simulator pointer device */
/* Specify the audio hardware device (Select 1) */
#undef INCLUDE_IGS_AUDIO
#undef INCLUDE_CUSTOM_AUDIO /* User defined audio device */

在这个例子中,配置包括VGA图形设备、一个标准PC AT型键盘、一个PS-2鼠标和无音频设备。

选择字体引擎

下面这部分就是建立要使用的字体引擎,与上述一样。

/* Specify the font engine (Select 1) */

#define INCLUDE_BMF_FONTS

在这个例子中,使用的字体引擎是位图字体引擎。

配置输入设备

WindML支持两种输入设备类型,键盘和指示器设备。 指示器设备包括鼠标、跟踪球、触摸屏、光笔等。

VxWorks WindML Device Name

缺省的设备名可以通过添加相关宏来改变,比如,要改变串口鼠标名为/tyCo/1,在文件uglInit.h 中添加下列行,这行应该在#include <ugl/config/uglDepend.h>前面。

#define SYS_POINTER_NAME "/tyCo/1"
#include <ugl/config/uglDepend.h> 可以定义键盘映射类型,如下:
/* Specify the keyboard key mapping (Select 1) */
#define INCLUDE_KMAP_ENGLISH_US
#undef INCLUDE_KMAP_ENGLISH_UK
#undef INCLUDE_KMAP_GERMAN
#undef INCLUDE_KMAP_ITALIAN
#undef INCLUDE_KMAP_FRENCH
#undef INCLUDE_KMAP_SWEDISH
#undef INCLUDE_KMAP_NONE

配置图形设备

下面将描述图形设备的配置。图形配置的各个部分包括分辨率、刷新率、帧缓冲格式和<可选图形设备组件。

这部分在文件uglInit.h中包含下列内容:

/*
* Specify characteristics of the display
*/
#define UGL_DISPLAY_WIDTH 800
#define UGL_DISPLAY_HEIGHT 600
#define UGL_REFRESH_RATE 60
/*
* When using a flat panel, select the flat panel type
* (Defaults to a CRT monitor)
*/
#undef INCLUDE_UGL_KYOCERA_KCS057QV1AA /* Passive, 320x240x8 */
#undef INCLUDE_UGL_SHARP_LM9V385 /* Dual panel passive, 640x480x8 */
#undef INCLUDE_UGL_SHARP_LQ039Q2DS01 /* TFT, 320x240x(8 or 16) */
/*
* Specify the frame buffer format (Select 1)
*/
#undef INCLUDE_UGL_MONO
#undef INCLUDE_UGL_GREYSCALE2
#undef INCLUDE_UGL_GRAYSCALE4
#undef INCLUDE_UGL_GRAYSCALE8
#undef INCLUDE_UGL_INDEXED4
#define INCLUDE_UGL_INDEXED8
#undef INCLUDE_UGL_ARGB4444
#undef INCLUDE_UGL_RGB565
#undef INCLUDE_UGL_ARGB8888
/*
* Select graphics driver optional components
*/
#undef INCLUDE_UGL_ALPHA /* Alpha blending */
#undef INCLUDE_UGL_DOUBLE_BUFFERING /* Double buffering */
#define INCLUDE_UGL_JPEG /* JPEG extension */
#undef INCLUDE_UGL_OVERLAY /* Video overlay support */
#define INCLUDE_UGL_SW_CURSOR /* Software cursor */
#undef INCLUDE_UGL_VIDEO /* Video extension */

上述配置指的是:

– 800×600的分辨率

– 刷新率为60HZ

– 使用CRT 显示器

– 帧缓冲格式为每象素8位

– 包含JPEG扩展

– 包含软件光标

配置字体引擎

主要的字体配置机制就是uglFontengineCfg.c文件,配置的主要方法就是指定字体引擎的类型。比如,要配置位图字体引擎,那么就需要在uglInit.h文件中添加相关定义。 设置位图字体引擎的代码如下:

/* Size of cache */
#define BMF_FONT_GLYPH_CACHE_SIZE UGL_BMF_GLYPH_CACHE_SIZE_MAX
/* Memory pool to use for glyph cache */
#define BMF_FONT_GLYPH_CACHE_MEM_POOL UGL_DEFAULT_MEM_POOL_ID
/* Include Unicode fonts */
#define INCLUDE_UGL_BMF_UNICODE
2.4.2 编辑字体配置文件

要选择指定的字体,编辑uglFontengineCfg.c文件。

配置位图字体引擎

位图配置文件uglBmfCfg.c包含了一个数据结构用来定义应用程序使用的字体。

extern const UGL_BMF_FONT_DESC uglBMFFont_Lucida_Sans_12;
extern const UGL_BMF_FONT_DESC uglBMFFont_Helvetica_Bold_12;
extern const UGL_BMF_FONT_DESC uglBMFFont_Lucida_Sans_8;
extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_12;
const UGL_BMF_FONT_DESC * uglBMFFontData[ ] =
{ &uglBMFFont_Lucida_Sans_12,
&uglBMFFont_Helvetica_Bold_12,
&uglBMFFont_Lucida_Sans_8,
&uglBMFFont_Courier_12,
NULL
};

修改uglBMFFontData 数据结构来包含WindML应用程序所需要的位图字体, 除此之外还需把字体放到这个数据结构中,外部引用字体必须添加到外部引用列表中。比如,要添加一个 间距18的Courier Bold Oblique字体,必须添加下列外部引用:

extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_Bold_Oblique_18;

然后添加如下代码到数据结构中:

&uglBMFFont_ Courier_Bold_Oblique_18,

目录 target/src/ugl/fonts/bmf 包含WindML发布可用的字体,如果需要其他的字体则需要添加到这个目录。