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日
系统默认的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);
+
+}
+
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");
一朝成名 2011年02月24日
强人。说啥也要顶~~~

我以前用ecos做过产品,现在也不怎么用了,不过还是要感谢你为大家做的贡献。。。。
其实ecos跑GUI没太合适的东西,除了Micro X还有民间人移植的minigui
rickleaf 2011年02月24日
我把minigui,pw和emwin都放上来了,不过emwin和 minigui并不是opensource啊
sw9518 2011年04月21日
牛啊