142 lines
2.8 KiB
C
142 lines
2.8 KiB
C
|
/*
|
||
|
* This file is part of the UCB release of Plan 9. It is subject to the license
|
||
|
* terms in the LICENSE file found in the top-level directory of this
|
||
|
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
||
|
* part of the UCB release of Plan 9, including this file, may be copied,
|
||
|
* modified, propagated, or distributed except according to the terms contained
|
||
|
* in the LICENSE file.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* USB keyboard/mouse constants
|
||
|
*/
|
||
|
|
||
|
typedef struct Chain Chain;
|
||
|
typedef struct HidInterface HidInterface;
|
||
|
typedef struct HidRepTempl HidRepTempl;
|
||
|
|
||
|
enum {
|
||
|
Stack = 32 * 1024,
|
||
|
|
||
|
/* HID class subclass protocol ids */
|
||
|
PtrCSP = 0x020103, /* mouse.boot.hid */
|
||
|
KbdCSP = 0x010103, /* keyboard.boot.hid */
|
||
|
|
||
|
/* Requests */
|
||
|
Getproto = 0x03,
|
||
|
Setidle = 0x0a,
|
||
|
Setproto = 0x0b,
|
||
|
|
||
|
/* protocols for SET_PROTO request */
|
||
|
Bootproto = 0,
|
||
|
Reportproto = 1,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
/* keyboard modifier bits */
|
||
|
Mlctrl = 0,
|
||
|
Mlshift = 1,
|
||
|
Mlalt = 2,
|
||
|
Mlgui = 3,
|
||
|
Mrctrl = 4,
|
||
|
Mrshift = 5,
|
||
|
Mralt = 6,
|
||
|
Mrgui = 7,
|
||
|
|
||
|
/* masks for byte[0] */
|
||
|
Mctrl = 1<<Mlctrl | 1<<Mrctrl,
|
||
|
Mshift = 1<<Mlshift | 1<<Mrshift,
|
||
|
Malt = 1<<Mlalt | 1<<Mralt,
|
||
|
Mcompose = 1<<Mlalt,
|
||
|
Maltgr = 1<<Mralt,
|
||
|
Mgui = 1<<Mlgui | 1<<Mrgui,
|
||
|
|
||
|
MaxAcc = 3, /* max. ptr acceleration */
|
||
|
PtrMask= 0xf, /* 4 buttons: should allow for more. */
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Plan 9 keyboard driver constants.
|
||
|
*/
|
||
|
enum {
|
||
|
/* Scan codes (see kbd.c) */
|
||
|
SCesc1 = 0xe0, /* first of a 2-character sequence */
|
||
|
SCesc2 = 0xe1,
|
||
|
SClshift = 0x2a,
|
||
|
SCrshift = 0x36,
|
||
|
SCctrl = 0x1d,
|
||
|
SCcompose = 0x38,
|
||
|
Keyup = 0x80, /* flag bit */
|
||
|
Keymask = 0x7f, /* regular scan code bits */
|
||
|
};
|
||
|
|
||
|
int kbmain(Dev *d, int argc, char*argv[]);
|
||
|
|
||
|
enum{
|
||
|
MaxChLen = 64, /* bytes */
|
||
|
};
|
||
|
|
||
|
struct Chain {
|
||
|
int b; /* offset start in bits, (first full) */
|
||
|
int e; /* offset end in bits (first empty) */
|
||
|
uint8_t buf[MaxChLen];
|
||
|
};
|
||
|
|
||
|
#define MSK(nbits) ((1UL << (nbits)) - 1)
|
||
|
#define IsCut(bbits, ebits) (((ebits)/8 - (bbits)/8) > 0)
|
||
|
|
||
|
enum {
|
||
|
KindPad = 0,
|
||
|
KindButtons,
|
||
|
KindX,
|
||
|
KindY,
|
||
|
KindWheel,
|
||
|
|
||
|
MaxVals = 16,
|
||
|
MaxIfc = 8,
|
||
|
};
|
||
|
|
||
|
struct HidInterface {
|
||
|
uint32_t v[MaxVals]; /* one ulong per val should be enough */
|
||
|
uint8_t kind[MaxVals];
|
||
|
int nbits;
|
||
|
int count;
|
||
|
};
|
||
|
|
||
|
struct HidRepTempl{
|
||
|
int id; /* id which may not be present */
|
||
|
uint32_t sz; /* in bytes */
|
||
|
int nifcs;
|
||
|
HidInterface ifcs[MaxIfc];
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
/* report types */
|
||
|
|
||
|
HidReportApp = 0x01,
|
||
|
HidTypeUsgPg = 0x05,
|
||
|
HidPgButts = 0x09,
|
||
|
|
||
|
HidTypeRepSz = 0x75,
|
||
|
HidTypeCnt = 0x95,
|
||
|
HidCollection = 0xa1,
|
||
|
|
||
|
HidTypeUsg = 0x09,
|
||
|
HidPtr = 0x01,
|
||
|
HidX = 0x30,
|
||
|
HidY = 0x31,
|
||
|
HidZ = 0x32,
|
||
|
HidWheel = 0x38,
|
||
|
|
||
|
HidInput = 0x81,
|
||
|
HidReportId = 0x85,
|
||
|
HidReportIdPtr = 0x01,
|
||
|
|
||
|
HidEnd = 0xc0,
|
||
|
};
|
||
|
|
||
|
void dumpreport(HidRepTempl *templ);
|
||
|
int hidifcval(HidRepTempl *templ, int kind, int n);
|
||
|
int parsereport(HidRepTempl *templ, Chain *rep);
|
||
|
int parsereportdesc(HidRepTempl *temp, uint8_t *repdesc, int repsz);
|