xref: /plan9/sys/src/cmd/usb/kb/hid.h (revision 9b7bf7df4595c26f1e9b67beb0c6e44c9876fb05)
183030dd5SDavid du Colombier /*
283030dd5SDavid du Colombier  * USB keyboard/mouse constants
383030dd5SDavid du Colombier  */
4906943f9SDavid du Colombier 
5d40255d8SDavid du Colombier typedef struct Chain Chain;
6d40255d8SDavid du Colombier typedef struct HidInterface HidInterface;
7d40255d8SDavid du Colombier typedef struct HidRepTempl HidRepTempl;
8d40255d8SDavid du Colombier 
9d40255d8SDavid 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,
18d40255d8SDavid 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[]);
65d40255d8SDavid du Colombier 
66d40255d8SDavid du Colombier enum{
67*9b7bf7dfSDavid du Colombier 	MaxChLen	= 64,	/* bytes */
68d40255d8SDavid du Colombier };
69d40255d8SDavid du Colombier 
70d40255d8SDavid du Colombier struct Chain {
71d40255d8SDavid du Colombier 	int	b;			/* offset start in bits, (first full) */
72d40255d8SDavid du Colombier 	int	e;			/* offset end in bits (first empty) */
73d40255d8SDavid du Colombier 	uchar	buf[MaxChLen];
74d40255d8SDavid du Colombier };
75d40255d8SDavid du Colombier 
76d40255d8SDavid du Colombier #define MSK(nbits)		((1UL << (nbits)) - 1)
77d40255d8SDavid du Colombier #define IsCut(bbits, ebits)	(((ebits)/8 - (bbits)/8) > 0)
78d40255d8SDavid du Colombier 
79d40255d8SDavid du Colombier enum {
80d40255d8SDavid du Colombier 	KindPad = 0,
81d40255d8SDavid du Colombier 	KindButtons,
82d40255d8SDavid du Colombier 	KindX,
83d40255d8SDavid du Colombier 	KindY,
84d40255d8SDavid du Colombier 	KindWheel,
85d40255d8SDavid du Colombier 
86*9b7bf7dfSDavid du Colombier 	MaxVals	= 16,
87d40255d8SDavid du Colombier 	MaxIfc	= 8,
88d40255d8SDavid du Colombier };
89d40255d8SDavid du Colombier 
90d40255d8SDavid du Colombier struct HidInterface {
91d40255d8SDavid du Colombier 	ulong	v[MaxVals];	/* one ulong per val should be enough */
92*9b7bf7dfSDavid du Colombier 	uchar	kind[MaxVals];
93d40255d8SDavid du Colombier 	int	nbits;
94d40255d8SDavid du Colombier 	int	count;
95d40255d8SDavid du Colombier };
96d40255d8SDavid du Colombier 
97d40255d8SDavid du Colombier struct HidRepTempl{
98f7db6155SDavid du Colombier 	int	id;				/* id which may not be present */
99f7db6155SDavid du Colombier 	uint	sz;				/* in bytes */
100d40255d8SDavid du Colombier 	int	nifcs;
101d40255d8SDavid du Colombier 	HidInterface ifcs[MaxIfc];
102d40255d8SDavid du Colombier };
103d40255d8SDavid du Colombier 
104d40255d8SDavid du Colombier enum {
105d40255d8SDavid du Colombier 	/* report types */
106f7db6155SDavid du Colombier 
107f7db6155SDavid du Colombier 	HidReportApp	= 0x01,
108d40255d8SDavid du Colombier 	HidTypeUsgPg	= 0x05,
109d40255d8SDavid du Colombier 	HidPgButts	= 0x09,
110d40255d8SDavid du Colombier 
111d40255d8SDavid du Colombier 	HidTypeRepSz	= 0x75,
112d40255d8SDavid du Colombier 	HidTypeCnt	= 0x95,
113f7db6155SDavid du Colombier 	HidCollection	= 0xa1,
114d40255d8SDavid du Colombier 
115d40255d8SDavid du Colombier 	HidTypeUsg	= 0x09,
116d40255d8SDavid du Colombier 	HidPtr		= 0x01,
117d40255d8SDavid du Colombier 	HidX		= 0x30,
118d40255d8SDavid du Colombier 	HidY		= 0x31,
119*9b7bf7dfSDavid du Colombier 	HidZ		= 0x32,
120d40255d8SDavid du Colombier 	HidWheel	= 0x38,
121d40255d8SDavid du Colombier 
122d40255d8SDavid du Colombier 	HidInput	= 0x81,
123d40255d8SDavid du Colombier 	HidReportId	= 0x85,
124*9b7bf7dfSDavid du Colombier 	HidReportIdPtr	= 0x01,
125d40255d8SDavid du Colombier 
126f7db6155SDavid du Colombier 	HidEnd		= 0xc0,
127d40255d8SDavid du Colombier };
128d40255d8SDavid du Colombier 
129d40255d8SDavid du Colombier void	dumpreport(HidRepTempl *templ);
130d40255d8SDavid du Colombier int	hidifcval(HidRepTempl *templ, int kind, int n);
131d40255d8SDavid du Colombier int	parsereport(HidRepTempl *templ, Chain *rep);
132d40255d8SDavid du Colombier int	parsereportdesc(HidRepTempl *temp, uchar *repdesc, int repsz);
133