This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
VNC - MicroWindows updates
- From: Gary Thomas <gary at mlbassoc dot com>
- To: eCos patches <ecos-patches at sources dot redhat dot com>
- Date: 28 Aug 2003 04:51:16 -0600
- Subject: VNC - MicroWindows updates
- Organization: MLB Associates
Oops, I forgot these the first time around - changes to let
MicroWindows run in the VNC environment.
--
Gary Thomas <gary@mlbassoc.com>
MLB Associates
Index: services/gfx/mw/current/ChangeLog
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/services/gfx/mw/current/ChangeLog,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -5 -p -r1.4 -r1.5
--- services/gfx/mw/current/ChangeLog 27 Jul 2003 10:23:33 -0000 1.4
+++ services/gfx/mw/current/ChangeLog 28 Aug 2003 10:30:33 -0000 1.5
@@ -1,5 +1,23 @@
+2003-08-22 Chris Garry <cgarry@sweeneydesign.co.uk>
+
+ * cdl/microwindows.cdl
+ Added support for VNC server.
+
+ * src/include/device.h:
+ Remove COLOR2PIXEL555 hack for strongarm lcd when VNC server screen
+ driver is used.
+
+ * src/nanox/clientfb.c:
+ Removed assumption that CYGPKG_HAL_ARM means target is a strongarm
+ lcd when VNC server is used.
+
+ * src/drivers/kbd_vnc_ecos.c:
+ * src/drivers/mou_vnc_ecos.c:
+ * src/drivers/scr_vnc_ecos.c:
+ New keyboard, mouse and screen drivers for VNC server.
+
2003-07-21 Chris Garry <cgarry@sweeneydesign.co.uk>
* src/nanox/client.c
Set the length field in the sockaddr_in structure name before
trying to connect to the server.
Index: services/gfx/mw/current/cdl/microwindows.cdl
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/services/gfx/mw/current/cdl/microwindows.cdl,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -5 -p -r1.4 -r1.5
--- services/gfx/mw/current/cdl/microwindows.cdl 13 Jun 2003 04:16:27 -0000 1.4
+++ services/gfx/mw/current/cdl/microwindows.cdl 28 Aug 2003 10:30:34 -0000 1.5
@@ -141,20 +141,42 @@ cdl_package CYGPKG_MICROWINDOWS {
# These files are unique to eCos
compile ecos/ecos_init.c ecos/nanox_thread.c
}
+ # eCos VNC server drivers
+ cdl_option CYGBLD_MICROWINDOWS_VNC_DRIVERS {
+ display "Build MicroWindows VNC server drivers"
+ default_value 0
+ description \
+ "This option builds the drivers for the VNC server. The VNC server
+ then provides a virtual screen, keyboard and mouse for MicroWindows."
+
+ compile \
+ drivers/scr_vnc_ecos.c \
+ drivers/kbd_vnc_ecos.c \
+ drivers/mou_vnc_ecos.c
+
+ requires CYGBLD_MICROWINDOWS_ECOS
+ requires CYGBLD_MICROWINDOWS_NANOWM
+ requires CYGPKG_VNC_SERVER
+ requires !CYGBLD_MICROWINDOWS_ARM_DRIVERS
+ requires CYGPKG_VNC_SERVER_BUILD_MOUSE_DRIVER
+ requires CYGPKG_VNC_SERVER_BUILD_KEYBOARD_DRIVER
+ }
+
# eCos ARM drivers
cdl_option CYGBLD_MICROWINDOWS_ARM_DRIVERS {
display "Build MicroWindows ARM drivers"
default_value CYGPKG_HAL_ARM
compile \
drivers/scr_ecos.c \
drivers/kbd_ipaq.c \
drivers/mou_ipaq.c
+
requires CYGBLD_MICROWINDOWS_ECOS
requires CYGBLD_MICROWINDOWS_NANOWM
requires CYGBLD_MICROWINDOWS_NXKBD
requires CYGBLD_MICROWINDOWS_NANOX_DEMOS
@@ -165,11 +187,11 @@ cdl_package CYGPKG_MICROWINDOWS {
}
cdl_component CYGPKG_MICROWINDOWS_PC {
display "Build options for PC hardware"
flavor none
- active_if CYGPKG_HAL_I386_PCMB
+ active_if (CYGPKG_HAL_I386_PCMB && !CYGBLD_MICROWINDOWS_VNC_DRIVERS)
compile drivers/ps2kbdmou_ecos.c
requires CYGBLD_MICROWINDOWS_ECOS
cdl_option CYGIMP_MICROWINDOWS_PCSVGA32 {
Index: services/gfx/mw/current/include/microwin/device.h
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/services/gfx/mw/current/include/microwin/device.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -5 -p -r1.1 -r1.2
--- services/gfx/mw/current/include/microwin/device.h 20 May 2002 22:25:28 -0000 1.1
+++ services/gfx/mw/current/include/microwin/device.h 28 Aug 2003 10:30:34 -0000 1.2
@@ -6,10 +6,11 @@
* Engine-level Screen, Mouse and Keyboard device driver API's and types
*
* Contents of this file are not for general export
*/
#include "mwtypes.h" /* public export typedefs*/
+#include <pkgconf/microwindows.h> /* CYGBLD_MICROWINDOWS_VNC_DRIVERS */
/* Changeable limits and options*/
#define ALPHABLEND 1 /* =1 to include blending code*/
#define DYNAMICREGIONS 1 /* =1 to use MWCLIPREGIONS*/
#define HAVEFLOAT 1 /* =1 incl float, GdArcAngle*/
@@ -289,14 +290,16 @@ typedef struct {
/* create 16 bit 5/6/5 format pixel from RGB colorval (0x00BBGGRR)*/
#define COLOR2PIXEL565(c) \
((((c) & 0xf8) << 8) | (((c) & 0xfc00) >> 5) | (((c) & 0xf80000) >> 19))
/* create 16 bit 5/5/5 format pixel from RGB colorval (0x00BBGGRR)*/
-#if 0
+#ifdef CYGBLD_MICROWINDOWS_VNC_DRIVERS
+ /* Real RGB555 data is required for VNC drivers */
#define COLOR2PIXEL555(c) \
((((c) & 0xf8) << 7) | (((c) & 0xf800) >> 6) | (((c) & 0xf80000) >> 19))
#else
+ /* BGR555 data is required strongarm LCD */
#define COLOR2PIXEL555(c) \
((((c) & 0xf8) >> (3-0)) | (((c) & 0xf800) >> (11-5)) | (((c) & 0xf80000) >> (19-10)))
#endif
/* create 8 bit 3/3/2 format pixel from RGB colorval (0x00BBGGRR)*/
Index: services/gfx/mw/current/src/drivers/kbd_vnc_ecos.c
===================================================================
RCS file: services/gfx/mw/current/src/drivers/kbd_vnc_ecos.c
diff -N services/gfx/mw/current/src/drivers/kbd_vnc_ecos.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ services/gfx/mw/current/src/drivers/kbd_vnc_ecos.c 28 Aug 2003 10:34:35 -0000 1.1
@@ -0,0 +1,363 @@
+//==========================================================================
+//
+// kbd_vnc_ecos.c
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, 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.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): Chris Garry <cgarry@sweeneydesign.co.uk>
+// Contributors:
+// Date: 2003-08-22
+// Purpose:
+// Description: Microwindows keyboard driver for VNC server on eCos
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pkgconf/vnc_server.h> /* CYGDAT_VNC_SERVER_KEYBOARD_NAME */
+#include "device.h"
+
+static int vnc_Open(KBDDEVICE *pkd);
+static void vnc_Close(void);
+static void vnc_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers);
+static int vnc_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode);
+
+KBDDEVICE kbddev = {
+ vnc_Open,
+ vnc_Close,
+ vnc_GetModifierInfo,
+ vnc_Read,
+ NULL
+};
+
+static int kbd_fd; /* File descriptor for keyboard */
+static MWKEYMOD current_mods; /* Current keyboard modifiers */
+
+
+static int vnc_Open(KBDDEVICE *pkd)
+{
+ /* Open the keyboard and get it ready for use */
+ kbd_fd = open(CYGDAT_VNC_SERVER_KEYBOARD_NAME, O_RDONLY | O_NONBLOCK);
+
+ if (kbd_fd < 0)
+ {
+ EPRINTF("%s - Can't open keyboard!\n", __FUNCTION__);
+ return -1;
+ }
+
+ current_mods = MWKMOD_NONE; /* Initialise the current modifiers */
+
+ /* Keyboard opened okay - return file descriptor */
+ return(kbd_fd);
+}
+
+
+static void vnc_Close(void)
+{
+ /* Close the mouse device. */
+ if (kbd_fd >= 0)
+ {
+ close(kbd_fd);
+ }
+
+ kbd_fd = -1;
+}
+
+
+static void vnc_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers)
+{
+ if (modifiers)
+ {
+ *modifiers = MWKMOD_CTRL | MWKMOD_SHIFT | MWKMOD_ALT | MWKMOD_META
+ | MWKMOD_CAPS | MWKMOD_NUM | MWKMOD_SCR;
+ }
+
+ *curmodifiers = current_mods;
+}
+
+
+/*
+ * This reads one keystroke from the keyboard, and the current state of
+ * the mode keys (ALT, SHIFT, CTRL). Returns -1 on error, 1 if key is
+ * pressed, and 0 if key was released. This is a non-blocking call.
+ */
+static int vnc_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode)
+{
+ cyg_uint8 keystroke_buff[4]; /* Smal buffer to hold data for 1 keystroke */
+ int bytes_read;
+
+ /* Try to read the data for 1 keystroke event from the keyboard device */
+ bytes_read = read(kbd_fd, keystroke_buff, 4);
+
+ /* Each keystroke event generates 4 x cyg_uint8 values in the queue
+ * 0: Padding - always zero
+ * 1: Key pressed (1 when key is pressed)
+ * 2: Keysym value MSB
+ * 3: Keysym value LSB
+ */
+
+ if (bytes_read != 4)
+ {
+ return 0;
+ }
+
+ /* Log modifier bits and convert Keysym values to Unicode */
+ switch(keystroke_buff[2]*256 + keystroke_buff[3])
+ {
+ case 0x0000 ... 0x007F: /* Standard ASCII */
+ *kbuf = keystroke_buff[3];
+ break;
+
+ case 0x0080 ... 0x00FF: /* Not so sure what to do with these - but it works for '£' */
+ *kbuf = keystroke_buff[3];
+ break;
+
+ case 0xFF08: /* BACKSPACE */
+ *kbuf = MWKEY_BACKSPACE;
+ break;
+
+ case 0xFF09: /* TAB */
+ *kbuf = MWKEY_TAB;
+ break;
+
+ case 0xFF0D: /* ENTER */
+ *kbuf = MWKEY_ENTER;
+ break;
+
+ case 0xFF13: /* BREAK */
+ *kbuf = MWKEY_BREAK;
+ break;
+
+ case 0xFF14: /* Scroll lock */
+ if (!keystroke_buff[0]) /* Key released */
+ current_mods ^= MWKMOD_SCR;
+ /* Note we invert the Scroll lock bit on each Scroll lock release event */
+ *kbuf = MWKEY_SCROLLOCK;
+ break;
+
+ case 0xFF1B: /* ESC */
+ *kbuf = MWKEY_ESCAPE;
+ break;
+
+ case 0xFF50: /* HOME */
+ *kbuf = MWKEY_HOME;
+ break;
+
+ case 0xFF51: /* LEFT ARROW */
+ *kbuf = MWKEY_LEFT;
+ break;
+
+ case 0xFF52: /* UP ARROW */
+ *kbuf = MWKEY_UP;
+ break;
+
+ case 0xFF53: /* RIGHT ARROW */
+ *kbuf = MWKEY_RIGHT;
+ break;
+
+ case 0xFF54: /* DOWN ARROW */
+ *kbuf = MWKEY_DOWN;
+ break;
+
+ case 0xFF55: /* PAGE UP */
+ *kbuf = MWKEY_PAGEUP;
+ break;
+
+ case 0xFF56: /* PAGE DOWN */
+ *kbuf = MWKEY_PAGEDOWN;
+ break;
+
+ case 0xFF57: /* END */
+ *kbuf = MWKEY_END;
+ break;
+
+ case 0xFF61: /* PRINT SCREEN */
+ *kbuf = MWKEY_PRINT;
+ break;
+
+ case 0xFF63: /* INSERT */
+ *kbuf = MWKEY_INSERT;
+ break;
+
+ case 0xFF7F: /* NUM lock */
+ if (!keystroke_buff[0]) /* Key released */
+ current_mods ^= MWKMOD_NUM;
+ /* Note we invert the NUM lock bit on each NUN lock release event */
+
+ *kbuf = MWKEY_NUMLOCK;
+ break;
+
+ case 0xFFAA: /* KEYPAD * */
+ *kbuf = MWKEY_KP_MULTIPLY;
+ break;
+
+ case 0xFFAB: /* KEYPAD + */
+ *kbuf = MWKEY_KP_PLUS;
+ break;
+
+ case 0xFFAD: /* KEYPAD - */
+ *kbuf = MWKEY_KP_MINUS;
+ break;
+
+ case 0xFFAE: /* KEYPAD . */
+ *kbuf = MWKEY_KP_PERIOD;
+ break;
+
+ case 0xFFAF: /* KEYPAD / */
+ *kbuf = MWKEY_KP_DIVIDE;
+ break;
+
+ case 0xFFB0 ... 0xFFB9: /* Numeric keypad 0 to 9 */
+ /* We can calculate this since both the Keysym codes and unicodes are consecutive */
+ *kbuf = MWKEY_KP0 + (keystroke_buff[2]*256 + keystroke_buff[3]) - 0xFFB0;
+ break;
+
+ case 0xFFBE ... 0xFFC9: /* F1 to F12 */
+ /* We can calculate this since both the Keysym codes and unicodes are consecutive */
+ *kbuf = MWKEY_F1 + (keystroke_buff[2]*256 + keystroke_buff[3]) - 0xFFBE;
+ break;
+
+ case 0xFFE1: /* SHIFT left*/
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_LSHIFT; /* Set SHIFT modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_LSHIFT); /* Clear SHIFT modifier bit */
+
+ *kbuf = MWKEY_LSHIFT;
+ break;
+
+ case 0xFFE2: /* SHIFT right */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_RSHIFT; /* Set SHIFT modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_RSHIFT); /* Clear SHIFT modifier bit */
+
+ *kbuf = MWKEY_RSHIFT;
+ break;
+
+ case 0xFFE3: /* CTRL left */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_LCTRL; /* Set CTRL modifier bit */
+ else
+ {
+ /* Clear CTRL modifier bit */
+ current_mods &= (0xFFFF ^ MWKMOD_LCTRL);
+ }
+
+ *kbuf = MWKEY_LCTRL;
+ break;
+
+ case 0xFFE4: /* CTRL right */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_RCTRL; /* Set CTRL modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_RCTRL); /* Clear CTRL modifier bit */
+
+ *kbuf = MWKEY_RCTRL;
+ break;
+
+ case 0xFFE5: /* CAPS lock */
+ if (!keystroke_buff[0]) /* Key released */
+ current_mods ^= MWKMOD_CAPS;
+ /* Note we invert the CAPS lock bit on each CAPS lock release event */
+
+ *kbuf = MWKEY_CAPSLOCK;
+ break;
+
+ case 0xFFE7: /* META Left */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_LMETA; /* Set META modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_LMETA); /* Clear META modifier bit */
+
+ *kbuf = MWKEY_LMETA;
+ break;
+
+ case 0xFFE8: /* META Right */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_RMETA; /* Set META modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_RMETA); /* Clear META modifier bit */
+
+ *kbuf = MWKEY_RMETA;
+ break;
+
+ case 0xFFE9: /* ALT left */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_LALT; /* Set ALT modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_LALT); /* Clear ALT modifier bit */
+
+ *kbuf = MWKEY_LALT;
+ break;
+
+ case 0xFFEA: /* ALT right */
+ if (keystroke_buff[1]) /* Key pressed */
+ current_mods |= MWKMOD_RALT; /* Set ALT modifier bit */
+ else
+ current_mods &= (0xFFFF ^ MWKMOD_RALT); /* Clear ALT modifier bit */
+
+ *kbuf = MWKEY_RALT;
+ break;
+
+ case 0xFFFF: /* DELETE */
+ *kbuf = MWKEY_DELETE;
+ break;
+
+ default:
+ *kbuf = MWKEY_UNKNOWN;
+ }
+
+ *modifiers = current_mods;
+ *scancode = 0; /* Scan code not supported because this is just a virtual device */
+
+ if (keystroke_buff[1])
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
Index: services/gfx/mw/current/src/drivers/mou_vnc_ecos.c
===================================================================
RCS file: services/gfx/mw/current/src/drivers/mou_vnc_ecos.c
diff -N services/gfx/mw/current/src/drivers/mou_vnc_ecos.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ services/gfx/mw/current/src/drivers/mou_vnc_ecos.c 28 Aug 2003 10:34:35 -0000 1.1
@@ -0,0 +1,179 @@
+//==========================================================================
+//
+// mou_vnc_ecos.c
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, 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.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): Chris Garry <cgarry@sweeneydesign.co.uk>
+// Contributors:
+// Date: 2003-08-22
+// Purpose:
+// Description: Microwindows mouse driver for VNC server on eCos
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <math.h>
+#include <sys/ioctl.h>
+#include <pkgconf/vnc_server.h> /* CYGDAT_VNC_SERVER_MOUSE_NAME */
+#include "device.h"
+
+static int vnc_Open(MOUSEDEVICE *pmd);
+static void vnc_Close(void);
+static int vnc_GetButtonInfo(void);
+static void vnc_GetDefaultAccel(int *pscale,int *pthresh);
+static int vnc_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb);
+
+static int mouse_fd = -1;
+
+/* Hack extern to used when hiding the mouse cursor
+ * There needs to be a better way to do this
+*/
+extern SCREENDEVICE scrdev;
+
+MOUSEDEVICE mousedev = {
+ vnc_Open,
+ vnc_Close,
+ vnc_GetButtonInfo,
+ vnc_GetDefaultAccel,
+ vnc_Read,
+ NULL
+};
+
+
+static int vnc_Open(MOUSEDEVICE *pmd)
+{
+ mouse_fd = open(CYGDAT_VNC_SERVER_MOUSE_NAME, O_RDONLY | O_NONBLOCK);
+ if (mouse_fd < 0)
+ {
+ EPRINTF("Error %d opening VNC mouse\n", errno);
+ return -1;
+ }
+
+// GdHideCursor(&scrdev);
+ return mouse_fd;
+}
+
+static void vnc_Close(void)
+{
+ /* Close the mouse device. */
+ if (mouse_fd >= 0)
+ {
+ close(mouse_fd);
+ }
+
+ mouse_fd = -1;
+}
+
+static int vnc_GetButtonInfo(void)
+{
+ /* Get mouse buttons supported */
+ return (MWBUTTON_L + MWBUTTON_R);
+}
+
+static void vnc_GetDefaultAccel(int *pscale,int *pthresh)
+{
+ /*
+ * Get default mouse acceleration settings
+ * Just return something inconspicuous for now.
+ */
+// diag_printf("Mouse: vnc_GetDefaultAccel()\n");
+ *pscale = 3;
+ *pthresh = 5;
+}
+
+static int vnc_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb)
+{
+ /* Read a mouse event */
+ cyg_uint8 data[8];
+ int bytes_read;
+
+ bytes_read = read(mouse_fd, data, 8);
+
+ if (bytes_read != sizeof(data))
+ {
+ if (errno == EINTR || errno == EAGAIN)
+ {
+ return 0;
+ }
+ /*
+ * kernel driver bug: select returns read available,
+ * but read returns -1
+ * we return 0 here to avoid GsError above
+ */
+ /*return -1;*/
+
+ return 0;
+ }
+
+ *px = data[2]*256 + data[3];
+ *py = data[4]*256 + data[5];
+ *pb = 0;
+ if (data[1] & 0x01)
+ {
+ *pb += MWBUTTON_L;
+ }
+ if (data[1] & 0x04)
+ {
+ *pb += MWBUTTON_R;
+ }
+
+ *pz = 0;
+
+ return 2;
+
+#if 0
+ if(! *pb )
+ {
+ return 1; /* Don't have button data */
+ }
+ else
+ {
+ return 2; /* Have full set of data */
+ }
+#endif
+
+}
Index: services/gfx/mw/current/src/drivers/scr_vnc_ecos.c
===================================================================
RCS file: services/gfx/mw/current/src/drivers/scr_vnc_ecos.c
diff -N services/gfx/mw/current/src/drivers/scr_vnc_ecos.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ services/gfx/mw/current/src/drivers/scr_vnc_ecos.c 28 Aug 2003 10:34:35 -0000 1.1
@@ -0,0 +1,351 @@
+//==========================================================================
+//
+// scr_vnc_ecos.c
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, 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.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): Chris Garry <cgarry@sweeneydesign.co.uk>
+// Contributors:
+// Date: 2003-08-22
+// Purpose:
+// Description: Microwindows screen driver for VNC server on eCos
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+
+
+#define _GNU_SOURCE 1
+
+#include <pkgconf/system.h>
+
+#include <assert.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <cyg/hal/drv_api.h>
+#include <cyg/infra/diag.h>
+#include <cyg/io/io.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "device.h"
+#include "genfont.h"
+#include "genmem.h"
+#include <vnc-server.h>
+
+/* In genmem.c*/
+MWBOOL set_subdriver(PSD psd, PSUBDRIVER subdriver, MWBOOL init);
+
+/* Prototypes for driver functions */
+static int vnc_init(PSD psd);
+static PSD vnc_open(PSD psd);
+static void vnc_close(PSD psd);
+static void vnc_getscreeninfo(PSD psd,PMWSCREENINFO psi);
+static void vnc_drawpixel(PSD psd,MWCOORD x, MWCOORD y, MWPIXELVAL c);
+static MWPIXELVAL vnc_readpixel(PSD psd,MWCOORD x, MWCOORD y);
+static void vnc_drawhorizline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c);
+static void vnc_drawvertline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c);
+static void vnc_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c);
+static void vnc_blit(PSD , MWCOORD, MWCOORD, MWCOORD, MWCOORD, PSD, MWCOORD, MWCOORD, long);
+static void vnc_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 vnc_drawarea(PSD psd, driver_gc_t *gc, int op);
+MWBOOL vnc_mapmemgc(PSD, MWCOORD, MWCOORD, int, int, int, int, void *);
+
+
+
+SCREENDEVICE scrdev = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL,
+ vnc_open,
+ vnc_close,
+ vnc_getscreeninfo,
+ NULL,
+ vnc_drawpixel, /* DrawPixel subdriver*/
+ vnc_readpixel, /* ReadPixel subdriver*/
+ vnc_drawhorizline, /* DrawHorzLine subdriver*/
+ vnc_drawvertline, /* DrawVertLine subdriver*/
+ vnc_fillrect, /* FillRect subdriver*/
+ gen_fonts,
+ vnc_blit, /* Blit subdriver*/
+ NULL, /* PreSelect*/
+ NULL, /* DrawArea subdriver*/
+ NULL, /* SetIOPermissions*/
+ gen_allocatememgc,
+ vnc_mapmemgc,
+ gen_freememgc,
+ vnc_stretchblit, /* StretchBlit subdriver*/
+ NULL /* SetPortrait*/
+};
+
+SUBDRIVER vnc_subdriver = {
+ vnc_init,
+ vnc_drawpixel,
+ vnc_readpixel,
+ vnc_drawhorizline,
+ vnc_drawvertline,
+ vnc_fillrect,
+ vnc_blit,
+ vnc_drawarea,
+ vnc_stretchblit
+};
+
+/* Static variables*/
+static int status; /* 0=never inited, 1=once inited, 2=inited. */
+static vnc_frame_format_t *frame_format;
+
+/* Calc linelen and mmap size, return 0 on fail*/
+static int vnc_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;
+}
+
+/* Initialise the VNC framebuffer */
+static PSD vnc_open(PSD psd)
+{
+ /* Get frame format details */
+ frame_format = VncGetInfo();
+
+ psd->xres = psd->xvirtres = frame_format->frame_width;
+ psd->yres = psd->yvirtres = frame_format->frame_height;
+ psd->portrait = MWPORTRAIT_NONE;
+ psd->planes = 1; /* Should probably find out what this means */
+
+ if (frame_format->rgb332)
+ {
+ psd->bpp = 8;
+ psd->ncolors = 0xFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR332;
+ }
+ else if (frame_format->rgb555)
+ {
+ psd->bpp = 16;
+ psd->ncolors = 0x7FFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR555;
+ }
+ else if (frame_format->rgb565)
+ {
+ psd->bpp = 16;
+ psd->ncolors = 0xFFFF + 1;
+ psd->pixtype = MWPF_TRUECOLOR565;
+ }
+ else
+ {
+ EPRINTF("Unsupported display type\n");
+ goto fail;
+ }
+
+ psd->linelen = frame_format->frame_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 = frame_format->frame_buffer; /* Test */
+// psd->addr = NULL; /* We do not want MW to access the frame buffer directly */
+
+ /* Initialise the frame buffer (white) */
+ VncInit(VNC_WHITE);
+
+ /* We always use our own subdriver */
+ psd->orgsubdriver = &vnc_subdriver;
+
+
+ status = 2;
+ return psd; /* success*/
+
+ fail:
+ return NULL;
+}
+
+
+/* Close framebuffer*/
+static void vnc_close(PSD psd)
+{
+ printf("%s - NOT IMPLEMENTED\n", __FUNCTION__);
+}
+
+
+static void vnc_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_TRUECOLOR555:
+ psi->rmask = 0x7c00;
+ psi->gmask = 0x03e0;
+ psi->bmask = 0x001f;
+ break;
+ case MWPF_TRUECOLOR565:
+ psi->rmask = 0xf800;
+ psi->gmask = 0x07e0;
+ psi->bmask = 0x001f;
+ 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 = 27; /* assumes screen width of 24 cm */
+ psi->ydpcm = 27; /* assumes screen height of 18 cm */
+}
+
+
+static void vnc_drawpixel(PSD psd, MWCOORD x, MWCOORD y, MWPIXELVAL c)
+{
+ VncDrawPixel(x, y, (vnc_colour_t)c);
+}
+
+
+static MWPIXELVAL vnc_readpixel(PSD psd, MWCOORD x, MWCOORD y)
+{
+ return VncReadPixel(x, y);
+}
+
+
+static void vnc_drawhorizline(PSD psd, MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c)
+{
+ VncDrawHorzLine(x1, x2, y, (vnc_colour_t)c);
+}
+
+
+static void vnc_drawvertline(PSD psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c)
+{
+ VncDrawVertLine(x, y1, y2, (vnc_colour_t)c);
+}
+
+
+static void vnc_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c)
+{
+ VncFillRect(x1, y1, x2, y2, (vnc_colour_t)c);
+}
+
+
+static void vnc_blit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD w, MWCOORD h,
+ PSD srcpsd, MWCOORD srcx, MWCOORD srcy, long op)
+{
+ if (op != 0)
+ {
+ diag_printf("vnc_blit(): op = 0x%x not supported\n", op);
+ }
+
+ if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr != frame_format->frame_buffer)
+ {
+ /* Copying rectangle from VNC frame buffer to supplied buffer */
+ VncCopyRect2Buffer(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)
+ {
+ /* Copying rectangle from a supplied buffer to the VNC frame buffer */
+ VncCopyBuffer2Rect(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)
+ {
+ /* Copying rectangle from VNC frame buffer to VNC frame buffer */
+ VncCopyRect(srcx, srcy, w, h, dstx, dsty);
+ }
+ else
+ {
+ diag_printf("vnc_blit(): Error unsupported operation\n");
+ }
+}
+
+static void vnc_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("vnc_stretch_blit() not implemented\n");
+}
+
+static void vnc_drawarea(PSD psd, driver_gc_t *gc, int op)
+{
+ diag_printf("vnc_drawarea() not implemented\n");
+}
+
+
+/*
+ * Initialize memory device with passed parms,
+ * select suitable framebuffer subdriver,
+ * and set subdriver in memory device.
+ */
+MWBOOL vnc_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 = &vnc_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;
+}
Index: services/gfx/mw/current/src/nanox/clientfb.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/services/gfx/mw/current/src/nanox/clientfb.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -5 -p -r1.1 -r1.2
--- services/gfx/mw/current/src/nanox/clientfb.c 20 May 2002 22:25:44 -0000 1.1
+++ services/gfx/mw/current/src/nanox/clientfb.c 28 Aug 2003 10:30:34 -0000 1.2
@@ -7,13 +7,16 @@
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#ifdef __ECOS
# include <pkgconf/system.h>
+#include <pkgconf/microwindows.h> /* CYGBLD_MICROWINDOWS_VNC_DRIVERS */
+# ifndef CYGBLD_MICROWINDOWS_VNC_DRIVERS
# ifdef CYGPKG_HAL_ARM
# include <cyg/hal/lcd_support.h>
# endif
+# endif
#else
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h> /* For definition of PAGE_SIZE */
#include <linux/fb.h>
@@ -53,10 +56,11 @@ GrOpenClientFramebuffer(void)
GrGetScreenInfo(&sinfo);
if (!sinfo.fbdriver)
return NULL;
#ifdef __ECOS
+# ifndef CYGBLD_MICROWINDOWS_VNC_DRIVERS
# ifdef CYGPKG_HAL_ARM
{
struct lcd_info li;
lcd_getinfo(&li);
physpixels = li.fb;
@@ -67,10 +71,11 @@ GrOpenClientFramebuffer(void)
{
physpixels = scrdev.addr;
return physpixels;
}
# endif
+# endif
#else
/*
* Try to open the framebuffer directly.
*/
if (!(fbdev = getenv("FRAMEBUFFER")))