Update from John Wittkoski: work around problem with mice that claim to
support Extended Mouse Protocol, but really don't; the Logitech Mouseman is one such mouse (model M-AC13-4MD).
This commit is contained in:
parent
13fa4227b1
commit
a6c6c9c1ad
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: adbsys.c,v 1.32 1997/11/05 08:21:47 ender Exp $ */
|
||||
/* $NetBSD: adbsys.c,v 1.33 1997/11/07 07:38:10 scottr Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 1994 Bradley A. Grantham
|
||||
|
@ -130,6 +130,69 @@ adb_msa3_complete(buffer, data_area, adb_command)
|
|||
adb_processevent(&event);
|
||||
}
|
||||
|
||||
void
|
||||
adb_mm_nonemp_complete(buffer, data_area, adb_command)
|
||||
caddr_t buffer;
|
||||
caddr_t data_area;
|
||||
int adb_command;
|
||||
{
|
||||
adb_event_t event;
|
||||
ADBDataBlock adbdata;
|
||||
int adbaddr;
|
||||
int error;
|
||||
|
||||
#ifdef MRG_DEBUG
|
||||
register int i;
|
||||
|
||||
printf("adb: transaction completion\n");
|
||||
#endif
|
||||
|
||||
adbaddr = (adb_command & 0xf0) >> 4;
|
||||
error = GetADBInfo(&adbdata, adbaddr);
|
||||
#ifdef MRG_DEBUG
|
||||
printf("adb: GetADBInfo returned %d\n", error);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
printf("adb: from %d at %d (org %d) %d:", event.addr,
|
||||
event.hand_id, event.def_addr, buffer[0]);
|
||||
for (i = 1; i <= buffer[0]; i++)
|
||||
printf(" %x", buffer[i]);
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
/* massage the data to look like EMP data */
|
||||
if ( (buffer[3] & 0x04) == 0x04 )
|
||||
buffer[1]&=0x7f;
|
||||
else
|
||||
buffer[1]|=0x80;
|
||||
if ( (buffer[3] & 0x02) == 0x02 )
|
||||
buffer[2]&=0x7f;
|
||||
else
|
||||
buffer[2]|=0x80;
|
||||
if ( (buffer[3] & 0x01) == 0x01 )
|
||||
buffer[3]=0x00;
|
||||
else
|
||||
buffer[3]=0x80;
|
||||
event.addr = adbaddr;
|
||||
event.hand_id = adbdata.devType;
|
||||
event.def_addr = adbdata.origADBAddr;
|
||||
event.byte_count = buffer[0];
|
||||
memcpy(event.bytes, buffer + 1, event.byte_count);
|
||||
|
||||
#ifdef MRG_DEBUG
|
||||
printf("adb: from %d at %d (org %d) %d:", event.addr,
|
||||
event.hand_id, event.def_addr, buffer[0]);
|
||||
for (i = 1; i <= buffer[0]; i++)
|
||||
printf(" %x", buffer[i]);
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
microtime(&event.timestamp);
|
||||
|
||||
adb_processevent(&event);
|
||||
}
|
||||
|
||||
static volatile int extdms_done;
|
||||
|
||||
/*
|
||||
|
@ -143,7 +206,7 @@ extdms_init(totaladbs)
|
|||
ADBDataBlock adbdata;
|
||||
int adbindex, adbaddr;
|
||||
short cmd;
|
||||
char buffer[9];
|
||||
u_char buffer[9];
|
||||
|
||||
for (adbindex = 1; adbindex <= totaladbs; adbindex++) {
|
||||
/* Get the ADB information */
|
||||
|
@ -265,15 +328,17 @@ adb_init()
|
|||
ADBSetInfoBlock adbinfo;
|
||||
int totaladbs;
|
||||
int adbindex, adbaddr;
|
||||
int error;
|
||||
char buffer[9];
|
||||
int error, cmd, devtype=0;
|
||||
u_char buffer[9];
|
||||
|
||||
#ifdef MRG_ADB
|
||||
/* Even if serial console only, some models require the
|
||||
* ADB in order to get the date/time and do soft power. */
|
||||
if ((mac68k_machine.serial_console & 0x03)) {
|
||||
printf("adb: using serial console\n");
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef MRG_ADB
|
||||
if (!mrg_romready()) {
|
||||
printf("adb: no ROM ADB driver in this kernel for this machine\n");
|
||||
return;
|
||||
|
@ -329,6 +394,15 @@ adb_init()
|
|||
printf("standard keyboard (ISO layout)");
|
||||
break;
|
||||
case ADB_EXTKBD:
|
||||
extdms_done = 0;
|
||||
cmd=(((adbaddr<<4) &0xf0) | 0x0d ); /* talk R1 */
|
||||
ADBOp((Ptr)buffer, (Ptr)extdms_complete,
|
||||
(Ptr)&extdms_done, cmd);
|
||||
while (!extdms_done);
|
||||
/* busy wait until done */
|
||||
if (buffer[1]==0x9a && buffer[2]==0x20 )
|
||||
printf("Mouseman (non-EMP) pseudo keyboard");
|
||||
else
|
||||
printf("extended keyboard");
|
||||
break;
|
||||
case ADB_EXTISOKBD:
|
||||
|
@ -383,7 +457,8 @@ adb_init()
|
|||
(Ptr)&extdms_done, (adbaddr << 4) | 0xf);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
switch (buffer[2]) {
|
||||
devtype=buffer[2];
|
||||
switch (devtype) {
|
||||
case ADBMS_100DPI:
|
||||
printf("100 dpi mouse");
|
||||
break;
|
||||
|
@ -404,6 +479,9 @@ adb_init()
|
|||
(adbaddr << 4) | 0xd);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
if (buffer[1]==0x9a && buffer[2]==0x20 )
|
||||
printf("Mouseman (non-EMP) mouse");
|
||||
else {
|
||||
printf("extended mouse "
|
||||
"<%c%c%c%c> %d-button %d dpi ",
|
||||
buffer[1], buffer[2],
|
||||
|
@ -416,6 +494,7 @@ adb_init()
|
|||
printf("trackball");
|
||||
else
|
||||
printf("unknown device");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("relative positioning device (mouse?) (%d)", adbdata.devType);
|
||||
|
@ -460,6 +539,55 @@ adb_init()
|
|||
(buffer[0] > 0) && (buffer[2] == ADBMS_MSA3)) {
|
||||
/* Special device handler for the A3 mouse */
|
||||
adbinfo.siServiceRtPtr = (Ptr)adb_msa3_asmcomplete;
|
||||
} else if ( ( adbdata.origADBAddr == ADBADDR_MAP ) &&
|
||||
( adbdata.devType == ADB_EXTKBD ) &&
|
||||
( buffer[1] == 0x9a ) && ( buffer[2]==0x20 ) ) {
|
||||
/* ignore non-EMP Mouseman pseudo keyboard */
|
||||
adbinfo.siServiceRtPtr = (Ptr)0;
|
||||
} else if ( ( adbdata.origADBAddr == ADBADDR_REL ) &&
|
||||
( devtype == ADBMS_EXTENDED ) &&
|
||||
( buffer[1] == 0x9a ) && ( buffer[2]==0x20 ) ) {
|
||||
/* Set up non-EMP Mouseman to put button
|
||||
* bits in 3rd byte instead of sending via
|
||||
* pseudo keyboard device. */
|
||||
extdms_done = 0;
|
||||
/* listen register 1 */
|
||||
buffer[0]=2;
|
||||
buffer[1]=0x00;
|
||||
buffer[2]=0x81;
|
||||
ADBOp((Ptr)buffer, (Ptr)extdms_complete,
|
||||
(Ptr)&extdms_done, (adbaddr << 4) | 0x9);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
extdms_done = 0;
|
||||
/* listen register 1 */
|
||||
buffer[0]=2;
|
||||
buffer[1]=0x01;
|
||||
buffer[2]=0x81;
|
||||
ADBOp((Ptr)buffer, (Ptr)extdms_complete,
|
||||
(Ptr)&extdms_done, (adbaddr << 4) | 0x9);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
extdms_done = 0;
|
||||
/* listen register 1 */
|
||||
buffer[0]=2;
|
||||
buffer[1]=0x02;
|
||||
buffer[2]=0x81;
|
||||
ADBOp((Ptr)buffer, (Ptr)extdms_complete,
|
||||
(Ptr)&extdms_done, (adbaddr << 4) | 0x9);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
extdms_done = 0;
|
||||
/* listen register 1 */
|
||||
buffer[0]=2;
|
||||
buffer[1]=0x03;
|
||||
buffer[2]=0x38;
|
||||
ADBOp((Ptr)buffer, (Ptr)extdms_complete,
|
||||
(Ptr)&extdms_done, (adbaddr << 4) | 0x9);
|
||||
while (!extdms_done)
|
||||
/* busy-wait until done */;
|
||||
/* non-EMP Mouseman has special handler */
|
||||
adbinfo.siServiceRtPtr = (Ptr)adb_mm_nonemp_asmcomplete;
|
||||
} else {
|
||||
/* Default completion routine */
|
||||
adbinfo.siServiceRtPtr = (Ptr)adb_asmcomplete;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: adbsysasm.s,v 1.5 1997/06/16 06:35:28 scottr Exp $ */
|
||||
/* $NetBSD: adbsysasm.s,v 1.6 1997/11/07 07:38:12 scottr Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 1994 Bradley A. Grantham
|
||||
|
@ -63,6 +63,20 @@ _adb_msa3_asmcomplete:
|
|||
moveml sp@+, #0x0303 | restore scratch regs
|
||||
rts
|
||||
|
||||
/* This routine is called when a Mouseman (non-EMP) mouse has sent
|
||||
* us some data. (provided it has been set up with SetADBInfo) */
|
||||
.global _adb_mm_nonemp_asmcomplete
|
||||
_adb_mm_nonemp_asmcomplete:
|
||||
moveml #0xc0c0, sp@- | save scratch regs
|
||||
movl d0, sp@- /* ADB command byte */
|
||||
movl a2, sp@- /* data area pointer */
|
||||
/* a1 is the pointer to this routine itself. */
|
||||
movl a0, sp@- /* device data buffer */
|
||||
jbsr _adb_mm_nonemp_complete
|
||||
addl #12, sp /* pop params */
|
||||
moveml sp@+, #0x0303 | restore scratch regs
|
||||
rts
|
||||
|
||||
_adb_jadbprochello:
|
||||
.asciz "adb: hello from adbproc\n"
|
||||
.even
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: adbvar.h,v 1.7 1997/06/16 06:35:29 scottr Exp $ */
|
||||
/* $NetBSD: adbvar.h,v 1.8 1997/11/07 07:38:14 scottr Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 1994 Bradley A. Grantham
|
||||
|
@ -61,11 +61,13 @@ int adbpoll __P((dev_t dev, int events, struct proc *p));
|
|||
/* adbsysasm.s */
|
||||
void adb_asmcomplete __P((void));
|
||||
void adb_msa3_asmcomplete __P((void));
|
||||
void adb_mm_nonemp_asmcomplete __P((void));
|
||||
void extdms_complete __P((void));
|
||||
|
||||
/* adbsys.c */
|
||||
void adb_complete __P((caddr_t buffer, caddr_t data_area, int adb_command));
|
||||
void adb_msa3_complete __P((caddr_t buffer, caddr_t data_area, int adb_command));
|
||||
void adb_mm_nonemp_complete __P((caddr_t buffer, caddr_t data_area, int adb_command));
|
||||
void extdms_init __P((int));
|
||||
|
||||
#ifndef MRG_ADB
|
||||
|
|
Loading…
Reference in New Issue