跳过正文

VxWorks下WindML相关知识和图形设备驱动程序开发

·955 字·5 分钟
VxWorks WindML SDK DDK 嵌入式GUI 多媒体库 Tornado 图形驱动 配置工具
目录

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 结构

VxWorks WindML SDK

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:

  1. 使用 WindML 配置工具(Tornado → Tools → WindML 菜单选项),这是配置 WindML 和相关驱动程序的主要方法。
  2. 通过直接编辑配置头和源文件(命令行方法),实现配置工具无法完成的定制。

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

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

2.1.1 配置方法比较
#

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

表 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 或平板显示器)

可裁剪的图形驱动功能(取决于硬件设备):

  • 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

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 选项(如 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 ProgramsobjCpuToolUgl 中的目标会随着 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 支持两种输入设备类型:键盘和指示器设备(鼠标、跟踪球、触摸屏、光笔等)。

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

配置图形设备

图形配置包括分辨率、刷新率、帧缓冲格式和可选图形设备组件。

示例:

/*
 * 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 发布可用的字体。如果需要其他字体,需要添加到该目录。

相关文章

VxWorks 6.8 安装配置 Qt 4.8.3 详细教程
·617 字·3 分钟
VxWorks Qt 嵌入式开发 VxWorks 6.8 Qt 4.8.3 Vxsim WindML 交叉编译 嵌入式GUI