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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_USB_USBKBM_H 28 #define _SYS_USB_USBKBM_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #include <sys/time.h> 37 #include <sys/vuid_event.h> 38 #include <sys/stream.h> 39 #include <sys/kbd.h> 40 41 42 /* 43 * USB keyboard LED masks (used to set LED's on USB keyboards) 44 */ 45 #define USB_LED_NUM_LOCK 0x1 46 #define USB_LED_CAPS_LOCK 0x2 47 #define USB_LED_SCROLL_LOCK 0x4 48 #define USB_LED_COMPOSE 0x8 49 #define USB_LED_KANA 0x10 /* Valid only on Japanese layout */ 50 51 /* Modifier key masks */ 52 #define USB_LCTLBIT 0x01 53 #define USB_LSHIFTBIT 0x02 54 #define USB_LALTBIT 0x04 55 #define USB_LMETABIT 0x08 56 #define USB_RCTLBIT 0x10 57 #define USB_RSHIFTBIT 0x20 58 #define USB_RALTBIT 0x40 59 #define USB_RMETABIT 0x80 60 61 #define USB_LSHIFTKEY 225 62 #define USB_LCTLCKEY 224 63 #define USB_LALTKEY 226 64 #define USB_LMETAKEY 227 65 #define USB_RCTLCKEY 228 66 #define USB_RSHIFTKEY 229 67 #define USB_RMETAKEY 231 68 #define USB_RALTKEY 230 69 70 /* 71 * The keyboard would report ErrorRollOver in all array fields when 72 * the number of non-modifier keys pressed exceeds the Report Count. 73 */ 74 #define USB_ERRORROLLOVER 1 75 76 77 /* 78 * This defines the format of translation tables. 79 * 80 * A translation table is USB_KEYMAP_SIZE "entries", each of which is 2 81 * bytes (unsigned shorts). The top 8 bits of each entry are decoded by 82 * a case statement in getkey.c. If the entry is less than 0x100, it 83 * is sent out as an EUC character (possibly with bucky bits 84 * OR-ed in). "Special" entries are 0x100 or greater, and 85 * invoke more complicated actions. 86 */ 87 88 /* 89 * Default packet size in bytes 90 */ 91 92 #define USB_KBD_DEFAULT_PACKET_SIZE 8 93 94 /* definitions for various state machines */ 95 #define USBKBM_OPEN 0x00000001 /* keyboard is open for business */ 96 #define USBKBM_QWAIT 0x00000002 /* keyboard is waiting for a response */ 97 98 /* 99 * Polled key state 100 */ 101 typedef struct poll_keystate { 102 int poll_key; /* scancode */ 103 enum keystate poll_state; /* pressed or released */ 104 } poll_keystate_t; 105 106 #define USB_POLLED_BUFFER_SIZE 20 /* # of characters in poll buffer */ 107 108 #define USBKBM_MAXPKTSIZE 10 /* Maximum size of a packet */ 109 110 /* state structure for usbkbm */ 111 typedef struct usbkbm_state { 112 struct kbtrans *usbkbm_kbtrans; 113 queue_t *usbkbm_readq; /* read queue */ 114 queue_t *usbkbm_writeq; /* write queue */ 115 int usbkbm_flags; 116 uint32_t usbkbm_packet_size; /* size usb packet */ 117 /* Pointer to the parser handle */ 118 hidparser_handle_t usbkbm_report_descr; 119 uint16_t usbkbm_layout; /* keyboard layout */ 120 /* 121 * Setting this indicates that the second IOCTL 122 * after KBD_CMD_SETLED follows 123 */ 124 int usbkbm_setled_second_byte; 125 /* Keyboard packets sent last */ 126 uchar_t usbkbm_lastusbpacket[USBKBM_MAXPKTSIZE]; 127 128 /* Currently processed key events of the current keyboard packet */ 129 uchar_t usbkbm_pendingusbpacket[USBKBM_MAXPKTSIZE]; 130 131 hid_polled_input_callback_t 132 usbkbm_hid_callback; /* poll information */ 133 134 mblk_t *usbkbm_pending_link; /* mp waiting response */ 135 136 /* "ioctl" awaiting buffer */ 137 mblk_t *usbkbm_streams_iocpending; 138 139 /* id from qbufcall on allocb failure */ 140 bufcall_id_t usbkbm_streams_bufcallid; 141 142 /* Polled input information */ 143 struct cons_polledio usbkbm_polled_info; 144 145 int usbkbm_vkbd_type; 146 147 /* keyboard device info from hid */ 148 hid_vid_pid_t usbkbm_vid_pid; 149 150 /* These entries are for polled input */ 151 uint_t usbkbm_polled_buffer_num_characters; 152 poll_keystate_t usbkbm_polled_scancode_buffer[USB_POLLED_BUFFER_SIZE]; 153 poll_keystate_t *usbkbm_polled_buffer_head; 154 poll_keystate_t *usbkbm_polled_buffer_tail; 155 156 } usbkbm_state_t; 157 158 #define USB_PRESSED 0x00 /* key was pressed */ 159 #define USB_RELEASED 0x01 /* key was released */ 160 161 /* Sun Japanese type6 and type7 keyboards layout numbers, vid and pid */ 162 #define SUN_JAPANESE_TYPE6 271 163 #define SUN_JAPANESE_TYPE7 15 164 #define HID_SUN_JAPANESE_TYPE6_KBD_VID 0x0430 165 #define HID_SUN_JAPANESE_TYPE6_KBD_PID 0x0005 166 167 168 /* Number of entries in the keytable */ 169 #define KEYMAP_SIZE_USB 255 170 171 /* Size in bytes of the keytable */ 172 #define USB_KEYTABLE_SIZE (KEYMAP_SIZE_USB * sizeof (keymap_entry_t)) 173 174 /* structure to save global state */ 175 typedef struct usbkbm_save_state { 176 /* LED state */ 177 uchar_t usbkbm_save_led; 178 uchar_t usbkbm_layout; 179 180 /* Keymap information */ 181 struct keyboard usbkbm_save_keyindex; 182 183 } usbkbm_save_state_t; 184 185 /* 186 * Masks for debug printing 187 */ 188 #define PRINT_MASK_ATTA 0x00000001 189 #define PRINT_MASK_OPEN 0x00000002 190 #define PRINT_MASK_CLOSE 0x00000004 191 #define PRINT_MASK_PACKET 0x00000008 192 #define PRINT_MASK_ALL 0xFFFFFFFF 193 194 #define INDEXTO_PC 1 /* To PC table */ 195 #define INDEXTO_USB 0 /* To USB table */ 196 197 #ifdef __cplusplus 198 } 199 #endif 200 201 #endif /* _SYS_USB_USBKBM_H */ 202