Newbusify mse driver.

This commit is contained in:
Yoshihiro Takahashi 2000-03-29 14:23:16 +00:00
parent 04c89022a2
commit 3de3db30db
2 changed files with 358 additions and 197 deletions

View File

@ -29,7 +29,6 @@
#include "vt.h"
#include "adv.h"
#include "wdc.h"
#include "mse.h"
#include "ar.h"
#include "cs.h"
#include "cx.h"
@ -89,7 +88,6 @@ struct old_isa_driver {
extern struct isa_driver vtdriver;
extern struct isa_driver advdriver;
extern struct isa_driver wdcdriver;
extern struct isa_driver msedriver;
extern struct isa_driver ardriver;
extern struct isa_driver csdriver;
extern struct isa_driver cxdriver;
@ -162,9 +160,6 @@ static struct old_isa_driver old_drivers[] = {
#if NVT > 0
{ INTR_TYPE_TTY, &vtdriver },
#endif
#if NMSE > 0
{ INTR_TYPE_TTY, &msedriver },
#endif
#if NGP > 0
{ INTR_TYPE_TTY, &gpdriver },
#endif

View File

@ -44,30 +44,91 @@
* that causes spurious button pushes.
*/
#include "mse.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/poll.h>
#include <sys/select.h>
#include <sys/uio.h>
#include <machine/bus.h>
#include <machine/clock.h>
#include <machine/mouse.h>
#include <machine/resource.h>
#include <sys/rman.h>
#include <i386/isa/isa_device.h>
#include <i386/isa/icu.h>
#include <isa/isavar.h>
/* driver configuration flags (config) */
#define MSE_CONFIG_ACCEL 0x00f0 /* acceleration factor */
#define MSE_CONFIG_FLAGS (MSE_CONFIG_ACCEL)
static int mseprobe(struct isa_device *);
static int mseattach(struct isa_device *);
/*
* Software control structure for mouse. The sc_enablemouse(),
* sc_disablemouse() and sc_getmouse() routines must be called spl'd().
*/
typedef struct mse_softc {
int sc_flags;
int sc_mousetype;
struct selinfo sc_selp;
struct resource *sc_port;
struct resource *sc_intr;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
void *sc_ih;
void (*sc_enablemouse) __P((bus_space_tag_t t,
bus_space_handle_t h));
void (*sc_disablemouse) __P((bus_space_tag_t t,
bus_space_handle_t h));
void (*sc_getmouse) __P((bus_space_tag_t t,
bus_space_handle_t h,
int *dx, int *dy, int *but));
int sc_deltax;
int sc_deltay;
int sc_obuttons;
int sc_buttons;
int sc_bytesread;
u_char sc_bytes[MOUSE_SYS_PACKETSIZE];
struct callout_handle sc_callout;
int sc_watchdog;
dev_t sc_dev;
dev_t sc_ndev;
mousehw_t hw;
mousemode_t mode;
mousestatus_t status;
} mse_softc_t;
struct isa_driver msedriver = {
mseprobe, mseattach, "mse"
static devclass_t mse_devclass;
static int mse_probe __P((device_t dev));
static int mse_attach __P((device_t dev));
static int mse_detach __P((device_t dev));
static device_method_t mse_methods[] = {
DEVMETHOD(device_probe, mse_probe),
DEVMETHOD(device_attach, mse_attach),
DEVMETHOD(device_detach, mse_detach),
{ 0, 0 }
};
static driver_t mse_driver = {
"mse",
mse_methods,
sizeof(mse_softc_t),
};
DRIVER_MODULE(mse, isa, mse_driver, mse_devclass, 0, 0);
static struct isa_pnp_id mse_ids[] = {
{ 0x000fd041, "Bus mouse" }, /* PNP0F00 */
{ 0x020fd041, "InPort mouse" }, /* PNP0F02 */
{ 0x0d0fd041, "InPort mouse compatible" }, /* PNP0F0D */
{ 0x110fd041, "Bus mouse compatible" }, /* PNP0F11 */
{ 0x150fd041, "Logitech bus mouse" }, /* PNP0F15 */
{ 0x180fd041, "Logitech bus mouse compatible" },/* PNP0F18 */
{ 0 }
};
static d_open_t mseopen;
@ -94,30 +155,8 @@ static struct cdevsw mse_cdevsw = {
/* bmaj */ -1
};
static ointhand2_t mseintr;
/*
* Software control structure for mouse. The sc_enablemouse(),
* sc_disablemouse() and sc_getmouse() routines must be called spl'd().
*/
static struct mse_softc {
int sc_flags;
int sc_mousetype;
struct selinfo sc_selp;
u_int sc_port;
void (*sc_enablemouse) __P((u_int port));
void (*sc_disablemouse) __P((u_int port));
void (*sc_getmouse) __P((u_int port, int *dx, int *dy, int *but));
int sc_deltax;
int sc_deltay;
int sc_obuttons;
int sc_buttons;
int sc_bytesread;
u_char sc_bytes[MOUSE_SYS_PACKETSIZE];
mousehw_t hw;
mousemode_t mode;
mousestatus_t status;
} mse_sc[NMSE];
static void mseintr __P((void *));
static timeout_t msetimeout;
/* Flags */
#define MSESC_OPEN 0x1
@ -133,19 +172,11 @@ static struct mse_softc {
#define MSE_LOGI_SIG 0xA5
#endif
#ifdef PC98
#define NORMAL_MSPORT 0x7fd9
#define PORT_A 0
#define PORT_B 2
#define PORT_C 4
#else /* IBM_PC */
#define MSE_PORTA 0
#define MSE_PORTB 1
#define MSE_PORTC 2
#define MSE_PORTD 3
#endif
#define MSE_IOSIZE 4
#define MSE_UNIT(dev) (minor(dev) >> 1)
#define MSE_NBLOCKIO(dev) (minor(dev) & 0x1)
@ -155,9 +186,9 @@ static struct mse_softc {
* PC-9801 Bus mouse definitions
*/
#define MODE 6
#define HC 6
#define INT 6
#define MODE MSE_PORTD
#define HC MSE_PORTD
#define INT MSE_PORTD
#define XL 0x00
#define XH 0x20
@ -169,15 +200,16 @@ static struct mse_softc {
#define HC_NO_CLEAR 0xe
#define HC_CLEAR 0xf
#define NORMAL_MSIRQ IRQ13 /* INT6 */
static bus_addr_t mse_port[] = {0, 2, 4, 6};
static int msport;
static int msirq;
static int mse_probe98m __P((struct isa_device *idp));
static void mse_disable98m __P((u_int port));
static void mse_get98m __P((u_int port, int *dx, int *dy, int *but));
static void mse_enable98m __P((u_int port));
static int mse_probe98m __P((device_t dev, mse_softc_t *sc));
static void mse_disable98m __P((bus_space_tag_t t,
bus_space_handle_t h));
static void mse_get98m __P((bus_space_tag_t t,
bus_space_handle_t h,
int *dx, int *dy, int *but));
static void mse_enable98m __P((bus_space_tag_t t,
bus_space_handle_t h));
#else
/*
* Logitech bus mouse definitions
@ -216,10 +248,14 @@ static void mse_enable98m __P((u_int port));
#define MSE_DISINTR 0x10
#define MSE_INTREN 0x00
static int mse_probelogi __P((struct isa_device *idp));
static void mse_disablelogi __P((u_int port));
static void mse_getlogi __P((u_int port, int *dx, int *dy, int *but));
static void mse_enablelogi __P((u_int port));
static int mse_probelogi __P((device_t dev, mse_softc_t *sc));
static void mse_disablelogi __P((bus_space_tag_t t,
bus_space_handle_t h));
static void mse_getlogi __P((bus_space_tag_t t,
bus_space_handle_t h,
int *dx, int *dy, int *but));
static void mse_enablelogi __P((bus_space_tag_t t,
bus_space_handle_t h));
/*
* ATI Inport mouse definitions
@ -232,10 +268,14 @@ static void mse_enablelogi __P((u_int port));
#define MSE_INPORT_HOLD 0x20
#define MSE_INPORT_INTREN 0x09
static int mse_probeati __P((struct isa_device *idp));
static void mse_enableati __P((u_int port));
static void mse_disableati __P((u_int port));
static void mse_getati __P((u_int port, int *dx, int *dy, int *but));
static int mse_probeati __P((device_t dev, mse_softc_t *sc));
static void mse_enableati __P((bus_space_tag_t t,
bus_space_handle_t h));
static void mse_disableati __P((bus_space_tag_t t,
bus_space_handle_t h));
static void mse_getati __P((bus_space_tag_t t,
bus_space_handle_t h,
int *dx, int *dy, int *but));
#endif
#define MSEPRI (PZERO + 3)
@ -247,13 +287,14 @@ static void mse_getati __P((u_int port, int *dx, int *dy, int *but));
*/
static struct mse_types {
int m_type; /* Type of bus mouse */
int (*m_probe) __P((struct isa_device *idp));
int (*m_probe) __P((device_t dev, mse_softc_t *sc));
/* Probe routine to test for it */
void (*m_enable) __P((u_int port));
void (*m_enable) __P((bus_space_tag_t t, bus_space_handle_t h));
/* Start routine */
void (*m_disable) __P((u_int port));
void (*m_disable) __P((bus_space_tag_t t, bus_space_handle_t h));
/* Disable interrupts routine */
void (*m_get) __P((u_int port, int *dx, int *dy, int *but));
void (*m_get) __P((bus_space_tag_t t, bus_space_handle_t h,
int *dx, int *dy, int *but));
/* and get mouse status */
mousehw_t m_hw; /* buttons iftype type model hwid */
mousemode_t m_mode; /* proto rate res accel level size mask */
@ -279,57 +320,139 @@ static struct mse_types {
{ 0, },
};
int
mseprobe(idp)
register struct isa_device *idp;
static int
mse_probe(dev)
device_t dev;
{
register struct mse_softc *sc = &mse_sc[idp->id_unit];
register int i;
mse_softc_t *sc;
int error;
int rid;
int i;
/* check PnP IDs */
error = ISA_PNP_PROBE(device_get_parent(dev), dev, mse_ids);
if (error == ENXIO)
return ENXIO;
sc = device_get_softc(dev);
rid = 0;
#ifdef PC98
sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, mse_port,
MSE_IOSIZE, RF_ACTIVE);
#else
sc->sc_port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
MSE_IOSIZE, RF_ACTIVE);
#endif
if (sc->sc_port == NULL)
return ENXIO;
#ifdef PC98
if (isa_load_resourcev(sc->sc_port, mse_port, MSE_IOSIZE)) {
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
return ENXIO;
}
#endif
sc->sc_iot = rman_get_bustag(sc->sc_port);
sc->sc_ioh = rman_get_bushandle(sc->sc_port);
/*
* Check for each mouse type in the table.
*/
i = 0;
while (mse_types[i].m_type) {
if ((*mse_types[i].m_probe)(idp)) {
if ((*mse_types[i].m_probe)(dev, sc)) {
sc->sc_mousetype = mse_types[i].m_type;
sc->sc_enablemouse = mse_types[i].m_enable;
sc->sc_disablemouse = mse_types[i].m_disable;
sc->sc_getmouse = mse_types[i].m_get;
sc->hw = mse_types[i].m_hw;
sc->mode = mse_types[i].m_mode;
return (1);
bus_release_resource(dev, SYS_RES_IOPORT, rid,
sc->sc_port);
device_set_desc(dev, "Bus/InPort Mouse");
return 0;
}
i++;
}
return (0);
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
return ENXIO;
}
int
mseattach(idp)
struct isa_device *idp;
static int
mse_attach(dev)
device_t dev;
{
int unit = idp->id_unit;
struct mse_softc *sc = &mse_sc[unit];
mse_softc_t *sc;
int flags;
int unit;
int rid;
sc = device_get_softc(dev);
unit = device_get_unit(dev);
rid = 0;
#ifdef PC98
if (msport != idp->id_iobase) {
idp->id_iobase = msport;
printf(" [ioport is changed to #0x%x]", msport);
}
if (msirq != idp->id_irq) {
idp->id_irq = msirq;
printf(" [irq is changed to IR%d]", ffs(msirq)-1);
sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, mse_port,
MSE_IOSIZE, RF_ACTIVE);
#else
sc->sc_port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
MSE_IOSIZE, RF_ACTIVE);
#endif
if (sc->sc_port == NULL)
return ENXIO;
#ifdef PC98
if (isa_load_resourcev(sc->sc_port, mse_port, MSE_IOSIZE)) {
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
return ENXIO;
}
#endif
sc->sc_intr = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
RF_ACTIVE);
if (sc->sc_intr == NULL) {
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
return ENXIO;
}
sc->sc_iot = rman_get_bustag(sc->sc_port);
sc->sc_ioh = rman_get_bushandle(sc->sc_port);
idp->id_ointr = mseintr;
sc->sc_port = idp->id_iobase;
sc->mode.accelfactor = (idp->id_flags & MSE_CONFIG_ACCEL) >> 4;
make_dev(&mse_cdevsw, unit << 1, 0, 0, 0600, "mse%d", unit);
make_dev(&mse_cdevsw, (unit<<1)+1, 0, 0, 0600, "nmse%d", unit);
return (1);
if (BUS_SETUP_INTR(device_get_parent(dev), dev, sc->sc_intr,
INTR_TYPE_TTY, mseintr, sc, &sc->sc_ih)) {
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
bus_release_resource(dev, SYS_RES_IRQ, rid, sc->sc_intr);
return ENXIO;
}
flags = device_get_flags(dev);
sc->mode.accelfactor = (flags & MSE_CONFIG_ACCEL) >> 4;
callout_handle_init(&sc->sc_callout);
sc->sc_dev = make_dev(&mse_cdevsw, unit << 1, 0, 0, 0600,
"mse%d", unit);
sc->sc_ndev = make_dev(&mse_cdevsw, (unit<<1)+1, 0, 0, 0600,
"nmse%d", unit);
return 0;
}
static int
mse_detach(dev)
device_t dev;
{
mse_softc_t *sc;
int rid;
sc = device_get_softc(dev);
if (sc->sc_flags & MSESC_OPEN)
return EBUSY;
rid = 0;
BUS_TEARDOWN_INTR(device_get_parent(dev), dev, sc->sc_intr, sc->sc_ih);
bus_release_resource(dev, SYS_RES_IRQ, rid, sc->sc_intr);
bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
destroy_dev(sc->sc_dev);
destroy_dev(sc->sc_ndev);
return 0;
}
/*
@ -342,12 +465,12 @@ mseopen(dev, flags, fmt, p)
int fmt;
struct proc *p;
{
register struct mse_softc *sc;
mse_softc_t *sc;
int s;
if (MSE_UNIT(dev) >= NMSE)
sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
if (sc == NULL)
return (ENXIO);
sc = &mse_sc[MSE_UNIT(dev)];
if (sc->sc_mousetype == MSE_NONE)
return (ENXIO);
if (sc->sc_flags & MSESC_OPEN)
@ -356,6 +479,8 @@ mseopen(dev, flags, fmt, p)
sc->sc_obuttons = sc->sc_buttons = MOUSE_MSC_BUTTONS;
sc->sc_deltax = sc->sc_deltay = 0;
sc->sc_bytesread = sc->mode.packetsize = MOUSE_MSC_PACKETSIZE;
sc->sc_watchdog = FALSE;
sc->sc_callout = timeout(msetimeout, dev, hz*2);
sc->mode.level = 0;
sc->status.flags = 0;
sc->status.button = sc->status.obutton = 0;
@ -365,7 +490,7 @@ mseopen(dev, flags, fmt, p)
* Initialize mouse interface and enable interrupts.
*/
s = spltty();
(*sc->sc_enablemouse)(sc->sc_port);
(*sc->sc_enablemouse)(sc->sc_iot, sc->sc_ioh);
splx(s);
return (0);
}
@ -380,11 +505,13 @@ mseclose(dev, flags, fmt, p)
int fmt;
struct proc *p;
{
struct mse_softc *sc = &mse_sc[MSE_UNIT(dev)];
mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
int s;
untimeout(msetimeout, dev, sc->sc_callout);
callout_handle_init(&sc->sc_callout);
s = spltty();
(*sc->sc_disablemouse)(sc->sc_port);
(*sc->sc_disablemouse)(sc->sc_iot, sc->sc_ioh);
sc->sc_flags &= ~MSESC_OPEN;
splx(s);
return(0);
@ -401,7 +528,7 @@ mseread(dev, uio, ioflag)
struct uio *uio;
int ioflag;
{
register struct mse_softc *sc = &mse_sc[MSE_UNIT(dev)];
mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
int xfer, s, error;
/*
@ -470,7 +597,7 @@ mseioctl(dev, cmd, addr, flag, p)
int flag;
struct proc *p;
{
register struct mse_softc *sc = &mse_sc[MSE_UNIT(dev)];
mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
mousestatus_t status;
int err = 0;
int s;
@ -585,7 +712,7 @@ msepoll(dev, events, p)
int events;
struct proc *p;
{
register struct mse_softc *sc = &mse_sc[MSE_UNIT(dev)];
mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
int s;
int revents = 0;
@ -607,12 +734,33 @@ msepoll(dev, events, p)
return (revents);
}
/*
* msetimeout: watchdog timer routine.
*/
static void
msetimeout(arg)
void *arg;
{
dev_t dev;
mse_softc_t *sc;
dev = (dev_t)arg;
sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev));
if (sc->sc_watchdog) {
if (bootverbose)
printf("mse%d: lost interrupt?\n", MSE_UNIT(dev));
mseintr(sc);
}
sc->sc_watchdog = TRUE;
sc->sc_callout = timeout(msetimeout, dev, hz);
}
/*
* mseintr: update mouse status. sc_deltax and sc_deltay are accumulative.
*/
static void
mseintr(unit)
int unit;
mseintr(arg)
void *arg;
{
/*
* the table to turn MouseSystem button bits (MOUSE_MSC_BUTTON?UP)
@ -628,7 +776,7 @@ mseintr(unit)
MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN,
MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN
};
register struct mse_softc *sc = &mse_sc[unit];
mse_softc_t *sc = arg;
int dx, dy, but;
int sign;
@ -640,7 +788,7 @@ mseintr(unit)
if ((sc->sc_flags & MSESC_OPEN) == 0)
return;
(*sc->sc_getmouse)(sc->sc_port, &dx, &dy, &but);
(*sc->sc_getmouse)(sc->sc_iot, sc->sc_ioh, &dx, &dy, &but);
if (sc->mode.accelfactor > 0) {
sign = (dx < 0);
dx = dx * dx / sc->mode.accelfactor;
@ -666,6 +814,8 @@ mseintr(unit)
| (sc->status.button ^ but);
sc->status.button = but;
sc->sc_watchdog = FALSE;
/*
* If mouse state has changed, wake up anyone wanting to know.
*/
@ -689,24 +839,26 @@ mseintr(unit)
* interrupts and return 1)
*/
static int
mse_probelogi(idp)
register struct isa_device *idp;
mse_probelogi(dev, sc)
device_t dev;
mse_softc_t *sc;
{
int sig;
outb(idp->id_iobase + MSE_PORTD, MSE_SETUP);
bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSE_PORTD, MSE_SETUP);
/* set the signature port */
outb(idp->id_iobase + MSE_PORTB, MSE_LOGI_SIG);
bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSE_PORTB, MSE_LOGI_SIG);
DELAY(30000); /* 30 ms delay */
sig = inb(idp->id_iobase + MSE_PORTB) & 0xFF;
sig = bus_space_read_1(sc->sc_iot, sc->sc_ioh, MSE_PORTB) & 0xFF;
if (sig == MSE_LOGI_SIG) {
outb(idp->id_iobase + MSE_PORTC, MSE_DISINTR);
bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSE_PORTC,
MSE_DISINTR);
return(1);
} else {
if (bootverbose)
printf("mse%d: wrong signature %x\n",idp->id_unit,sig);
device_printf(dev, "wrong signature %x\n", sig);
return(0);
}
}
@ -715,51 +867,54 @@ mse_probelogi(idp)
* Initialize Logitech mouse and enable interrupts.
*/
static void
mse_enablelogi(port)
register u_int port;
mse_enablelogi(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
int dx, dy, but;
outb(port + MSE_PORTD, MSE_SETUP);
mse_getlogi(port, &dx, &dy, &but);
bus_space_write_1(tag, handle, MSE_PORTD, MSE_SETUP);
mse_getlogi(tag, handle, &dx, &dy, &but);
}
/*
* Disable interrupts for Logitech mouse.
*/
static void
mse_disablelogi(port)
register u_int port;
mse_disablelogi(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
outb(port + MSE_PORTC, MSE_DISINTR);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_DISINTR);
}
/*
* Get the current dx, dy and button up/down state.
*/
static void
mse_getlogi(port, dx, dy, but)
register u_int port;
mse_getlogi(tag, handle, dx, dy, but)
bus_space_tag_t tag;
bus_space_handle_t handle;
int *dx;
int *dy;
int *but;
{
register char x, y;
outb(port + MSE_PORTC, MSE_HOLD | MSE_RXLOW);
x = inb(port + MSE_PORTA);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_HOLD | MSE_RXLOW);
x = bus_space_read_1(tag, handle, MSE_PORTA);
*but = (x >> 5) & MOUSE_MSC_BUTTONS;
x &= 0xf;
outb(port + MSE_PORTC, MSE_HOLD | MSE_RXHIGH);
x |= (inb(port + MSE_PORTA) << 4);
outb(port + MSE_PORTC, MSE_HOLD | MSE_RYLOW);
y = (inb(port + MSE_PORTA) & 0xf);
outb(port + MSE_PORTC, MSE_HOLD | MSE_RYHIGH);
y |= (inb(port + MSE_PORTA) << 4);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_HOLD | MSE_RXHIGH);
x |= (bus_space_read_1(tag, handle, MSE_PORTA) << 4);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_HOLD | MSE_RYLOW);
y = (bus_space_read_1(tag, handle, MSE_PORTA) & 0xf);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_HOLD | MSE_RYHIGH);
y |= (bus_space_read_1(tag, handle, MSE_PORTA) << 4);
*dx = x;
*dy = y;
outb(port + MSE_PORTC, MSE_INTREN);
bus_space_write_1(tag, handle, MSE_PORTC, MSE_INTREN);
}
/*
@ -770,13 +925,14 @@ mse_getlogi(port, dx, dy, but)
* (do not enable interrupts)
*/
static int
mse_probeati(idp)
register struct isa_device *idp;
mse_probeati(dev, sc)
device_t dev;
mse_softc_t *sc;
{
int i;
for (i = 0; i < 2; i++)
if (inb(idp->id_iobase + MSE_PORTC) == 0xde)
if (bus_space_read_1(sc->sc_iot, sc->sc_ioh, MSE_PORTC) == 0xde)
return (1);
return (0);
}
@ -785,56 +941,58 @@ mse_probeati(idp)
* Initialize ATI Inport mouse and enable interrupts.
*/
static void
mse_enableati(port)
register u_int port;
mse_enableati(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
outb(port + MSE_PORTA, MSE_INPORT_RESET);
outb(port + MSE_PORTA, MSE_INPORT_MODE);
outb(port + MSE_PORTB, MSE_INPORT_INTREN);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_RESET);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_MODE);
bus_space_write_1(tag, handle, MSE_PORTB, MSE_INPORT_INTREN);
}
/*
* Disable interrupts for ATI Inport mouse.
*/
static void
mse_disableati(port)
register u_int port;
mse_disableati(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
outb(port + MSE_PORTA, MSE_INPORT_MODE);
outb(port + MSE_PORTB, 0);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_MODE);
bus_space_write_1(tag, handle, MSE_PORTB, 0);
}
/*
* Get current dx, dy and up/down button state.
*/
static void
mse_getati(port, dx, dy, but)
register u_int port;
mse_getati(tag, handle, dx, dy, but)
bus_space_tag_t tag;
bus_space_handle_t handle;
int *dx;
int *dy;
int *but;
{
register char byte;
outb(port + MSE_PORTA, MSE_INPORT_MODE);
outb(port + MSE_PORTB, MSE_INPORT_HOLD);
outb(port + MSE_PORTA, MSE_INPORT_STATUS);
*but = ~inb(port + MSE_PORTB) & MOUSE_MSC_BUTTONS;
outb(port + MSE_PORTA, MSE_INPORT_DX);
byte = inb(port + MSE_PORTB);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_MODE);
bus_space_write_1(tag, handle, MSE_PORTB, MSE_INPORT_HOLD);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_STATUS);
*but = ~bus_space_read_1(tag, handle, MSE_PORTB) & MOUSE_MSC_BUTTONS;
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_DX);
byte = bus_space_read_1(tag, handle, MSE_PORTB);
*dx = byte;
outb(port + MSE_PORTA, MSE_INPORT_DY);
byte = inb(port + MSE_PORTB);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_DY);
byte = bus_space_read_1(tag, handle, MSE_PORTB);
*dy = byte;
outb(port + MSE_PORTA, MSE_INPORT_MODE);
outb(port + MSE_PORTB, MSE_INPORT_INTREN);
bus_space_write_1(tag, handle, MSE_PORTA, MSE_INPORT_MODE);
bus_space_write_1(tag, handle, MSE_PORTB, MSE_INPORT_INTREN);
}
#endif
#ifdef PC98
/*
* Routines for the PC98 bus mouse.
*/
@ -844,19 +1002,21 @@ mse_getati(port, dx, dy, but)
* (do not enable interrupts)
*/
static int
mse_probe98m(idp)
register struct isa_device *idp;
mse_probe98m(dev, sc)
device_t dev;
mse_softc_t *sc;
{
msport = NORMAL_MSPORT;
msirq = NORMAL_MSIRQ;
/* mode set */
outb(msport + MODE, 0x93);
bus_space_write_1(sc->sc_iot, sc->sc_ioh, MODE, 0x93);
/* initialize */
outb(msport + INT, INT_DISABLE); /* INT disable */
outb(msport + HC, HC_NO_CLEAR); /* HC = 0 */
outb(msport + HC, HC_CLEAR); /* HC = 1 */
/* INT disable */
bus_space_write_1(sc->sc_iot, sc->sc_ioh, INT, INT_DISABLE);
/* HC = 0 */
bus_space_write_1(sc->sc_iot, sc->sc_ioh, HC, HC_NO_CLEAR);
/* HC = 1 */
bus_space_write_1(sc->sc_iot, sc->sc_ioh, HC, HC_CLEAR);
return (1);
}
@ -864,60 +1024,66 @@ mse_probe98m(idp)
* Initialize PC98 bus mouse and enable interrupts.
*/
static void
mse_enable98m(port)
register u_int port;
mse_enable98m(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
outb(port + INT, INT_ENABLE);/* INT enable */
outb(port + HC, HC_NO_CLEAR); /* HC = 0 */
outb(port + HC, HC_CLEAR); /* HC = 1 */
bus_space_write_1(tag, handle, INT, INT_ENABLE); /* INT enable */
bus_space_write_1(tag, handle, HC, HC_NO_CLEAR); /* HC = 0 */
bus_space_write_1(tag, handle, HC, HC_CLEAR); /* HC = 1 */
}
/*
* Disable interrupts for PC98 Bus mouse.
*/
static void
mse_disable98m(port)
register u_int port;
mse_disable98m(tag, handle)
bus_space_tag_t tag;
bus_space_handle_t handle;
{
outb(port + INT, INT_DISABLE);/* INT disable */
outb(port + HC, HC_NO_CLEAR); /* HC = 0 */
outb(port + HC, HC_CLEAR); /* HC = 1 */
bus_space_write_1(tag, handle, INT, INT_DISABLE); /* INT disable */
bus_space_write_1(tag, handle, HC, HC_NO_CLEAR); /* HC = 0 */
bus_space_write_1(tag, handle, HC, HC_CLEAR); /* HC = 1 */
}
/*
* Get current dx, dy and up/down button state.
*/
static void
mse_get98m(port, dx, dy, but)
register u_int port;
int *dx;
int *dy;
int *but;
mse_get98m(tag, handle, dx, dy, but)
bus_space_tag_t tag;
bus_space_handle_t handle;
int *dx;
int *dy;
int *but;
{
register char x, y;
outb(port + INT, INT_DISABLE); /* INT disable */
bus_space_write_1(tag, handle, INT, INT_DISABLE); /* INT disable */
outb(port + HC, HC_CLEAR); /* HC = 1 */
bus_space_write_1(tag, handle, HC, HC_CLEAR); /* HC = 1 */
outb(port + PORT_C, 0x90 | XL);
x = inb(port + PORT_A) & 0x0f; /* X low */
outb(port + PORT_C, 0x90 | XH);
x |= ((inb(port + PORT_A) & 0x0f) << 4); /* X high */
/* X low */
bus_space_write_1(tag, handle, MSE_PORTC, 0x90 | XL);
x = bus_space_read_1(tag, handle, MSE_PORTA) & 0x0f;
/* X high */
bus_space_write_1(tag, handle, MSE_PORTC, 0x90 | XH);
x |= ((bus_space_read_1(tag, handle, MSE_PORTA) & 0x0f) << 4);
outb(port + PORT_C, 0x90 | YL);
y = (inb(port + PORT_A) & 0x0f); /* Y low */
outb(port + PORT_C, 0x90 | YH);
y |= ((inb(port + PORT_A) & 0x0f) << 4);
/* Y low */
bus_space_write_1(tag, handle, MSE_PORTC, 0x90 | YL);
y = (bus_space_read_1(tag, handle, MSE_PORTA) & 0x0f);
/* Y high */
bus_space_write_1(tag, handle, MSE_PORTC, 0x90 | YH);
y |= ((bus_space_read_1(tag, handle, MSE_PORTA) & 0x0f) << 4);
*but = (inb(port + PORT_A) >> 5) & 7;
*but = (bus_space_read_1(tag, handle, MSE_PORTA) >> 5) & 7;
*dx = x;
*dy = y;
outb(port + HC, HC_NO_CLEAR); /* HC = 0 */
bus_space_write_1(tag, handle, HC, HC_NO_CLEAR); /* HC = 0 */
outb(port + INT, INT_ENABLE); /* INT enable */
bus_space_write_1(tag, handle, INT, INT_ENABLE); /* INT enable */
}
#endif