xref: /plan9/sys/src/cmd/usb/kb/hid.h (revision d40255d87ccd1acd15b87823a96efd7b6296fadd)
183030dd5SDavid du Colombier /*
283030dd5SDavid du Colombier  * USB keyboard/mouse constants
383030dd5SDavid du Colombier  */
4906943f9SDavid du Colombier 
5*d40255d8SDavid du Colombier typedef struct Chain Chain;
6*d40255d8SDavid du Colombier typedef struct HidInterface HidInterface;
7*d40255d8SDavid du Colombier typedef struct HidRepTempl HidRepTempl;
8*d40255d8SDavid du Colombier 
9*d40255d8SDavid du Colombier enum {
10906943f9SDavid du Colombier 	Stack = 32 * 1024,
11906943f9SDavid du Colombier 
1283030dd5SDavid du Colombier 	/* HID class subclass protocol ids */
1383030dd5SDavid du Colombier 	PtrCSP		= 0x020103,	/* mouse.boot.hid */
1483030dd5SDavid du Colombier 	KbdCSP		= 0x010103,	/* keyboard.boot.hid */
1583030dd5SDavid du Colombier 
1683030dd5SDavid du Colombier 	/* Requests */
17906943f9SDavid du Colombier 	Getproto	= 0x03,
18*d40255d8SDavid du Colombier 	Setidle		= 0x0a,
19906943f9SDavid du Colombier 	Setproto	= 0x0b,
2083030dd5SDavid du Colombier 
2183030dd5SDavid du Colombier 	/* protocols for SET_PROTO request */
22906943f9SDavid du Colombier 	Bootproto	= 0,
23906943f9SDavid du Colombier 	Reportproto	= 1,
2483030dd5SDavid du Colombier };
2583030dd5SDavid du Colombier 
2683030dd5SDavid du Colombier enum {
2783030dd5SDavid du Colombier 	/* keyboard modifier bits */
2883030dd5SDavid du Colombier 	Mlctrl		= 0,
2983030dd5SDavid du Colombier 	Mlshift		= 1,
3083030dd5SDavid du Colombier 	Mlalt		= 2,
3183030dd5SDavid du Colombier 	Mlgui		= 3,
3283030dd5SDavid du Colombier 	Mrctrl		= 4,
3383030dd5SDavid du Colombier 	Mrshift		= 5,
3483030dd5SDavid du Colombier 	Mralt		= 6,
3583030dd5SDavid du Colombier 	Mrgui		= 7,
3683030dd5SDavid du Colombier 
3783030dd5SDavid du Colombier 	/* masks for byte[0] */
3883030dd5SDavid du Colombier 	Mctrl		= 1<<Mlctrl | 1<<Mrctrl,
3983030dd5SDavid du Colombier 	Mshift		= 1<<Mlshift | 1<<Mrshift,
4083030dd5SDavid du Colombier 	Malt		= 1<<Mlalt | 1<<Mralt,
4183030dd5SDavid du Colombier 	Mcompose	= 1<<Mlalt,
4283030dd5SDavid du Colombier 	Maltgr		= 1<<Mralt,
4383030dd5SDavid du Colombier 	Mgui		= 1<<Mlgui | 1<<Mrgui,
4483030dd5SDavid du Colombier 
4583030dd5SDavid du Colombier 	MaxAcc = 3,			/* max. ptr acceleration */
4683030dd5SDavid du Colombier 	PtrMask= 0xf,			/* 4 buttons: should allow for more. */
4783030dd5SDavid du Colombier };
4883030dd5SDavid du Colombier 
4983030dd5SDavid du Colombier /*
5083030dd5SDavid du Colombier  * Plan 9 keyboard driver constants.
5183030dd5SDavid du Colombier  */
5283030dd5SDavid du Colombier enum {
5383030dd5SDavid du Colombier 	/* Scan codes (see kbd.c) */
5483030dd5SDavid du Colombier 	SCesc1		= 0xe0,		/* first of a 2-character sequence */
5583030dd5SDavid du Colombier 	SCesc2		= 0xe1,
5683030dd5SDavid du Colombier 	SClshift	= 0x2a,
5783030dd5SDavid du Colombier 	SCrshift	= 0x36,
5883030dd5SDavid du Colombier 	SCctrl		= 0x1d,
5983030dd5SDavid du Colombier 	SCcompose	= 0x38,
6083030dd5SDavid du Colombier 	Keyup		= 0x80,		/* flag bit */
6183030dd5SDavid du Colombier 	Keymask		= 0x7f,		/* regular scan code bits */
6283030dd5SDavid du Colombier };
6383030dd5SDavid du Colombier 
64906943f9SDavid du Colombier int kbmain(Dev *d, int argc, char*argv[]);
65*d40255d8SDavid du Colombier 
66*d40255d8SDavid du Colombier enum{
67*d40255d8SDavid du Colombier 	MaxChLen	= 16,	/* bytes */
68*d40255d8SDavid du Colombier };
69*d40255d8SDavid du Colombier 
70*d40255d8SDavid du Colombier struct Chain {
71*d40255d8SDavid du Colombier 	int	b;			/* offset start in bits, (first full) */
72*d40255d8SDavid du Colombier 	int	e;			/* offset end in bits (first empty) */
73*d40255d8SDavid du Colombier 	uchar	buf[MaxChLen];
74*d40255d8SDavid du Colombier };
75*d40255d8SDavid du Colombier 
76*d40255d8SDavid du Colombier #define MSK(nbits)		((1UL << (nbits)) - 1)
77*d40255d8SDavid du Colombier #define IsCut(bbits, ebits)	(((ebits)/8 - (bbits)/8) > 0)
78*d40255d8SDavid du Colombier 
79*d40255d8SDavid du Colombier enum {
80*d40255d8SDavid du Colombier 	KindPad = 0,
81*d40255d8SDavid du Colombier 	KindButtons,
82*d40255d8SDavid du Colombier 	KindX,
83*d40255d8SDavid du Colombier 	KindY,
84*d40255d8SDavid du Colombier 	KindWheel,
85*d40255d8SDavid du Colombier 
86*d40255d8SDavid du Colombier 	MaxVals	= 8,
87*d40255d8SDavid du Colombier 	MaxIfc	= 8,
88*d40255d8SDavid du Colombier };
89*d40255d8SDavid du Colombier 
90*d40255d8SDavid du Colombier struct HidInterface {
91*d40255d8SDavid du Colombier 	ulong	v[MaxVals];	/* one ulong per val should be enough */
92*d40255d8SDavid du Colombier 	int	kind[MaxVals];
93*d40255d8SDavid du Colombier 	int	nbits;
94*d40255d8SDavid du Colombier 	int	count;
95*d40255d8SDavid du Colombier };
96*d40255d8SDavid du Colombier 
97*d40255d8SDavid du Colombier struct HidRepTempl{
98*d40255d8SDavid du Colombier 	int	nifcs;
99*d40255d8SDavid du Colombier 	HidInterface ifcs[MaxIfc];
100*d40255d8SDavid du Colombier };
101*d40255d8SDavid du Colombier 
102*d40255d8SDavid du Colombier enum {
103*d40255d8SDavid du Colombier 	/* report types */
104*d40255d8SDavid du Colombier 	HidTypeUsgPg	= 0x05,
105*d40255d8SDavid du Colombier 	HidPgButts	= 0x09,
106*d40255d8SDavid du Colombier 
107*d40255d8SDavid du Colombier 	HidTypeRepSz	= 0x75,
108*d40255d8SDavid du Colombier 	HidTypeCnt	= 0x95,
109*d40255d8SDavid du Colombier 
110*d40255d8SDavid du Colombier 	HidTypeUsg	= 0x09,
111*d40255d8SDavid du Colombier 	HidPtr		= 0x01,
112*d40255d8SDavid du Colombier 	HidX		= 0x30,
113*d40255d8SDavid du Colombier 	HidY		= 0x31,
114*d40255d8SDavid du Colombier 	HidWheel	= 0x38,
115*d40255d8SDavid du Colombier 
116*d40255d8SDavid du Colombier 	HidInput	= 0x81,
117*d40255d8SDavid du Colombier 	HidReportId	= 0x85,
118*d40255d8SDavid du Colombier 
119*d40255d8SDavid du Colombier 	HidEnd		= 0x0c,
120*d40255d8SDavid du Colombier };
121*d40255d8SDavid du Colombier 
122*d40255d8SDavid du Colombier void	dumpreport(HidRepTempl *templ);
123*d40255d8SDavid du Colombier int	hidifcval(HidRepTempl *templ, int kind, int n);
124*d40255d8SDavid du Colombier int	parsereport(HidRepTempl *templ, Chain *rep);
125*d40255d8SDavid du Colombier int	parsereportdesc(HidRepTempl *temp, uchar *repdesc, int repsz);
126