分类: LINUX
2009-10-04 00:20:50
Microwindows-0.91在ARM平台上的移植
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以适应不同的应用
环境。
两种API:Win32和Nano-X
Microwindows中使用两种流行的图形编程接口:Microsoft Windows Win32/WinCE图形
显示接口(GDI)和Xlib-like接口。前者应用于所有的Windows CE和Win32应用程序,
后者就象Nano-X,应用于所有Linux X插件集的最底层。这样做可以让大量的Windows
程序员开发图形应用程序,类似地也可以让Linux图形程序员用X接口开发图形应用
程序。
本文中将用Nano-X API设计一个应用程序,并且讨论底层Nano-X程序的设计问题。
Nano-X允许应用程序使用client/server网络协议或本地UNIX的主域接口。这样可以让
几个应用程序在嵌入式设备或远程主机上运行而连接到Microwindows 的服务器上显
示,这些特点使得Nano-X的操作非常像X Windows系统。在底层和大部分有关创建
、删除窗口以及基本画图函数方面,Nano-X API和X的Xlib库很相似。另外,由于
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会根据外
部字体文件来生成大小适当的字体。最新的版本还可支持外部中文字体,其中所有
的字体可用8位ASCII 码、 Unicode-16或UTF-8确定。其中UTF-8是Unicode的字节流编
码方案。
有关字符支持的选项如下:
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选项引入了对16色VGA平面模式屏幕驱动的支持,但是该选项不可用于嵌入
式系统。VTSW99vCH选项允许Microwindows在帧缓存控制器上运行,按下ALT键可
打开另一个虚拟控制器。一些嵌入式系统要求该选项关闭。PORTRA99v_MODE选项
利用 L/R键来指定系统偏向于左/右运行,这一点和康柏公司出品的iPAQ PDA非常类
似。
(3)Linux内核帧缓存支持
如果在运行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函数在屏幕
(20,20)的位置上创建一个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 context用GrNewGC生成。该函数按标准设置
生成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 绘制存盘的BMP、GIF、JPEG图形(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网站上还有更多的内容。