VxWorks WindML 完整指南:结构、配置与命令行定制
1 介绍 #
WindML(Wind Media Library,媒体库)支持多媒体程序运行于嵌入式操作系统。风河公司设计它主要是用来提供基本的图形、视频和音频技术,并提供一个设计标准设备驱动程序的框架。
WindML API 库提供了一个统一的图形硬件接口,以及处理输入设备和输入设备事件的能力。WindML 有以下几个设计目的:
- 简单:提供一个灵活的图形原语集、基本的视频和音频功能;
- 硬件便宜:可以在多种 CPU 体系结构上使用;
- 操作系统便宜:可以在多种 RTOS 系统上使用;
- 驱动程序开发容易:提供给开发者一个定制设备驱动程序的机制。
2 WindML 结构 #
WindML 包括两个组件——软件开发包(SDK) 和 驱动程序开发包(DDK)。
- SDK 组件用来开发应用程序,它提供了一个全面的 API 集,包括图形、输入处理、多媒体、字体和内存管理。
- DDK 组件用来实现驱动程序,它提供了一个完整的驱动程序参考集,包括硬件配置和 API 集,使开发者能够迅速引导和使用自己的驱动程序。
WindML 的结构可概括为如图 1-1 所示:
图 1-1 WindML 结构
2.1 SDK #
这一层定义了应用程序代码和硬件驱动程序的接口,因此应用程序可以独立于硬件进行开发。
SDK 提供了下列 API 集:
- 图形芯片的初始化程序
- 多媒体 API,包括:
- 2D 图形
- 区域管理
- 窗口
- 颜色管理
- 视频支持
- JPEG 支持
- 音频
- 事件服务
- 内存管理
- 扩展 API
- 设备管理
2.2 DDK #
DDK 是处于 SDK 和硬件之间的中间层,它直接与应用程序目标硬件设备接口,包括监视器、视频、音频、键盘和指示设备等。
对于大多数 SDK API 都有相关的驱动程序级结构和 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 总结了这两种配置方法。对第一次安装和配置,推荐使用配置工具。
表 2-1 配置方法比较
2.2 基本配置 #
基本配置意味着使用标准的 WindML 配置。标准配置使用 WindML 提供的支持驱动程序,包括:
- 一个单一的图形设备
- 一个指示设备
- 一个键盘设备
- 一个音频设备
- 一个支持的字体引擎
- 缺省的内存管理器
如果要使用不被支持的硬件或不同于下列所列的配置,就必须做非标准配置。
如果使用配置工具定义 WindML 配置,配置工具在 build 过程中产生的文件用于编译和连接 WindML。如果不使用配置工具,必须编辑文件 target/src/ugl/config/uglInit.h。
2.2.1 配置图形设备 #
要配置一个图形设备,必须设置下列基本配置选项:
- 图形设备类型(如 MediaGx)
- 显示分辨率
- 帧缓冲颜色深度(如 4、8 或 16 位)
- 显示器的刷新率
- 输出设备类型(CRT 或平板显示器)
可裁剪的图形驱动功能(取决于硬件设备):
- software cursors
- overlay surfaces
- video
- JPEG
- alpha blending
- double buffers
这些功能都是可裁剪的。
2.2.2 配置键盘设备 #
要配置键盘设备,设置下列配置选项:
- 键盘设备类型
- 设备名
缺省的设备名是 /keyboard/0。
2.2.3 配置指示设备 #
要配置指示设备,设置下列选项:
- 指示设备类型
- 设备名
缺省的指示设备名取决于设备类型:
- PS2:
/mouse/0 - 串口设备指示器:
/tyCo/0 - 触摸屏设备:
/touchscreen/0
2.2.4 配置字体 #
必须配置字体引擎来显示文本。WindML 提供的字体引擎是 bitmap(位图)字体引擎,其他可用的字体引擎来自第三方。通常需要:
- 选择要使用的字体
- 选择字体引擎类型配置选项
如果从命令行配置,必须修改字体引擎文件(位于 target/src/ugl/config 目录)来定义要包含的字体和字体引擎特性。文件名格式为 uglFontengineCfg.c(Fontengine 指字体引擎名)。例如,对于位图字体引擎,文件名为 uglBmfCfg.c。
2.2.5 配置音频 #
要配置音频,定义下列选项:
- 音频设备类型
- 音频通道
2.2.6 混杂配置项 #
下列配置项目可以配置给 WindML:
-
Event Queue Size(事件队列大小)
确定 WindML 应用程序中事件数,缺省大小是 100 个事件。 -
Memory Manager(内存管理器)
WindML 可以使用专有内存池,也可以使用 VxWorks 系统内存池。当指定使用专有内存池时,所有内存分配都来自专有内存池;当指定使用 VxWorks 系统内存池时,所有内存分配都来自系统内存池。 -
Special Processor Requirements(特殊处理器需要)
有的处理器类型有特殊需要。例如 PowerPC 有两个内存模型:PowerPC Reference Platform (PreP) 和 Common Hardware Reference Platform (CHRP)。配置 PowerPC 时必须定义正确的内存模型。
2.3 使用配置工具 #
在 Windows 操作系统中,从 Tornado 菜单中选择 Tornado → Tools → WindML,初始配置窗口如图 2-1 所示。
图 2-1 Configurator on a Windows Host
2.3.1 定义一个新的配置 #
- 在 Configuration File 域中输入一个配置名。
- 在处理器列表中选择一个处理器类型。选择后,配置域会出现只适用于该处理器的选项。
- 选择 Graphics 配置页并设置:
- graphics device
- output device type
- color depth
- resolution
- refresh rate
- optional components
- 选择 Input 配置页并设置:
- Pointer 设备类型和设备名
- Keyboard 设备类型和设备名
- 从所安装的字体引擎集中选择要使用的字体引擎。
对于 UGL Bitmap font engine,选择:- 是否使用 Unicode 字体
- 字体 cache 的大小
- 应用程序要使用的字体
- 在 Audio 配置页选择:
- 音频硬件类型
- 音频设备名
- 使用硬件上的通道号
- 在 Miscellaneous 配置页选择:
- Build 选项(如 building with debug symbols 和要建立的库)
- 是否使用专用 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 Example 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 配置
选择设备驱动程序
文件第一部分是选择要使用的设备驱动程序。每个支持的设备驱动程序通过 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 支持两种输入设备类型:键盘和指示器设备(鼠标、跟踪球、触摸屏、光笔等)。
缺省设备名可通过添加相关宏来改变。例如,要改变串口鼠标名为 /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
配置图形设备
图形配置包括分辨率、刷新率、帧缓冲格式和可选图形设备组件。
示例:
/*
* 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 发布可用的字体。如果需要其他字体,需要添加到该目录。