eCos GUI for Synthetic 的研究
2011年02月24日 08:42 发布者:rickleaf
帖子发的比较仓促,由于帖子大小的问题,补丁在2楼和3楼。1. 软件下载新版本的eCos已经开始用hg作为代码管理了。
大家可以用以下命令下载最新的eCos源码
hg clone http://hg-pub.ecoscentric.com/ecos/
当然也可以用http://ecos.sourceware.org/getstart.html提供的正式版安装ecos的tcl脚本来安装,因为本人使用的是ubuntu 10.04 amd64版本,所以必须用hg的方式。
2. 安装host工具
所谓host工具是指,ecos在发布的时候一些用来模拟的工具,其中synthetic就是其中的一个。your_ecos_folder/configuremakesudo make install
3. 配置synthetic平台,并且加入microwindows组件
ecosconfig new linux netecosconfig add mwecosconfig treemake
4. 运行synthetic的ecos代码
install/bin/ecos-mw.elf --io
网友评论
rickleaf 2011年02月24日
+
+static void synth_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c)
+{
+ cyg_fb_fill_block(&FRAMEBUF,x1, y1, x2-x1+1, y2-y1+1, CMWtofb(&FRAMEBUF,c));
+ cyg_fb_synch(&FRAMEBUF,0);
+}
+
+
+static void synth_blit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD w, MWCOORD h,
+ PSD srcpsd, MWCOORD srcx, MWCOORD srcy, long op)
+{
+ /*
+ if (op != 0)
+ {
+ diag_printf("synth_blit(): op = 0x%x not supported\n", op);
+ }
+
+ if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr != frame_format->frame_buffer)
+ {
+ synthCopyRect2Buffer(srcx, srcy, w, h, dstpsd->addr, dstpsd->xres, dstpsd->yres, dstx, dsty);
+ }
+ else if (srcpsd->addr != frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)
+ {
+ synthCopyBuffer2Rect(srcpsd->addr, srcpsd->xres, srcpsd->yres, srcx, srcy, dstx, dsty, w, h);
+ }
+ else if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)
+ {
+ synthCopyRect(srcx, srcy, w, h, dstx, dsty);
+ }
+ else
+ {
+ diag_printf("synth_blit(): Error unsupported operation\n");
+ }
+ */
+ diag_printf("synth_blit(): Error unsupported operation\n");
+}
+
+static void synth_stretchblit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw,
+ MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy,
+ MWCOORD srcw, MWCOORD srch, long op)
+{
+ diag_printf("synth_stretch_blit() not implemented\n");
+}
+
+
+static void synth_getscreeninfo(PSD psd,PMWSCREENINFO psi)
+{
+ psi->rows = psd->yvirtres;
+ psi->cols = psd->xvirtres;
+ psi->planes = psd->planes;
+ psi->bpp = psd->bpp;
+ psi->ncolors = psd->ncolors;
+ psi->pixtype = psd->pixtype;
+ psi->fonts = NUMBER_FONTS;
+ psi->portrait = psd->portrait;
+ psi->fbdriver = true;
+
+ switch (psd->pixtype) {
+ case MWPF_TRUECOLOR332:
+ psi->rmask = 0xE0;
+ psi->gmask = 0x1C;
+ psi->bmask = 0x03;
+ break;
+ case MWPF_TRUECOLOR233:
+ psi->rmask = 0x07;
+ psi->gmask = 0x38;
+ psi->bmask = 0xC0;
+ break;
+ case MWPF_TRUECOLOR555:
+ psi->rmask = 0x7c00;
+ psi->gmask = 0x03e0;
+ psi->bmask = 0x001f;
+ break;
+ case MWPF_TRUECOLOR565:
+ psi->rmask = 0xf800;
+ psi->gmask = 0x07e0;
+ psi->bmask = 0x001f;
+ break;
+ case MWPF_TRUECOLOR0888:
+ psi->rmask = 0xFF0000;
+ psi->gmask = 0x00FF00;
+ psi->bmask = 0x0000FF;
+ break;
+ default:
+ printf("%s - unsupported pixtype\n", __FUNCTION__);
+ psi->rmask = 0xff;
+ psi->gmask = 0xff;
+ psi->bmask = 0xff;
+ break;
+ }
+
+ /* Need to figure out better values possibly */
+ psi->xdpcm = 24; /* assumes screen width of 24 cm */
+ psi->ydpcm = 18; /* assumes screen height of 18 cm */
+}
+
+static void synth_drawarea(PSD psd, driver_gc_t *gc, int op)
+{
+ diag_printf("synth_drawarea() not implemented\n");
+}
+
+
+/*
+ * Initialize memory device with passed parms,
+ * select suitable framebuffer subdriver,
+ * and set subdriver in memory device.
+ */
+MWBOOL synth_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen,
+ int size,void *addr)
+{
+ PSUBDRIVER subdriver;
+
+ /* initialize mem screen driver*/
+ initmemgc(mempsd, w, h, planes, bpp, linelen, size, addr);
+
+ subdriver = &synth_subdriver;
+
+ /* set and initialize subdriver into mem screen driver*/
+ if(!set_subdriver(mempsd, subdriver, TRUE))
+ {
+ diag_printf("set_subdriver() failed\n");
+ return 0;
+ }
+
+ return 1;
+}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/demo_thread.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/demo_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -0,0 +1,53 @@
+#include /* which packages are enabled/disabled */
+#ifdef CYGPKG_KERNEL
+# include
+#endif
+#ifdef CYGPKG_LIBC
+# include
+#endif
+#ifdef CYGPKG_IO_SERIAL
+# include
+#endif
+
+#ifndef CYGFUN_KERNEL_API_C
+# error Kernel API must be enabled to build this application
+#endif
+
+#ifndef CYGPKG_LIBC_STDIO
+# error C library standard I/O must be enabled to build this application
+#endif
+
+#ifndef CYGPKG_IO_SERIAL_HALDIAG
+# error I/O HALDIAG pseudo-device driver must be enabled to build this application
+#endif
+
+/* INCLUDES */
+
+#include /* printf */
+#include /* printf */
+#include /* strlen */
+#include /* All the kernel specific stuff */
+#include
+
+#define MWINCLUDECOLORS
+#include "nano-X.h"
+
+#include
+_mw_app("demo", demo, ECOS_MW_APP_PRIORITY, 0);
+
+//
+// Component interfaces
+//
+
+externC int demo_main(int argc, char *argv[]);
+
+/*static*/ void
+demo_thread(CYG_ADDRWORD data)
+{
+ int argc = 1;
+ char *argv[] = {"demo" };
+
+ cyg_thread_delay(10*100);
+ INIT_PER_THREAD_DATA();
+ demo_main(argc, argv);
+}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/ecos_app.c
--- a/packages/services/gfx/mw/current/src/ecos/ecos_app.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/ecos_app.c Fri Apr 23 14:41:29 2010 +0800
@@ -115,7 +115,11 @@
{
int res;
printf("... Mounting JFFS2 on \"/\"\n");
+#ifdef CYGPKG_DEVS_FLASH_SYNTH_V2
+ res = mount( "/dev/flash/0/", "/", "jffs2" );
+#else
res = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" );
+#endif
if (res < 0) {
printf("Mount \"/\" failed - res: %d\n", res);
}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/nanowm_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/nanowm_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/nanowm_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -43,7 +43,7 @@
externC int nanowm_main(int argc, char *argv[]);
-static void
+/*static*/ void
nanowm_thread(CYG_ADDRWORD data)
{
int argc = 0;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/nanox_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/nanox_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/nanox_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int nanox_main(int argc, char *argv[]);
-static void
+/*static*/ void
nanox_thread(CYG_ADDRWORD data)
{
int argc = 0;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/ntetris_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/ntetris_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/ntetris_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int ntetris_main(int argc, char *argv[]);
-static void
+/*static*/ void
ntetris_thread(CYG_ADDRWORD data)
{
int argc = 1;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/world_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/world_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/world_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int world_main(int argc, char *argv[]);
-static void
+/*static*/ void
world_thread(CYG_ADDRWORD data)
{
int argc = 1;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/nanox/srvmain.c
--- a/packages/services/gfx/mw/current/src/nanox/srvmain.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/nanox/srvmain.c Fri Apr 23 14:41:29 2010 +0800
@@ -47,6 +47,7 @@
# include
# ifdef CYGPKG_NET
# define NONETWORK 0
+# define MW_NOSIGNALS 1
# else
# error Not yet supported.
# define NONETWORK 1
@@ -725,9 +726,11 @@
selection_owner.typelist = NULL;
#if !NONETWORK
+#ifndef MW_NOSIGNALS
/* ignore pipe signal, sent when clients exit*/
signal(SIGPIPE, SIG_IGN);
signal(SIGHUP, SIG_IGN);
+#endif
if (GsOpenSocket() < 0) {
EPRINTF("Cannot bind to named socket\n");
+
+static void synth_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c)
+{
+ cyg_fb_fill_block(&FRAMEBUF,x1, y1, x2-x1+1, y2-y1+1, CMWtofb(&FRAMEBUF,c));
+ cyg_fb_synch(&FRAMEBUF,0);
+}
+
+
+static void synth_blit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD w, MWCOORD h,
+ PSD srcpsd, MWCOORD srcx, MWCOORD srcy, long op)
+{
+ /*
+ if (op != 0)
+ {
+ diag_printf("synth_blit(): op = 0x%x not supported\n", op);
+ }
+
+ if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr != frame_format->frame_buffer)
+ {
+ synthCopyRect2Buffer(srcx, srcy, w, h, dstpsd->addr, dstpsd->xres, dstpsd->yres, dstx, dsty);
+ }
+ else if (srcpsd->addr != frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)
+ {
+ synthCopyBuffer2Rect(srcpsd->addr, srcpsd->xres, srcpsd->yres, srcx, srcy, dstx, dsty, w, h);
+ }
+ else if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)
+ {
+ synthCopyRect(srcx, srcy, w, h, dstx, dsty);
+ }
+ else
+ {
+ diag_printf("synth_blit(): Error unsupported operation\n");
+ }
+ */
+ diag_printf("synth_blit(): Error unsupported operation\n");
+}
+
+static void synth_stretchblit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw,
+ MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy,
+ MWCOORD srcw, MWCOORD srch, long op)
+{
+ diag_printf("synth_stretch_blit() not implemented\n");
+}
+
+
+static void synth_getscreeninfo(PSD psd,PMWSCREENINFO psi)
+{
+ psi->rows = psd->yvirtres;
+ psi->cols = psd->xvirtres;
+ psi->planes = psd->planes;
+ psi->bpp = psd->bpp;
+ psi->ncolors = psd->ncolors;
+ psi->pixtype = psd->pixtype;
+ psi->fonts = NUMBER_FONTS;
+ psi->portrait = psd->portrait;
+ psi->fbdriver = true;
+
+ switch (psd->pixtype) {
+ case MWPF_TRUECOLOR332:
+ psi->rmask = 0xE0;
+ psi->gmask = 0x1C;
+ psi->bmask = 0x03;
+ break;
+ case MWPF_TRUECOLOR233:
+ psi->rmask = 0x07;
+ psi->gmask = 0x38;
+ psi->bmask = 0xC0;
+ break;
+ case MWPF_TRUECOLOR555:
+ psi->rmask = 0x7c00;
+ psi->gmask = 0x03e0;
+ psi->bmask = 0x001f;
+ break;
+ case MWPF_TRUECOLOR565:
+ psi->rmask = 0xf800;
+ psi->gmask = 0x07e0;
+ psi->bmask = 0x001f;
+ break;
+ case MWPF_TRUECOLOR0888:
+ psi->rmask = 0xFF0000;
+ psi->gmask = 0x00FF00;
+ psi->bmask = 0x0000FF;
+ break;
+ default:
+ printf("%s - unsupported pixtype\n", __FUNCTION__);
+ psi->rmask = 0xff;
+ psi->gmask = 0xff;
+ psi->bmask = 0xff;
+ break;
+ }
+
+ /* Need to figure out better values possibly */
+ psi->xdpcm = 24; /* assumes screen width of 24 cm */
+ psi->ydpcm = 18; /* assumes screen height of 18 cm */
+}
+
+static void synth_drawarea(PSD psd, driver_gc_t *gc, int op)
+{
+ diag_printf("synth_drawarea() not implemented\n");
+}
+
+
+/*
+ * Initialize memory device with passed parms,
+ * select suitable framebuffer subdriver,
+ * and set subdriver in memory device.
+ */
+MWBOOL synth_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen,
+ int size,void *addr)
+{
+ PSUBDRIVER subdriver;
+
+ /* initialize mem screen driver*/
+ initmemgc(mempsd, w, h, planes, bpp, linelen, size, addr);
+
+ subdriver = &synth_subdriver;
+
+ /* set and initialize subdriver into mem screen driver*/
+ if(!set_subdriver(mempsd, subdriver, TRUE))
+ {
+ diag_printf("set_subdriver() failed\n");
+ return 0;
+ }
+
+ return 1;
+}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/demo_thread.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/demo_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -0,0 +1,53 @@
+#include
+#ifdef CYGPKG_KERNEL
+# include
+#endif
+#ifdef CYGPKG_LIBC
+# include
+#endif
+#ifdef CYGPKG_IO_SERIAL
+# include
+#endif
+
+#ifndef CYGFUN_KERNEL_API_C
+# error Kernel API must be enabled to build this application
+#endif
+
+#ifndef CYGPKG_LIBC_STDIO
+# error C library standard I/O must be enabled to build this application
+#endif
+
+#ifndef CYGPKG_IO_SERIAL_HALDIAG
+# error I/O HALDIAG pseudo-device driver must be enabled to build this application
+#endif
+
+/* INCLUDES */
+
+#include
+#include
+#include
+#include
+#include
+
+#define MWINCLUDECOLORS
+#include "nano-X.h"
+
+#include
+_mw_app("demo", demo, ECOS_MW_APP_PRIORITY, 0);
+
+//
+// Component interfaces
+//
+
+externC int demo_main(int argc, char *argv[]);
+
+/*static*/ void
+demo_thread(CYG_ADDRWORD data)
+{
+ int argc = 1;
+ char *argv[] = {"demo" };
+
+ cyg_thread_delay(10*100);
+ INIT_PER_THREAD_DATA();
+ demo_main(argc, argv);
+}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/ecos_app.c
--- a/packages/services/gfx/mw/current/src/ecos/ecos_app.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/ecos_app.c Fri Apr 23 14:41:29 2010 +0800
@@ -115,7 +115,11 @@
{
int res;
printf("... Mounting JFFS2 on \"/\"\n");
+#ifdef CYGPKG_DEVS_FLASH_SYNTH_V2
+ res = mount( "/dev/flash/0/", "/", "jffs2" );
+#else
res = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" );
+#endif
if (res < 0) {
printf("Mount \"/\" failed - res: %d\n", res);
}
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/nanowm_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/nanowm_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/nanowm_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -43,7 +43,7 @@
externC int nanowm_main(int argc, char *argv[]);
-static void
+/*static*/ void
nanowm_thread(CYG_ADDRWORD data)
{
int argc = 0;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/nanox_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/nanox_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/nanox_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int nanox_main(int argc, char *argv[]);
-static void
+/*static*/ void
nanox_thread(CYG_ADDRWORD data)
{
int argc = 0;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/ntetris_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/ntetris_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/ntetris_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int ntetris_main(int argc, char *argv[]);
-static void
+/*static*/ void
ntetris_thread(CYG_ADDRWORD data)
{
int argc = 1;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/ecos/world_thread.c
--- a/packages/services/gfx/mw/current/src/ecos/world_thread.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/ecos/world_thread.c Fri Apr 23 14:41:29 2010 +0800
@@ -41,7 +41,7 @@
externC int world_main(int argc, char *argv[]);
-static void
+/*static*/ void
world_thread(CYG_ADDRWORD data)
{
int argc = 1;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/nanox/srvmain.c
--- a/packages/services/gfx/mw/current/src/nanox/srvmain.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/nanox/srvmain.c Fri Apr 23 14:41:29 2010 +0800
@@ -47,6 +47,7 @@
# include
# ifdef CYGPKG_NET
# define NONETWORK 0
+# define MW_NOSIGNALS 1
# else
# error Not yet supported.
# define NONETWORK 1
@@ -725,9 +726,11 @@
selection_owner.typelist = NULL;
#if !NONETWORK
+#ifndef MW_NOSIGNALS
/* ignore pipe signal, sent when clients exit*/
signal(SIGPIPE, SIG_IGN);
signal(SIGHUP, SIG_IGN);
+#endif
if (GsOpenSocket() < 0) {
EPRINTF("Cannot bind to named socket\n");
一朝成名 2011年02月24日
强人。说啥也要顶~~~
我以前用ecos做过产品,现在也不怎么用了,不过还是要感谢你为大家做的贡献。。。。
其实ecos跑GUI没太合适的东西,除了Micro X还有民间人移植的minigui
强人。说啥也要顶~~~
我以前用ecos做过产品,现在也不怎么用了,不过还是要感谢你为大家做的贡献。。。。
其实ecos跑GUI没太合适的东西,除了Micro X还有民间人移植的minigui
rickleaf 2011年02月24日
我把minigui,pw和emwin都放上来了,不过emwin和 minigui并不是opensource啊
我把minigui,pw和emwin都放上来了,不过emwin和 minigui并不是opensource啊
sw9518 2011年04月21日
牛啊
牛啊
系统默认的microwindows有比较多的bug,本人把自己的patch放出了,给大家一起学习。diff -r 418d34334c77 packages/services/gfx/mw/current/cdl/microwindows.cdl
--- a/packages/services/gfx/mw/current/cdl/microwindows.cdl Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/cdl/microwindows.cdl Fri Apr 23 14:41:29 2010 +0800
@@ -199,6 +199,66 @@
}
+ # ecos Linux synth drivers
+ cdl_component CYGPKG_MICROWINDOWS_SYNTH {
+ display "Build MicroWindows for synthetic target"
+ flavor none
+ active_if (CYGPKG_HAL_SYNTH && !CYGBLD_MICROWINDOWS_VNC_DRIVERS)
+ description \
+ "This option builds the drivers for the synthetic target. The synthetic
+ then provides a virtual screen."
+
+ compile \
+ drivers/scr_synth_ecos.c \
+ drivers/kbd_null.c \
+ drivers/mou_null.c
+ requires CYGPKG_IO_FRAMEBUF
+ requires CYGBLD_MICROWINDOWS_ECOS
+ requires CYGBLD_MICROWINDOWS_NANOWM
+ requires CYGBLD_MICROWINDOWS_NANOX_DEMOS
+ requires !CYGBLD_MICROWINDOWS_ARM_DRIVERS
+ cdl_option CYGIMP_MICROWINDOWS_TRUECOLOR0888 {
+ display "Assume 32 bits per pixel, RGB == 0888"
+ implements CYGINT_MICROWINDOWS_SYNTH_DRIVER
+ default_value 1
+ requires { is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR0888 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR565 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR555 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR332 ") }
+ }
+ cdl_option CYGIMP_MICROWINDOWS_TRUECOLOR565 {
+ display "Assume 16 bits per pixel, RGB == 565"
+ implements CYGINT_MICROWINDOWS_SYNTH_DRIVER
+ default_value 0
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR0888 ") }
+ requires { is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR565 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR555 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR332 ") }
+ }
+ cdl_option CYGIMP_MICROWINDOWS_TRUECOLOR555 {
+ display "Assume 16 bits per pixel, RGB == 555"
+ implements CYGINT_MICROWINDOWS_SYNTH_DRIVER
+ default_value 0
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR0888 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR565 ") }
+ requires { is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR555 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR332 ") }
+ }
+ cdl_option CYGIMP_MICROWINDOWS_TRUECOLOR332 {
+ display "Assume 8 bits per pixel, RGB == 332"
+ implements CYGINT_MICROWINDOWS_SYNTH_DRIVER
+ default_value 0
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR0888 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR565 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR555 ") }
+ requires { is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR332 ") }
+ }
+ cdl_interface CYGINT_MICROWINDOWS_SYNTH_DRIVER {
+ display "Number of active synthic graphics drivers"
+ requires { CYGINT_MICROWINDOWS_SYNTH_DRIVER == 1 }
+ }
+ }
+
cdl_component CYGPKG_MICROWINDOWS_PC {
display "Build options for PC hardware"
flavor none
@@ -255,7 +315,7 @@
default_value 0
compile drivers/scr_bios.c drivers/vgainit.c drivers/vgaplan4.c drivers/memplan4.c
requires { is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_PALETTE ") }
- requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR0888 ") }
+ requires { !is_substr(CYGPKG_MICROWINDOWS_CFLAGS_ADD, " -DMWPIXEL_FORMAT=MWPF_TRUECOLOR565 ") }
}
cdl_interface CYGINT_MICROWINDOWS_PC_DRIVER {
@@ -313,6 +373,14 @@
compile demos/nanox/ntetris.c
compile -library=libextras.a ecos/ntetris_thread.c
}
+
+ cdl_option CYGBLD_MICROWINDOWS_NANOX_DEMOS_DEMO {
+ display "Include 'demo' demo"
+ default_value 0
+ no_define
+ compile demos/nanox/demo.c
+ compile -library=libextras.a ecos/demo_thread.c
+ }
}
cdl_component CYGPKG_MICROWINDOWS_OPTIONS {
diff -r 418d34334c77 packages/services/gfx/mw/current/src/demos/nanowm/wlist.c
--- a/packages/services/gfx/mw/current/src/demos/nanowm/wlist.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/demos/nanowm/wlist.c Fri Apr 23 14:41:29 2010 +0800
@@ -13,7 +13,7 @@
#include "nanowm.h"
-static win *windows = NULL;
+/*static*/ win *windows = NULL;
/*
* Find the windowlist entry for the specified window ID and return a pointer
diff -r 418d34334c77 packages/services/gfx/mw/current/src/demos/nanox/demo.c
--- a/packages/services/gfx/mw/current/src/demos/nanox/demo.c Thu Apr 01 13:17:10 2010 +0000
+++ b/packages/services/gfx/mw/current/src/demos/nanox/demo.c Fri Apr 23 14:41:29 2010 +0800
@@ -6,10 +6,15 @@
#define MWINCLUDECOLORS
#include "nano-X.h"
+
#if DOS_TURBOC
unsigned _stklen = 32768;
#endif
+#if defined(MSDOS) || defined(__ECOS)
+#include
+#endif
+
/*
* Definitions to make it easy to define cursors
*/
@@ -47,7 +52,7 @@
void do_buttonup(GR_EVENT_BUTTON *bp);
void do_motion(GR_EVENT_MOUSE *mp);
void do_keystroke(GR_EVENT_KEYSTROKE *kp);
-void do_exposure(GR_EVENT_EXPOSURE *ep);
+static void do_exposure(GR_EVENT_EXPOSURE *ep);
void do_focusin(GR_EVENT_GENERAL *gp);
void do_focusout(GR_EVENT_GENERAL *gp);
void do_enter(GR_EVENT_GENERAL *gp);
@@ -56,8 +61,13 @@
/* routine to handle errors */
void errorcatcher(GR_EVENT *ep);
+#ifdef __ECOS
int
-main(int argc,char **argv)
+demo_main(int argc, char **argv)
+#else
+int
+main(int argc, char **argv)
+#endif
{
GR_EVENT event; /* current event */
GR_BITMAP bitmap1fg; /* bitmaps for first cursor */
@@ -73,8 +83,14 @@
GrReqShmCmds(655360);
GrGetScreenInfo(&si);
+#ifdef __ECOS
+/* 240x320 screen*/
+COLS = si.cols - 10;
+ROWS = si.rows - 40;
+#else
COLS = si.cols - 40;
ROWS = si.rows - 80;
+#endif
/* print error, but don't exit*/
GrSetErrorHandler(errorcatcher);
@@ -375,7 +391,7 @@
/*
* Here when an exposure event occurs.
*/
-void
+static void
do_exposure(GR_EVENT_EXPOSURE *ep)
{
GR_POINT points;
diff -r 418d34334c77 packages/services/gfx/mw/current/src/drivers/scr_synth_ecos.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/services/gfx/mw/current/src/drivers/scr_synth_ecos.c Fri Apr 23 14:41:29 2010 +0800
@@ -0,0 +1,444 @@
+//==========================================================================
+//
+// scr_synth_ecos.c
+//
+//
+//
+//==========================================================================
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later
+// version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with eCos; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// As a special exception, if other files instantiate templates or use
+// macros or inline functions from this file, or you compile this file
+// and link it with other works to produce a work based on this file,
+// this file does not by itself cause the resulting work to be covered by
+// the GNU General Public License. However the source code for this file
+// must still be made available in accordance with section (3) of the GNU
+// General Public License v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): Ricky Wu
+// Contributors:
+// Date: 2010-04-16
+// Purpose:
+// Description: Microwindows screen driver for synth server on eCos
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+
+
+#define _GNU_SOURCE 1
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "device.h"
+#include "genfont.h"
+#include "genmem.h"
+
+
+static cyg_ucount32 colours;
+/* In genmem.c*/
+MWBOOL set_subdriver(PSD psd, PSUBDRIVER subdriver, MWBOOL init);
+
+/* Prototypes for driver functions */
+static int synth_init(PSD psd);
+static PSD synth_open(PSD psd);
+static void synth_close(PSD psd);
+static void synth_getscreeninfo(PSD psd,PMWSCREENINFO psi);
+static void synth_drawpixel(PSD psd,MWCOORD x, MWCOORD y, MWPIXELVAL c);
+static MWPIXELVAL synth_readpixel(PSD psd,MWCOORD x, MWCOORD y);
+static void synth_drawhorizline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c);
+static void synth_drawvertline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c);
+static void synth_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c);
+static void synth_blit(PSD , MWCOORD, MWCOORD, MWCOORD, MWCOORD, PSD, MWCOORD, MWCOORD, long);
+static void synth_stretchblit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw,
+ MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy,
+ MWCOORD srcw, MWCOORD srch, long op);
+static void synth_drawarea(PSD psd, driver_gc_t *gc, int op);
+MWBOOL synth_mapmemgc(PSD, MWCOORD, MWCOORD, int, int, int, int, void *);
+
+
+#define FRAMEBUF cyg_synth_fb0
+
+#define BLACK cyg_fb_make_colour(&FRAMEBUF, 0, 0, 0)
+#define WHITE cyg_fb_make_colour(&FRAMEBUF, 255, 255, 255)
+#define RED cyg_fb_make_colour(&FRAMEBUF, 255, 0, 0)
+#define GREEN cyg_fb_make_colour(&FRAMEBUF, 0, 255, 0)
+#define BLUE cyg_fb_make_colour(&FRAMEBUF, 0, 0, 255)
+#define YELLOW cyg_fb_make_colour(&FRAMEBUF, 255, 255, 80)
+
+
+
+SCREENDEVICE scrdev = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL,
+ synth_open,
+ synth_close,
+ synth_getscreeninfo,
+ NULL,
+ synth_drawpixel, /* DrawPixel subdriver*/
+ synth_readpixel, /* ReadPixel subdriver*/
+ synth_drawhorizline, /* DrawHorzLine subdriver*/
+ synth_drawvertline, /* DrawVertLine subdriver*/
+ synth_fillrect, /* FillRect subdriver*/
+ gen_fonts,
+ synth_blit, /* Blit subdriver*/
+ NULL, /* PreSelect*/
+ NULL, /* DrawArea subdriver*/
+ NULL, /* SetIOPermissions*/
+ gen_allocatememgc,
+ synth_mapmemgc,
+ gen_freememgc,
+ synth_stretchblit, /* StretchBlit subdriver*/
+ NULL /* SetPortrait*/
+};
+
+SUBDRIVER synth_subdriver = {
+ synth_init,
+ synth_drawpixel,
+ synth_readpixel,
+ synth_drawhorizline,
+ synth_drawvertline,
+ synth_fillrect,
+ synth_blit,
+ synth_drawarea,
+ synth_stretchblit
+};
+
+/* Static variables*/
+static int status; /* 0=never inited, 1=once inited, 2=inited. */
+//static synth_frame_format_t *frame_format;
+
+/* Calc linelen and mmap size, return 0 on fail*/
+static int synth_init(PSD psd)
+{
+ if (!psd->size)
+ {
+ psd->size = psd->yres * psd->xres * psd->bpp / 8;
+ /* convert linelen from byte to pixel len for bpp 16, 24, 32*/
+ psd->linelen = psd->xres;
+ }
+
+ return 1;
+}
+
+static cyg_fb_colour CMWtofb(cyg_fb* fb,MWPIXELVAL c)
+{
+ if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_8BPP_TRUE_332)
+ {
+ return cyg_fb_make_colour(fb, (c&0xe0)>>(3+2), (c&0x1c)>>2, (c&0x03));
+ }
+ else if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_555)
+ {
+ return cyg_fb_make_colour(fb, (c&0x7c00)>>(5+5), (c&0x03e0)>>5, (c&0x001f));
+ }
+ else if(CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_565)
+ {
+ return cyg_fb_make_colour(fb, (c&0xf800)>>(6+5), (c&0x07e0)>>5, (c&0x001f));
+ }
+ else if(CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_32BPP_TRUE_0888)
+ {
+ return cyg_fb_make_colour(fb, (c&0xFF0000)>>(8+8), (c&0x00ff00)>>8, (c&0x0000ff));
+ }
+}
+
+static MWPIXELVAL CFBtoMW(cyg_fb* fb,cyg_fb_colour fb_colour)
+{
+ cyg_ucount8 r,g,b;
+ MWPIXELVAL mMWPIXELVAL=0;
+ cyg_fb_break_colour(fb,fb_colour,&r, &g, &b);
+ if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_8BPP_TRUE_332)
+ {
+ mMWPIXELVAL|=r;
+ mMWPIXELVAL<<=3;
+ mMWPIXELVAL|=g;
+ mMWPIXELVAL<<=2;
+ mMWPIXELVAL|=b;
+ return mMWPIXELVAL;
+ }
+ else if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_555)
+ {
+ mMWPIXELVAL|=r;
+ mMWPIXELVAL<<=5;
+ mMWPIXELVAL|=g;
+ mMWPIXELVAL<<=5;
+ mMWPIXELVAL|=b;
+ return mMWPIXELVAL;
+ }
+ else if(CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_565)
+ {
+ mMWPIXELVAL|=r;
+ mMWPIXELVAL<<=6;
+ mMWPIXELVAL|=g;
+ mMWPIXELVAL<<=5;
+ mMWPIXELVAL|=b;
+ return mMWPIXELVAL;
+ }
+ else if(CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_32BPP_TRUE_0888)
+ {
+ mMWPIXELVAL|=r;
+ mMWPIXELVAL<<=8;
+ mMWPIXELVAL|=g;
+ mMWPIXELVAL<<=8;
+ mMWPIXELVAL|=b;
+ return mMWPIXELVAL;
+ }
+
+}
+
+/* Initialise the synth framebuffer */
+static PSD synth_open(PSD psd)
+{
+ /* Get frame format details */
+ cyg_fb_on(&FRAMEBUF);
+
+ psd->xres = psd->xvirtres = CYG_FB_fb0_WIDTH;
+ psd->yres = psd->yvirtres = CYG_FB_fb0_HEIGHT;
+ psd->portrait = MWPORTRAIT_NONE;
+ psd->planes = 1; /* Should probably find out what this means */
+
+
+ if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_8BPP_TRUE_332)
+ {
+ psd->bpp = 8;
+ psd->ncolors = 0xFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR332;
+ }
+ else if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_555)
+ {
+ psd->bpp = 16;
+ psd->ncolors = 0x7FFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR555;
+ }
+ else if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_16BPP_TRUE_565)
+ {
+ psd->bpp = 16;
+ psd->ncolors = 0xFFFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR565;
+ }
+ else if (CYG_FB_fb0_FORMAT==CYG_FB_FORMAT_32BPP_TRUE_0888)
+ {
+ psd->bpp = 32;
+ psd->ncolors = 0xFFFFFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR0888;
+ }
+ else
+ {
+ EPRINTF("Unsupported display type\n");
+ goto fail;
+ }
+
+ psd->linelen = CYG_FB_fb0_WIDTH * psd->bpp / 8;; /* What is linelen? - linelen in bytes for now...*/
+ psd->size = psd->xres * psd->yres * psd->bpp / 8;
+ psd->flags = PSF_SCREEN | PSF_HAVEBLIT;
+ psd->addr = CYG_FB_fb0_BASE; /* Test */
+// psd->addr = NULL; /* We do not want MW to access the frame buffer directly */
+
+
+ /* We always use our own subdriver */
+ psd->orgsubdriver = &synth_subdriver;
+
+
+ status = 2;
+ return psd; /* success*/
+
+ fail:
+ return NULL;
+}
+
+
+/* Close framebuffer*/
+static void synth_close(PSD psd)
+{
+ EPRINTF("%s - NOT IMPLEMENTED\n", __FUNCTION__);
+}
+
+
+static void synth_drawpixel(PSD psd, MWCOORD x, MWCOORD y, MWPIXELVAL c)
+{
+ cyg_fb_write_pixel(&FRAMEBUF,x, y, CMWtofb(&FRAMEBUF,c));
+ cyg_fb_synch(&FRAMEBUF,0);
+}
+
+
+static MWPIXELVAL synth_readpixel(PSD psd, MWCOORD x, MWCOORD y)
+{
+ return CFBtoMW(&FRAMEBUF,cyg_fb_read_pixel(&FRAMEBUF,x,y));
+}
+
+
+static void synth_drawhorizline(PSD psd, MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c)
+{
+ cyg_fb_write_hline(&FRAMEBUF,x1, y,x2-x1+1, CMWtofb(&FRAMEBUF,c));
+ cyg_fb_synch(&FRAMEBUF,0);
+}
+
+
+static void synth_drawvertline(PSD psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c)
+{
+ cyg_fb_write_vline(&FRAMEBUF,x, y1, y2-y1+1, CMWtofb(&FRAMEBUF,c));
+ cyg_fb_synch(&FRAMEBUF,0);
+
+}
+