142421Syokota/*-
242421Syokota * Copyright (c) 1996-1999
342421Syokota * Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
442421Syokota * All rights reserved.
542421Syokota *
642421Syokota * Redistribution and use in source and binary forms, with or without
742421Syokota * modification, are permitted provided that the following conditions
842421Syokota * are met:
942421Syokota * 1. Redistributions of source code must retain the above copyright
1042421Syokota *    notice, this list of conditions and the following disclaimer.
1142421Syokota * 2. Redistributions in binary form must reproduce the above copyright
1242421Syokota *    notice, this list of conditions and the following disclaimer in the
1342421Syokota *    documentation and/or other materials provided with the distribution.
1442421Syokota * 3. The name of the author may not be used to endorse or promote
1542421Syokota *    products derived from this software without specific prior written
1642421Syokota *    permission.
1742421Syokota *
1842421Syokota * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1942421Syokota * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2042421Syokota * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2142421Syokota * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2242421Syokota * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2342421Syokota * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2442421Syokota * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2542421Syokota * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2642421Syokota * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2742421Syokota * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2842421Syokota * SUCH DAMAGE.
2942421Syokota *
3050477Speter * $FreeBSD$
3142421Syokota * from kbdio.h,v 1.8 1998/09/25 11:55:46 yokota Exp
3242421Syokota */
3342421Syokota
34147271Smarius#ifndef _DEV_ATKBDC_ATKBDCREG_H_
35147271Smarius#define	_DEV_ATKBDC_ATKBDCREG_H_
3642421Syokota
37105181Sphk#include "opt_kbd.h"	/* Structures depend on the value if KBDIO_DEBUG */
38105181Sphk
3942421Syokota/* constants */
4042421Syokota
4142421Syokota/* I/O ports */
4242421Syokota#define KBD_STATUS_PORT 	4	/* status port, read */
4342421Syokota#define KBD_COMMAND_PORT	4	/* controller command port, write */
4442421Syokota#define KBD_DATA_PORT		0	/* data port, read/write
4542421Syokota					 * also used as keyboard command
4642421Syokota					 * and mouse command port
4742421Syokota					 */
4842421Syokota
4942421Syokota/* controller commands (sent to KBD_COMMAND_PORT) */
5042421Syokota#define KBDC_SET_COMMAND_BYTE 	0x0060
5142421Syokota#define KBDC_GET_COMMAND_BYTE 	0x0020
5242421Syokota#define KBDC_WRITE_TO_AUX    	0x00d4
5342421Syokota#define KBDC_DISABLE_AUX_PORT 	0x00a7
5442421Syokota#define KBDC_ENABLE_AUX_PORT 	0x00a8
5542421Syokota#define KBDC_TEST_AUX_PORT   	0x00a9
5642421Syokota#define KBDC_DIAGNOSE	     	0x00aa
5742421Syokota#define KBDC_TEST_KBD_PORT   	0x00ab
5842421Syokota#define KBDC_DISABLE_KBD_PORT 	0x00ad
5942421Syokota#define KBDC_ENABLE_KBD_PORT 	0x00ae
6042421Syokota
6142421Syokota/* controller command byte (set by KBDC_SET_COMMAND_BYTE) */
6242421Syokota#define KBD_TRANSLATION		0x0040
6342421Syokota#define KBD_RESERVED_BITS	0x0004
6442421Syokota#define KBD_OVERRIDE_KBD_LOCK	0x0008
6542421Syokota#define KBD_ENABLE_KBD_PORT    	0x0000
6642421Syokota#define KBD_DISABLE_KBD_PORT   	0x0010
6742421Syokota#define KBD_ENABLE_AUX_PORT	0x0000
6842421Syokota#define KBD_DISABLE_AUX_PORT	0x0020
6942421Syokota#define KBD_ENABLE_AUX_INT	0x0002
7042421Syokota#define KBD_DISABLE_AUX_INT	0x0000
7142421Syokota#define KBD_ENABLE_KBD_INT     	0x0001
7242421Syokota#define KBD_DISABLE_KBD_INT    	0x0000
7342421Syokota#define KBD_KBD_CONTROL_BITS	(KBD_DISABLE_KBD_PORT | KBD_ENABLE_KBD_INT)
7442421Syokota#define KBD_AUX_CONTROL_BITS	(KBD_DISABLE_AUX_PORT | KBD_ENABLE_AUX_INT)
7542421Syokota
7642421Syokota/* keyboard device commands (sent to KBD_DATA_PORT) */
7742421Syokota#define KBDC_RESET_KBD	     	0x00ff
7842421Syokota#define KBDC_ENABLE_KBD		0x00f4
7942421Syokota#define KBDC_DISABLE_KBD	0x00f5
8042421Syokota#define KBDC_SET_DEFAULTS	0x00f6
8142421Syokota#define KBDC_SEND_DEV_ID	0x00f2
8242421Syokota#define KBDC_SET_LEDS		0x00ed
8342421Syokota#define KBDC_ECHO		0x00ee
8442421Syokota#define KBDC_SET_SCANCODE_SET	0x00f0
8542421Syokota#define KBDC_SET_TYPEMATIC	0x00f3
8642421Syokota
8742421Syokota/* aux device commands (sent to KBD_DATA_PORT) */
8842421Syokota#define PSMC_RESET_DEV	     	0x00ff
8942421Syokota#define PSMC_ENABLE_DEV      	0x00f4
9042421Syokota#define PSMC_DISABLE_DEV     	0x00f5
9142421Syokota#define PSMC_SET_DEFAULTS	0x00f6
9242421Syokota#define PSMC_SEND_DEV_ID     	0x00f2
9342421Syokota#define PSMC_SEND_DEV_STATUS 	0x00e9
9442421Syokota#define PSMC_SEND_DEV_DATA	0x00eb
9542421Syokota#define PSMC_SET_SCALING11	0x00e6
9642421Syokota#define PSMC_SET_SCALING21	0x00e7
9742421Syokota#define PSMC_SET_RESOLUTION	0x00e8
9842421Syokota#define PSMC_SET_STREAM_MODE	0x00ea
9942421Syokota#define PSMC_SET_REMOTE_MODE	0x00f0
10042421Syokota#define PSMC_SET_SAMPLING_RATE	0x00f3
10142421Syokota
10242421Syokota/* PSMC_SET_RESOLUTION argument */
10342421Syokota#define PSMD_RES_LOW		0	/* typically 25ppi */
10442421Syokota#define PSMD_RES_MEDIUM_LOW	1	/* typically 50ppi */
10542421Syokota#define PSMD_RES_MEDIUM_HIGH	2	/* typically 100ppi (default) */
10642421Syokota#define PSMD_RES_HIGH		3	/* typically 200ppi */
10742421Syokota#define PSMD_MAX_RESOLUTION	PSMD_RES_HIGH
10842421Syokota
10942421Syokota/* PSMC_SET_SAMPLING_RATE */
11042421Syokota#define PSMD_MAX_RATE		255	/* FIXME: not sure if it's possible */
11142421Syokota
11242421Syokota/* status bits (KBD_STATUS_PORT) */
11342421Syokota#define KBDS_BUFFER_FULL	0x0021
11442421Syokota#define KBDS_ANY_BUFFER_FULL	0x0001
11542421Syokota#define KBDS_KBD_BUFFER_FULL	0x0001
11642421Syokota#define KBDS_AUX_BUFFER_FULL	0x0021
11742421Syokota#define KBDS_INPUT_BUFFER_FULL	0x0002
11842421Syokota
11942421Syokota/* return code */
12042421Syokota#define KBD_ACK 		0x00fa
12142421Syokota#define KBD_RESEND		0x00fe
12242421Syokota#define KBD_RESET_DONE		0x00aa
12342421Syokota#define KBD_RESET_FAIL		0x00fc
12442421Syokota#define KBD_DIAG_DONE		0x0055
12542421Syokota#define KBD_DIAG_FAIL		0x00fd
12642421Syokota#define KBD_ECHO		0x00ee
12742421Syokota
12842421Syokota#define PSM_ACK 		0x00fa
12942421Syokota#define PSM_RESEND		0x00fe
13042421Syokota#define PSM_RESET_DONE		0x00aa
13142421Syokota#define PSM_RESET_FAIL		0x00fc
13242421Syokota
13342421Syokota/* aux device ID */
13442421Syokota#define PSM_MOUSE_ID		0
13542421Syokota#define PSM_BALLPOINT_ID	2
13642421Syokota#define PSM_INTELLI_ID		3
13758230Syokota#define PSM_EXPLORER_ID		4
13858230Syokota#define PSM_4DMOUSE_ID		6
13958230Syokota#define PSM_4DPLUS_ID		8
140117478Smikeh#define PSM_4DPLUS_RFSW35_ID	24
14142421Syokota
14255205Speter#ifdef _KERNEL
14342421Syokota
14442421Syokota#define ATKBDC_DRIVER_NAME	"atkbdc"
14542421Syokota
14642421Syokota/*
14742421Syokota * driver specific options: the following options may be set by
14842421Syokota * `options' statements in the kernel configuration file.
14942421Syokota */
15042421Syokota
15142421Syokota/* retry count */
15242421Syokota#ifndef KBD_MAXRETRY
15342421Syokota#define KBD_MAXRETRY	3
15442421Syokota#endif
15542421Syokota
15642421Syokota/* timing parameters */
15742421Syokota#ifndef KBD_RESETDELAY
15842421Syokota#define KBD_RESETDELAY  200     /* wait 200msec after kbd/mouse reset */
15942421Syokota#endif
16042421Syokota#ifndef KBD_MAXWAIT
16142421Syokota#define KBD_MAXWAIT	5 	/* wait 5 times at most after reset */
16242421Syokota#endif
16342421Syokota
16442421Syokota/* I/O recovery time */
16542421Syokota#define KBDC_DELAYTIME	20
16642421Syokota#define KBDD_DELAYTIME	7
16742421Syokota
16842421Syokota/* debug option */
16942421Syokota#ifndef KBDIO_DEBUG
17042421Syokota#define KBDIO_DEBUG	0
17142421Syokota#endif
17242421Syokota
17342421Syokota/* end of driver specific options */
17442421Syokota
17542421Syokota/* types/structures */
17642421Syokota
17742421Syokota#define KBDQ_BUFSIZE	32
17842421Syokota
17942421Syokotatypedef struct _kqueue {
18042421Syokota    int head;
18142421Syokota    int tail;
18242421Syokota    unsigned char q[KBDQ_BUFSIZE];
18342421Syokota#if KBDIO_DEBUG >= 2
18442421Syokota    int call_count;
18542421Syokota    int qcount;
18642421Syokota    int max_qcount;
18742421Syokota#endif
18842421Syokota} kqueue;
18942421Syokota
19058271Syokotastruct resource;
19158271Syokota
19242421Syokotatypedef struct atkbdc_softc {
19358271Syokota    struct resource *port0;	/* data port */
19458271Syokota    struct resource *port1;	/* status port */
195216492Sjhb    struct resource *irq;
19658271Syokota    bus_space_tag_t iot;
19758271Syokota    bus_space_handle_t ioh0;
19858271Syokota    bus_space_handle_t ioh1;
19942421Syokota    int command_byte;		/* current command byte value */
20042421Syokota    int command_mask;		/* command byte mask bits for kbd/aux devices */
20142421Syokota    int lock;			/* FIXME: XXX not quite a semaphore... */
20242421Syokota    kqueue kbd;			/* keyboard data queue */
20342421Syokota    kqueue aux;			/* auxiliary data queue */
204207354Ssobomax    int retry;
20542421Syokota} atkbdc_softc_t;
20642421Syokota
20742421Syokotaenum kbdc_device_ivar {
20858271Syokota	KBDC_IVAR_VENDORID,
20958271Syokota	KBDC_IVAR_SERIAL,
21058271Syokota	KBDC_IVAR_LOGICALID,
21158271Syokota	KBDC_IVAR_COMPATID,
21242421Syokota};
21342421Syokota
21442421Syokotatypedef caddr_t KBDC;
21542421Syokota
21683147Syokota#define KBDC_RID_KBD	0
21783147Syokota#define KBDC_RID_AUX	1
21883147Syokota
21942421Syokota/* function prototypes */
22042421Syokota
22142421Syokotaatkbdc_softc_t *atkbdc_get_softc(int unit);
22258271Syokotaint atkbdc_probe_unit(int unit, struct resource *port0, struct resource *port1);
22358271Syokotaint atkbdc_attach_unit(int unit, atkbdc_softc_t *sc, struct resource *port0,
22458271Syokota		       struct resource *port1);
22542421Syokotaint atkbdc_configure(void);
22642421Syokota
22758271SyokotaKBDC atkbdc_open(int unit);
22842421Syokotaint kbdc_lock(KBDC kbdc, int lock);
22942421Syokotaint kbdc_data_ready(KBDC kbdc);
23042421Syokota
23142421Syokotaint write_controller_command(KBDC kbdc,int c);
23242421Syokotaint write_controller_data(KBDC kbdc,int c);
23342421Syokota
23442421Syokotaint write_kbd_command(KBDC kbdc,int c);
23542421Syokotaint write_aux_command(KBDC kbdc,int c);
23642421Syokotaint send_kbd_command(KBDC kbdc,int c);
23742421Syokotaint send_aux_command(KBDC kbdc,int c);
23842421Syokotaint send_kbd_command_and_data(KBDC kbdc,int c,int d);
23942421Syokotaint send_aux_command_and_data(KBDC kbdc,int c,int d);
24042421Syokota
24142421Syokotaint read_controller_data(KBDC kbdc);
24242421Syokotaint read_kbd_data(KBDC kbdc);
24342421Syokotaint read_kbd_data_no_wait(KBDC kbdc);
24442421Syokotaint read_aux_data(KBDC kbdc);
24542421Syokotaint read_aux_data_no_wait(KBDC kbdc);
24642421Syokota
24742421Syokotavoid empty_kbd_buffer(KBDC kbdc, int t);
24842421Syokotavoid empty_aux_buffer(KBDC kbdc, int t);
24942421Syokotavoid empty_both_buffers(KBDC kbdc, int t);
25042421Syokota
25142421Syokotaint reset_kbd(KBDC kbdc);
25242421Syokotaint reset_aux_dev(KBDC kbdc);
25342421Syokota
25442421Syokotaint test_controller(KBDC kbdc);
25542421Syokotaint test_kbd_port(KBDC kbdc);
25642421Syokotaint test_aux_port(KBDC kbdc);
25742421Syokota
25842421Syokotaint kbdc_get_device_mask(KBDC kbdc);
25942421Syokotavoid kbdc_set_device_mask(KBDC kbdc, int mask);
26042421Syokota
26142421Syokotaint get_controller_command_byte(KBDC kbdc);
26242421Syokotaint set_controller_command_byte(KBDC kbdc, int command, int flag);
26342421Syokota
26455205Speter#endif /* _KERNEL */
26542421Syokota
266147271Smarius#endif /* !_DEV_ATKBDC_ATKBDCREG_H_ */
267