diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/compat/compat3x.i386/libxpg4.so.2.gz.uu | 116 | ||||
| -rw-r--r-- | lib/libusb/Makefile | 24 | ||||
| -rw-r--r-- | lib/libusb/data.c | 99 | ||||
| -rw-r--r-- | lib/libusb/descr.c | 75 | ||||
| -rw-r--r-- | lib/libusb/libusb.h | 96 | ||||
| -rw-r--r-- | lib/libusb/parse.c | 405 | ||||
| -rw-r--r-- | lib/libusb/usage.c | 197 | ||||
| -rw-r--r-- | lib/libusb/usb.3 | 190 | ||||
| -rw-r--r-- | lib/libusb/usbvar.h | 36 |
9 files changed, 1238 insertions, 0 deletions
diff --git a/lib/compat/compat3x.i386/libxpg4.so.2.gz.uu b/lib/compat/compat3x.i386/libxpg4.so.2.gz.uu new file mode 100644 index 000000000000..6bbe08b1b6d7 --- /dev/null +++ b/lib/compat/compat3x.i386/libxpg4.so.2.gz.uu @@ -0,0 +1,116 @@ +$FreeBSD$ + +begin 440 libxpg4.so.2.gz +M'XL("$;"73@"`VQI8GAP9S0N<V\N,@#=6GUT4\>5GR?)0C8RDL%\-0YVRT?Y +M6G^P),&$#W_)X,0&!VR3;#Z$P0*98VRO]!X8BK'AV2=^"!&=P';3M+1I<M)R +M>MIMNJ$YQMEM99,8)V<_'-*T:3?ITI1L)40I2<`(4-'>.S-/?GIR:'O._M-] +M/M<SOYD[=V;NW)D[3^]V.:HK!4$@E1Z7JVQS!3'"GT`(J<@@9#FD)5\B]%E. +M\J!F(9E)LFF]]CEP+Z,T!'9"ZVG9WS!R&Z`8*LV\'B!IR@4J8-1-&&&]"6@^ +MT#(N>P'0-*!9NCZ_J,G?R]MR\602T!R.,X&@"Q@[>]*!E@+-!<H'R@;"*<(P +MR3S.8P-:`@0J(!:@&82-6?L4`DW68)Q[C@;/U/%;-?G%FCS.]PM`LTGJLPCH +M'I[/(B2A]UR>+N3I5*XS]?DR3XMXFL?3Z4!3R,0/RL:U8'U]$L>YC^2/8Y3Q +M?8O:WR2Z+J=S5)Q!=?HOT.@IBM/)`QK9N"8/H7XFC]?7HXT`;N:X4<?OUN&O +MZ/!A'59T^+@.?UV'?X0V!8K;96#]OZFK_S<=?E>'_QLH!.-?8&3MP[KZ*SI\ +M'>@$+&8)GR\JO"=['$\6DOGG`#X%1B0+K'ZAKKY0A^_788<.5^OP%L"!&>/] +MNP!'L]A>0NP%_`:,[P['AW7MG\'ZZ4Q/6/]-P.MAO$Z.7P$\"O(ECH<`YX&A +MBWP^HSIYOP"\%#;!IYS_8UW]91W^!/`38'_UJCYA'7\&^NWCV&88MT^TWQF` +M+VKL^UX=7@3XZ+)Q3)P5CVTHK:DJ)\YUU1O+2JN=&RLK-SOJG'6E9=4.)W$V +MMS:+Q+D#$N)T.L4VJ;W=Y2'.<LGC<;6*FZ165W7;]L86%ZMM:=N+M4ZG!RK$ +M?>TNXA4]V]OW09'8O-OE;&EK;()_M,%.E^AJW4,9&D72[/6Z1&EG<Q,6M+(F +MV]M:6AI%WDILW-;B\A)G1_O.Y4[@Q1ZX)&C1)+532;O;B;.V473S00%?@@<Z +M00XWC*^L:MU]?&;U=97+>+;"M:-1:DF:DZ.^G%<Z71Y/FX?L:&MWM1+G)A>, +M"!EK&G<VDQW;6]J\P-W:UNKB[#6;'VYLW=7,4/)H69?>G:P0)._>YMPN>9R[ +M&SO4NG:)UZEB)BA)M,<Q)NIW-[9`-[Q098%IP]*0'>#[^-S'Y3&8$`9KT@'# +M=S4UBHTPM&U>KQ,TY\&BUB;2TKP-U9_O;<M?QGP>'I7=/.WA:1]/C_(TP-,3 +M/'T4[-$,AW<)IN"4UF,*CJH.4W`&JS"%/;(<4W!X%9B"TUJ!*3C)K9C"05R+ +M*3B$)S`%V=68PH'],SC/)\%6>1]3V*L?8`IG]@5,X2R[B"DXE1"FX'`O8PK. +MZBJFX,"N80H.-8HI[.48IO<P!SL)'(L)4W">%DQADUHQA3/%CBGLQ6Q,X8"9 +MA2DXZ!Q,P9GE80IG\3Q,P=$LQ!3.EJ68PAE2B"DXY-!QV/1G"8F_BEXS_A)W +M1Y"SJAXC?"$.STO4@V!U>)1B]/)N+`P'*<;;A!O_A5^A&`\*-[JX\`L48]:- +M[C4<H!AO!FYT^>%NBK'*O0)Q.\7H_=QXE(:W4HRL[O6(:RG&FY2[%G$)Q=C4 +M_2CB0HI7(=Z*.(]B%.7&"87M%%<@;D=,*$;1[@[$5^\@KD;<3>=/,7;E[J/S +MI[@.<8#.GV+LVOT<G3_%3R!^@<Z?8AR*^Q2=/\5-B%^A\Z<8A^;NI_,'7*]\ +MW+`YA.I__-#9_:`KOWP5N/SM)KG#1$2[/&R2UQ`I&C$K8SYS?%0>CC&.XN&] +M?_"[HH\_]=;9)!GW4QE1C0PK:T?E7.--`DEM#-#&5V/QR2V`?86'ABO`*'P- +MIMZW#BR5;\:E*9'YRHBQS++$$)GCWT.*@L7F@].4L>*,KLSBATR=ORV1A^S% +MYJX_*".J^&3Y+\[5R5_U?RN_#.5+JGS[H:'E*+_,U#MVX`'Y#LHO5#Y=8O>5 +M6'VF0&1!T5O%&0?G@/S"KEG%[:8#D^4.*Y$^])58(AFE<M`._5XL"B:ZPK[D +MRY8MX_V=AP-&[K28;4]?,F`.6N<")K8>Q#Z'9?!"FK]G%MI/^$,H@3F=<\30 +M"P=\CAA6GJ"5FX`I!XIK0U(L'I??L,0=,;DS9C[X2U^-M;N8V'H_)+B:IX$7 +M]!=?WA<Z0!E-V)LXLS<HIG6O(-*4^*O($G*R2K78YI=77(G':T/KDLO-?GDU +ME._*K?5U6@9_E^9_%0?A-ZVI#9T$SN&*-;E$?L-*9]3[5:CB@U<'$L.!?'9; +M+Q.%4)FQ9)E5&IGJ!$^'5PA4+W0BBW?EQB5KRF#LFH9A"^/?50"<H>]`C7(. +M%-8;EXKYZ)0Q+D77_=NW4[M_+WR&)*;5W2442!D@>QWFQ)OP'U;2SOI3HDL< +MUG..*+XWR-'<+J/BB,:E*';$5O(T7<&&T/;;J)KHL*F(0"]*IQ6ZZUY;(,U4 +MQN(.*UW/`O%ZQ`(RH5@TK^M>2Z3K;)VEK^&HNA9"'9?JH\.OLUS8)(S4AK;< +M@NT,0W_#0D?_7U1IF7')$IH/;)'.N]E7C-K7=)0@Q4)XE8:!]0:EE3]!_F(I +M=G"1<I4U0=9QD_SH9CS>$'J#-:@$QJY?%`4C6="7JL7C(7S3\;LN/_Z4\ZVS +MRACL$\TF^4$N/<Q@&+5^^0,#BGP&1/[40"5:J&ZQW^,X4F&T5A[*VQ0Z>8ON +M`["JE90QX)?7H@G[7T4)#:%_!0FL&=M>M0VA[]W$)O9U<MQ\\)U(.JXC9E]D +MG?I=U^CH4O;PE-S$3CU*9ZS4Q+A06&*?C!Y#!L-V^^52NHD,V/4PFOR8Z`A5 +M``(MKBH,*C=B9]"Q?/I/RLB-43FX9'4<WFML3V=0LSB`K8:8.,6.K<]+T\-7 +MJ+WZCK?3754#\A4#M:I8Z.LWN0;@/'-$P\.$'C4&:3%6SJ&5IJ(QJ#;ZI%CO +MF*WW6?3B4I2.+XQ^*@#\@O0EY/]U-,%_@/%+.Y!W&,HC.X$OC?'-2.5;@WQW +M;@#?6N`SBG@<F$4S_#=)R[#-_70=M6.1,K`-_GH0F0P<"$Z"`.5JQ!C`\U1C +M)X<N;X5[B&8YNNXE["PHAH/<_SJ>3V?0`&*GR&??$:?30B<6FM5"R03FV#R^ +M4.G]:-"1+:!76A8O]/^8Q-"&9\$@N!TUA+YR`W>"I2'D@4Q1W-_[PFU:7AZE +M"YJUP]=["DIVS"=7=ZPF)6+:3^GA$O6_?`**55M*C/M<#FK?$NH!:;XG8V^= +M!?NC\S,ES^];.6Q^MIZ3^`8:A,-.:S;KX6RQ/8TOYG2FKHFFOS-Y^M-]QZF[ +MDT4<GZ$H&/ZM@%#5QUZ_O)L:;M78N.'6A7QC=)X/?Y[A[LGLQ]\YPE]EYU]# +M:&`LU8+O"35!J0^N,/@JK-KQ/FK'>NT_?QVU[V/:_^-UKOUKM-3/2G]W'<TO +MSR__(\-;^(@M:%/]J(?P)+J;-F!%;TQU/5)60^AA*.K?B"P7T?8;0BO':*WO +M'Y"M>S_Z2>7G\C`H\&NHP+2$`NWQ'R-+J`IZ#W\754DQ9?UF,FLF9[T"K)$N +M#=]+R&=*X;L?^;9H^+X[L;QCUX"O0,/W?>2S)!8^O1]_/XMD@@]A#?RHMI>O +MJI9([R8)&WL0WBM\]7`-PMNM4K;0)Q^@F:7L8J38?3+><\_1'_2*@M1<D\_L +MF[/914VRXZ5&G'%$"(9,MI^,^F6\Z\/EJ=AA]=KAU.GY(6H<;[GHPZ,&L:`K +M4XX*8G;X&;7,*):'#]-S#NPNS;]/4-;87A/"AUC]D5)A?A"RJW%$TI.,Q:"L +M.2+(%W('+YB//")$2E+X[CM2:M#`!:R9,=',"LWDC]8.?F1.'SWRB`&RZ:.1 +MJ<!E+%6F\.LA\944JEZ!GD4-..-Z\.=VGY0]]F94?!@FM&=9[WDQ3QD9C%KG +MV:P7^@R8-<];:^WN*Q/Z1EC&`)*SY2&C,B.2"6,%9#Y'?TSM1PU'=D'9C<'N +M282(JT`Y>^:"R&PF)]<:[#.H8@1HF"4/&4!,AD8&VGUD`<H-BG9H:NC#6GL9 +ML$T.:/@$>FK$DL^E@EG<%GI46^B;V!8,GV<+OY_);0&N5+#D4F9"?[6%D6+; +M:UFE_L-=8!5R=,Z>R?[#>30[>V^N?$?8FZ7AK8I880Z#'UE@]=.'2GOCHD&Q +M*:/J$K#S<DL#]N/(IH?M(3@G(3V81J\`Q9UV;R:HH.`<?6&-?#F`=TZ_]0'% +MXM\2[XT?G.&WOH<UX,W?C?:9*Y71AWJ#79?@R'9%Z29)\?U3<6KR44)51)43 +M8,J1!ZKQ=5A*WQ3^D-DI:N!'6!@Q!"J[U^2)M[K7I(O7=\T+&3ZA-P5V$&6C +M#\C[%(XB;!].P_O$6%$<[J3$[XC!D7;M*CU%'5$ENQ_N4W"=$KW4:8HM$1/T +MHY7-FPPFFM3UVWF;M:S-"GT;N/(8#QY76SZ=:%F;QQN"XXX1:38.<]\G>`9' +M0W__"3\Y(X^!SZRWR`.U,/BY>W)\5`L^*1H[@S_Y?_8R<I<#=R0SX*^)HLZ. +M4(YZR[G#V&8>]4,3G3&JTT]=@V/3J:^#>RLA[!U*K+2]9NX)=LY;C6>(.'T` +M;6'U,5R/:0-T,UB5L0&ZL^`^<3YA8MTX%J4^ZK,&BFNLWMERIYV(:6"TR@.: +M+1_9"?>BJ''O"E]G5'E_2<_KL4N@A@N_R28$Z1JGJHB-W:'!7&>DCRJ.6*4R +M4H7V-)'8`%5#6=Z-T;F.&`B>7#%@3[KGR)=-FCD_GZWJ*=&VTS)W?YX210$6 +MZ*QX?[:T-7EFO@Z3<@LV@>WPFU11V43,@,TBW/'59"M%U-AMQV[3N[*)[0,I +MI@R^>T>Y:NV&UXL^H52IL;(]\>OPN_0=(4E^<8==FN];P?J03_(^;#UXN$,7 +MY^B/Q^'GB6;HO-TLN(-T6&A#SU+H:E@X%EF->T;'EV/K783NH\-*>;W3Z"0> +MAM.6G6"1$K`_;/X,#O6A2`[(T,]%-Y,+5(0%2D&*,@7W^M64N]F2:?P,/*&> +M@<_].6=@\IK]S]04.YT#=IKFA!E1"Y6C3^Y-H_:IO',W^YL?J.J8%O#5Q^A1 +M:$X?4NICE57[KFC9'3'-/!IP[#7<+^WH/=^9BTXD7QD=C%KZA+Y'T&VDR8,& +M90IS%3GH)_JRN+=CMV&X0<%Q.P4FAPXB$`B$_O/W\?C9ZG)GC6/SYM)UCLT$ +M\G55-0Y,-]37.#95E6.V9N,&1UWIIL<P7U[W6"VM+]]875U:1[.EU=6DNG3# +M.E)."DAM:=UZ9_7&\M)J!RF0O)X"K[O1XRK@OTW7;MQ<]2CPL?3NO`6D(-&A +MA^`/UV0#C(0XZLL)_JI,^$_5Y";<IZ\`?0ST2Z#_`!H&&@`J)W=__MKKA3]! +M^L?`2?V.BY=^;:I^N\3G;;A\_@KH$M`MH`SP`%\`6@RT$N@AH+\#V@6T'^@( +MT/-`WP,:`'H;Z%=`EX!N`65D0'N@Q4`K,\A?_."[2+Z!?0/&;ZB9_-LIWKE/ +M\&_'L_CW\:C`OCL_:&#?E^U\SO@M%N<?Y-^LL_@WYLN36+YN$OL._!S_7F[1 +M#F!=>?G*O(7K-M0OREN6_T#^LOR__7]39M'84V%1?F&19NY_[64DW[MOM]BX +M#5+1PU*WFG,W>MTDOVE?*["P5/20?(^K)9]^H:*YG6TBR[2W0(9^<6-9^BTK +MGWZ[S/>TL0;L_W:QS>,%P!(J`&0W[F[>3O*W>:%H>]ONW:Y6*&YM$UU_P1ZX +MA]NY@=L\4I,P'E=AXO1%'E=AX'L!*<_(]H#`>>P\-L+(^7#O(#UH2#Y?U!B( +M=,Z'>P1I!<=6+@]U_Z"&[^@D1ELYMFGX*C1\N/>0@AQ;-'PU?`QFON>1S+JX +M#WPV:_A.6Q@%A&0^I$<U?!B;@]0^-57>4UIY.8PFZK>)\^&X![C/&2*I^FOA +M>=0UC>>YEY!50JH\CX:O'\ZJ_CG)9Y#*MT_#%P2^X.?P=6OX\.P;`;YOD%2] +M]/*Y&KD/P+BB;HV?4-?C&$^Q'+_[7P2^4X;4?H_K_`_R?3"!7K[!XXSPP?I@ +MWL1\69JQT'9@X"].P"?H8HS>GP_S,+'8HYD:NT_7R7MT,?,M>GD3/2=X:N1< +M44'%3,"L-!6S'NHFJ9AIYV@",\;+"<PL3(T/,G+-G$Y@EJG(4'$ZJ\]1,:L8 +M2&`6687VQC"+GNK/5W$F38,)S**:1A+81K1W`B/5W'B\AY&NROAC)%,3Z\CP +M-%U]M@Y/U^$927JW<UO3QOM,T]4OT,5+X3FEC8]9JXO'6J]KOY$DQ[<TZ.J? +M),GQ.[B/M?%&>W7\^!.+-O[F65V\UW,Z_F_I\#_K\!D=/DN2XYG^75?_GBX> +M[#>Z>GU\55R'IPK)\5P+=/%)]^GBAU;I<)F0'`^T05?_I`XWZ7";#N\1DN/C +M#NCJ^X3D^+%G=?%,W];%9_U0U_ZT;KRO"\GQ>N\(R?%,/]?%=UW4Q6N-Z>3_ +M44B.I[(:DN.YYAB2X_D6&9+;)^*;-"%%J:%.VLBII'"=1/05#X;B\3=J%(\N +M4D@3JY04-)04[,-#CEC(SP0Q32GQ5JE!3KKXK;M%8TT0!S9!@)8NK(G':_%8 +M*FV0T9^*JU)#O%@\VH2!7OH`I^1(+(P"4Z.;)@YXPS@GW>A3HK"2XLC&-9\: +1FS4>$T>#K_X7I2,=M(8L```` +` +end diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile new file mode 100644 index 000000000000..fddc4aad1d3b --- /dev/null +++ b/lib/libusb/Makefile @@ -0,0 +1,24 @@ +# $NetBSD: Makefile,v 1.5 1999/07/23 09:44:38 mrg Exp $ +# $FreeBSD$ + +MAINTAINER= n_hibma@FreeBSD.ORG + +LIB= usb +MAN3= usb.3 + +SHLIB_MAJOR= 0 +SHLIB_MINOR= 0 + +MLINKS= usb.3 libusb.3 usb.3 hid_get_report_desc.3 \ + usb.3 hid_dispose_report_desc.3 \ + usb.3 hid_start_parse.3 usb.3 hid_end_parse.3 \ + usb.3 hid_get_item.3 usb.3 hid_report_size.3 usb.3 hid_locate.3 \ + usb.3 hid_usage_page.3 usb.3 hid_usage_in_page.3 usb.3 hid_init.3 \ + usb.3 hid_get_data.3 usb.3 hid_set_data.3 + +SRCS= descr.c parse.c usage.c data.c + +INCS= libusb.h + +.include <bsd.lib.mk> + diff --git a/lib/libusb/data.c b/lib/libusb/data.c new file mode 100644 index 000000000000..26b33b39b9cc --- /dev/null +++ b/lib/libusb/data.c @@ -0,0 +1,99 @@ +/* $NetBSD: data.c,v 1.8 2000/04/02 11:10:53 augustss Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <assert.h> +#include <stdlib.h> +#include "libusb.h" + +int +hid_get_data(const void *p, const hid_item_t *h) +{ + const unsigned char *buf; + unsigned int hpos; + unsigned int hsize; + int data; + int i, end, offs; + + _DIAGASSERT(p != NULL); + _DIAGASSERT(h != NULL); + + buf = p; + hpos = h->pos; /* bit position of data */ + hsize = h->report_size; /* bit length of data */ + + if (hsize == 0) + return (0); + offs = hpos / 8; + end = (hpos + hsize) / 8 - offs; + data = 0; + for (i = 0; i <= end; i++) + data |= buf[offs + i] << (i*8); + data >>= hpos % 8; + data &= (1 << hsize) - 1; + if (h->logical_minimum < 0) { + /* Need to sign extend */ + hsize = sizeof data * 8 - hsize; + data = (data << hsize) >> hsize; + } + return (data); +} + +void +hid_set_data(void *p, const hid_item_t *h, int data) +{ + unsigned char *buf; + unsigned int hpos; + unsigned int hsize; + int i, end, offs, mask; + + _DIAGASSERT(p != NULL); + _DIAGASSERT(h != NULL); + + buf = p; + hpos = h->pos; /* bit position of data */ + hsize = h->report_size; /* bit length of data */ + + if (hsize != 32) { + mask = (1 << hsize) - 1; + data &= mask; + } else + mask = ~0; + + data <<= (hpos % 8); + mask <<= (hpos % 8); + mask = ~mask; + + offs = hpos / 8; + end = (hpos + hsize) / 8 - offs; + + for (i = 0; i <= end; i++) + buf[offs + i] = (buf[offs + i] & (mask >> (i*8))) | + ((data >> (i*8)) & 0xff); +} diff --git a/lib/libusb/descr.c b/lib/libusb/descr.c new file mode 100644 index 000000000000..17b607e60c16 --- /dev/null +++ b/lib/libusb/descr.c @@ -0,0 +1,75 @@ +/* $NetBSD: descr.c,v 1.7 1999/10/13 17:48:04 drochner Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#include <sys/types.h> + +#include <assert.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/ioctl.h> + +#include <dev/usb/usb.h> + +#include "libusb.h" +#include "usbvar.h" + +report_desc_t +hid_get_report_desc(fd) + int fd; +{ + struct usb_ctl_report_desc rep; + report_desc_t r; + + _DIAGASSERT(fd != -1); + + rep.size = 0; + if (ioctl(fd, USB_GET_REPORT_DESC, &rep) < 0) + return (0); + r = malloc(sizeof *r + rep.size); + if (r == 0) { + errno = ENOMEM; + return (0); + } + r->size = rep.size; + memcpy(r->data, rep.data, (unsigned int)rep.size); + return (r); +} + +void +hid_dispose_report_desc(r) + report_desc_t r; +{ + + free(r); +} diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h new file mode 100644 index 000000000000..65b996fc7fde --- /dev/null +++ b/lib/libusb/libusb.h @@ -0,0 +1,96 @@ +/* $NetBSD: usb.h,v 1.7 2000/04/02 11:10:53 augustss Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +typedef struct report_desc *report_desc_t; + +typedef struct hid_data *hid_data_t; + +typedef enum hid_kind { + hid_input, hid_output, hid_feature, hid_collection, hid_endcollection +}hid_kind_t; + +typedef struct hid_item { + /* Global */ + int _usage_page; + int logical_minimum; + int logical_maximum; + int physical_minimum; + int physical_maximum; + int unit_exponent; + int unit; + int report_size; + int report_ID; +#define NO_REPORT_ID 0 + int report_count; + /* Local */ + unsigned int usage; + int usage_minimum; + int usage_maximum; + int designator_index; + int designator_minimum; + int designator_maximum; + int string_index; + int string_minimum; + int string_maximum; + int set_delimiter; + /* Misc */ + int collection; + int collevel; + enum hid_kind kind; + unsigned int flags; + /* Absolute data position (bits) */ + unsigned int pos; + /* */ + struct hid_item *next; +} hid_item_t; + +#define HID_PAGE(u) ((u) >> 16) +#define HID_USAGE(u) ((u) & 0xffff) + +/* Obtaining a report descriptor, descr.c: */ +report_desc_t hid_get_report_desc __P((int file)); +void hid_dispose_report_desc __P((report_desc_t)); + +/* Parsing of a HID report descriptor, parse.c: */ +hid_data_t hid_start_parse __P((report_desc_t d, int kindset)); +void hid_end_parse __P((hid_data_t s)); +int hid_get_item __P((hid_data_t s, hid_item_t *h)); +int hid_report_size __P((report_desc_t d, enum hid_kind k, int *idp)); +int hid_locate __P((report_desc_t d, unsigned int usage, enum hid_kind k, hid_item_t *h)); + +/* Conversion to/from usage names, usage.c: */ +const char *hid_usage_page __P((int i)); +const char *hid_usage_in_page __P((unsigned int u)); +void hid_init __P((const char *file)); + +/* Extracting/insertion of data, data.c: */ +int hid_get_data __P((const void *p, const hid_item_t *h)); +void hid_set_data __P((void *p, const hid_item_t *h, int data)); diff --git a/lib/libusb/parse.c b/lib/libusb/parse.c new file mode 100644 index 000000000000..79af687d7434 --- /dev/null +++ b/lib/libusb/parse.c @@ -0,0 +1,405 @@ +/* $NetBSD: parse.c,v 1.9 2000/03/17 18:09:17 augustss Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <sys/time.h> + +#include <dev/usb/usb.h> +#include <dev/usb/usbhid.h> + +#include "libusb.h" +#include "usbvar.h" + +#define MAXUSAGE 100 +struct hid_data { + u_char *start; + u_char *end; + u_char *p; + hid_item_t cur; + unsigned int usages[MAXUSAGE]; + int nusage; + int minset; + int multi; + int multimax; + int kindset; +}; + +static int min(int x, int y) { return x < y ? x : y; } + +static void +hid_clear_local(hid_item_t *c) +{ + + _DIAGASSERT(c != NULL); + + c->usage = 0; + c->usage_minimum = 0; + c->usage_maximum = 0; + c->designator_index = 0; + c->designator_minimum = 0; + c->designator_maximum = 0; + c->string_index = 0; + c->string_minimum = 0; + c->string_maximum = 0; + c->set_delimiter = 0; +} + +hid_data_t +hid_start_parse(report_desc_t d, int kindset) +{ + struct hid_data *s; + + _DIAGASSERT(d != NULL); + + s = malloc(sizeof *s); + memset(s, 0, sizeof *s); + s->start = s->p = d->data; + s->end = d->data + d->size; + s->kindset = kindset; + return (s); +} + +void +hid_end_parse(hid_data_t s) +{ + + _DIAGASSERT(s != NULL); + + while (s->cur.next) { + hid_item_t *hi = s->cur.next->next; + free(s->cur.next); + s->cur.next = hi; + } + free(s); +} + +int +hid_get_item(hid_data_t s, hid_item_t *h) +{ + hid_item_t *c; + unsigned int bTag = 0, bType = 0, bSize, oldpos; + unsigned char *data; + int dval; + unsigned char *p; + hid_item_t *hi; + int i; + + _DIAGASSERT(s != NULL); + _DIAGASSERT(h != NULL); + + c = &s->cur; + + top: + if (s->multimax) { + if (s->multi < s->multimax) { + c->usage = s->usages[min(s->multi, s->nusage-1)]; + s->multi++; + *h = *c; + c->pos += c->report_size; + h->next = 0; + return (1); + } else { + c->report_count = s->multimax; + s->multimax = 0; + s->nusage = 0; + hid_clear_local(c); + } + } + for (;;) { + p = s->p; + if (p >= s->end) + return (0); + + bSize = *p++; + if (bSize == 0xfe) { + /* long item */ + bSize = *p++; + bSize |= *p++ << 8; + bTag = *p++; + data = p; + p += bSize; + } else { + /* short item */ + bTag = bSize >> 4; + bType = (bSize >> 2) & 3; + bSize &= 3; + if (bSize == 3) bSize = 4; + data = p; + p += bSize; + } + s->p = p; + /* + * The spec is unclear if the data is signed or unsigned. + */ + switch(bSize) { + case 0: + dval = 0; + break; + case 1: + dval = (int8_t)*data++; + break; + case 2: + dval = *data++; + dval |= *data++ << 8; + dval = (int16_t)dval; + break; + case 4: + dval = *data++; + dval |= *data++ << 8; + dval |= *data++ << 16; + dval |= *data++ << 24; + break; + default: + return (-1); + } + + switch (bType) { + case 0: /* Main */ + switch (bTag) { + case 8: /* Input */ + if (!(s->kindset & (1 << hid_input))) + continue; + c->kind = hid_input; + c->flags = dval; + ret: + if (c->flags & HIO_VARIABLE) { + s->multimax = c->report_count; + s->multi = 0; + c->report_count = 1; + if (s->minset) { + for (i = c->usage_minimum; + i <= c->usage_maximum; + i++) { + s->usages[s->nusage] = i; + if (s->nusage < MAXUSAGE-1) + s->nusage++; + } + s->minset = 0; + } + goto top; + } else { + if (s->minset) + c->usage = c->usage_minimum; + *h = *c; + h->next = 0; + c->pos += c->report_size * c->report_count; + hid_clear_local(c); + s->minset = 0; + return (1); + } + case 9: /* Output */ + if (!(s->kindset & (1 << hid_output))) + continue; + c->kind = hid_output; + c->flags = dval; + goto ret; + case 10: /* Collection */ + c->kind = hid_collection; + c->collection = dval; + c->collevel++; + *h = *c; + hid_clear_local(c); + c->report_ID = NO_REPORT_ID; + s->nusage = 0; + return (1); + case 11: /* Feature */ + if (!(s->kindset & (1 << hid_feature))) + continue; + c->kind = hid_feature; + c->flags = dval; + goto ret; + case 12: /* End collection */ + c->kind = hid_endcollection; + c->collevel--; + *h = *c; + /*hid_clear_local(c);*/ + s->nusage = 0; + return (1); + default: + return (-2); + } + + case 1: /* Global */ + switch (bTag) { + case 0: + c->_usage_page = dval << 16; + break; + case 1: + c->logical_minimum = dval; + break; + case 2: + c->logical_maximum = dval; + break; + case 3: + c->physical_maximum = dval; + break; + case 4: + c->physical_maximum = dval; + break; + case 5: + c->unit_exponent = dval; + break; + case 6: + c->unit = dval; + break; + case 7: + c->report_size = dval; + break; + case 8: + c->report_ID = dval; + break; + case 9: + c->report_count = dval; + break; + case 10: /* Push */ + hi = malloc(sizeof *hi); + *hi = s->cur; + c->next = hi; + break; + case 11: /* Pop */ + hi = c->next; + oldpos = c->pos; + s->cur = *hi; + c->pos = oldpos; + free(hi); + break; + default: + return (-3); + } + break; + case 2: /* Local */ + switch (bTag) { + case 0: + if (bSize == 1) + dval = c->_usage_page | (dval&0xff); + else if (bSize == 2) + dval = c->_usage_page | (dval&0xffff); + c->usage = dval; + if (s->nusage < MAXUSAGE) + s->usages[s->nusage++] = dval; + /* else XXX */ + break; + case 1: + s->minset = 1; + if (bSize == 1) + dval = c->_usage_page | (dval&0xff); + else if (bSize == 2) + dval = c->_usage_page | (dval&0xffff); + c->usage_minimum = dval; + break; + case 2: + if (bSize == 1) + dval = c->_usage_page | (dval&0xff); + else if (bSize == 2) + dval = c->_usage_page | (dval&0xffff); + c->usage_maximum = dval; + break; + case 3: + c->designator_index = dval; + break; + case 4: + c->designator_minimum = dval; + break; + case 5: + c->designator_maximum = dval; + break; + case 7: + c->string_index = dval; + break; + case 8: + c->string_minimum = dval; + break; + case 9: + c->string_maximum = dval; + break; + case 10: + c->set_delimiter = dval; + break; + default: + return (-4); + } + break; + default: + return (-5); + } + } +} + +int +hid_report_size(report_desc_t r, enum hid_kind k, int *idp) +{ + struct hid_data *d; + hid_item_t h; + int size, id; + + _DIAGASSERT(r != NULL); + /* idp may be NULL */ + + id = 0; + if (idp) + *idp = 0; + memset(&h, 0, sizeof h); + for (d = hid_start_parse(r, 1<<k); hid_get_item(d, &h); ) { + if (h.report_ID != NO_REPORT_ID) { + if (idp) + *idp = h.report_ID; + id = 8; + } + } + hid_end_parse(d); + size = h.pos + id; + return ((size + 7) / 8); +} + +int +hid_locate(desc, u, k, h) + report_desc_t desc; + unsigned int u; + enum hid_kind k; + hid_item_t *h; +{ + hid_data_t d; + + _DIAGASSERT(desc != NULL); + _DIAGASSERT(h != NULL); + + for (d = hid_start_parse(desc, 1<<k); hid_get_item(d, h); ) { + if (h->kind == k && !(h->flags & HIO_CONST) && h->usage == u) { + hid_end_parse(d); + return (1); + } + } + hid_end_parse(d); + h->report_size = 0; + return (0); +} diff --git a/lib/libusb/usage.c b/lib/libusb/usage.c new file mode 100644 index 000000000000..afb990a93ccd --- /dev/null +++ b/lib/libusb/usage.c @@ -0,0 +1,197 @@ +/* $NetBSD: usage.c,v 1.5 2000/04/02 11:10:53 augustss Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +#include <ctype.h> +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "libusb.h" + +#define _PATH_HIDTABLE "/usr/share/misc/usb_hid_usages" + +struct usage_in_page { + const char *name; + int usage; +}; + +static struct usage_page { + const char *name; + int usage; + struct usage_in_page *page_contents; + int pagesize, pagesizemax; +} *pages; +static int npages, npagesmax; + +#ifdef DEBUG +void +dump_hid_table(void) +{ + int i, j; + + for (i = 0; i < npages; i++) { + printf("%d\t%s\n", pages[i].usage, pages[i].name); + for (j = 0; j < pages[i].pagesize; j++) { + printf("\t%d\t%s\n", pages[i].page_contents[j].usage, + pages[i].page_contents[j].name); + } + } +} +#endif + +void +hid_init(const char *hidname) +{ + FILE *f; + char line[100], name[100], *p, *n; + int no; + int lineno; + struct usage_page *curpage = 0; + + if (hidname == 0) + hidname = _PATH_HIDTABLE; + + f = fopen(hidname, "r"); + if (f == NULL) + err(1, "%s", hidname); + for (lineno = 1; ; lineno++) { + if (fgets(line, sizeof line, f) == NULL) + break; + if (line[0] == '#') + continue; + for (p = line; *p && isspace(*p); p++) + ; + if (!*p) + continue; + if (sscanf(line, " * %[^\n]", name) == 1) + no = -1; + else if (sscanf(line, " 0x%x %[^\n]", &no, name) != 2 && + sscanf(line, " %d %[^\n]", &no, name) != 2) + errx(1, "file %s, line %d, syntax error\n", + hidname, lineno); + for (p = name; *p; p++) + if (isspace(*p) || *p == '.') + *p = '_'; + n = strdup(name); + if (!n) + err(1, "strdup"); + if (isspace(line[0])) { + if (!curpage) + errx(1, "file %s, line %d, syntax error\n", + hidname, lineno); + if (curpage->pagesize >= curpage->pagesizemax) { + curpage->pagesizemax += 10; + curpage->page_contents = + realloc(curpage->page_contents, + curpage->pagesizemax * + sizeof (struct usage_in_page)); + if (!curpage->page_contents) + err(1, "realloc"); + } + curpage->page_contents[curpage->pagesize].name = n; + curpage->page_contents[curpage->pagesize].usage = no; + curpage->pagesize++; + } else { + if (npages >= npagesmax) { + if (pages == 0) { + npagesmax = 5; + pages = malloc(npagesmax * + sizeof (struct usage_page)); + } else { + npagesmax += 5; + pages = realloc(pages, + npagesmax * + sizeof (struct usage_page)); + } + if (!pages) + err(1, "alloc"); + } + curpage = &pages[npages++]; + curpage->name = n; + curpage->usage = no; + curpage->pagesize = 0; + curpage->pagesizemax = 10; + curpage->page_contents = + malloc(curpage->pagesizemax * + sizeof (struct usage_in_page)); + if (!curpage->page_contents) + err(1, "malloc"); + } + } + fclose(f); +#ifdef DEBUG + dump_hid_table(); +#endif +} + +const char * +hid_usage_page(int i) +{ + static char b[10]; + int k; + + if (!pages) + errx(1, "no hid table\n"); + + for (k = 0; k < npages; k++) + if (pages[k].usage == i) + return pages[k].name; + sprintf(b, "0x%02x", i); + return b; +} + +const char * +hid_usage_in_page(unsigned int u) +{ + int page = HID_PAGE(u); + int i = HID_USAGE(u); + static char b[100]; + int j, k, us; + + for (k = 0; k < npages; k++) + if (pages[k].usage == page) + break; + if (k >= npages) + goto bad; + for (j = 0; j < pages[k].pagesize; j++) { + us = pages[k].page_contents[j].usage; + if (us == -1) { + sprintf(b, pages[k].page_contents[j].name, i); + return b; + } + if (us == i) + return pages[k].page_contents[j].name; + } + bad: + sprintf(b, "0x%02x", i); + return b; +} diff --git a/lib/libusb/usb.3 b/lib/libusb/usb.3 new file mode 100644 index 000000000000..a8a87534914b --- /dev/null +++ b/lib/libusb/usb.3 @@ -0,0 +1,190 @@ +.\" $NetBSD: usb.3,v 1.10 2000/02/22 12:39:22 augustss Exp $ +.\" $FreeBSD$ +.\" +.\" Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd May 11, 1999 +.Dt USB 3 +.Os +.Sh NAME +.Nm usb , +.Nm hid_get_report_desc , +.Nm hid_dispose_report_desc , +.Nm hid_start_parse , +.Nm hid_end_parse , +.Nm hid_get_item , +.Nm hid_report_size , +.Nm hid_locate , +.Nm hid_usage_page , +.Nm hid_usage_in_page , +.Nm hid_init , +.Nm hid_get_data , +.Nm hid_set_data +.Nd USB HID access routines +.Sh LIBRARY +.Lb libusb +.Sh SYNOPSIS +.Fd #include <libusb.h> +.Ft report_desc_t +.Fn hid_get_report_desc "int file" +.Ft void +.Fn hid_dispose_report_desc "report_desc_t d" +.Ft hid_data_t +.Fn hid_start_parse "report_desc_t d" "int kindset" +.Ft void +.Fn hid_end_parse "hid_data_t s" +.Ft int +.Fn hid_get_item "hid_data_t s" "hid_item_t *h" +.Ft int +.Fn hid_report_size "report_desc_t d" "hid_kind_t k" "int *idp" +.Ft int +.Fn hid_locate "report_desc_t d" "u_int usage" "hid_kind_t k" "hid_item_t *h" +.Ft char * +.Fn hid_usage_page "int i" +.Ft char * +.Fn hid_usage_in_page "u_int u" +.Ft void +.Fn hid_init "char *file" +.Ft int +.Fn hid_get_data "void *data" "hid_item_t *h" +.Ft void +.Fn hid_set_data "void *data" "hid_item_t *h" "u_int data" +.Sh DESCRIPTION +The +.Nm +library provides routines to extract data from USB Human Interface Devices. +.Ss INTRODUCTION +USB HID devices send and receive data layed out in a device dependent +way. The +.Nm +library contains routines to extract the +.Em report descriptor +which contains the data layout information and then use this information. +.Pp +The routines can be divided into four parts: extraction of the descriptor, +parsing of the descriptor, translating to/from symbolic names, and +data manipulation. +.Ss DESCRIPTOR FUNCTIONS +A report descriptor can be obtained by calling +.Fn hid_get_report_desc +with a file descriptor obtained by opening a +.Xr uhid 4 +device. +When the report descriptor is no longer needed it should be freed +by calling +.Fn hid_dispose_report_desc . +The type +.Fa report_desc_t +is opaque and should be used when calling the parsing functions. +.Ss DESCRIPTOR PARSING FUNCTIONS +To parse the report descriptor the +.Fn hid_start_parse +function should be called with a report descriptor and a set that +describes which items that are interesting. The set is obtained +by or-ing together values +.Fa "(1 << k)" +where +.Fa k +is an item of type +.Fa hid_kind_t . +The function returns +.Fa NULL +if the initialization fails, otherwise an opaque value to be used +in subsequent calls. +After parsing the +.Fn hid_end_parse +function should be called to free internal data structures. +.Pp +To iterate through all the items in the report descriptor +.Fn hid_get_item +should be called while it returns a value greater than 0. +When the report descriptor ends it will returns 0; a syntax +error within the report descriptor will cause a return value less +than 0. +The struct pointed to by +.Fa h +will be filled with the relevant data for the item. +The definition of +.Fa hid_item_t +can be found in +.Pa <libusb.h> +and the meaning of the components in the USB HID documentation. +.Pp +Data should be read/written to the device in the size of +the report. The size of a report (of a certain kind) can be +computed by the +.Fn hid_report_size +function. If the report is prefixed by an ID byte it is +stored at +.Fa idp , +otherwise it will contain 0. +.Pp +To locate a single item the +.Fn hid_locate +function can be used. It should be given the usage code of +the item and its kind and it will fill the item and return +non-zero if the item was found. +.Pp +.Ss NAME TRANSLATION FUNCTIONS +The function +.Fn hid_usage_page +will return the symbolic name of a usage page, and the function +.Fn hid_usage_in_page +will return the symbolic name of the usage within the page. +Both these functions may return a pointer to static data. +Before either of these functions can be called the usage table +must be parsed, this is done by calling +.Fn hid_init +with the name of the table. Passing +.Fa NULL +to this function will cause it to use the default table. +.Ss DATA EXTRACTION FUNCTIONS +Given the data obtained from a HID device and an item in the +report descriptor the +.Fn hid_get_data +function extracts the value of the item. +Conversely +.Fn hid_set_data +can be used to put data into a report (which must be zeroed first). +.Sh EXAMPLE +Not yet. +.Sh FILES +.Pa /usr/share/misc/usb_hid_usages +The default HID usage table. +.Sh BUGS +This man page is woefully incomplete. +.Sh SEE ALSO +The +.Tn USB +specifications can be found at +.Dv http://www.usb.org/developers/docs.htm . +.Pp +.Xr hid 4 , +.Xr usb 4 . +.Sh HISTORY +The +.Nm +library first appeared in +.Nx 1.5 . diff --git a/lib/libusb/usbvar.h b/lib/libusb/usbvar.h new file mode 100644 index 000000000000..7ed04e5edea1 --- /dev/null +++ b/lib/libusb/usbvar.h @@ -0,0 +1,36 @@ +/* $NetBSD: usbvar.h,v 1.2 1999/05/11 21:15:46 augustss Exp $ */ + +/* + * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + */ + +struct report_desc { + unsigned int size; + unsigned char data[1]; +}; + |
