root/usr/src/uts/common/io/kb8042/kb8042.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
/*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T   */
/*        All Rights Reserved   */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _KB8042_H
#define _KB8042_H

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * Messages from keyboard.
 */
#define KB_ERROR        0x00    /* Keyboard overrun or detection error */
#define KB_POST_OK      0xAA    /* Sent at completion of poweron */
#define KB_ECHO         0xEE    /* Response to Echo command (EE)  */
#define KB_ACK          0xFA    /* Acknowledgement byte from keyboard */
#define KB_POST_FAIL    0xFC    /* Power On Self Test failed */
#define KB_RESEND       0xFE    /* response from keyboard to resend data */
#define KB_REPLY_MAXLEN 8       /* Maximum # of bytes the keyboard can reply */
/*
 * Commands to keyboard.
 */
#define KB_SET_LED      0xED    /* Tell kbd that following byte is led status */
#define KB_READID       0xF2    /* command to read keyboard id */
#define KB_ENABLE       0xF4    /* command to to enable keyboard */
#define KB_RESET        0xFF    /* command to reset keyboard */
#define KB_SET_TYPE     0xF3    /* command--next byte is typematic values */
#define KB_SET_SCAN     0xF0    /* kbd command to set scan code set */

/*
 * LED bits
 */
#define LED_SCR         0x01    /* Flag bit for scroll lock */
#define LED_CAP         0x04    /* Flag bit for cap lock */
#define LED_NUM         0x02    /* Flag bit for num lock */

/*
 * Keyboard scan code prefixes
 */
#define KAT_BREAK       0xf0    /* first byte in two byte break sequence */
#define KXT_EXTEND      0xe0    /* first byte in two byte extended sequence */
#define KXT_EXTEND2     0xe1    /* Used in "Pause" sequence */

/*
 * Korean keyboard keys.  We handle these specially to avoid having to
 * dramatically extend the table.
 */
#define KXT_HANGUL_HANJA        0xf1
#define KXT_HANGUL              0xf2

#ifdef _KERNEL

struct kb8042 {
        kmutex_t        w_hw_mutex;     /* hardware mutex */
        int     w_init;         /* workstation has been initialized */
        queue_t *w_qp;          /* pointer to queue for this minor device */
        int     w_kblayout;     /* keyboard layout code */
        dev_t   w_dev;          /* major/minor for this device */
        ddi_iblock_cookie_t     w_iblock;
        ddi_acc_handle_t        handle;
        uint8_t                 *addr;
        int     kb_old_key_pos; /* scancode for autorepeat filtering */
        struct {
                int desired;
                int commanded;
        }       leds;
        int     parse_scan_state;
        struct kbtrans  *hw_kbtrans;
        struct cons_polledio    polledio;
        struct {
                unsigned char mod1;
                unsigned char mod2;
                unsigned char trigger;
                boolean_t mod1_down;
                boolean_t mod2_down;
                boolean_t enabled;
        }               debugger;
        boolean_t       polled_synthetic_release_pending;
        int             polled_synthetic_release_key;
        int             simulated_kbd_type;
        uint32_t        init_state;
        int             break_received;
        boolean_t       suspended;
        int             ops;
        kcondvar_t      suspend_cv;
        kcondvar_t      ops_cv;
        int             acked;
        int             need_retry;
        kcondvar_t      cmd_cv;
};

extern boolean_t KeyboardConvertScan(struct kb8042 *, unsigned char scan,
                        int *keynum, enum keystate *, boolean_t *);
extern int KeyboardConvertScan_init(struct kb8042 *, int scanset);

#if defined(__i386) || defined(__amd64)
/*
 * We pick up the initial state of the keyboard from the BIOS state.
 */
#define BIOS_KB_FLAG            0x417   /* address of BIOS keyboard state */
#define BIOS_SCROLL_STATE       0x10
#define BIOS_NUM_STATE          0x20
#define BIOS_CAPS_STATE         0x40
#endif

/*
 * Initialization states
 */
#define KB8042_UNINITIALIZED            0x00000000
#define KB8042_MINOR_NODE_CREATED       0x00000001
#define KB8042_REGS_MAPPED              0x00000002
#define KB8042_HW_MUTEX_INITTED         0x00000004
#define KB8042_INTR_ADDED               0x00000008

/*
 * Key values that map into the USB translation table in kb8042.c
 */
#define K8042_STOP      160

#endif

#ifdef  __cplusplus
}
#endif

#endif /* _KB8042_H */