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