Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Sep 2000 12:11:49 -0500 (CDT)
From:      stephen@math.missouri.edu
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   ports/21520: Configure the synaptics touchpad.
Message-ID:  <200009241711.e8OHBnp07041@cauchy.math.missouri.edu>

next in thread | raw e-mail | index | archive | help

>Number:         21520
>Category:       ports
>Synopsis:       Configure the synaptics touchpad.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Sep 24 10:20:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Stephen Montgomery-Smith
>Release:        FreeBSD 4.1-STABLE i386
>Organization:
University of Missouri
>Environment:

Using a synaptics touchpad on a laptop

>Description:

You may like to make various configurations to the touchpad, for
example, to disable the feature that tapping the touchpad is like
a mouse click.

>How-To-Repeat:


>Fix:

This port will not compile or work unless changes are made to the 
kernel - this is described at
http://www.freebsd.org/cgi/query-pr.cgi?pr=20352


# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	synaptics
#	synaptics/files
#	synaptics/files/remouse
#	synaptics/files/remouse.sh-sample
#	synaptics/files/md5
#	synaptics/patches
#	synaptics/patches/patch-aa
#	synaptics/pkg
#	synaptics/pkg/COMMENT
#	synaptics/pkg/DESCR
#	synaptics/pkg/PLIST
#	synaptics/Makefile
#
echo c - synaptics
mkdir -p synaptics > /dev/null 2>&1
echo c - synaptics/files
mkdir -p synaptics/files > /dev/null 2>&1
echo x - synaptics/files/remouse
sed 's/^X//' >synaptics/files/remouse << 'END-of-synaptics/files/remouse'
X#!/bin/sh
X
X# Suck in the configuration variables.
Xif [ -r /etc/defaults/rc.conf ]; then
X	. /etc/defaults/rc.conf
X	source_rc_confs
Xelif [ -r /etc/rc.conf ]; then
X	. /etc/rc.conf
Xfi
X
Xif [ -f /var/run/moused.pid ]; then
X	kill `cat /var/run/moused.pid`
X	rm -f /var/run/moused.pid
Xfi
X
X/usr/local/bin/tpconfig $@
X
Xcase ${moused_enable} in
X[Yy][Ee][Ss])
X	/usr/sbin/moused -p ${moused_port} -t ${moused_type} ${moused_flags}
X	;;
Xesac
END-of-synaptics/files/remouse
echo x - synaptics/files/remouse.sh-sample
sed 's/^X//' >synaptics/files/remouse.sh-sample << 'END-of-synaptics/files/remouse.sh-sample'
X#!/bin/sh
Xcase "$1" in
X	start)
X		/usr/local/bin/remouse -t0
X		echo -n ' remouse'
X		;;
X	stop)
X		;;
X	restart)
X		/usr/local/bin/remouse -t0
X		echo -n ' remouse'
X		;;
X	-h)
X		echo "Usage: `basename $0` { start | stop | restart }"
X		;;
X	*)
X		/usr/local/bin/remouse -t0
X		echo -n ' remouse'
X		;;
Xesac
END-of-synaptics/files/remouse.sh-sample
echo x - synaptics/files/md5
sed 's/^X//' >synaptics/files/md5 << 'END-of-synaptics/files/md5'
XMD5 (synaptics-2.2.tar.gz) = 9cd5348a797081c2abead26a02f7365e
END-of-synaptics/files/md5
echo c - synaptics/patches
mkdir -p synaptics/patches > /dev/null 2>&1
echo x - synaptics/patches/patch-aa
sed 's/^X//' >synaptics/patches/patch-aa << 'END-of-synaptics/patches/patch-aa'
X--- ../synaptics-2.2/tpconfig.c	Tue Feb 16 13:09:43 1999
X+++ tpconfig.c	Tue Aug 15 00:34:09 2000
X@@ -55,11 +55,14 @@
X #include <fcntl.h>
X #include <stdio.h>
X #include <unistd.h>
X-#include <assert.h>
X #include <sys/ioctl.h>
X #include <sys/time.h>
X #include <sys/timeb.h>
X 
X+#include <machine/mouse.h>
X+
X+#define exit_if_false(e) if (!(e)){printf("failed for %s\n",#e);exit(1);}
X+
X 
X #define fatal(string) \
X { fprintf(stderr, "fatal: " string); exit(1); } 
X@@ -67,10 +70,6 @@
X /* Prototypes for PS/2 utility functions */
X typedef unsigned char byte;
X 
X-/* write a byte to the ps/2 port, handling ACK */
X-void putbyte(int fd, byte b);
X-/* read a byte from the ps/2 port */
X-byte getbyte(int fd);
X /* use the Synaptics extended ps/2 syntax to write a special command byte */
X void send_cmd(int fd, byte cmd);
X /* write 'cmd' to mode byte 1 */
X@@ -107,54 +106,13 @@
X void set_firmware_options(int fd, FILE *info);
X 
X 
X-int tp_read(fd,buffer,num_bytes)
X-  int fd;
X-  char *buffer;
X-  int num_bytes;
X-{ /* tp_read */
X-#define TRUE 1
X-#define FALSE 0
X-#define TIMEOUT 3 /* wait for up to 3 seconds for a reply*/
X-int bytes_read;
X-struct timeb start;
X-struct timeb now;
X-int at;
X-int left;
X- 
X-#ifdef DEBUG
X-printf("Trying to read [%d] bytes \n",num_bytes);
X-#endif
X-/* Use the temporary buffer to store the data as it arrives */
X-ftime(&start);
X-at = 0;
X-left = num_bytes;
X-do
X-  {
X-  bytes_read = read(fd,(buffer + at),left);
X-  if(bytes_read > 0)
X-    {
X-    left = left - bytes_read;
X-    at = at + bytes_read;
X-    }
X-  ftime(&now);
X-  if((((now.time * 1000.0 + now.millitm) -
X-     (start.time * 1000.0 + start.millitm)) / 1000.0) > TIMEOUT)
X-    {
X-    printf("\n\nTimed Out waiting to read from Touchpad\n\n");
X-    exit(-1);
X-    }
X-  }
X-while(left > 0);
X- 
X-return(at);
X-} /* tp_read */
X- 
X 
X /* initialize file description if hasn't already been done. */
X void init_fd(int *fd) {
X+
X   if (*fd<0) {
X-    *fd = open("/dev/psaux", O_RDWR|O_NDELAY);	
X-    if (*fd<0) fatal("Could not open /dev/psaux");	
X+    *fd = open("/dev/psm0", O_RDWR|O_NDELAY);	
X+    if (*fd<0) fatal("Could not open /dev/psm2");	
X     if (!is_touchpad(*fd)) 
X       fatal("\n\nNo Synaptics touchpad device was found.\n\n");
X   }
X@@ -167,21 +125,19 @@
X byte b=0xff;
X byte ack;
X byte null;
X+struct mousedata data;
X fprintf(stderr,"Performing a Software Reset on TouchPad\n");
X #ifdef DEBUG
X printf("Writing [0x%x] in reset_touchpad\n",b);
X #endif
X-write(fd, &b, 1);
X-tp_read(fd, &ack, 1);
X-#ifdef DEBUG
X-printf("Read [0x%x] in reset_touchpad ACK? (0xfa)\n",ack);
X-#endif
X-assert(ack==0xFA);
X-tp_read(fd, &null, 1);
X+data.len=1;
X+data.buf[0]=b;
X+exit_if_false(ioctl(fd,MOUSE_SENDREADCMD,&data)!=-1);
X #ifdef DEBUG
X-printf("Read [0x%x] in reset_touchpad NULL? (0x0)\n",null);
X+printf("Read [0x%x] in reset_touchpad NULL? (0x0)\n",data.buf[0]);
X #endif
X-assert(null==0x00);
X+printf("data.len = %d\n",data.len);
X+exit_if_false(data.len==1 && data.buf[0]==0x00);
X fprintf(stderr,"Software Reset of TouchPad DONE!\n\n");
X } /* reset_touchpad */
X 
X@@ -324,7 +280,7 @@
X                         else if((((mode1>>2)&1)==0) && (((cc>>2)&1)!=0))
X                           fprintf(stderr,"Tap-to-drag NOT Correctly Set\n");
X                         else if((((mode1>>2)&1)==1) && (((cc>>2)&1)==1))
X-                          fprintf(stderr,"No tap gestures CORECTLY Set\n");
X+                          fprintf(stderr,"No tap gestures CORRECTLY Set\n");
X                         else if((((mode1>>2)&1)==1) && (((cc>>2)&1)!=1))
X                           fprintf(stderr,"No tap gestures NOT Correctly Set\n");
X                         }
X@@ -621,74 +577,66 @@
X /*   PS/2 Utility functions.                                              */
X /*------------------------------------------------------------------------*/
X 
X-/* write a byte to the ps/2 port, handling ACK */
X-void putbyte(int fd, byte b) {
X-  byte ack;
X-  int waiting = 0;
X-  int ireturn = 0;
X-#ifdef DEBUG
X-  printf("Writing [0x%x] in putbyte\n",b);
X-#endif
X-  write(fd, &b, 1);
X-/*
X-  ireturn = ioctl(fd,FIONREAD,&waiting);
X-  if(waiting < 1)
X-    {
X-    printf("Timed Out waiting for Acknowledgement from Touchpad\n");
X-    }
X-*/
X-  tp_read(fd, &ack, 1);
X-#ifdef DEBUG
X-  printf("Read [0x%x] in putbyte\n",ack);
X-#endif
X-  assert(ack==0xFA);
X+void clear_data(struct mousedata *data)
X+{
X+  data->len = 0;
X }
X-/* read a byte from the ps/2 port */
X-byte getbyte(int fd) {
X-  byte b;
X-  tp_read(fd, &b, 1);
X-#ifdef DEBUG
X-  printf("Read [0x%x] in getbyte\n",b);
X-#endif
X-  return b;
X+
X+void append_data(struct mousedata *data, byte b)
X+{
X+  data->buf[data->len] = b;
X+  data->len++;
X }
X-/* use the Synaptics extended ps/2 syntax to write a special command byte */
X-void send_cmd(int fd, byte cmd) {
X+
X+void append_data_cmd(struct mousedata *data,byte cmd)
X+{
X   int i;
X   /* initialize with 'inert' command */
X-  putbyte(fd, 0xE6);
X+  append_data(data, 0xE6);
X   for (i=0; i<4; i++) {
X-    putbyte(fd, 0xE8);
X-    putbyte(fd, (cmd>>6)&0x3);
X+    append_data(data, 0xE8);
X+    append_data(data, (cmd>>6)&0x3);
X     cmd<<=2;
X   }
X }
X+
X+
X /* write 'cmd' to mode byte 1 */
X void set_mode1(int fd, byte cmd) 
X   {
X+  struct mousedata data;
X+
X   if(single_mode_byte)
X     set_mode2(fd,cmd);
X   else
X     {
X-    send_cmd(fd, cmd);
X-    putbyte(fd, 0xF3);
X-    putbyte(fd, 0x0A);
X+    clear_data(&data);
X+    append_data_cmd(&data,cmd);
X+    append_data(&data, 0xF3);
X+    append_data(&data, 0x0A);
X+    exit_if_false(ioctl(fd,MOUSE_SENDREADCMD,&data)!=-1);
X     }
X   }
X /* write 'cmd' to mode byte 2 */
X void set_mode2(int fd, byte cmd) {
X-  send_cmd(fd, cmd);
X-  putbyte(fd, 0xF3);
X-  putbyte(fd, 0x14);
X+  struct mousedata data;
X+  clear_data(&data);
X+  append_data_cmd(&data,cmd);
X+  append_data(&data, 0xF3);
X+  append_data(&data, 0x14);
X+  exit_if_false(ioctl(fd,MOUSE_SENDREADCMD,&data)!=-1);
X }
X /* read three byte status ('a','b','c') corresponding to register 'cmd' */
X void status_rqst(int fd, byte cmd, byte *byte1, byte *byte2, byte *byte3) {
X-  byte chk;
X-  send_cmd(fd, cmd);
X-  putbyte(fd, 0xE9);
X-  *byte1=getbyte(fd);
X-  *byte2=getbyte(fd);
X-  *byte3=getbyte(fd);
X+  struct mousedata data;
X+  clear_data(&data);
X+  append_data_cmd(&data,cmd);
X+  append_data(&data, 0xE9);
X+  exit_if_false(ioctl(fd,MOUSE_SENDREADCMD,&data)!=-1);
X+  exit_if_false(data.len==3);
X+  *byte1=data.buf[0];
X+  *byte2=data.buf[1];
X+  *byte3=data.buf[2];
X }
X byte get_mode1(int fd) {
X   byte a,b,c;
X@@ -717,10 +665,5 @@
X #ifdef DEBUG
X   printf("In is_touchpad, a,b,c [%x,  %x  %x]\n",a,b,c);
X #endif
X-  while(a == ACK)
X-    { /* 2.2.x kernel fix an extra ack preceeded the status */
X-    a=b;b=c;
X-    c = getbyte(fd);
X-    }
X   return (b==0x47);
X }
END-of-synaptics/patches/patch-aa
echo c - synaptics/pkg
mkdir -p synaptics/pkg > /dev/null 2>&1
echo x - synaptics/pkg/COMMENT
sed 's/^X//' >synaptics/pkg/COMMENT << 'END-of-synaptics/pkg/COMMENT'
XConfigure the synaptics touchpad
END-of-synaptics/pkg/COMMENT
echo x - synaptics/pkg/DESCR
sed 's/^X//' >synaptics/pkg/DESCR << 'END-of-synaptics/pkg/DESCR'
XThis program allows the user to configure a synaptics touchpad -
Xa pointing device used on many laptops.
X
XThe basic program is called tpconfig.  Type tpconfig to see
Xall of its options.  It will not work if any other program
Xis using the mouse (for example moused or X windows).  Also,
Xyou should not touch the touchpad while this program is running.
X
XI have also included a program remouse.  This first kills the
Xmoused daemon, then runs tpconfig with whatever options you have
Xset, and then restarts the moused daemon.
X
XAlso included is a file /usr/local/etc/rc.d/remouse.sh-sample.  You
Xcan make whatever changes you like, and then rename it to
Xremouse.sh, and then remouse will be called upon boot up.
X
XIMPORTANT: this port will not compile or work unless some changes
Xare made to the kernel.  You can find the required changes at
Xhttp://www.freebsd.org/cgi/query-pr.cgi?pr=20352
X
XWWW: http://www.compass.com/synaptics/
X
XStephen Montgomery-Smith
Xstephen@math.missouri.edu
END-of-synaptics/pkg/DESCR
echo x - synaptics/pkg/PLIST
sed 's/^X//' >synaptics/pkg/PLIST << 'END-of-synaptics/pkg/PLIST'
Xbin/tpconfig
Xbin/remouse
Xetc/rc.d/remouse.sh-sample
END-of-synaptics/pkg/PLIST
echo x - synaptics/Makefile
sed 's/^X//' >synaptics/Makefile << 'END-of-synaptics/Makefile'
X# New ports collection makefile for:	synaptics
X# Date created:		September 24 2000
X# Whom:			Stephen Montgomery-Smith <stephen@math.missouri.edu>
X#
X# $FreeBSD:
X#
X
XPORTNAME=		synaptics
XPORTVERSION=		2.2
XCATEGORIES=		sysutils
XMASTER_SITES=		http://www.compass.com/synaptics/
X
XMAINTAINER=		stephen@math.missouri.edu
X
XLIB_DEPENDS=		gnugetopt:${PORTSDIR}/devel/libgnugetopt:install
X
XGNU_CONFIGURE=		yes
XCONFIGURE_ENV+=		CFLAGS="${CFLAGS} -I${PREFIX}/include" \
X			LDFLAGS=-L${PREFIX}/lib \
X			LIBS=-lgnugetopt
X
Xpre-patch:
X	${CHMOD} +w ${WRKSRC}/tpconfig.c
X
Xpost-install:
X	strip ${PREFIX}/bin/tpconfig
X	${INSTALL_SCRIPT} ${FILESDIR}/remouse.sh-sample ${PREFIX}/etc/rc.d
X	${INSTALL_SCRIPT} ${FILESDIR}/remouse ${PREFIX}/bin
X
X.include <bsd.port.mk>
END-of-synaptics/Makefile
exit



>Release-Note:
>Audit-Trail:
>Unformatted:
 Stephen Montgomery-Smith


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200009241711.e8OHBnp07041>