1*4882a593Smuzhiyun #ifndef _HIL_H_ 2*4882a593Smuzhiyun #define _HIL_H_ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Hewlett Packard Human Interface Loop (HP-HIL) Protocol -- header. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 2001 Brian S. Julin 8*4882a593Smuzhiyun * All rights reserved. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 11*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 12*4882a593Smuzhiyun * are met: 13*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 14*4882a593Smuzhiyun * notice, this list of conditions, and the following disclaimer, 15*4882a593Smuzhiyun * without modification. 16*4882a593Smuzhiyun * 2. The name of the author may not be used to endorse or promote products 17*4882a593Smuzhiyun * derived from this software without specific prior written permission. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * Alternatively, this software may be distributed under the terms of the 20*4882a593Smuzhiyun * GNU General Public License ("GPL"). 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23*4882a593Smuzhiyun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*4882a593Smuzhiyun * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 26*4882a593Smuzhiyun * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*4882a593Smuzhiyun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*4882a593Smuzhiyun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*4882a593Smuzhiyun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*4882a593Smuzhiyun * 32*4882a593Smuzhiyun * References: 33*4882a593Smuzhiyun * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * A note of thanks to HP for providing and shipping reference materials 36*4882a593Smuzhiyun * free of charge to help in the development of HIL support for Linux. 37*4882a593Smuzhiyun * 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #include <asm/types.h> 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* Physical constants relevant to raw loop/device timing. 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define HIL_CLOCK 8MHZ 46*4882a593Smuzhiyun #define HIL_EK1_CLOCK 30HZ 47*4882a593Smuzhiyun #define HIL_EK2_CLOCK 60HZ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define HIL_TIMEOUT_DEV 5 /* ms */ 50*4882a593Smuzhiyun #define HIL_TIMEOUT_DEVS 10 /* ms */ 51*4882a593Smuzhiyun #define HIL_TIMEOUT_NORESP 10 /* ms */ 52*4882a593Smuzhiyun #define HIL_TIMEOUT_DEVS_DATA 16 /* ms */ 53*4882a593Smuzhiyun #define HIL_TIMEOUT_SELFTEST 200 /* ms */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* Actual wire line coding. These will only be useful if someone is 57*4882a593Smuzhiyun * implementing a software MLC to run HIL devices on a non-parisc machine. 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define HIL_WIRE_PACKET_LEN 15 61*4882a593Smuzhiyun enum hil_wire_bitpos { 62*4882a593Smuzhiyun HIL_WIRE_START = 0, 63*4882a593Smuzhiyun HIL_WIRE_ADDR2, 64*4882a593Smuzhiyun HIL_WIRE_ADDR1, 65*4882a593Smuzhiyun HIL_WIRE_ADDR0, 66*4882a593Smuzhiyun HIL_WIRE_COMMAND, 67*4882a593Smuzhiyun HIL_WIRE_DATA7, 68*4882a593Smuzhiyun HIL_WIRE_DATA6, 69*4882a593Smuzhiyun HIL_WIRE_DATA5, 70*4882a593Smuzhiyun HIL_WIRE_DATA4, 71*4882a593Smuzhiyun HIL_WIRE_DATA3, 72*4882a593Smuzhiyun HIL_WIRE_DATA2, 73*4882a593Smuzhiyun HIL_WIRE_DATA1, 74*4882a593Smuzhiyun HIL_WIRE_DATA0, 75*4882a593Smuzhiyun HIL_WIRE_PARITY, 76*4882a593Smuzhiyun HIL_WIRE_STOP 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* HP documentation uses these bit positions to refer to commands; 80*4882a593Smuzhiyun * we will call these "packets". 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun enum hil_pkt_bitpos { 83*4882a593Smuzhiyun HIL_PKT_CMD = 0x00000800, 84*4882a593Smuzhiyun HIL_PKT_ADDR2 = 0x00000400, 85*4882a593Smuzhiyun HIL_PKT_ADDR1 = 0x00000200, 86*4882a593Smuzhiyun HIL_PKT_ADDR0 = 0x00000100, 87*4882a593Smuzhiyun HIL_PKT_ADDR_MASK = 0x00000700, 88*4882a593Smuzhiyun HIL_PKT_ADDR_SHIFT = 8, 89*4882a593Smuzhiyun HIL_PKT_DATA7 = 0x00000080, 90*4882a593Smuzhiyun HIL_PKT_DATA6 = 0x00000040, 91*4882a593Smuzhiyun HIL_PKT_DATA5 = 0x00000020, 92*4882a593Smuzhiyun HIL_PKT_DATA4 = 0x00000010, 93*4882a593Smuzhiyun HIL_PKT_DATA3 = 0x00000008, 94*4882a593Smuzhiyun HIL_PKT_DATA2 = 0x00000004, 95*4882a593Smuzhiyun HIL_PKT_DATA1 = 0x00000002, 96*4882a593Smuzhiyun HIL_PKT_DATA0 = 0x00000001, 97*4882a593Smuzhiyun HIL_PKT_DATA_MASK = 0x000000FF, 98*4882a593Smuzhiyun HIL_PKT_DATA_SHIFT = 0 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* The HIL MLC also has several error/status/control bits. We extend the 102*4882a593Smuzhiyun * "packet" to include these when direct access to the MLC is available, 103*4882a593Smuzhiyun * or emulate them in cases where they are not available. 104*4882a593Smuzhiyun * 105*4882a593Smuzhiyun * This way the device driver knows that the underlying MLC driver 106*4882a593Smuzhiyun * has had to deal with loop errors. 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun enum hil_error_bitpos { 109*4882a593Smuzhiyun HIL_ERR_OB = 0x00000800, /* MLC is busy sending an auto-poll, 110*4882a593Smuzhiyun or we have filled up the output 111*4882a593Smuzhiyun buffer and must wait. */ 112*4882a593Smuzhiyun HIL_ERR_INT = 0x00010000, /* A normal interrupt has occurred. */ 113*4882a593Smuzhiyun HIL_ERR_NMI = 0x00020000, /* An NMI has occurred. */ 114*4882a593Smuzhiyun HIL_ERR_LERR = 0x00040000, /* A poll didn't come back. */ 115*4882a593Smuzhiyun HIL_ERR_PERR = 0x01000000, /* There was a Parity Error. */ 116*4882a593Smuzhiyun HIL_ERR_FERR = 0x02000000, /* There was a Framing Error. */ 117*4882a593Smuzhiyun HIL_ERR_FOF = 0x04000000 /* Input FIFO Overflowed. */ 118*4882a593Smuzhiyun }; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun enum hil_control_bitpos { 121*4882a593Smuzhiyun HIL_CTRL_TEST = 0x00010000, 122*4882a593Smuzhiyun HIL_CTRL_IPF = 0x00040000, 123*4882a593Smuzhiyun HIL_CTRL_APE = 0x02000000 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Bits 30,31 are unused, we use them to control write behavior. */ 127*4882a593Smuzhiyun #define HIL_DO_ALTER_CTRL 0x40000000 /* Write MSW of packet to control 128*4882a593Smuzhiyun before writing LSW to loop */ 129*4882a593Smuzhiyun #define HIL_CTRL_ONLY 0xc0000000 /* *Only* alter the control registers */ 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* This gives us a 32-bit "packet" 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun typedef u32 hil_packet; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* HIL Loop commands 137*4882a593Smuzhiyun */ 138*4882a593Smuzhiyun enum hil_command { 139*4882a593Smuzhiyun HIL_CMD_IFC = 0x00, /* Interface Clear */ 140*4882a593Smuzhiyun HIL_CMD_EPT = 0x01, /* Enter Pass-Thru Mode */ 141*4882a593Smuzhiyun HIL_CMD_ELB = 0x02, /* Enter Loop-Back Mode */ 142*4882a593Smuzhiyun HIL_CMD_IDD = 0x03, /* Identify and Describe */ 143*4882a593Smuzhiyun HIL_CMD_DSR = 0x04, /* Device Soft Reset */ 144*4882a593Smuzhiyun HIL_CMD_PST = 0x05, /* Perform Self Test */ 145*4882a593Smuzhiyun HIL_CMD_RRG = 0x06, /* Read Register */ 146*4882a593Smuzhiyun HIL_CMD_WRG = 0x07, /* Write Register */ 147*4882a593Smuzhiyun HIL_CMD_ACF = 0x08, /* Auto Configure */ 148*4882a593Smuzhiyun HIL_CMDID_ACF = 0x07, /* Auto Configure bits with incremented ID */ 149*4882a593Smuzhiyun HIL_CMD_POL = 0x10, /* Poll */ 150*4882a593Smuzhiyun HIL_CMDCT_POL = 0x0f, /* Poll command bits with item count */ 151*4882a593Smuzhiyun HIL_CMD_RPL = 0x20, /* RePoll */ 152*4882a593Smuzhiyun HIL_CMDCT_RPL = 0x0f, /* RePoll command bits with item count */ 153*4882a593Smuzhiyun HIL_CMD_RNM = 0x30, /* Report Name */ 154*4882a593Smuzhiyun HIL_CMD_RST = 0x31, /* Report Status */ 155*4882a593Smuzhiyun HIL_CMD_EXD = 0x32, /* Extended Describe */ 156*4882a593Smuzhiyun HIL_CMD_RSC = 0x33, /* Report Security Code */ 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* 0x34 to 0x3c reserved for future use */ 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun HIL_CMD_DKA = 0x3d, /* Disable Keyswitch Autorepeat */ 161*4882a593Smuzhiyun HIL_CMD_EK1 = 0x3e, /* Enable Keyswitch Autorepeat 1 */ 162*4882a593Smuzhiyun HIL_CMD_EK2 = 0x3f, /* Enable Keyswitch Autorepeat 2 */ 163*4882a593Smuzhiyun HIL_CMD_PR1 = 0x40, /* Prompt1 */ 164*4882a593Smuzhiyun HIL_CMD_PR2 = 0x41, /* Prompt2 */ 165*4882a593Smuzhiyun HIL_CMD_PR3 = 0x42, /* Prompt3 */ 166*4882a593Smuzhiyun HIL_CMD_PR4 = 0x43, /* Prompt4 */ 167*4882a593Smuzhiyun HIL_CMD_PR5 = 0x44, /* Prompt5 */ 168*4882a593Smuzhiyun HIL_CMD_PR6 = 0x45, /* Prompt6 */ 169*4882a593Smuzhiyun HIL_CMD_PR7 = 0x46, /* Prompt7 */ 170*4882a593Smuzhiyun HIL_CMD_PRM = 0x47, /* Prompt (General Purpose) */ 171*4882a593Smuzhiyun HIL_CMD_AK1 = 0x48, /* Acknowledge1 */ 172*4882a593Smuzhiyun HIL_CMD_AK2 = 0x49, /* Acknowledge2 */ 173*4882a593Smuzhiyun HIL_CMD_AK3 = 0x4a, /* Acknowledge3 */ 174*4882a593Smuzhiyun HIL_CMD_AK4 = 0x4b, /* Acknowledge4 */ 175*4882a593Smuzhiyun HIL_CMD_AK5 = 0x4c, /* Acknowledge5 */ 176*4882a593Smuzhiyun HIL_CMD_AK6 = 0x4d, /* Acknowledge6 */ 177*4882a593Smuzhiyun HIL_CMD_AK7 = 0x4e, /* Acknowledge7 */ 178*4882a593Smuzhiyun HIL_CMD_ACK = 0x4f, /* Acknowledge (General Purpose) */ 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* 0x50 to 0x78 reserved for future use */ 181*4882a593Smuzhiyun /* 0x80 to 0xEF device-specific commands */ 182*4882a593Smuzhiyun /* 0xf0 to 0xf9 reserved for future use */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun HIL_CMD_RIO = 0xfa, /* Register I/O Error */ 185*4882a593Smuzhiyun HIL_CMD_SHR = 0xfb, /* System Hard Reset */ 186*4882a593Smuzhiyun HIL_CMD_TER = 0xfc, /* Transmission Error */ 187*4882a593Smuzhiyun HIL_CMD_CAE = 0xfd, /* Configuration Address Error */ 188*4882a593Smuzhiyun HIL_CMD_DHR = 0xfe, /* Device Hard Reset */ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* 0xff is prohibited from use. */ 191*4882a593Smuzhiyun }; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* 195*4882a593Smuzhiyun * Response "records" to HIL commands 196*4882a593Smuzhiyun */ 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* Device ID byte 199*4882a593Smuzhiyun */ 200*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_MASK 0xe0 /* Primary type bits */ 201*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_KB_INTEGRAL 0xa0 /* Integral keyboard */ 202*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_KB_ITF 0xc0 /* ITD keyboard */ 203*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_KB_RSVD 0xe0 /* Reserved keyboard type */ 204*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_KB_LANG_MASK 0x1f /* Keyboard locale bits */ 205*4882a593Smuzhiyun #define HIL_IDD_DID_KBLANG_USE_ESD 0x00 /* Use ESD Locale instead */ 206*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_ABS 0x80 /* Absolute Positioners */ 207*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD1_MASK 0xf8 /* Reserved */ 208*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD1 0x98 209*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_TABLET_MASK 0xf8 /* Tablets and digitizers */ 210*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_TABLET 0x90 211*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_TSCREEN_MASK 0xfc /* Touch screens */ 212*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_TSCREEN 0x8c 213*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD2_MASK 0xfc /* Reserved */ 214*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD2 0x88 215*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD3_MASK 0xfc /* Reserved */ 216*4882a593Smuzhiyun #define HIL_IDD_DID_ABS_RSVD3 0x80 217*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_REL 0x60 /* Relative Positioners */ 218*4882a593Smuzhiyun #define HIL_IDD_DID_REL_RSVD1_MASK 0xf0 /* Reserved */ 219*4882a593Smuzhiyun #define HIL_IDD_DID_REL_RSVD1 0x70 220*4882a593Smuzhiyun #define HIL_IDD_DID_REL_RSVD2_MASK 0xfc /* Reserved */ 221*4882a593Smuzhiyun #define HIL_IDD_DID_REL_RSVD2 0x6c 222*4882a593Smuzhiyun #define HIL_IDD_DID_REL_MOUSE_MASK 0xfc /* Mouse */ 223*4882a593Smuzhiyun #define HIL_IDD_DID_REL_MOUSE 0x68 224*4882a593Smuzhiyun #define HIL_IDD_DID_REL_QUAD_MASK 0xf8 /* Other Quadrature Devices */ 225*4882a593Smuzhiyun #define HIL_IDD_DID_REL_QUAD 0x60 226*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_CHAR 0x40 /* Character Entry */ 227*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_BARCODE_MASK 0xfc /* Barcode Reader */ 228*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_BARCODE 0x5c 229*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD1_MASK 0xfc /* Reserved */ 230*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD1 0x58 231*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD2_MASK 0xf8 /* Reserved */ 232*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD2 0x50 233*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD3_MASK 0xf0 /* Reserved */ 234*4882a593Smuzhiyun #define HIL_IDD_DID_CHAR_RSVD3 0x40 235*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_OTHER 0x20 /* Miscellaneous */ 236*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD1_MASK 0xf0 /* Reserved */ 237*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD1 0x30 238*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_BARCODE_MASK 0xfc /* Tone Generator */ 239*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_BARCODE 0x2c 240*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD2_MASK 0xfc /* Reserved */ 241*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD2 0x28 242*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD3_MASK 0xf8 /* Reserved */ 243*4882a593Smuzhiyun #define HIL_IDD_DID_OTHER_RSVD3 0x20 244*4882a593Smuzhiyun #define HIL_IDD_DID_TYPE_KEYPAD 0x00 /* Vectra Keyboard */ 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* IDD record header 247*4882a593Smuzhiyun */ 248*4882a593Smuzhiyun #define HIL_IDD_HEADER_AXSET_MASK 0x03 /* Number of axis in a set */ 249*4882a593Smuzhiyun #define HIL_IDD_HEADER_RSC 0x04 /* Supports RSC command */ 250*4882a593Smuzhiyun #define HIL_IDD_HEADER_EXD 0x08 /* Supports EXD command */ 251*4882a593Smuzhiyun #define HIL_IDD_HEADER_IOD 0x10 /* IOD byte to follow */ 252*4882a593Smuzhiyun #define HIL_IDD_HEADER_16BIT 0x20 /* 16 (vs. 8) bit resolution */ 253*4882a593Smuzhiyun #define HIL_IDD_HEADER_ABS 0x40 /* Reports Absolute Position */ 254*4882a593Smuzhiyun #define HIL_IDD_HEADER_2X_AXIS 0x80 /* Two sets of 1-3 axis */ 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* I/O Descriptor 257*4882a593Smuzhiyun */ 258*4882a593Smuzhiyun #define HIL_IDD_IOD_NBUTTON_MASK 0x07 /* Number of buttons */ 259*4882a593Smuzhiyun #define HIL_IDD_IOD_PROXIMITY 0x08 /* Proximity in/out events */ 260*4882a593Smuzhiyun #define HIL_IDD_IOD_PROMPT_MASK 0x70 /* Number of prompts/acks */ 261*4882a593Smuzhiyun #define HIL_IDD_IOD_PROMPT_SHIFT 4 262*4882a593Smuzhiyun #define HIL_IDD_IOD_PROMPT 0x80 /* Generic prompt/ack */ 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define HIL_IDD_NUM_AXES_PER_SET(header_packet) \ 265*4882a593Smuzhiyun ((header_packet) & HIL_IDD_HEADER_AXSET_MASK) 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define HIL_IDD_NUM_AXSETS(header_packet) \ 268*4882a593Smuzhiyun (2 - !((header_packet) & HIL_IDD_HEADER_2X_AXIS)) 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun #define HIL_IDD_LEN(header_packet) \ 271*4882a593Smuzhiyun ((4 - !(header_packet & HIL_IDD_HEADER_IOD) - \ 272*4882a593Smuzhiyun 2 * !(HIL_IDD_NUM_AXES_PER_SET(header_packet))) + \ 273*4882a593Smuzhiyun 2 * HIL_IDD_NUM_AXES_PER_SET(header_packet) * \ 274*4882a593Smuzhiyun !!((header_packet) & HIL_IDD_HEADER_ABS)) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* The following HIL_IDD_* macros assume you have an array of 277*4882a593Smuzhiyun * packets and/or unpacked 8-bit data in the order that they 278*4882a593Smuzhiyun * were received. 279*4882a593Smuzhiyun */ 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun #define HIL_IDD_AXIS_COUNTS_PER_M(header_ptr) \ 282*4882a593Smuzhiyun (!(HIL_IDD_NUM_AXSETS(*(header_ptr))) ? -1 : \ 283*4882a593Smuzhiyun (((*(header_ptr + 1) & HIL_PKT_DATA_MASK) + \ 284*4882a593Smuzhiyun ((*(header_ptr + 2) & HIL_PKT_DATA_MASK)) << 8) \ 285*4882a593Smuzhiyun * ((*(header_ptr) & HIL_IDD_HEADER_16BIT) ? 100 : 1))) 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define HIL_IDD_AXIS_MAX(header_ptr, __axnum) \ 288*4882a593Smuzhiyun ((!(*(header_ptr) & HIL_IDD_HEADER_ABS) || \ 289*4882a593Smuzhiyun (HIL_IDD_NUM_AXES_PER_SET(*(header_ptr)) <= __axnum)) ? 0 : \ 290*4882a593Smuzhiyun ((HIL_PKT_DATA_MASK & *((header_ptr) + 3 + 2 * __axnum)) + \ 291*4882a593Smuzhiyun ((HIL_PKT_DATA_MASK & *((header_ptr) + 4 + 2 * __axnum)) << 8))) 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun #define HIL_IDD_IOD(header_ptr) \ 294*4882a593Smuzhiyun (*(header_ptr + HIL_IDD_LEN((*header_ptr)) - 1)) 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun #define HIL_IDD_HAS_GEN_PROMPT(header_ptr) \ 297*4882a593Smuzhiyun ((*header_ptr & HIL_IDD_HEADER_IOD) && \ 298*4882a593Smuzhiyun (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROMPT)) 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define HIL_IDD_HAS_GEN_PROXIMITY(header_ptr) \ 301*4882a593Smuzhiyun ((*header_ptr & HIL_IDD_HEADER_IOD) && \ 302*4882a593Smuzhiyun (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROXIMITY)) 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun #define HIL_IDD_NUM_BUTTONS(header_ptr) \ 305*4882a593Smuzhiyun ((*header_ptr & HIL_IDD_HEADER_IOD) ? \ 306*4882a593Smuzhiyun (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NBUTTON_MASK) : 0) 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun #define HIL_IDD_NUM_PROMPTS(header_ptr) \ 309*4882a593Smuzhiyun ((*header_ptr & HIL_IDD_HEADER_IOD) ? \ 310*4882a593Smuzhiyun ((HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NPROMPT_MASK) \ 311*4882a593Smuzhiyun >> HIL_IDD_IOD_PROMPT_SHIFT) : 0) 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun /* The response to HIL EXD commands -- the "extended describe record" */ 314*4882a593Smuzhiyun #define HIL_EXD_HEADER_WRG 0x03 /* Supports type2 WRG */ 315*4882a593Smuzhiyun #define HIL_EXD_HEADER_WRG_TYPE1 0x01 /* Supports type1 WRG */ 316*4882a593Smuzhiyun #define HIL_EXD_HEADER_WRG_TYPE2 0x02 /* Supports type2 WRG */ 317*4882a593Smuzhiyun #define HIL_EXD_HEADER_RRG 0x04 /* Supports RRG command */ 318*4882a593Smuzhiyun #define HIL_EXD_HEADER_RNM 0x10 /* Supports RNM command */ 319*4882a593Smuzhiyun #define HIL_EXD_HEADER_RST 0x20 /* Supports RST command */ 320*4882a593Smuzhiyun #define HIL_EXD_HEADER_LOCALE 0x40 /* Contains locale code */ 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun #define HIL_EXD_NUM_RRG(header_ptr) \ 323*4882a593Smuzhiyun ((*header_ptr & HIL_EXD_HEADER_RRG) ? \ 324*4882a593Smuzhiyun (*(header_ptr + 1) & HIL_PKT_DATA_MASK) : 0) 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun #define HIL_EXD_NUM_WWG(header_ptr) \ 327*4882a593Smuzhiyun ((*header_ptr & HIL_EXD_HEADER_WRG) ? \ 328*4882a593Smuzhiyun (*(header_ptr + 2 - !(*header_ptr & HIL_EXD_HEADER_RRG)) & \ 329*4882a593Smuzhiyun HIL_PKT_DATA_MASK) : 0) 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun #define HIL_EXD_LEN(header_ptr) \ 332*4882a593Smuzhiyun (!!(*header_ptr & HIL_EXD_HEADER_RRG) + \ 333*4882a593Smuzhiyun !!(*header_ptr & HIL_EXD_HEADER_WRG) + \ 334*4882a593Smuzhiyun !!(*header_ptr & HIL_EXD_HEADER_LOCALE) + \ 335*4882a593Smuzhiyun 2 * !!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) + 1) 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun #define HIL_EXD_LOCALE(header_ptr) \ 338*4882a593Smuzhiyun (!(*header_ptr & HIL_EXD_HEADER_LOCALE) ? -1 : \ 339*4882a593Smuzhiyun (*(header_ptr + HIL_EXD_LEN(header_ptr) - 1) & HIL_PKT_DATA_MASK)) 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun #define HIL_EXD_WRG_TYPE2_LEN(header_ptr) \ 342*4882a593Smuzhiyun (!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) ? -1 : \ 343*4882a593Smuzhiyun (*(header_ptr + HIL_EXD_LEN(header_ptr) - 2 - \ 344*4882a593Smuzhiyun !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) + \ 345*4882a593Smuzhiyun ((*(header_ptr + HIL_EXD_LEN(header_ptr) - 1 - \ 346*4882a593Smuzhiyun !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) << 8)) 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun /* Device locale codes. */ 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* Last defined locale code. Everything above this is "Reserved", 351*4882a593Smuzhiyun and note that this same table applies to the Device ID Byte where 352*4882a593Smuzhiyun keyboards may have a nationality code which is only 5 bits. */ 353*4882a593Smuzhiyun #define HIL_LOCALE_MAX 0x1f 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* Map to hopefully useful strings. I was trying to make these look 356*4882a593Smuzhiyun like locale.aliases strings do; maybe that isn't the right table to 357*4882a593Smuzhiyun emulate. In either case, I didn't have much to work on. */ 358*4882a593Smuzhiyun #define HIL_LOCALE_MAP \ 359*4882a593Smuzhiyun "", /* 0x00 Reserved */ \ 360*4882a593Smuzhiyun "", /* 0x01 Reserved */ \ 361*4882a593Smuzhiyun "", /* 0x02 Reserved */ \ 362*4882a593Smuzhiyun "swiss.french", /* 0x03 Swiss/French */ \ 363*4882a593Smuzhiyun "portuguese", /* 0x04 Portuguese */ \ 364*4882a593Smuzhiyun "arabic", /* 0x05 Arabic */ \ 365*4882a593Smuzhiyun "hebrew", /* 0x06 Hebrew */ \ 366*4882a593Smuzhiyun "english.canadian", /* 0x07 Canadian English */ \ 367*4882a593Smuzhiyun "turkish", /* 0x08 Turkish */ \ 368*4882a593Smuzhiyun "greek", /* 0x09 Greek */ \ 369*4882a593Smuzhiyun "thai", /* 0x0a Thai (Thailand) */ \ 370*4882a593Smuzhiyun "italian", /* 0x0b Italian */ \ 371*4882a593Smuzhiyun "korean", /* 0x0c Hangul (Korea) */ \ 372*4882a593Smuzhiyun "dutch", /* 0x0d Dutch */ \ 373*4882a593Smuzhiyun "swedish", /* 0x0e Swedish */ \ 374*4882a593Smuzhiyun "german", /* 0x0f German */ \ 375*4882a593Smuzhiyun "chinese", /* 0x10 Chinese-PRC */ \ 376*4882a593Smuzhiyun "chinese", /* 0x11 Chinese-ROC */ \ 377*4882a593Smuzhiyun "swiss.french", /* 0x12 Swiss/French II */ \ 378*4882a593Smuzhiyun "spanish", /* 0x13 Spanish */ \ 379*4882a593Smuzhiyun "swiss.german", /* 0x14 Swiss/German II */ \ 380*4882a593Smuzhiyun "flemish", /* 0x15 Belgian (Flemish) */ \ 381*4882a593Smuzhiyun "finnish", /* 0x16 Finnish */ \ 382*4882a593Smuzhiyun "english.uk", /* 0x17 United Kingdom */ \ 383*4882a593Smuzhiyun "french.canadian", /* 0x18 French/Canadian */ \ 384*4882a593Smuzhiyun "swiss.german", /* 0x19 Swiss/German */ \ 385*4882a593Smuzhiyun "norwegian", /* 0x1a Norwegian */ \ 386*4882a593Smuzhiyun "french", /* 0x1b French */ \ 387*4882a593Smuzhiyun "danish", /* 0x1c Danish */ \ 388*4882a593Smuzhiyun "japanese", /* 0x1d Katakana */ \ 389*4882a593Smuzhiyun "spanish", /* 0x1e Latin American/Spanish*/\ 390*4882a593Smuzhiyun "english.us" /* 0x1f United States */ \ 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun /* HIL keycodes */ 394*4882a593Smuzhiyun #define HIL_KEYCODES_SET1_TBLSIZE 128 395*4882a593Smuzhiyun #define HIL_KEYCODES_SET1 \ 396*4882a593Smuzhiyun KEY_5, KEY_RESERVED, KEY_RIGHTALT, KEY_LEFTALT, \ 397*4882a593Smuzhiyun KEY_RIGHTSHIFT, KEY_LEFTSHIFT, KEY_LEFTCTRL, KEY_SYSRQ, \ 398*4882a593Smuzhiyun KEY_KP4, KEY_KP8, KEY_KP5, KEY_KP9, \ 399*4882a593Smuzhiyun KEY_KP6, KEY_KP7, KEY_KPCOMMA, KEY_KPENTER, \ 400*4882a593Smuzhiyun KEY_KP1, KEY_KPSLASH, KEY_KP2, KEY_KPPLUS, \ 401*4882a593Smuzhiyun KEY_KP3, KEY_KPASTERISK, KEY_KP0, KEY_KPMINUS, \ 402*4882a593Smuzhiyun KEY_B, KEY_V, KEY_C, KEY_X, \ 403*4882a593Smuzhiyun KEY_Z, KEY_RESERVED, KEY_RESERVED, KEY_ESC, \ 404*4882a593Smuzhiyun KEY_6, KEY_F10, KEY_3, KEY_F11, \ 405*4882a593Smuzhiyun KEY_KPDOT, KEY_F9, KEY_TAB /*KP*/, KEY_F12, \ 406*4882a593Smuzhiyun KEY_H, KEY_G, KEY_F, KEY_D, \ 407*4882a593Smuzhiyun KEY_S, KEY_A, KEY_RESERVED, KEY_CAPSLOCK, \ 408*4882a593Smuzhiyun KEY_U, KEY_Y, KEY_T, KEY_R, \ 409*4882a593Smuzhiyun KEY_E, KEY_W, KEY_Q, KEY_TAB, \ 410*4882a593Smuzhiyun KEY_7, KEY_6, KEY_5, KEY_4, \ 411*4882a593Smuzhiyun KEY_3, KEY_2, KEY_1, KEY_GRAVE, \ 412*4882a593Smuzhiyun KEY_F13, KEY_F14, KEY_F15, KEY_F16, \ 413*4882a593Smuzhiyun KEY_F17, KEY_F18, KEY_F19, KEY_F20, \ 414*4882a593Smuzhiyun KEY_MENU, KEY_F4, KEY_F3, KEY_F2, \ 415*4882a593Smuzhiyun KEY_F1, KEY_VOLUMEUP, KEY_STOP, KEY_SENDFILE, \ 416*4882a593Smuzhiyun KEY_SYSRQ, KEY_F5, KEY_F6, KEY_F7, \ 417*4882a593Smuzhiyun KEY_F8, KEY_VOLUMEDOWN, KEY_DEL_EOL, KEY_DEL_EOS, \ 418*4882a593Smuzhiyun KEY_8, KEY_9, KEY_0, KEY_MINUS, \ 419*4882a593Smuzhiyun KEY_EQUAL, KEY_BACKSPACE, KEY_INS_LINE, KEY_DEL_LINE, \ 420*4882a593Smuzhiyun KEY_I, KEY_O, KEY_P, KEY_LEFTBRACE, \ 421*4882a593Smuzhiyun KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_INSERT, KEY_DELETE, \ 422*4882a593Smuzhiyun KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \ 423*4882a593Smuzhiyun KEY_APOSTROPHE, KEY_ENTER, KEY_HOME, KEY_PAGEUP, \ 424*4882a593Smuzhiyun KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH, \ 425*4882a593Smuzhiyun KEY_BACKSLASH, KEY_SELECT, KEY_102ND, KEY_PAGEDOWN, \ 426*4882a593Smuzhiyun KEY_N, KEY_SPACE, KEY_NEXT, KEY_RESERVED, \ 427*4882a593Smuzhiyun KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun #define HIL_KEYCODES_SET3_TBLSIZE 128 431*4882a593Smuzhiyun #define HIL_KEYCODES_SET3 \ 432*4882a593Smuzhiyun KEY_RESERVED, KEY_ESC, KEY_1, KEY_2, \ 433*4882a593Smuzhiyun KEY_3, KEY_4, KEY_5, KEY_6, \ 434*4882a593Smuzhiyun KEY_7, KEY_8, KEY_9, KEY_0, \ 435*4882a593Smuzhiyun KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_TAB, \ 436*4882a593Smuzhiyun KEY_Q, KEY_W, KEY_E, KEY_R, \ 437*4882a593Smuzhiyun KEY_T, KEY_Y, KEY_U, KEY_I, \ 438*4882a593Smuzhiyun KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE, \ 439*4882a593Smuzhiyun KEY_ENTER, KEY_LEFTCTRL, KEY_A, KEY_S, \ 440*4882a593Smuzhiyun KEY_D, KEY_F, KEY_G, KEY_H, \ 441*4882a593Smuzhiyun KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \ 442*4882a593Smuzhiyun KEY_APOSTROPHE,KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH, \ 443*4882a593Smuzhiyun KEY_Z, KEY_X, KEY_C, KEY_V, \ 444*4882a593Smuzhiyun KEY_B, KEY_N, KEY_M, KEY_COMMA, \ 445*4882a593Smuzhiyun KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_KPASTERISK, \ 446*4882a593Smuzhiyun KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1, \ 447*4882a593Smuzhiyun KEY_F2, KEY_F3, KEY_F4, KEY_F5, \ 448*4882a593Smuzhiyun KEY_F6, KEY_F7, KEY_F8, KEY_F9, \ 449*4882a593Smuzhiyun KEY_F10, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_KP7, \ 450*4882a593Smuzhiyun KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4, \ 451*4882a593Smuzhiyun KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1, \ 452*4882a593Smuzhiyun KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT, \ 453*4882a593Smuzhiyun KEY_SYSRQ, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \ 454*4882a593Smuzhiyun KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \ 455*4882a593Smuzhiyun KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \ 456*4882a593Smuzhiyun KEY_UP, KEY_LEFT, KEY_DOWN, KEY_RIGHT, \ 457*4882a593Smuzhiyun KEY_HOME, KEY_PAGEUP, KEY_END, KEY_PAGEDOWN, \ 458*4882a593Smuzhiyun KEY_INSERT, KEY_DELETE, KEY_102ND, KEY_RESERVED, \ 459*4882a593Smuzhiyun KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \ 460*4882a593Smuzhiyun KEY_F1, KEY_F2, KEY_F3, KEY_F4, \ 461*4882a593Smuzhiyun KEY_F5, KEY_F6, KEY_F7, KEY_F8, \ 462*4882a593Smuzhiyun KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \ 463*4882a593Smuzhiyun KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun /* Response to POL command, the "poll record header" */ 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun #define HIL_POL_NUM_AXES_MASK 0x03 /* Number of axis reported */ 469*4882a593Smuzhiyun #define HIL_POL_CTS 0x04 /* Device ready to receive data */ 470*4882a593Smuzhiyun #define HIL_POL_STATUS_PENDING 0x08 /* Device has status to report */ 471*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_MASK 0x70 /* Type of character data to follow */ 472*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_NONE 0x00 /* No character data to follow */ 473*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_RSVD1 0x10 /* Reserved Set 1 */ 474*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_ASCII 0x20 /* U.S. ASCII */ 475*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_BINARY 0x30 /* Binary data */ 476*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_SET1 0x40 /* Keycode Set 1 */ 477*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_RSVD2 0x50 /* Reserved Set 2 */ 478*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_SET2 0x60 /* Keycode Set 2 */ 479*4882a593Smuzhiyun #define HIL_POL_CHARTYPE_SET3 0x70 /* Keycode Set 3 */ 480*4882a593Smuzhiyun #define HIL_POL_AXIS_ALT 0x80 /* Data is from axis set 2 */ 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun #endif /* _HIL_H_ */ 484