Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!news.ecn.uoknor.edu!feed1.news.erols.com!howland.erols.net!vixen.cso.uiuc.edu!uwm.edu!news.he.net!nr1.scn.co.jp!news02.so-net.or.jp!news01.so-net.or.jp!sinfony-news01!wnoc-tyo-news!news.nc.u-tokyo.ac.jp!train.ad.jp!iroha.utsunomiya-u.ac.jp!nikko.utsunomiya-u.ac.jp!yokota
From: yokota@zodiac.mech.utsunomiya-u.ac.jp. (Kazutaka YOKOTA)
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Re: X11R6 on compaq laptop
Date: 30 Jan 1997 03:35:06 GMT
Organization: Utsunomiya University, Utsunomiya, Japan
Lines: 364
Message-ID: <5cp4ta$a5q@nikko.utsunomiya-u.ac.jp>
References: <5cea5b$8nq@news.montanavision.net>
NNTP-Posting-Host: zodiac.mech.utsunomiya-u.ac.jp
X-Newsreader: mnews [version 1.19PL2] 1996-01/26(Fri)
Xref: euryale.cc.adfa.oz.au comp.unix.bsd.freebsd.misc:34240
ron@3rivers.net wrote:
ron>>I just got X11R6 running at 800x600 on my 4120 compaq armada, with
ron>>2.2-BETA, by copying over a previous version XF86_SVGA, and
ron>>kludging the device section. However, I haven't yet succeeded in
ron>>getting the touchpad mouse to be recognized. I compiled psm0 in
ron>>the kernel, but it is not found on boot. Any suggestions???
ron>>
ron>>Ron
There have been reports that built-in PS/2 mouse/pad devices in some
laptop computers are not recognized under 2.2-BETA. Here is a patch
which successfully fixed the problems with Dell and DEC laptops.
Apply the patch in /usr/src/sys/i386/isa (psm.c, kbdio.c, and kbdio.h
will be modified), rebuild the kernel, and see if it works for you.
If you have further questions, don't hesitate to ask me.
Kazu
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/psm.c,v
retrieving revision 1.25.2.3
retrieving revision 1.25.2.5
diff -u -r1.25.2.3 -r1.25.2.5
--- src/sys/i386/isa/psm.c 1996/12/03 10:47:24 1.25.2.3
+++ src/sys/i386/isa/psm.c 1997/01/15 12:03:33 1.25.2.5
@@ -19,7 +19,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: psm.c,v 1.25.2.3 1996/12/03 10:47:24 phk Exp $
+ * $Id: psm.c,v 1.25.2.5 1997/01/15 12:03:33 sos Exp $
*/
/*
@@ -435,6 +435,11 @@
int i;
switch((i = test_aux_port(port))) {
+ case 1: /* ignore this error */
+ if (verbose)
+ log(LOG_DEBUG, "psm%d: strange result for test aux port (%d).\n",
+ PSM_UNIT(dev), i);
+ /* fall though */
case 0: /* no error */
break;
case -1: /* time out */
@@ -478,10 +483,14 @@
}
/* just check the status of the mouse */
+ i = get_mouse_status(port, stat);
if (verbose) {
- get_mouse_status(port, stat);
- log(LOG_DEBUG, "psm%d: status %02x %02x %02x (reinitialized)\n",
- PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+ if (i)
+ log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
+ PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+ else
+ log(LOG_DEBUG, "psm%d: failed to get mouse status\n",
+ PSM_UNIT(dev));
}
return TRUE;
@@ -508,6 +517,8 @@
if (unit >= NPSM)
return (0);
+ psm_softc[unit] = NULL;
+
sc = malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
bzero(sc, sizeof *sc);
@@ -556,6 +567,7 @@
*/
/* save the current command byte; it will be used later */
+ empty_both_buffers(ioport, 20);
if (!write_controller_command(ioport,KBDC_GET_COMMAND_BYTE)) {
/* CONTROLLER ERROR */
printf("psm%d: failed to get the current command byte value.\n",
@@ -604,8 +616,18 @@
* supporsed to return with an error code or simply time out. In any
* case, we have to continue probing the port even when the controller
* passes this test.
+ *
+ * XXX: some controllers erroneously return the error code 1 when
+ * it has the perfectly functional aux port. We have to ignore this
+ * error code. Even if the controller HAS error with the aux port,
+ * it will be detected later...
*/
switch ((i = test_aux_port(ioport))) {
+ case 1: /* ignore this error */
+ if (verbose)
+ printf("psm%d: strange result for test aux port (%d).\n",
+ unit, i);
+ /* fall though */
case 0: /* no error */
break;
case -1: /* time out */
@@ -693,6 +715,7 @@
/* set mouse parameters */
/* FIXME:XXX should we set them in `psmattach()' rather than here? */
+#if 0
if (setparams) {
if (sc->mode.rate > 0)
sc->mode.rate = set_mouse_sampling_rate(ioport, sc->mode.rate);
@@ -703,12 +726,25 @@
/* FIXME:XXX I don't know if these parameters are reasonable */
set_mouse_scaling(ioport); /* 1:1 scaling */
set_mouse_mode(ioport); /* stream mode */
+#else
+ i = send_aux_command(ioport, PSMC_SET_DEFAULTS);
+ if (verbose >= 2)
+ log(LOG_DEBUG, "psm%d: SET_DEFAULTS return code:%04x\n", unit, i);
+#endif
/* just check the status of the mouse */
+ /*
+ * XXX there are some arcane controller/mouse combinations out there,
+ * which hung the controller unless there is data transmission
+ * after ACK from the mouse.
+ */
+ i = get_mouse_status(ioport, stat);
if (verbose) {
- get_mouse_status(ioport, stat);
- log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
- unit, stat[0], stat[1], stat[2]);
+ if (i)
+ log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
+ unit, stat[0], stat[1], stat[2]);
+ else
+ log(LOG_DEBUG, "psm%d: failed to get mouse status\n", unit);
}
/* disable the aux port for now... */
@@ -745,6 +781,9 @@
int unit = dvp->id_unit;
struct psm_softc *sc = psm_softc[unit];
+ if (sc == NULL) /* shouldn't happen */
+ return (0);
+
/* initial operation mode */
sc->mode.accelfactor = PSM_ACCEL;
sc->mode.protocol = MOUSE_PROTO_PS2;
@@ -763,8 +802,11 @@
DV_CHR, 0, 0, 0666, "npsm%d", unit);
#endif
- printf("psm%d: device ID %d, %d buttons?\n",
- unit, sc->hw.hwid, sc->hw.buttons);
+ if (verbose)
+ printf("psm%d: device ID %d, %d buttons?\n",
+ unit, sc->hw.hwid, sc->hw.buttons);
+ else
+ printf("psm%d: device ID %d\n", unit, sc->hw.hwid);
if (bootverbose)
--verbose;
@@ -779,6 +821,7 @@
int ioport;
struct psm_softc *sc;
int stat[3];
+ int ret;
/* Validate unit number */
if (unit >= NPSM)
@@ -786,7 +829,7 @@
/* Get device data */
sc = psm_softc[unit];
- if ((sc->state & PSM_VALID) == 0)
+ if ((sc == NULL) || (sc->state & PSM_VALID) == 0)
/* the device is no longer valid/functioning */
return (ENXIO);
ioport = sc->addr;
@@ -849,10 +892,14 @@
return (EIO);
}
+ ret = get_mouse_status(ioport, stat);
if (verbose >= 2) {
- get_mouse_status(ioport, stat);
- log(LOG_DEBUG, "psm%d: status %02x %02x %02x\n",
- unit, stat[0], stat[1], stat[2]);
+ if (ret)
+ log(LOG_DEBUG, "psm%d: status %02x %02x %02x (psmopen)\n",
+ unit, stat[0], stat[1], stat[2]);
+ else
+ log(LOG_DEBUG, "psm%d: failed to get mouse status (psmopen).\n",
+ unit);
}
/* enable the aux port and interrupt */
@@ -877,6 +924,8 @@
{
struct psm_softc *sc = psm_softc[PSM_UNIT(dev)];
int ioport = sc->addr;
+ int stat[3];
+ int ret;
/* disable the aux interrupt */
if (!set_controller_command_byte(ioport, sc->command_byte,
@@ -905,6 +954,17 @@
log(LOG_ERR, "psm%d: failed to disable the device (psmclose).\n",
PSM_UNIT(dev));
}
+
+ ret = get_mouse_status(ioport, stat);
+ if (verbose >= 2) {
+ if (ret)
+ log(LOG_DEBUG, "psm%d: status %02x %02x %02x (psmclose)\n",
+ PSM_UNIT(dev), stat[0], stat[1], stat[2]);
+ else
+ log(LOG_DEBUG, "psm%d: failed to get mouse status (psmclose).\n",
+ PSM_UNIT(dev));
+ }
+
if (!set_controller_command_byte(ioport, sc->command_byte,
KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) {
/* CONTROLLER ERROR;
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/kbdio.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- src/sys/i386/isa/kbdio.c 1996/12/04 16:11:39 1.1.2.2
+++ src/sys/i386/isa/kbdio.c 1997/01/15 12:03:38 1.1.2.3
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kbdio.c,v 1.1.2.2 1996/12/04 16:11:39 phk Exp $
+ * $Id: kbdio.c,v 1.1.2.3 1997/01/15 12:03:38 sos Exp $
*/
#include <sys/param.h>
@@ -295,64 +295,76 @@
/* discard data from the keyboard */
void
-empty_kbd_buffer(int port, int t)
+empty_kbd_buffer(int port, int wait)
{
+ int t;
int b;
int c = 0;
int delta = 2;
- for (; t > 0; t -= delta) {
+ for (t = wait; t > 0; ) {
if ((inb(port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL)
== KBDS_KBD_BUFFER_FULL) {
DELAY(KBDD_DELAYTIME);
- b = inb(port + KBD_DATA_PORT);
- ++c;
- }
+ b = inb(port + KBD_DATA_PORT);
+ ++c;
+ t = wait;
+ } else {
+ t -= delta;
+ }
DELAY(delta*1000);
}
if ((verbose >= 2) && (c > 0))
- log(LOG_DEBUG,"kbdio: %d char read (empty_kbd_buffer)\n",c);
+ log(LOG_DEBUG,"kbdio: %d char read (empty_kbd_buffer)\n",c);
}
/* discard data from the aux device */
void
-empty_aux_buffer(int port, int t)
+empty_aux_buffer(int port, int wait)
{
+ int t;
int b;
int c = 0;
int delta = 2;
- for (; t > 0; t -= delta) {
+ for (t = wait; t > 0; ) {
if ((inb(port + KBD_STATUS_PORT) & KBDS_BUFFER_FULL)
== KBDS_AUX_BUFFER_FULL) {
DELAY(KBDD_DELAYTIME);
- b = inb(port + KBD_DATA_PORT);
- ++c;
- }
+ b = inb(port + KBD_DATA_PORT);
+ ++c;
+ t = wait;
+ } else {
+ t -= delta;
+ }
DELAY(delta*1000);
}
if ((verbose >= 2) && (c > 0))
- log(LOG_DEBUG,"kbdio: %d char read (empty_aux_buffer)\n",c);
+ log(LOG_DEBUG,"kbdio: %d char read (empty_aux_buffer)\n",c);
}
/* discard any data from the keyboard or the aux device */
void
-empty_both_buffers(int port, int t)
+empty_both_buffers(int port, int wait)
{
+ int t;
int b;
int c = 0;
int delta = 2;
- for (; t > 0; t -= delta) {
+ for (t = wait; t > 0; ) {
if (inb(port + KBD_STATUS_PORT) & KBDS_ANY_BUFFER_FULL) {
DELAY(KBDD_DELAYTIME);
- b = inb(port + KBD_DATA_PORT);
- ++c;
- }
+ b = inb(port + KBD_DATA_PORT);
+ ++c;
+ t = wait;
+ } else {
+ t -= delta;
+ }
DELAY(delta*1000);
}
if ((verbose >= 2) && (c > 0))
- log(LOG_DEBUG,"kbdio: %d char read (empty_both_buffers)\n",c);
+ log(LOG_DEBUG,"kbdio: %d char read (empty_both_buffers)\n",c);
}
/* keyboard and mouse device control */
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/kbdio.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- src/sys/i386/isa/kbdio.h 1996/12/04 16:11:45 1.1.2.2
+++ src/sys/i386/isa/kbdio.h 1997/01/15 12:03:41 1.1.2.3
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kbdio.h,v 1.1.2.2 1996/12/04 16:11:45 phk Exp $
+ * $Id: kbdio.h,v 1.1.2.3 1997/01/15 12:03:41 sos Exp $
*/
#ifndef _I386_ISA_KBDIO_H_
@@ -93,6 +93,7 @@
#define PSMC_RESET_DEV 0x00ff
#define PSMC_ENABLE_DEV 0x00f4
#define PSMC_DISABLE_DEV 0x00f5
+#define PSMC_SET_DEFAULTS 0x00f6
#define PSMC_SEND_DEV_ID 0x00f2
#define PSMC_SEND_DEV_STATUS 0x00e9
#define PSMC_SEND_DEV_DATA 0x00eb