Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef	_SYS_CONSKBD_H
     28 #define	_SYS_CONSKBD_H
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 #include <sys/types.h>
     33 #include <sys/stream.h>
     34 #include <sys/consdev.h>
     35 #include <sys/kbd.h>
     36 #include <sys/kbtrans.h>
     37 
     38 #ifdef	__cplusplus
     39 extern "C" {
     40 #endif
     41 
     42 /*
     43  * Lower Queue State:
     44  *
     45  * Every physical keyboard has a corresponding STREAMS queue. We call this
     46  * queue lower queue. To describe this kind of queue, we define a structure
     47  * (refer conskbd_lower_queue_t). Every lower queue has a state, transform
     48  * of the state describes the process from a keyborad attached to system to
     49  * the keyboard is plumbed into conskbd or rejected.
     50  *  Rule:
     51  *
     52  * 1) LQS_UNINITIALIZED 	--->	LQS_KIOCTYPE_ACK_PENDING;
     53  * 	send a KIOCTYPE to lower queue, and then wait response;
     54  *
     55  * 2) LQS_KIOCTYPE_ACK_PENDING	--->	LQS_INITIALIZED_LEGACY;
     56  * 	receive nak to KIOCTYPE, the corresponding keyboard can not
     57  * 	multiplexed with other keyboards. so the conskbd is bypassed,
     58  * 	only one keyboard is supported.
     59  *
     60  * 3) LQS_KIOCTYPE_ACK_PENDING	--->	LQS_KIOCTRANS_ACK_PENDING;
     61  *	receive ack to KIOCTYPE, and send KIOCTRANS to lower queue,
     62  *
     63  * 4) LQS_KIOCTRANS_ACK_PENDING	--->	LQS_KIOCLAYOUT_ACK_PENDING;
     64  * 	receive ack to KIOCTRANS, and send KIOCLAYOUT to lower queue
     65  *
     66  * 5) LQS_KIOCTRANS_ACK_PENDING --->	Destroy
     67  * 	receive nak to KIOCTRANS, it is a fatal error so that this
     68  * 	keyboard is not avilable. destroy the lower queue struct.
     69  *
     70  * 6) LQS_KIOCLAYOUT_ACK_PENDING --->	LQS_KIOCSLED_ACK_PENDING;
     71  * 	receive ack/nak to KIOCLAYOUT, and send KIOCSLED/KIOCGLED to
     72  *	lower queue.
     73  *
     74  * 7) LQS_KIOCSLED_ACK_PENDING	--->	LQS_INITIALIZED
     75  * 	receive ack/nak, the keyboard is linked under conskbd, multiplexed
     76  * 	with other keyboards.
     77  *
     78  * 8) when lower queue is in the state of LQS_INITIALIZED_LEGACY or
     79  *    LQS_INITIALIZED, no state transform occures unless the lower
     80  *    queue is destroyed.
     81  */
     82 enum conskbd_lqs_state {
     83 	LQS_UNINITIALIZED = 0,
     84 	LQS_KIOCTYPE_ACK_PENDING = 1,	/* waiting ACK for KIOCTYPE */
     85 	LQS_KIOCTRANS_ACK_PENDING = 2, /* waiting ACK for KIOCTRANS */
     86 	LQS_KIOCLAYOUT_ACK_PENDING = 3, /* waiting ACK for KIOCLAYOUT */
     87 	LQS_KIOCSLED_ACK_PENDING = 4, /* waiting ACK for KIOCSLED/KIOCGLED */
     88 	LQS_INITIALIZED_LEGACY = 5, /* only one lower legacy keyboard */
     89 	LQS_INITIALIZED = 6 /* virtual keyboard initialized */
     90 };
     91 
     92 struct conskbd_state;
     93 struct conskbd_lower_queue;
     94 
     95 /*
     96  * state of lower queue.
     97  */
     98 typedef struct conskbd_lower_queue	conskbd_lower_queue_t;
     99 struct conskbd_lower_queue {
    100 
    101 	conskbd_lower_queue_t	*lqs_next;
    102 
    103 	queue_t		*lqs_queue; /* streams queue of lower driver */
    104 
    105 	queue_t		*lqs_pending_queue; /* queue of pending message from */
    106 	mblk_t		*lqs_pending_plink; /* pending I_PLINK message */
    107 
    108 	/* state of lower queue */
    109 	enum conskbd_lqs_state		lqs_state;
    110 
    111 	/* polled I/O interface structure of lower keyboard driver */
    112 	struct cons_polledio	*lqs_polledio;
    113 
    114 	/* key status (key-down/key-up) of each key */
    115 	enum keystate	lqs_key_state[KBTRANS_KEYNUMS_MAX];
    116 };
    117 
    118 /*
    119  * Pending message structure.
    120  *
    121  * Note:
    122  *     When conskbd receives message from its upper module, it has to
    123  * clone the message and send a copy to each of its lower queues. The
    124  * conskbd_pending_msg structure is used to track the process of handling
    125  * this kind of messages.
    126  */
    127 typedef struct conskbd_pending_msg	conskbd_pending_msg_t;
    128 struct conskbd_pending_msg {
    129 
    130 	conskbd_pending_msg_t	*kpm_next;
    131 
    132 	/* the upper queue from which request message is sent out */
    133 	queue_t	*kpm_upper_queue;
    134 
    135 	mblk_t	*kpm_req_msg;	/* the message block from upper */
    136 
    137 	/* message ID and Command Code of the message pointed by kpm_req_msg */
    138 	uint_t	kpm_req_id;
    139 	int	kpm_req_cmd;
    140 
    141 	/* number of request message's copies sent down to lower queues */
    142 	int	kpm_req_nums;
    143 
    144 	/* number of responses to request message received from lower queues */
    145 	int	kpm_resp_nums;
    146 
    147 	mblk_t	*kpm_resp_list;	/* chain of responses from lower */
    148 
    149 	kmutex_t kpm_lock;	/* lock for this structure */
    150 };
    151 
    152 /*
    153  * software state structure for virtual keyboard
    154  */
    155 struct conskbd_state {
    156 
    157 	/* kbtrans of virtual keyboard */
    158 	struct kbtrans		*conskbd_kbtrans;
    159 
    160 	/* polled I/O interface structure of virutal keyboard */
    161 	struct cons_polledio	conskbd_polledio;
    162 
    163 	/* chain of lower physical keyboard queues */
    164 	conskbd_lower_queue_t	*conskbd_lqueue_list;
    165 
    166 	/* the number of lower physical keyboard queues */
    167 	int	conskbd_lqueue_nums;
    168 
    169 	int	conskbd_layout;	 /* layout of virtual keyboard */
    170 	int	conskbd_led_state; /* LED state of virtual keyboard */
    171 
    172 	boolean_t	conskbd_directio; /* upstream directory */
    173 	boolean_t	conskbd_bypassed; /* is virtual keyboard disabled ? */
    174 };
    175 typedef struct conskbd_state	conskbd_state_t;
    176 
    177 #ifdef	__cplusplus
    178 }
    179 #endif
    180 
    181 #endif	/* _SYS_CONSKBD_H */
    182