/* $NetBSD: nextkbd.c,v 1.19 2023/02/03 23:13:00 tsutsui Exp $ */
/*
* Copyright (c) 1998 Matt DeBergalis
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Matt DeBergalis
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
if (sc->sc_leds & WSKBD_LED_CAPS) {
hw_leds |= 0x30000;
}
s = spltty();
bus_space_write_1(sc->id->iot, sc->id->ioh, 3, 0xc5);
/*
* @@@ need to add:
* if bit 7 of @ioh+0 set:
* repeat 2
* wait until bit 6 of @ioh+2 clears
*/
bus_space_write_4(sc->id->iot, sc->id->ioh, 4, hw_leds);
/*
* @@@ need to add:
* wait until bit 4 of @ioh+0 (@ioh+2 if bit 7 was set above)
* clears
*/
splx(s);
}
int
nextkbd_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l)
{
struct nextkbd_softc *sc = v;
switch (cmd) {
case WSKBDIO_GTYPE:
/* XXX */
*(int *)data = WSKBD_TYPE_NEXT;
return 0;
case WSKBDIO_SETLEDS:
nextkbd_set_leds (sc, *(int *)data);
return 0;
case WSKBDIO_GETLEDS:
*(int *)data = sc->sc_leds & NEXT_WSKBD_LEDS;
return 0;
case WSKBDIO_COMPLEXBELL:
return 0;
}
return EPASSTHROUGH;
}
int
nextkbdhard(void *arg)
{
struct nextkbd_softc *sc = arg;
int type, key, val;