#ifndef _HIL_H_
#define _HIL_H_



#include <asm/types.h>

 

#define HIL_CLOCK		8MHZ
#define HIL_EK1_CLOCK		30HZ
#define HIL_EK2_CLOCK		60HZ

#define HIL_TIMEOUT_DEV         5	
#define HIL_TIMEOUT_DEVS	10	
#define HIL_TIMEOUT_NORESP	10	
#define HIL_TIMEOUT_DEVS_DATA	16	
#define HIL_TIMEOUT_SELFTEST	200	




#define HIL_WIRE_PACKET_LEN	15
enum hil_wire_bitpos {
	HIL_WIRE_START		= 0,
	HIL_WIRE_ADDR2,
	HIL_WIRE_ADDR1,
	HIL_WIRE_ADDR0,
	HIL_WIRE_COMMAND,
	HIL_WIRE_DATA7,
	HIL_WIRE_DATA6,
	HIL_WIRE_DATA5,
	HIL_WIRE_DATA4,
	HIL_WIRE_DATA3,
	HIL_WIRE_DATA2,
	HIL_WIRE_DATA1,
	HIL_WIRE_DATA0,
	HIL_WIRE_PARITY,
	HIL_WIRE_STOP
};


enum hil_pkt_bitpos {
	HIL_PKT_CMD		= 0x00000800,
	HIL_PKT_ADDR2		= 0x00000400,
	HIL_PKT_ADDR1		= 0x00000200,
	HIL_PKT_ADDR0		= 0x00000100,
	HIL_PKT_ADDR_MASK	= 0x00000700,
	HIL_PKT_ADDR_SHIFT	= 8,
	HIL_PKT_DATA7		= 0x00000080,
	HIL_PKT_DATA6		= 0x00000040,
	HIL_PKT_DATA5		= 0x00000020,
	HIL_PKT_DATA4		= 0x00000010,
	HIL_PKT_DATA3		= 0x00000008,
	HIL_PKT_DATA2		= 0x00000004,
	HIL_PKT_DATA1		= 0x00000002,
	HIL_PKT_DATA0		= 0x00000001,
	HIL_PKT_DATA_MASK	= 0x000000FF,
	HIL_PKT_DATA_SHIFT	= 0
};


enum hil_error_bitpos {
	HIL_ERR_OB	= 0x00000800, 
	HIL_ERR_INT	= 0x00010000, 
	HIL_ERR_NMI	= 0x00020000, 
	HIL_ERR_LERR	= 0x00040000, 
	HIL_ERR_PERR	= 0x01000000, 
	HIL_ERR_FERR	= 0x02000000, 
	HIL_ERR_FOF	= 0x04000000  
};

enum hil_control_bitpos {
	HIL_CTRL_TEST	= 0x00010000,
	HIL_CTRL_IPF	= 0x00040000,
	HIL_CTRL_APE	= 0x02000000
};


#define HIL_DO_ALTER_CTRL  0x40000000 
#define HIL_CTRL_ONLY      0xc0000000 


typedef u32 hil_packet;



enum hil_command {
	HIL_CMD_IFC	= 0x00,	
	HIL_CMD_EPT	= 0x01,	
	HIL_CMD_ELB	= 0x02,	
	HIL_CMD_IDD	= 0x03,	
	HIL_CMD_DSR	= 0x04,	
	HIL_CMD_PST	= 0x05,	
	HIL_CMD_RRG	= 0x06,	
	HIL_CMD_WRG	= 0x07,	
	HIL_CMD_ACF	= 0x08,	
	HIL_CMDID_ACF	= 0x07,	
	HIL_CMD_POL	= 0x10,	
	HIL_CMDCT_POL	= 0x0f,	
	HIL_CMD_RPL	= 0x20,	
	HIL_CMDCT_RPL	= 0x0f,	
	HIL_CMD_RNM	= 0x30,	
	HIL_CMD_RST	= 0x31,	
	HIL_CMD_EXD	= 0x32,	
	HIL_CMD_RSC	= 0x33,	

	

	HIL_CMD_DKA	= 0x3d,	
	HIL_CMD_EK1	= 0x3e,	
	HIL_CMD_EK2	= 0x3f,	
	HIL_CMD_PR1	= 0x40,	  
	HIL_CMD_PR2	= 0x41,	
	HIL_CMD_PR3	= 0x42,	
	HIL_CMD_PR4	= 0x43,	
	HIL_CMD_PR5	= 0x44,	
	HIL_CMD_PR6	= 0x45,	
	HIL_CMD_PR7	= 0x46,	
	HIL_CMD_PRM	= 0x47,	
	HIL_CMD_AK1	= 0x48,	  
	HIL_CMD_AK2	= 0x49,	
	HIL_CMD_AK3	= 0x4a,	
	HIL_CMD_AK4	= 0x4b,	
	HIL_CMD_AK5	= 0x4c,	
	HIL_CMD_AK6	= 0x4d,	
	HIL_CMD_AK7	= 0x4e,	
	HIL_CMD_ACK	= 0x4f,	

	
	
	

	HIL_CMD_RIO	= 0xfa,	
	HIL_CMD_SHR	= 0xfb,	
	HIL_CMD_TER	= 0xfc,	
	HIL_CMD_CAE	= 0xfd,	
	HIL_CMD_DHR	= 0xfe,	

	
};





#define HIL_IDD_DID_TYPE_MASK		0xe0	
#define HIL_IDD_DID_TYPE_KB_INTEGRAL	0xa0	
#define HIL_IDD_DID_TYPE_KB_ITF		0xc0	
#define HIL_IDD_DID_TYPE_KB_RSVD	0xe0	
#define HIL_IDD_DID_TYPE_KB_LANG_MASK	0x1f	
#define HIL_IDD_DID_KBLANG_USE_ESD	0x00	
#define HIL_IDD_DID_TYPE_ABS		0x80    
#define HIL_IDD_DID_ABS_RSVD1_MASK	0xf8	
#define HIL_IDD_DID_ABS_RSVD1		0x98
#define HIL_IDD_DID_ABS_TABLET_MASK	0xf8	
#define HIL_IDD_DID_ABS_TABLET		0x90
#define HIL_IDD_DID_ABS_TSCREEN_MASK	0xfc	
#define HIL_IDD_DID_ABS_TSCREEN		0x8c
#define HIL_IDD_DID_ABS_RSVD2_MASK	0xfc	
#define HIL_IDD_DID_ABS_RSVD2		0x88
#define HIL_IDD_DID_ABS_RSVD3_MASK	0xfc	
#define HIL_IDD_DID_ABS_RSVD3		0x80
#define HIL_IDD_DID_TYPE_REL		0x60    
#define HIL_IDD_DID_REL_RSVD1_MASK	0xf0	
#define HIL_IDD_DID_REL_RSVD1		0x70
#define HIL_IDD_DID_REL_RSVD2_MASK	0xfc	
#define HIL_IDD_DID_REL_RSVD2		0x6c
#define HIL_IDD_DID_REL_MOUSE_MASK	0xfc	
#define HIL_IDD_DID_REL_MOUSE		0x68
#define HIL_IDD_DID_REL_QUAD_MASK	0xf8	
#define HIL_IDD_DID_REL_QUAD		0x60
#define HIL_IDD_DID_TYPE_CHAR		0x40    
#define HIL_IDD_DID_CHAR_BARCODE_MASK	0xfc	
#define HIL_IDD_DID_CHAR_BARCODE	0x5c
#define HIL_IDD_DID_CHAR_RSVD1_MASK	0xfc	
#define HIL_IDD_DID_CHAR_RSVD1		0x58
#define HIL_IDD_DID_CHAR_RSVD2_MASK	0xf8	
#define HIL_IDD_DID_CHAR_RSVD2		0x50
#define HIL_IDD_DID_CHAR_RSVD3_MASK	0xf0	
#define HIL_IDD_DID_CHAR_RSVD3		0x40
#define HIL_IDD_DID_TYPE_OTHER		0x20    
#define HIL_IDD_DID_OTHER_RSVD1_MASK	0xf0	
#define HIL_IDD_DID_OTHER_RSVD1		0x30
#define HIL_IDD_DID_OTHER_BARCODE_MASK	0xfc	
#define HIL_IDD_DID_OTHER_BARCODE	0x2c
#define HIL_IDD_DID_OTHER_RSVD2_MASK	0xfc	
#define HIL_IDD_DID_OTHER_RSVD2		0x28
#define HIL_IDD_DID_OTHER_RSVD3_MASK	0xf8	
#define HIL_IDD_DID_OTHER_RSVD3		0x20
#define HIL_IDD_DID_TYPE_KEYPAD		0x00	


#define HIL_IDD_HEADER_AXSET_MASK	0x03    
#define HIL_IDD_HEADER_RSC		0x04	
#define HIL_IDD_HEADER_EXD		0x08	
#define HIL_IDD_HEADER_IOD		0x10	
#define HIL_IDD_HEADER_16BIT		0x20	
#define HIL_IDD_HEADER_ABS		0x40	
#define HIL_IDD_HEADER_2X_AXIS		0x80	


#define HIL_IDD_IOD_NBUTTON_MASK	0x07	
#define HIL_IDD_IOD_PROXIMITY		0x08	
#define HIL_IDD_IOD_PROMPT_MASK		0x70	
#define HIL_IDD_IOD_PROMPT_SHIFT	4
#define HIL_IDD_IOD_PROMPT		0x80	

#define HIL_IDD_NUM_AXES_PER_SET(header_packet) \
((header_packet) & HIL_IDD_HEADER_AXSET_MASK)

#define HIL_IDD_NUM_AXSETS(header_packet) \
(2 - !((header_packet) & HIL_IDD_HEADER_2X_AXIS))

#define HIL_IDD_LEN(header_packet) \
((4 - !(header_packet & HIL_IDD_HEADER_IOD) -			\
  2 * !(HIL_IDD_NUM_AXES_PER_SET(header_packet))) +		\
  2 * HIL_IDD_NUM_AXES_PER_SET(header_packet) *			\
 !!((header_packet) & HIL_IDD_HEADER_ABS))



#define HIL_IDD_AXIS_COUNTS_PER_M(header_ptr) \
(!(HIL_IDD_NUM_AXSETS(*(header_ptr))) ? -1 :			\
(((*(header_ptr + 1) & HIL_PKT_DATA_MASK) +			\
  ((*(header_ptr + 2) & HIL_PKT_DATA_MASK)) << 8)		\
* ((*(header_ptr) & HIL_IDD_HEADER_16BIT) ? 100 : 1)))

#define HIL_IDD_AXIS_MAX(header_ptr, __axnum) \
((!(*(header_ptr) & HIL_IDD_HEADER_ABS) ||			\
  (HIL_IDD_NUM_AXES_PER_SET(*(header_ptr)) <= __axnum)) ? 0 :	\
 ((HIL_PKT_DATA_MASK & *((header_ptr) + 3 + 2 * __axnum)) +	\
  ((HIL_PKT_DATA_MASK & *((header_ptr) + 4 + 2 * __axnum)) << 8)))

#define HIL_IDD_IOD(header_ptr) \
(*(header_ptr + HIL_IDD_LEN((*header_ptr)) - 1))

#define HIL_IDD_HAS_GEN_PROMPT(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) &&				\
 (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROMPT))

#define HIL_IDD_HAS_GEN_PROXIMITY(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) &&				\
 (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROXIMITY))

#define HIL_IDD_NUM_BUTTONS(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) ?				\
 (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NBUTTON_MASK) : 0)

#define HIL_IDD_NUM_PROMPTS(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) ?				\
 ((HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NPROMPT_MASK)		\
  >> HIL_IDD_IOD_PROMPT_SHIFT) : 0)


#define	HIL_EXD_HEADER_WRG		0x03	
#define HIL_EXD_HEADER_WRG_TYPE1	0x01	
#define	HIL_EXD_HEADER_WRG_TYPE2	0x02	
#define	HIL_EXD_HEADER_RRG		0x04	
#define	HIL_EXD_HEADER_RNM		0x10	
#define HIL_EXD_HEADER_RST		0x20	
#define HIL_EXD_HEADER_LOCALE		0x40	

#define HIL_EXD_NUM_RRG(header_ptr) \
((*header_ptr & HIL_EXD_HEADER_RRG) ? \
 (*(header_ptr + 1) & HIL_PKT_DATA_MASK) : 0)

#define HIL_EXD_NUM_WWG(header_ptr) \
((*header_ptr & HIL_EXD_HEADER_WRG) ?				\
 (*(header_ptr + 2 - !(*header_ptr & HIL_EXD_HEADER_RRG)) &	\
    HIL_PKT_DATA_MASK) : 0)

#define HIL_EXD_LEN(header_ptr) \
(!!(*header_ptr & HIL_EXD_HEADER_RRG) +				\
 !!(*header_ptr & HIL_EXD_HEADER_WRG) +				\
 !!(*header_ptr & HIL_EXD_HEADER_LOCALE) +			\
 2 * !!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) + 1)

#define HIL_EXD_LOCALE(header_ptr) \
(!(*header_ptr & HIL_EXD_HEADER_LOCALE) ? -1 :			\
 (*(header_ptr + HIL_EXD_LEN(header_ptr) - 1) & HIL_PKT_DATA_MASK))

#define HIL_EXD_WRG_TYPE2_LEN(header_ptr) \
(!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) ? -1	:			\
 (*(header_ptr + HIL_EXD_LEN(header_ptr) - 2 -                  	\
    !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) +	\
 ((*(header_ptr + HIL_EXD_LEN(header_ptr) - 1 -				\
     !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) << 8))

 


#define HIL_LOCALE_MAX 0x1f


#define HIL_LOCALE_MAP \
"",					\
"",					\
"",					\
"swiss.french",				\
"portuguese",				\
"arabic",				\
"hebrew",				\
"english.canadian",		\
"turkish",				\
"greek",				\
"thai",				\
"italian",				\
"korean",			\
"dutch",				\
"swedish",				\
"german",				\
"chinese",				\
"chinese",				\
"swiss.french",			\
"spanish",				\
"swiss.german",			\
"flemish",			\
"finnish",				\
"english.uk",			\
"french.canadian",		\
"swiss.german",				\
"norwegian",				\
"french",				\
"danish",				\
"japanese",				\
"spanish",		\
"english.us"			\



#define HIL_KEYCODES_SET1_TBLSIZE 128
#define HIL_KEYCODES_SET1 	\
   KEY_5,		KEY_RESERVED,	KEY_RIGHTALT,	KEY_LEFTALT,	\
   KEY_RIGHTSHIFT,	KEY_LEFTSHIFT,	KEY_LEFTCTRL,	KEY_SYSRQ,	\
   KEY_KP4,		KEY_KP8,	KEY_KP5,	KEY_KP9,	\
   KEY_KP6,		KEY_KP7,	KEY_KPCOMMA,	KEY_KPENTER,	\
   KEY_KP1,		KEY_KPSLASH,	KEY_KP2,	KEY_KPPLUS,	\
   KEY_KP3,		KEY_KPASTERISK,	KEY_KP0,	KEY_KPMINUS,	\
   KEY_B,		KEY_V,		KEY_C,		KEY_X,		\
   KEY_Z,		KEY_RESERVED,	KEY_RESERVED,   KEY_ESC,	\
   KEY_6,		KEY_F10,	KEY_3,		KEY_F11,	\
   KEY_KPDOT,		KEY_F9,		KEY_TAB ,	KEY_F12,	\
   KEY_H,		KEY_G,		KEY_F,		KEY_D,		\
   KEY_S,		KEY_A,		KEY_RESERVED,	KEY_CAPSLOCK,	\
   KEY_U,		KEY_Y,		KEY_T,		KEY_R,		\
   KEY_E,		KEY_W,		KEY_Q,		KEY_TAB,	\
   KEY_7,		KEY_6,		KEY_5,		KEY_4,		\
   KEY_3,		KEY_2,		KEY_1,		KEY_GRAVE,	\
   KEY_F13,		KEY_F14,	KEY_F15,	KEY_F16,	\
   KEY_F17,		KEY_F18,	KEY_F19,	KEY_F20,	\
   KEY_MENU,		KEY_F4,		KEY_F3,		KEY_F2,		\
   KEY_F1,		KEY_VOLUMEUP,	KEY_STOP,	KEY_SENDFILE,	\
   KEY_SYSRQ,		KEY_F5,		KEY_F6,		KEY_F7,		\
   KEY_F8,		KEY_VOLUMEDOWN,	KEY_DEL_EOL,	KEY_DEL_EOS,	\
   KEY_8,		KEY_9,		KEY_0,		KEY_MINUS,	\
   KEY_EQUAL,		KEY_BACKSPACE,	KEY_INS_LINE,	KEY_DEL_LINE,	\
   KEY_I,		KEY_O,		KEY_P,		KEY_LEFTBRACE,	\
   KEY_RIGHTBRACE,	KEY_BACKSLASH,	KEY_INSERT,	KEY_DELETE,	\
   KEY_J,		KEY_K,		KEY_L,		KEY_SEMICOLON,	\
   KEY_APOSTROPHE,	KEY_ENTER,	KEY_HOME,	KEY_PAGEUP,	\
   KEY_M,		KEY_COMMA,	KEY_DOT,	KEY_SLASH,	\
   KEY_BACKSLASH,	KEY_SELECT,	KEY_102ND,	KEY_PAGEDOWN,	\
   KEY_N,		KEY_SPACE,	KEY_NEXT,	KEY_RESERVED,	\
   KEY_LEFT,		KEY_DOWN,	KEY_UP,		KEY_RIGHT


#define HIL_KEYCODES_SET3_TBLSIZE 128
#define HIL_KEYCODES_SET3 	\
  KEY_RESERVED,	KEY_ESC,	KEY_1,		KEY_2,			\
  KEY_3,	KEY_4,		KEY_5,		KEY_6,			\
  KEY_7,	KEY_8,		KEY_9,		KEY_0,			\
  KEY_MINUS,	KEY_EQUAL,	KEY_BACKSPACE,	KEY_TAB,		\
  KEY_Q,	KEY_W,		KEY_E,		KEY_R,			\
  KEY_T,	KEY_Y,		KEY_U,		KEY_I,			\
  KEY_O,	KEY_P,		KEY_LEFTBRACE,	KEY_RIGHTBRACE,		\
  KEY_ENTER,	KEY_LEFTCTRL,	KEY_A,		KEY_S,			\
  KEY_D,	KEY_F,		KEY_G,		KEY_H,			\
  KEY_J,	KEY_K,		KEY_L,		KEY_SEMICOLON,		\
  KEY_APOSTROPHE,KEY_GRAVE,	KEY_LEFTSHIFT,	KEY_BACKSLASH,		\
  KEY_Z,	KEY_X,		KEY_C,		KEY_V,			\
  KEY_B,	KEY_N,		KEY_M,		KEY_COMMA,		\
  KEY_DOT,	KEY_SLASH,	KEY_RIGHTSHIFT,	KEY_KPASTERISK,		\
  KEY_LEFTALT,	KEY_SPACE,	KEY_CAPSLOCK,	KEY_F1,			\
  KEY_F2,	KEY_F3,		KEY_F4,		KEY_F5,			\
  KEY_F6,	KEY_F7,		KEY_F8,		KEY_F9,			\
  KEY_F10,	KEY_NUMLOCK,	KEY_SCROLLLOCK,	KEY_KP7,		\
  KEY_KP8,	KEY_KP9,	KEY_KPMINUS,	KEY_KP4,		\
  KEY_KP5,	KEY_KP6,	KEY_KPPLUS,	KEY_KP1,		\
  KEY_KP2,	KEY_KP3,	KEY_KP0,	KEY_KPDOT,		\
  KEY_SYSRQ,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
  KEY_UP,	KEY_LEFT,	KEY_DOWN,	KEY_RIGHT,		\
  KEY_HOME,	KEY_PAGEUP,	KEY_END,	KEY_PAGEDOWN,		\
  KEY_INSERT,	KEY_DELETE,	KEY_102ND,	KEY_RESERVED,		\
  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
  KEY_F1,	KEY_F2,		KEY_F3,		KEY_F4,			\
  KEY_F5,	KEY_F6,		KEY_F7,		KEY_F8,			\
  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED




#define HIL_POL_NUM_AXES_MASK	0x03	
#define HIL_POL_CTS		0x04	
#define HIL_POL_STATUS_PENDING	0x08	
#define HIL_POL_CHARTYPE_MASK	0x70	
#define HIL_POL_CHARTYPE_NONE	0x00	
#define HIL_POL_CHARTYPE_RSVD1	0x10	
#define HIL_POL_CHARTYPE_ASCII	0x20	
#define HIL_POL_CHARTYPE_BINARY	0x30	
#define HIL_POL_CHARTYPE_SET1	0x40	
#define HIL_POL_CHARTYPE_RSVD2	0x50	
#define HIL_POL_CHARTYPE_SET2	0x60	
#define HIL_POL_CHARTYPE_SET3	0x70	
#define HIL_POL_AXIS_ALT	0x80	


#endif 
