Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118899
  • 博文数量: 121
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 1210
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-03 23:43
文章分类

全部博文(121)

文章存档

2011年(1)

2010年(6)

2009年(114)

我的朋友

分类: LINUX

2009-10-04 00:20:50

Microwindows-0.91ARM平台上的移植


STEP 1

#cp Configs/config.fb config

配置文件样本应选择config.fb,而不是config.fb3,在用config.fb3时出错,jpeg错误。


修改config如下:

ARCH = LINUX-ARM

SHAREDLIBS = Y

HAVETEXTMODE = N

GPMMOUSE = N

NOMOUSE = Y

SCANKBD = N

NOKBD = Y


STEP 2

设置好交叉编译环境,在用3.4.1编译Microwindows-0.91时出错,换成2.95.3后,编译过程中虽然有错误闪过,但编译通过。


STEP 3

src/lib下的*.so文件拷贝到/根文件系统usr/lib目录下,将/src/bin目录下的文件拷贝到根文件系统/usr/share/bin目录下,制作cramfs文件系统。



STEP 4

Win32 API程序能正常运行,Nano-X API程序要先让/tmp目录可写,即挂载ramfs文件系统,否则会出现Cannot bind to named socket错误。




Microwindows采用分层设计方法。在最底层,屏幕,鼠标/触摸屏以及键盘驱动程序

提供了对物理设备访问的能力。在中间层,实现了一个可移植的图形引擎,支持行

绘制,区域填充,剪切以及颜色模型等。在上层,实现多种API以适应不同的应用

环境。


两种APIWin32Nano-X

Microwindows中使用两种流行的图形编程接口:Microsoft Windows Win32/WinCE图形

显示接口(GDI)和Xlib-like接口。前者应用于所有的Windows CEWin32应用程序,

后者就象Nano-X,应用于所有Linux X插件集的最底层。这样做可以让大量的Windows

程序员开发图形应用程序,类似地也可以让Linux图形程序员用X接口开发图形应用

程序。


Nano-X程序设计

本文中将用Nano-X API设计一个应用程序,并且讨论底层Nano-X程序的设计问题。

Nano-X允许应用程序使用client/server网络协议或本地UNIX的主域接口。这样可以让

几个应用程序在嵌入式设备或远程主机上运行而连接到Microwindows 的服务器上显

示,这些特点使得Nano-X的操作非常像X Windows系统。在底层和大部分有关创建

、删除窗口以及基本画图函数方面,Nano-X APIXXlib库很相似。另外,由于

Microwindows被设计得很小,很多选项可以用资源包中的配置文件来进行设置。

下面的过程是建立一个Nano-X服务器的一个具体操作。

1)初始化

Mcrowindows的资源包可以从下载。首先通过编译为主机和嵌

入式目标平台建立一个Nano-X 的服务器。大多数的设置选项在配置文件中,所以在

解压缩该资源包后进入microwin/src目录里编辑配置文件。下面是一些最重要的

ARCH选项:

ARCH=LINUX-NATIVE

ARCH=LINUX-ARM

ARCH=LINUX-MIPS

ARCH=LINUX-POWERPC

LINUX-NATIVE设置ARCH选项的目的是通知系统为当前运行的主机的Linux系统生

成程序,而为其他选项设置ARCH则是要给一个RISC目标平台进行交叉编译。

Microwindows中使用Arch.rules文件为每一个选项确定一个具体的设置。

下面的设置项用于提供Nano-X 服务器的图像支持:

HAVE_BMP_SUPPORT=Y

HAVE_GIF_SUPPORT=Y

HAVE_JPEG_SUPPORT=Y

设置JPEG图像选项时必须给出外部jpeg解压缩库的位置,例如

LIBJPEG=/usr/lib/libjpeg.a。大部分系统都提供了解压库,也可从Microwindows网站上

下载。另外一个重要设置项为选择是否提供大小可变字体支持,缺省项是在

drivers/genfont.c中提供固定大小的位图字体。如想显示更大的字体,例如运行一个嵌

入式浏览器,则可加入对TrueType Adobe Type 1字体的支持。当选项确定以后,

就可以根据显示的需要指定字体文件和像素点的大小,相应Microwindows会根据外

部字体文件来生成大小适当的字体。最新的版本还可支持外部中文字体,其中所有

的字体可用8ASCII 码、 Unicode-16UTF-8确定。其中UTF-8Unicode的字节流编

码方案。

有关字符支持的选项如下:

HAVE_FREETYPE_SUPPORT=Y

HAVE_T1LIB_SUPPORT=Y

HAVE_HZK_SUPPORT=Y

FreeType T1lib外部库分别用于支持TrueType Adobe Type 1字体。这些库必须预

先编译并且在配置文件中应指定其位置。Microwindows的网站上提供的所有库函数

的下载。


2)配置输出显示设备

由于Microwindows可在帧缓存系统和X Windows下运行,每一种显示驱动需要确定不

同的设置。如果已经在Linux桌面上运行了X ,最好首先用X屏幕驱动建立系统,然

后再为嵌入式设备生成一个帧缓存。下列选项用以配置X屏幕驱动:

X11=Y

SCREEN_WIDTH=640

SCREEN_HEIGHT=480

SCREEN_PIXTYPE=MWPF_TRUECOLOR0888

Microwindows通过这些选项在X 桌面上生成一个640x480的虚窗口,采用了8位色彩模

式(红、绿、兰各用8位表示)输出。通过改变设置,可以在自己的桌面上控制目

标嵌入式设备的仿真。例如仿真一个每像素16位的显示,

SCREEN_PIXTYPE=MWPF_TRUECOLOR565。其中MWPF常数在src/include/mwtypes.h

头文件中有详尽的解释。

由于必须确定Linux系统内核支持帧缓存,因此设置帧缓存显示比较复杂。其设置如

下:

X11=N

FRAMEBUFFER=Y

FBVGA=Y

VTSW99vCH=Y

PORTRA99v_MODE=N

FBVGA选项引入了对16VGA平面模式屏幕驱动的支持,但是该选项不可用于嵌入

式系统。VTSW99vCH选项允许Microwindows在帧缓存控制器上运行,按下ALT键可

打开另一个虚拟控制器。一些嵌入式系统要求该选项关闭。PORTRA99v_MODE选项

利用 L/R键来指定系统偏向于左/右运行,这一点和康柏公司出品的iPAQ PDA非常类

似。


3Linux内核帧缓存支持

如果在运行Nano-X 服务器时显示“Can't open /dev/fb0”,说明没有打开帧缓存或是系

统内核没有引入帧缓存驱动。最简单的识别方式是当启动系统时是否看见一个企鹅

图标,如果没有图标则确认下列选项是否在/usr/src/linux/.config文件中:

CONFIG_FB=y

CONFIG_FB_VGA16=y

CONFIG_FBCON_VGA=y

CONFIG_FBCON_CFB4=y

CONFIG_FBCON_CFB8=y

如果系统支持图形卡而不是标准的老式VGA,可以不用CONFIG_FB_VGA16选项。

在重建内核之前,需要备份旧的内核,并且在lilo.conf文件中写明备份位置。启用帧

缓存是大部分嵌入式系统的标准设置。

最后一项重要配置是为Microwindows指定鼠标或触摸屏输入的驱动程序。目前

Microwindows上的鼠标是通过GPM工具或直接使用串口。指令GPMMOUSE=Y是选择

GPM支持,设置之后运行gpm工具,例如‘gpm –R –t ps2'(支持 PS/2 鼠标);指令

SERMOUSE=Y 是选择串口,同时还要在src/drivers/mou_ser.c 中设置MOUSE_TYPE

MOUSE_PORT两个环境变量。


4)创建一个完整的演示系统

一旦在配置文件中设置好选项后,只要用户不再改动,参数就保持不变。同时在src

目录中还有很多针对不同平台的样本配置文件。要创建一个 Nano-X 服务器并且运

行演示程序,首先进入microwin/src目录,然后键入“make”。所有的程序在

microwin/src/bin目录中生成,客户链接库也放在microwin/src/lib目录下。要运行演示程

序,首先运行Nano-X 服务器 (bin/nano-X),然后再运行应用程序


bin/nano-X & sleep 1; bin/world

在运行demonstration world plotting程序之前运行休眠命令以便服务器有一段时间来进

行初始化。


创建一个简单的Nano-X应用程序

目的:绘制一个带兰边的白色方块。源代码如下

filename sample.c

#define MWINCLUDECOLORS

#include

#include “nano-X.h”

int main(int ac,char **av)

{

GR_WINDOW_ID w;

GR_EVENT event;

if (GrOpen() < 0) {

printf(“Can't open graphics\n”);

exit(1);

}

w = GrNewWindow(GR_ROOT_WINDOW_ID, 20, 20, 100, 60, 4, WH99vE, BLUE);

GrMapWindow(w);

for (;;) { GrGetNextEvent(&event); }

GrClose();

return 0;

}

在配置和检测了Microwindows初始安装程序以后,用“make install”指令来创建Nano-X

服务器、客户库和头文件,然后键入下述字符编译、链接和运行示例程序:

gcc sample.c –o sample –lnano-X

nano-X & sleep 1; sample

键入escape将退出服务器。

GrOpen()函数用于打开一个与正在运行中的Nano-X 服务器的连接,如果服务器没有

运行,则返回-1值,应用程序此时显示错误信息并退出。GrNewWindow函数在屏幕

2020)的位置上创建一个100x60像素的窗口。它的边界大小为4像素宽,兰边白

底。然后调用GrMapWindow函数将刚刚创建的窗口在屏幕上显示出来。这是因为有

时生成一组窗口很方便,但是要根据用户指令在屏幕上显示和移动。在屏幕显示窗

口以后,程序进入“event loop”状态,等待下一个鼠标或键盘事件。


Expose event

更为复杂的Nano-X应用程序基本上遵从上述同样的逻辑结构。首先生成窗口,接着

显示出来,然后程序进入“event loop”等待用户发出指令。在该例中并没有真正写出

明确的代码在窗口上画出东西。在实现这一点之前,首先应当理解关于Expose event

的概念。Nano-X API提供一套完整的在屏幕上划线、写字、画圆和显示图像的函数

。当一个窗口被遮住时,Microwindows剪辑该窗口图画并保存下来,当被遮掩部分

再次需显示时,可以重新刷新以显示以前的内容。刷新发生时,服务器首先向应用

程序发送一个Expose event,要求重新绘制窗口中的内容。Microwindows在首次显示

窗口后就发出一个expose event指令,这样重新绘制时使用的代码和原来显示时所用

的代码完全一样,所以可以实现在原先位置上显示同样的内容。下例是用该机制显

示一些文字,并在窗口移动后重新显示出来(sample2.c).

#define MWINCLUDECOLORS

#include

#include “nano-X.h”

int main(int ac,char **av)

{

GR_WINDOW_ID w;

GR_GC_ID gc;

GR_EVENT event;

if (GrOpen() < 0) {

printf(“Can't open graphics\n”);

exit(1);

}

w = GrNewWindow(GR_ROOT_WINDOW_ID, 20, 20, 100, 60,4, WH99vE, BLUE);

gc = GrNewGC();

GrSetGCForeground(gc, BLACK);

GrSetGCUseBackground(gc, GR_FALSE);


GrSelectEvents(w, GR_EVENT_MASK_EXPOSURE);

GrMapWindow(w);


for (;;) {

GrGetNextEvent(&event);

switch (event.type) {

case GR_EVENT_TYPE_EXPOSURE:

GrText(w, gc, 10, 30, “Hello World”, -1, GR_TFASCII);

break;

}

GrClose();

return 0;

}

为了检测expose event代码,要运行带有NanoWM窗口管理器的Nano-X,这样就可以

移动窗口了。命令如下:

bin/nano-X & sleep 1; bin/nanowm & sleep 1; sample2

在上例中用GrSelectEvents函数发送 GR_EVENT_TYPE_EXPOSURE事件到客户(client

)程序中。为了保持client/ server之间的通信,server只向每个client窗口发送选择过的

事件。程序中只有一句处理“Hello World”显示文本,该句在expose event例程中。

GrMapWindow调用后立即产生一个expose event,这样即使窗口实际上并没有真正移

动文字还是会被显示出来。


Graphics contexts

当绘制类似于线条或文字的图形时,所调用的每个画图函数都定义了一些可以影响

操作的参数。每个调用除了一些类似于线条起始点这样的最基本信息以外,还由系

统确定一些其它信息。前景色、背景色、与或画图模式以及一些其它参数保存在一

graphics context结构中。上例中graphics contextGrNewGC生成。该函数按标准设置

生成graphics context,然后调用GrSetGCForeground设置前景文字颜色。在expose event

处理过程中,graphics context通过window id设置文本绘制参数。


画图函数

上面已经介绍了生成程序、窗口和graphics context的基本知识,下面介绍

Microwindows图形库中提供的其它函数。

GrClearWindow 清除窗口(Clear a window to it's background color

GrPoint 画点(Draw a single point

GrLine 画线(Draw a line

GrRect 画矩形(Draw a rectangle outline

GrFillRect 填充矩形(Draw a filled rectangle

GrEllipse 画圆/椭圆(Draw an ellipse or circle outline

GrFillEllipse 填充圆/椭圆(Draw a filled ellipse or circle

GrArc 画弧形(Draw an arc outline or pie wedge

GrArcAngle 画弧形,指定浮点及角度(Like GrArc, but uses floating point and angles

GrPoly 画多边形(Draw a polygon outline

GrFillPoly 填充多边形(Draw a filled polygon


GrBitmap 绘制位图( Draw a bitmap image

GrDrawImageFromFile 绘制存盘的BMPGIFJPEG图形(Draw a BMP, GIF or JPEG file

from disk

GrDrawImageToFit 绘制cache中的图形,并适当调整其大小(Draw a cached image and

stretch to fit

GrArea 绘制内存队列中像素点(Draw from a memory array of pixels

GrCopyArea 将某一窗口中的矩形区域复制到另一窗口(Copy a rectangular area

fromonewindow to another

Microwindows也支持一种从来不在屏幕上显示的窗口,即像素映射(pixmap)。像素

映射窗口有时也称作虚窗口(offscreen),虚窗口不能在屏幕上显示出来,但是可以使

GrCopyArea函数复制到别的窗口。有时在expose events期间,CPU太忙而无法保存

显示窗口的内容,普通窗口在被遮掩时又从不保存它们的内容,这时就可以使用像

素映射。用GrNewPixmap函数可以生成一个像素映射。

希望上面的介绍可以帮助你理解在嵌入式Linux里,一个小型系统如何运行复杂的应

用程序。Microwindows网站上还有更多的内容。

阅读(1051) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~