README | 20 ++++++ configure.ac | 2 debian/changelog | 6 + man/penmount.man | 2 src/xf86PM.c | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++---- src/xf86PM.h | 1 6 files changed, 199 insertions(+), 14 deletions(-)
New commits: commit a20637dcbcf1ac7ede21cc16cd09a3e57a252d70 Author: Timo Aaltonen <tjaal...@cc.hut.fi> Date: Thu Feb 26 17:59:51 2009 +0200 Start a new release. diff --git a/debian/changelog b/debian/changelog index cc90b78..d919b88 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xserver-xorg-input-penmount (1:1.4.0-1) UNRELEASED; urgency=low + + * New upstream release. + + -- Timo Aaltonen <tjaal...@ubuntu.com> Thu, 26 Feb 2009 17:59:16 +0200 + xserver-xorg-input-penmount (1:1.3.0-1) unstable; urgency=low * New upstream release. commit 0536f70861f11192820439d36de951ef106d4e5e Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Thu Feb 19 16:32:32 2009 +1000 penmount 1.4.0 diff --git a/configure.ac b/configure.ac index b245f5f..e32aeea 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-penmount], - 1.3.0, + 1.4.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-penmount) commit ae5faa7a024cf63b766b916ef09adf3e66d1a170 Author: mjs <m...@core7.eu> Date: Tue Feb 17 01:48:43 2009 +0100 Add DMC9512 support #19885 Add new value for the ControllerModel option because we can not auto-detect it (looks like a DMC8910). The only relevant difference between the DMC8910 and DMC9512 is the device initialization. Signed-off-by: mjs <m...@core7.eu> Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/src/xf86PM.c b/src/xf86PM.c index 95adb8b..d07e242 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -4,6 +4,9 @@ * CoAuthor: Mayk Langer <lan...@vsys.de> * * History: + * 02/01/2009: mjs <m...@core7.eu> + * - Added DMC9512 controller protocol support + * based on old code from http://www.salt.com.tw/Download/Driver/PenMount/DMC9512/ * 09/16/2005: Jaya Kumar <jayakumar.x...@gmail.com> * - Added DMC9000 controller protocol support * - DMC9000 support work was sponsored by CIS(M) Sdn Bhd @@ -348,6 +351,119 @@ DMC9000_DeviceControl (DeviceIntPtr dev, int mode) } +static Bool +DMC9512_ProcessDeviceOn(PenMountPrivatePtr priv, DeviceIntPtr dev, InputInfoPtr pInfo) +{ + unsigned char buf[5] = { 'D', 'G', 0x02, 0x80, 0x00 }; + + XisbBlockDuration (priv->buffer, 500000); + + if ( PenMountSendPacket(priv, buf, 5) != Success ) + { + return !Success; + } + + /* wait for right response */ + priv->lex_mode = PenMount_Response0; + + if (PenMountGetPacket (priv) != Success ) + { + return !Success; + } + + if ( ! (priv->packet[0] == 0xff && priv->packet[1] == 0x70) ) + { + return !Success; + } + + xf86Msg(X_NOTICE, "%s: DMC9512: found\n", pInfo->name); + priv->chip = DMC9512; + + /* disable DMC9512 */ + buf[2] = 0x0a; + buf[3] = 0x00; + buf[4] = 0x00; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* set screen width */ + buf[2] = 0x02; + buf[3] = 0x03; /*(priv->screen_width & 0x0fff) >> 8;*/ + buf[4] = 0xfc; /*priv->screen_width & 0xff;*/ + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* set screen height */ + buf[2] = 0x02; + buf[3] = 0x13; /*(priv->screen_height & 0x0fff) >> 8;*/ + buf[4] = 0xfc; /*priv->screen_height & 0xff;*/ + buf[3] |= 0x10; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set Calibration Data */ + /* Set X-coordinate of the Left Top corner */ + buf[2] = 0x02; + buf[3] = 0x40; + buf[4] = 0x03; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set Y-coordinate of the Left Top corner */ + buf[2] = 0x02; + buf[3] = 0x50; + buf[4] = 0x03; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set X-coordinate of the Right bottom corner */ + buf[2] = 0x02; + buf[3] = 0x60; + buf[4] = 0xfc; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set Y-coordinate of the Right bottom corner */ + buf[2] = 0x02; + buf[3] = 0x70; + buf[4] = 0xfc; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set Screen Width Again */ + buf[2] = 0x02; + buf[3] = 0x03; + buf[4] = 0xfc; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* Set Screen Height Again */ + buf[2] = 0x02; + buf[3] = 0x13; + buf[4] = 0xfc; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + /* enable DMC9512 */ + buf[2] = 0x0a; + buf[3] = 0x01; + buf[4] = 0x00; + PenMountSendPacket(priv,buf,5); + priv->lex_mode = PenMount_Response0; + PenMountGetPacket(priv); + + return Success; +} + static InputInfoPtr PenMountPreInit(InputDriverPtr drv, IDevPtr dev, int flags) { @@ -425,6 +541,8 @@ PenMountPreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->chip = DMC9000; pInfo->device_control = DMC9000_DeviceControl; pInfo->read_input = DMC9000_ReadInput; + } else if ((s) && (xf86NameCmp (s, "DMC9512") == 0)) { + priv->chip = DMC9512; } priv->proximity = FALSE; @@ -486,6 +604,18 @@ DeviceControl (DeviceIntPtr dev, int mode) return (!Success); } /* if (isatty (pInfo->fd)) check if DMC8910 is found */ + + if (priv->chip == DMC9512) + { + if (DMC9512_ProcessDeviceOn(priv,dev,pInfo) != Success) + { + xf86Msg(X_WARNING, "%s: DMC9512: could not initialize", pInfo->name); + return !Success; + } + // else continue to the code below which does common stuff + // between 8910/9512 again + } + else { /* echo Success Code */ unsigned char buf[5] = { 'D', 'G', 0x02, 0x80, 0x00 }; @@ -573,7 +703,7 @@ ReadInput (InputInfoPtr pInfo) XisbBlockDuration (priv->buffer, -1); while (1) { - if ( priv->chip != DMC8910 ) + if ( priv->chip != DMC8910 && priv->chip != DMC9512 ) { if ( PenMountGetPacket (priv) != Success) break; @@ -898,7 +1028,7 @@ PenMountGetPacket (PenMountPrivatePtr priv) switch (priv->lex_mode) { case PenMount_byte0: - if ( priv->chip != DMC8910 ) + if ( priv->chip != DMC8910 && priv->chip != DMC9512 ) { if (!(c & 0x08) ) return (!Success); @@ -920,7 +1050,7 @@ PenMountGetPacket (PenMountPrivatePtr priv) case PenMount_byte2: priv->packet[2] = (unsigned char) c; priv->lex_mode = PenMount_byte0; - if ( priv->chip != DMC8910 ) + if ( priv->chip != DMC8910 && priv->chip != DMC9512 ) return (Success); if (( priv->packet[2] == 0xfe ) && ( priv->packet[1] == 0xfe )) return (Success); diff --git a/src/xf86PM.h b/src/xf86PM.h index 1b6ed0f..d13cbee 100644 --- a/src/xf86PM.h +++ b/src/xf86PM.h @@ -74,6 +74,7 @@ PenMountPrivateRec, *PenMountPrivatePtr; #define CHIP_UNKNOWN 0 #define DMC8910 1 #define DMC9000 2 +#define DMC9512 3 /****************************************************************************** commit ec3379232341ea024b6fb2b612733fdb99537c5e Author: Alan Coopersmith <alan.coopersm...@sun.com> Date: Fri Jan 30 20:28:40 2009 -0800 Add README with pointers to mailing list, bugzilla & git repos diff --git a/README b/README new file mode 100644 index 0000000..f857884 --- /dev/null +++ b/README @@ -0,0 +1,20 @@ +xf86-input-penmount - PenMount input driver for the Xorg X server + +Please submit bugs & patches to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + +All questions regarding this software should be directed at the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/xorg/driver/xf86-input-penmount + + http://cgit.freedesktop.org/xorg/driver/xf86-input-penmount + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage commit 0627c2743471791f57fe8b8e96d7df3db676aca9 Author: Alan Coopersmith <alan.coopersm...@sun.com> Date: Fri Jan 9 16:22:15 2009 -0800 Remove xorgconfig & xorgcfg from See Also list in man page diff --git a/man/penmount.man b/man/penmount.man index 30676ad..17a2e6f 100644 --- a/man/penmount.man +++ b/man/penmount.man @@ -33,6 +33,6 @@ section only covers configuration details specific to this driver. .PP Config details... .SH "SEE ALSO" -__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__). +__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__). .SH AUTHORS Authors include... commit e94c776512adba9398a01406e630271cf912bf21 Author: Arrigo Marchiori <ard...@yahoo.it> Date: Thu Nov 20 09:57:34 2008 +1000 Fix y axis inversion for axis ranges with a non-zero minimum. Signed-off-by: Peter Hutterer <peter.hutte...@redhat.com> diff --git a/src/xf86PM.c b/src/xf86PM.c index 71edeee..95adb8b 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -716,7 +716,7 @@ DMC9000_ReadInput (InputInfoPtr pInfo) } if (priv->invert_y) { - y = priv->max_y - y; + y = priv->max_y - y + priv->min_y; } priv->packet[0] = priv->pen_down ? 0x01 : 0x00; commit d112cca181b9fc9586391e83b8c0ff26ca22ff9e Author: Steve Bian <s...@pictorii.com> Date: Tue Sep 23 20:43:23 2008 +0930 Init axes according to configuration. When reporting mode is TS_Raw since we do no scaling, it will just be the values in xorg.conf. If however reporting mode is TS_Scaled however, xf86ScaleAxis will return a value between 0 screen_width/screen_height, so we must setup the axis accordingly or there will be strange behaviour Signed-off-by: Peter Hutterer <peter.hutte...@redhat.com> diff --git a/src/xf86PM.c b/src/xf86PM.c index 954bdc8..71edeee 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -177,6 +177,7 @@ ProcessDeviceInit(PenMountPrivatePtr priv, DeviceIntPtr dev, InputInfoPtr pInfo) { unsigned char map[] = {0, 1}; + int min_x, min_y, max_x, max_y; /* * these have to be here instead of in the SetupProc, because when the * SetupProc is run at server startup, screenInfo is not setup yet @@ -208,11 +209,33 @@ ProcessDeviceInit(PenMountPrivatePtr priv, DeviceIntPtr dev, InputInfoPtr pInfo) } else { - InitValuatorAxisStruct (dev, 0, priv->min_x, priv->max_x, + /* max_* min_* refer to the max/min values we will emit to the core. + * When reporting mode is TS_Raw since we do no scaling, it will + * just be the values in xorg.conf. If however reporting mode is + * TS_Scaled however, xf86ScaleAxis will return a value between 0 + * screen_width/screen_height, so we must setup the axis accordingly + * or there will be strange behaviour + */ + if ( priv->reporting_mode == TS_Raw ) + { + max_x = priv->max_x; + min_x = priv->min_x; + max_y = priv->max_y; + min_y = priv->min_y; + } + else + { + max_x = priv->screen_width; + min_x = 0; + max_y = priv->screen_height; + min_y = 0; + } + + InitValuatorAxisStruct (dev, 0, min_x, max_x, 9500, 0 /* min_res */ , 9500 /* max_res */ ); - InitValuatorAxisStruct (dev, 1, priv->min_y, priv->max_y, + InitValuatorAxisStruct (dev, 1, min_y, max_y, 10500, 0 /* min_res */ , 10500 /* max_res */ ); commit 22fca7467a943539b44a520a7b9d827508f01538 Author: Steve Bian <s...@pictorii.com> Date: Tue Sep 23 20:42:33 2008 +0930 InvertY should be disabled by default. Signed-off-by: Peter Hutterer <peter.hutte...@redhat.com> diff --git a/src/xf86PM.c b/src/xf86PM.c index b268393..954bdc8 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -389,7 +389,7 @@ PenMountPreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->screen_num = xf86SetIntOption( pInfo->options, "ScreenNumber", 0 ); priv->button_number = xf86SetIntOption( pInfo->options, "ButtonNumber", 1 ); priv->swap_xy = xf86SetIntOption( pInfo->options, "SwapXY", 0 ); - priv->invert_y = xf86SetIntOption( pInfo->options, "InvertY", 1 ); + priv->invert_y = xf86SetIntOption( pInfo->options, "InvertY", 0 ); priv->buffer = NULL; s = xf86FindOptionValue (pInfo->options, "ReportingMode"); if ((s) && (xf86NameCmp (s, "raw") == 0)) commit 8a9ff94e3db692736f86d52e569f65f6f363b0e0 Author: Arrigo Marchiori <ard...@yahoo.it> Date: Sun Jun 22 18:00:57 2008 +0930 Fix scaling behaviour if the axes are swapped. #13535 First swapping, then inverting and scaling. I think it's the most intuitive solution to the problem, because it makes minX, maxX & co. act on the _actual_ X and Y axes, from the user/developer point of view. Signed-off-by: Peter Hutterer <pe...@cs.unisa.edu.au> X.Org Bug 13535 <http://bugs.freedesktop.org/show_bug.cgi?id=13535> diff --git a/src/xf86PM.c b/src/xf86PM.c index 7c65ee3..b268393 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -685,15 +685,15 @@ DMC9000_ReadInput (InputInfoPtr pInfo) } x = ((((unsigned int) (priv->packet[1]&0x07)) << 7) | (priv->packet[2]&0x7F)); y = ((((unsigned int) (priv->packet[3]&0x07)) << 7) | (priv->packet[4]&0x7F)); - if (priv->invert_y) - { - y = priv->max_y - y; - } if ( priv->swap_xy) { tmp = y; y = x; - x = tmp; + x = tmp; + } + if (priv->invert_y) + { + y = priv->max_y - y; } priv->packet[0] = priv->pen_down ? 0x01 : 0x00; commit 5e1c22ff2c21cd20b204394731e2ad8ce1980091 Author: Peter Hutterer <pe...@cs.unisa.edu.au> Date: Mon May 26 22:19:12 2008 +0930 Check for XINPUT ABI 3. diff --git a/src/xf86PM.c b/src/xf86PM.c index 612b68b..7c65ee3 100644 --- a/src/xf86PM.c +++ b/src/xf86PM.c @@ -105,7 +105,9 @@ static const char *reqSymbols[] = { "xf86CollectInputOptions", "xf86ErrorFVerb", "xf86FindOptionValue", +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3 "xf86GetMotionEvents", +#endif "xf86GetVerbosity", "xf86MotionHistoryAllocate", "xf86NameCmp", @@ -195,7 +197,10 @@ ProcessDeviceInit(PenMountPrivatePtr priv, DeviceIntPtr dev, InputInfoPtr pInfo) * Device reports motions on 2 axes in absolute coordinates. * Axes min and max values are reported in raw coordinates. */ - if (InitValuatorClassDeviceStruct (dev, 2, xf86GetMotionEvents, + if (InitValuatorClassDeviceStruct (dev, 2, +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3 + xf86GetMotionEvents, +#endif pInfo->history_size, Absolute) == FALSE) { ErrorF ("Unable to allocate PenMount ValuatorClassDeviceStruct\n"); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org