From 65fd83e6d502ca44bf2f5b0f33b6b824f4f1168f Mon Sep 17 00:00:00 2001 From: Vincent-FK Date: Thu, 22 Aug 2019 01:18:00 +0800 Subject: [PATCH] added i2c and uinput linux headers for compilation --- Makefile | 40 ++++--- driver_pcal6416a.c | 2 + driver_pcal6416a.o | Bin 0 -> 2052 bytes funkey_gpio_management | Bin 0 -> 30344 bytes funkey_gpio_management.o | Bin 0 -> 1636 bytes gpio-utils.o | Bin 0 -> 3632 bytes gpio_mapping.o | Bin 0 -> 5408 bytes keydefs.o | Bin 0 -> 11532 bytes read_conf_file.o | Bin 0 -> 5008 bytes smbus.c | 224 +++++++++++++++++++++++++++++++++++++ smbus.h | 61 ++++++++++ smbus.o | Bin 0 -> 2636 bytes uinput.c | 3 +- uinput.o | Bin 0 -> 3660 bytes uinput_linux.h | 232 +++++++++++++++++++++++++++++++++++++++ 15 files changed, 540 insertions(+), 22 deletions(-) create mode 100644 driver_pcal6416a.o create mode 100755 funkey_gpio_management create mode 100644 funkey_gpio_management.o create mode 100644 gpio-utils.o create mode 100644 gpio_mapping.o create mode 100644 keydefs.o create mode 100644 read_conf_file.o create mode 100755 smbus.c create mode 100755 smbus.h create mode 100644 smbus.o create mode 100644 uinput.o create mode 100755 uinput_linux.h diff --git a/Makefile b/Makefile index 9c14bee..4cdcb4e 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,19 @@ -TOOLS_CFLAGS := -Wstrict-prototypes -Wshadow -Wpointer-arith -Wcast-qual \ - -Wcast-align -Wwrite-strings -Wnested-externs -Winline \ - -W -Wundef -Wmissing-prototypes -# -# Programs -# -all: funkey_gpio_management - -funkey_gpio_management: funkey_gpio_management.o gpio-utils.o uinput.o gpio_mapping.o read_conf_file.o keydefs.o driver_pcal6416a.o - $(CC) $(LDFLAGS) -o $@ $^ - - -# -# Objects -# - -%.o: %.c - $(CC) $(CFLAGS) $(TOOLS_CFLAGS) -c $< -o $@ - -clean: - rm *.o funkey_gpio_management +TOOLS_CFLAGS := -Wall -std=c99 -D _DEFAULT_SOURCE +# +# Programs +# +all: funkey_gpio_management + +funkey_gpio_management: funkey_gpio_management.o gpio-utils.o uinput.o gpio_mapping.o read_conf_file.o keydefs.o driver_pcal6416a.o smbus.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ + + +# +# Objects +# + +%.o: %.c + $(CC) $(CFLAGS) $(TOOLS_CFLAGS) -c $< -o $@ + +clean: + rm *.o funkey_gpio_management diff --git a/driver_pcal6416a.c b/driver_pcal6416a.c index 76dea8f..83a5836 100644 --- a/driver_pcal6416a.c +++ b/driver_pcal6416a.c @@ -10,7 +10,9 @@ #include #include "read_conf_file.h" #include +#include #include +#include "smbus.h" #include "driver_pcal6416a.h" /**************************************************************** diff --git a/driver_pcal6416a.o b/driver_pcal6416a.o new file mode 100644 index 0000000000000000000000000000000000000000..3be6a6b5e3d4b77831bd34b776e8b5898492fec3 GIT binary patch literal 2052 zcma)6&u<$=6n^Wq^Q#dwp{1!E!KQUlAY@}lAuThQsBTpzy+itq#pVYvqX3;zyBBJ6*qU2T*H&2r^PQATPZ_ziG9ufVBk(oRA^YKBZ25bY{`43H0 z*rbJH_kfZ-cniA4*>tvi|1fI?bM5QS8CL8XEsPH4^m7aMul{im@Au4%{O11d@mg&z zU+e34Qpz1DSF~cCovDqTzgz3wr5}2G$%>N|7B**+nXLCUy`O=)p6to4?f3R~(=~?k zD3$kHHJ!Z_$nB+Y*iCTp@0VZRujtTD5x7nSWK*L(y_p+?UAqQ2iW zQ6w9#k~@mrKqx_OJ&wtZ+I`@+n@!n*)@m#1uD$u*VyuL}MQ-JtH(a4q6xO>+@`i^j z-EUcXc#xLuBi%@3BAiX+%|L76brv3#n zq)lT~1jyMp3tOq+TNbSGmJ^!dKX;xAxZMt8wyW zm!2e=z&VuQ`CCj(5j_pR^hE!BOYn}y{M{M5jK_$U8N;tK#{7$n;a`EDn8v+l9{E?8 zhrh=BQ$%&<$B8zWhyRFqH2Dtm$orUi_|KR>N%XnqztH^Gn!m02?==4t^JxBGG=ER? z512nq^jPy5G$+@eglGQ$+OtUHzBV_4`@YD8wygFAcx;O}skZ=v^G#lmdMD=^h`-__&M*n%ym$Ly@-+1>0P!5oXS)r+Yca+ekBat& z|DDN{8Td9htgT}t&U?uKc$0_L8tj4PX)IK5pv~m5H+x`70o($~|1bD#$@y`w@)?^m PK}bbx@GlOunR@>Ku!d6c literal 0 HcmV?d00001 diff --git a/funkey_gpio_management b/funkey_gpio_management new file mode 100755 index 0000000000000000000000000000000000000000..1c7da8ba38fadfa5b32359fc654259207ada615a GIT binary patch literal 30344 zcmd6Q4SZD9nfIBQKmvjU6E!5L13^V2NiflZ(VCfLh6IvK%m<*dI~g()W@M6#nF$7h zHdboM)ZtOyfe1;S=Q&Kbgf6m9u&E#J8 z-FNr>{oVs7=RD{9&vU+>^PG=+=H9P3YMdsMi78`d^BGb1PBF1kxQ8BO%$&w1l`<>K zK-{$~kK#k`G%@y0lZo35;K-&)I~gveEd`P+X9#DKjJHr6=u+fMb{1%|lpev{!jV1` z8$e!UDLus!MueH+n%NEnoG>#+`BFT*>?rU@5l8j}XtETq%2vzADx$(@*8LusMEPHNw`ZrGh=GocdJGX2ss=I6C zd!rpQ8lIUy$CUra7Z=a@?TqL8pPfDDS5v;Yc4SrN3(vniNIg`S^6?@Xc3r_fKP z&@ZRZf0ja1A1lNC7_Y4~LT_i`NLOoUJqw4r0v(Yy*47#Fbx>eOYkP==d|h3gT`U|} z)8PrSPJjzOIP7%@YVxsz~Qr*5>O3pEW)LN4kPw*Y0Z% z`v?to9i8rAXR9X?=dXQWw$l2tkLl2URa?T?cN_sxI`HbB{E|h06xlqidAHRI?>w_6XKRa%%L&5&(>%YzZ#WTOPj_p0J{5cwbrpBM4@iUD- z_C+%7kj8&P;~&)c4{7`Z8vnZ*|9*{skH)`K<9|uxe?jBls_}2u_%~_%eHwp{#vju7 z{ThFZ#=lbIuh;miH2!jpf04#ttnts+_^ld$j>ey<@n^vA8e*5hUT)s|fHQ5EY1hBS zGWXZU(mt?Mr7ep`A3qn59zFN#8%@kJ)x`c9Zg%nW$Fr@^AGZ{Leb8)u_V zBGcY@{Nyb)CiWaeJbjsCcw@`{VKd9iom?>Klk#C^*$-=ZEoVt+3ETG-$Py5(5`{Q3 zo0a=irs>qd2dgtD4W!~TcLV7KDlNY!?~Qo$S8-E*ekk)T$MB)@jNO#l;?H{HtrHpL zAO2pYWd$PxTbEq;ec$fKcCuG{TI|E8L;HtKEFQi5oMSlHic}UhH@79@OK&;*-eUXu zc5ebM*78Qnh8C7T>S6i)u)Q9$wR~jp9HcbGqpzQ3L+KaO&(AicpU*L;pU<{rIA=O@ zou;AT*!sYmfzg1V+0bvkFb%Sy+s0H*d481VARC%H#)cM+viuyUHIeTYQNEEJM&&cj zL5rV_c}Ih+ApNj?q?m`sqnpo;2Cp7WKc8XAahA`qkKAbn+T80W^d4`25HaRhkV+Ge z4xWt#mSkC1CCd5)aunfIPe11< z>e(mjIs0sXFk^5}aIt^V+<0`u**&Pq_cb~6?H28&<-a+>fB886i!}UqO8%$M^rIci z&>tBCdxG|n{U+*LGxDlDn~r?#Bkv?a?&P_z*5pod@@?KjP@26SO&`cCdi|i$_95)dpvpr&v_;9 zLA`n(O4R%C8Ew1nJwp;9^1UGQ4WZuC2NywJ_MEXeO(oRABrCr-LoGaX=0EGhWF22b zUSKQDf)6I_&g@_oCKLo%OpvTM{h@-N&?k5>_G|MLAD(6}yC##%c=i<}<9SH&z?lQFrZmJ=@#xrT z3MoeGPP4$5Hp}U{(6>4sefRW%SPjrMr9U|zzx%2IiqAory(mYnv&@<2&qZ%eGZP}K z60IMi)NBqz@4S85bzwsYql|c`#iOgv5Gu!+{`uF|kmlID`<3BfEqm2IvWVBZe1tT` zMda9m99ww#R9rl|v|C!%aAthnBX=@w@JFo;fi**pjN9)B>SgNrMCOgQ>Oep zSxVDA@#x_Ri1&e*I_MbQ%x4gAoR`~TvO=a$(FjT(4la4ixtY%=k3&zG^2=Jv{FZ|J zL#FRH#PWyOzE3hu?Dw$eVZVUw9GYSoZE+37OZrRa;4RyyVMz*31PoL`bn@W0Hdi_}i=YKsFAswgo z{ho9dd({lee@c}*&!6LT44YBI2PV|;KGZNHQA0vvM&Y#+^W+m!|DkS=_4>E}xc9L# ze=p6KG;g-39CH1n8#0};yr#E z>;DudL~@=Mn8nDcuZ8A*HivR(LEZXzpP1+7KC1j|?tKaW2LIti=|uheJVdqN&RKpxZvlXx2_eMoY{^2;7Y55tb4Rm)&|6J^i! zmpN6to;;}}I3nA1BX}~5w;X4tY*XSV)-}DD^)5eXA9;pj?ISPEq`B{|x%QFy`81N^ z(czP$e#`mm%&cJ7zAR^+^ZuE$oc;dB*c^7z|KZg~F3+tr4_#;eFc)i{{AbI{Pg>0V z{)*TfYp*}oKkDCRHy`fxUxYUOujF5a{7Ys2KmIS}f24vdS%GN)qbt%Iz}WVT26ET-2DaJ%?da%6R&duqKmOh^@SWKFVped|!002a;Ie_y zz_YO$(31yZ0XDR1EEb4IpO0TZIQod0EC0v}yB8rU8jMTuC!Hx4G(vm|f%&<2j-7x{SXML&$Tq@!&wVmw#G=4OsU zOO3XS`mZav@JT<{FB>nCYahv!EA36AL{qE2F=~dUdVzDw1yA7<b;Y2}W+dTI2Ju{uw3i${ON*X2naC&r9pcni<_O~{jDcq{jlggb_JhG`G6f%^r9 zN)?YDJ3*@o$M8HJPe|$WD_(j2Ow^5LptR2vpFHT$-hh-Xv@53yK0k=LH_nFs{tK#^ z(2_!*$D@CR@E8xLGB5aS$n}$*=2ttMk08e_Z7AF1+x?Tz$G?0awsY`x=dhFS^iIAv zrTXN3>s=>*k@327h{C40PX6;G$H|r5u9NSkl{(W)k7XQVubfJoZr;I455#tqgB#y_ z-QbU0dm#2wc`2ou^cl0AY09X z|H)W?v62Vuo6NJEefgPuuQK_>$FUumdTk{3Qe)8z*smG4pcm<1v`%cy?_y8!8oL{PQx02=nSl8bF9#fY%KcA zb2KOCd`fGXUB%Tv>?$6wE4Q=s^ZU(Nm5s3-vk`06YE0Wj%O5Nl&#d6a0mNa}Vspo$ z-#nLoehb#ByVxwJ8Fbex zR1#V%?Lr%?x>Ekz>^pw_9n^*uu%W$uZ0OvdEY81+Z7XI&W8AkDJ#!$ow|K>%lI&dn z$Dp?}XdmcFGs^sTv2PduG`7|HQ@B~>+o6r73?%!5&{>t(w}gHg+or)xMjc9uN<4lK11CK&G$u+^QClhM|nv13l_6D|NhR>?Z_4o4G zs5dYbVKm=t2=pW5>=BZE(n&ea*{H{##nO61OSF4oI+s}QuSc0@pY8E4=DwV>v<6({ zpXH?R%(LJfEc0*k_WJL@U$w6l>&ae!8O@R{WtdIaK`Ue)xgl)kU>Rn-GHArSwcG6J zhsn1nK=ago%t5^#qRa4iTW}QRJaMorFxmn=TJW2LYE3EHdT~pyf3(GdcFglv@!5x3 zEqbutIu@OFmNfP#G&#lQI7R9AoFR(M-R2do#`f*RUUlWe>{Y&h#Evn;GOMNR8d_%@ zh^;K4vACkdK2k16?nh_L*dGVcF7}ZsKCg{M=b=SJh+l?8u#;T{4X~<&71U#G7UZez zBP!mjiNBTBZYl9in)u9vg8LZG6ci`u6!=A|v1srN5N6Q%wBE~hUgMnc!Hjplbt0Wv z-kIBHF3p;jADWK+Ghu=$m>G(U-|SqXeU-sjeR(A!a7v8#b(;oTW-S`uD6Uuw}2`| z%aj5;^&o}WM|Mc$`+V1U^+Ct*En=3%+*-_iz-Q4KL&cERSAO)AHJRH=o*Vdr|IZJS zj$KjW=GwiognG1`_vqbJ7o7F^v6oS4b1`cS(wTx~!KXM4K#i+P(opIuUi+#N^5ykd zv5pizRxku#Wl35A8@47^B?k<@DjMqY~mn_+z^OB)lD9fvmJi#Nk^_$cZDAz98 zS0jAilg1I)kF{pW`28~ecba(YrCL><9fR$>WVB8<510zB7`TzAj7QyH(8$WRY-^>z z+Yztok~>Ie3{_|;CnO{X?RPC)I;YCE9Oh_R*8`C?7LA=!IkA08pQbWerkFi&#$ z6UrwzI%)*%rs}eA&zK=qAiWq)F0|W))gt zFK^qsFI@j4p!oO@Yt+gwv@{#KHKxXhR%+PLeKEn$BKhsX4p{J^{rxlxot&wZV#iM* z(20rhnAMX0`O1gha_&r=iS%$yOy>m|IKN;+(_;PD5A;L#VmE=mtl$p^)jahVe4fOP z4!g3czoz-Y3=K}Z2kh_GlE#l76+5}?#H@t*b(cuDn9r~(#YI2n9((La5-IkCj^R)X zjS}-5NXseOZR|>{+=Y*3ipvfIS57NIxE|n5W6{kgS^h$-4HOC|^TU=0Y2N;s+?V4t zgr^ycegtgZplc)^9_>>puxH+s>2zWzz=lkJM2l!*`Vq5~$6Sb+^0nt5w696#I2OGE zCn-7d83yffwXrogD|$0#agO$lZqo8d#nGA44Zi;<8ka%dWd7_ zVh^pPdi*n;Y%YV2IuO^M4gVF#(M(Gi6V}WoV0Oo2t4ANezW6Zy4wh}maTcTZ``)5; zRVrVGTOaZ0a~iI+{t|pe{z>j;AfGhkolJvP2=(`rg)jDqy#$?8QQ82{MU^FqC!DH* z1-Rz%c|4UYe=<#$v#hUdQ~#sdJSgp#4D!&!rvZN*@T5O!{l*6SHFnpV?g%BX3jq;H~kx|1*T7|`Tbp3x3x|m?3Mgxp>;CNy=${7r#f>( z2rcPteRD%E=hqKeqq1f4vN2w^*T+ag7V%uzzRkOzHOvR8yLqk$C(mPp8S}KYq?P?Q z#{TbXS&96`Iq(0AdQL_k*vHkgZ@1_#{q`J1d#e7S_RKbq%JvjJ^yUW9Khz@0R$z0| zk+HW`?sr({(`rN~n>+)XDoH~$p7n^4)ZH}egy~t^E zE_H5Qvdcbl@U0WEud;nNEHJUzu=Grr?iJ9T0=gAff%_>7Dy*R{AFi=@Z?U!peV&d$ z#~N#Q$m;3vT75l%2*|=hJZmn(y_2HWATGQVtqBD>i+nvHx&p(r#P!~Zxb6;xoES%G zulE*t16{aNLpNezI6qBDYQ8efI#00Mm%!tC%>o&+5P`*t4=&EAa05O*?;4-TlX!4S zmZ8n-=9huMi>LMa)&*L9;iAsgP~ojbeqRu`g9;ZeEV5PC@p>b^s5{VsTSAOq8@j_P z?&~1E2wo8Ow1d$5Ux^jjN_hWTa5t**Q+?jZmU?#<){S@C3%VQ%UCv zjB%&ZI2V}u8l#02=?j4|7HFE+1;$vQXPW9>q7En)6+)Gf0u zYp$|!2Z0(xYZ}5VEWVYm|20twFX>#uI2Rh%eMJIeTz8rSh)=^M7C`q(%raY(ZJDi3 zcS%9>4e_a}Zm=yez}&AeRCfbqzbYj!J$`>CF}2NAhMfLf@u^>0Z!{mc6By&wR*S@N zJ#Vns@+9~e&lsyErt#j!29hN`(~3ae7c{3BOa@+wsj04WI34=?L7&8^eXL$yZ4%Rb ziAC)iiK(|OaTwwJ5<~NsUOp5SkQm;E2A~Hd#$hP&jIEWJO4kYl>0vA=F;r$FT)V_n z*I`d>Q0fkqm!rnfWUy%Kl$cr@lsNo)CWJuh)7oYuE{r`WG0R;w&9w%l?iz>D?~Sm; z)Vo#~?j0f$v#j2D_t~AmknYu=57w!?Y|V`Z&BGp&n8pfQjS;3Nk(bdZWo*5~Kv_Z% z^;hg0G?-?`e~MYEtHi*gSMs^nVJKp3qr{NR*E*VXSv@Qfxk4Ow^j@^TP3w=dm z8k<~(BehRrpm?i|O8uzB)MJlAbC8~S41px8&2^PV;>^A(G0p~8ox#vyk4sF2tDdF~ zUGo_E*Hk0lo)5VvEtYyF%`{5C1&g?iNVpEVLLx9F|`i)BWTd6 z=4%L`dO_q3w@%MUOrxVoe;_0NFBPW7;V>%DUrEdg+cHD_{B?AVng5Q& zRJfd&PWAb0l^Cqm9gaHvwYtJoRyQ~*nyPir3cjoIy0@anu>u0?S}~zm+a#veR;{nZ z5Wihw>@L@`T3f@i2}}_GoWziB!PL_La)SA5gi!m?dBTK98Sp)cak?6CJWo5DiRO6( zahb1y7OT+5ydW`-rDz@l%>NpP(P#F3iK%m}Y-)7X(e`J8`5S~#dFpFy_tqQCPcJG= zgJXHMtGQ8+*WXGE>0W~(vmZzddfjEvJnZih80vHoI_4#W@iJGr>I}q?y(}@+jfU!( z{k_CgxayqMx~;?54<&}yhqO)tIl=5e2$iS7;l!f{+Cfe_@z$`Mv>`h=6 z8)Dv4m|KetF+WRSjAjeQ_9ZYzvjt=O6By%m{)Ys{xSijY7}709I^kV~A>CsD`e%i~ zJZMy+UuZB!C3;U{Dsdc~cz}p7t$7~=$yj4^BUW4b3g`ogsUWqhO|0?%Qevp?n&5HX zUrCG;N1jG=#(>1wZHHe6@^i^Npb>oAZ(A4*Jxt=7??yHdyd z8ziRDg_W-XtN$%A_cS{i4W@VYuM*?9#N_?4#8gz-^s3EsKO`}Y4qHQozUpP4C_b*b zI?Sj%UFx615`(p|txop|B4bA+rm@~-v=wGY6{gB~5Ath?!LbF}Szm;HBQX_J8iUo% zze$XptKK?CBi3%IyZylln2GbjrxJtxbhSaZv)@Wg}t8%>b|GUI2 zvsYHvV0+%=TCyZ{C4DRfGqJ>s9Z$hbEHPuhQ{^!lq=^5$#56eSYm5fr35k*8Pgfd0 zQ+XLbl42(%rqWe`bBVg9M$oC|6aq-M*lkVdc>NNcR+yS*N0ZCdq$kp6BxXg8(a9iV zXCbgL4^VRUZ_U7(CH5Jd%n5 zV{fX%9fnI^C?SmT%nc?c!N+*!21H_vXKuWCM`DcTNvf$uVoHfHFliEFyh6hJ*d)ey zg@pH!NsRFd3GX$L7~>TZ-j5?Oiw(+4!FXkz=nL#o#tD`t4SpKVF_$`nRhUbi!Om29 zRaaJym*Qk*S4d1Fv}H1Mye~^)FtCiKT$U{{Mr#D(Nbgu88N1Z}l-_Sdm?oRv(^XNf zt0iWs>t4*=`g>jcq(bmP11-_tF0%xts=3xk1IFVVZ1)Ytb@^ znXpjPRN+ol9vXuN^}kDtF{uBSfx#6Joz+1yvp9?sug=4*(@3Y4ZrfTTexJ4a)(Y$D z?l5kk0-B8Xv_9C4o5DQG(~7IOVY;MT)Y)Z?c!Fz*LpbPJ=PP7v%dYrWkUck7;(c0Q z&_n=3f5}dR-GoVII^01F&RKBjy`gz<(_nL9KLR~l(w~pTJGWr6odo(ACc?>Zw_swO z3YYZ$WpFcLuY@IIfqe(>p)5j$Yo#hBevvg89 zhv1ITr21bp^o~KUq~Sa;auTbZ02G}bXZFZ7Z={T zU}15A*SC66_rjY*Kq_WYVd(-M2M@E6;`I1Ds{_n*GrW_&w7|wDPffRFn5LMgrd^Si zWy&^PX}a2yW13~kHRoAon=qXehS#@8Jged21&-YHD<9qo>FWxy!j8^}uh3?%UJ&uD zk<^-w?!wjG0lf7!;AMqG`8{DjEA+1K06*bIx+x2LPivtGcJ|AAI; z2WL-vpcT1xf}7y7Ivi%Wg5BQk>p&Rs^h6?Efz{m+9}PAgL+|4yW8u9e-jOS4A!DIL zJV`yqMS`Z0B*qE37Cw5!_z^UXBF2<_TUa`$N&d-L_{b3BM9@=sIE^1c)94f9SkN>I zkssupjD?SKyjM|$z84Q&JcBIrIap!zsK&s#CRe$S-TZxL(64~LDCs|dei<9VO_ENBie89K-yM>^ zMyPC1qP+@1&rhij(Zb}gTEyR?iKq4}2Hgh$wFix#_j8l=bp!taXo{!$;&<4rHqXT9 z42$Rp=x>3pl=OPgpMY+W^y8ox&o*&6COpZ1Iod-Qp`Qlu`+i}Byd2ZePa(ZBYJ3c6 z(m$&cA42~MBgRii>VMLQRKF(LfO0dP{U9Yh#rM$WQ^x;DC;qv_cog;dNJCTlqZ&F@ zzft|wd_*hCH^E=gw5p_drT=Kv`7YuWP5Mx4s69SHywXSXCiLT=)!Na7)$Cc&O8-#2 zDNU?viI0h0#r3zEZ)sIc`M;R1>OYOgzoenBMtXY3Ew%6!=+7HL--QJbzwf8S|0IR}N6^!8;6Z7rJcm-^ zKLc$-`Dvb`_{rE1{Ctjy{|=4lYiNTY4e=-f{qki(o+7$@u1KlR+DCpzp zpShBrf+gE0Qws=dn4$lrkPj|{KWtEl=vkn^u3^8gMNQn;(efL{-S1|iT>;a z-9FvKXcI~NHi9;Ren8SsgI0#}e=ddI33@TgdjsMq{XWpw=8-7oPzHMt(DjP zph+Lo%AVxmBhaM3U$}|r8SFQp>ANIki2rfW%20VmKx_Gpfwo~hwjqx2)3BvDuBp!r zpp)Y}c(7QDH*bQ14D?IB#PXRwVFCl(UgZ>2N-7o2_8a$Qnhbi=4 z(Cd-DLE=9EP3JOXu0XGUn1VkB`n!-H)qfVT<&$_gMcv^p{xOy{t*u4)4vYLE3wGyp zDBy1^!l6P@VWIr52WahzEG+C~^So?cb~ipI(SiNFPLSK}?R2jRcCPjW-QGxN zSJ>_8?qN6}zz@|UK5yaT;^IP2SnS|Th-QK<)Ni>w3PBq3u z$Nez8!?VUm2NI|R{ZxEGcO(!DgAhNP=N=pqxqa&pLY_8!H3L7DZ}8z`81g6csXvGB zSj~TM?(^~=pNB;>ekvcvCpG9d^&$X2U*{)0UEQIG8)s0g%}aprTJe*0@kRml<96{0 z4?N6lYQl}9<~n{+(d{n0ePMC&xL?4#-MXOL8GfuET(5oz@Ak+a;p1Fre1z8**2G=< z$NY>pE&qXiq9*8ky-@m{zngx2kDd$q(5ikO;Kz4D&`d!HOQLAR4?@u05pkmp0;&;t zQSgI)`W}fJCsA%RC<{O239;4Pt5*kojr2l@P&ZD&0P_0Us1Lne0UUU_LlFPlOBdem zK~T6Ihr4in!L|id(8A6}$cwW94;t{x-AYKW5M|{bCp})~uDrL-h9|H>)W&GPJZuzc;R-FcrA5gLVp zUXAa=taXRFI_W%|zwkkn!A-Az(AG_USw_o+iw(rujn{23UQCQ8YJML-EEJ!;(I()Z zsL=+9ui=afp|8?t14NU%HS80z;N~L9$6G>p!z@|1akWYY^LJy&ii?7x*vowDZFqY| zq%#Dc7~S%{BjO`I+9L6KlMIUi&R^4^jTfKR(T3o3G@=A%Eh@OClU|9z`KZ@~BpQ>y zLxjG_6I!ojK}X7+Yu#Pr!uW@U+QA-HJ4RfAHlmxP);QcZC#yE=4uGb&jM)~ zLQ`vG5#KA)Mv9LKX+tJ_Fi0CIzB8l^N%?#bJ+B!b?G1Oz%J8osX(Rc-7$=bKj!v(S zxvO0m9Ns{OyBn{dk+Mr|sTBk+C#$J7(2Dq?(m2LSvv6&|NRRnC#JEW+_pnw6kk-&` zYusk$eUU&kDp~@vzd=W~^1#_sE5*54A?rmYNqj7xi zBUS1q52_$^9G8u8NhvLcEtkN=>vmF$^-yP*S5+{fk>q!#wA}c2qlB<(gOlt;XK=Nn z9epBu(k60LB~%nokj$PdZK-_K2ohhraxY!yZjj5C3VPEJDlI?Eb*Z92E=0xXTUc74 zo}%G1tIxfpzS;!|qjiZITtevFZm4!S4bk!dwSXSM0LA#^bAVbzjhg|IISKvEFsZte z8V1ct-xJf8jekH)8<1>Z@obX`dFCynj}uCQ(rF}X+$YJj>G&e~|KJZj1Em!>ozc*< zpHdL?d{h~+I%jy99Pa7B5>9+KkufX$%BZ6gy1%4w^sFcZ2J;jMuEJHqKZ56-#E+gK zZJ~@{u{Gz0aAfOXY1z+lX5iqdho!AMB_Rx*M=yuPHkRY)ne8z|(6d@)l=sgOK+ju= zA3cj2L554=SNT#n*|o6re3tz5jH(#-w;<2uJ2gScMbMdvR7r0n!kT>^ET*j-Cyz zL?Jd^D?t)N)K*x9qcf$!8%4P(j*QBe_Kt+3`qEj%3E+;>22&b^`vGX+LXW`}-w74` zrl;Uu6FAO~&Nko2;g8}$Q01q4^z;Oe`k2lr>HD854nYb30r=_39^vS$^CJV?hlrKS$#01wi04cF`zfsAN6-A;X=dyNgegO1CHp&Ag`=}3F9etN z`^u;~okjrhrF?0Rz7aUOtD%g-oksu#(-{pJ!j*HM_(O4I=@|idg+wT0dx6v5DN?NI zsVC*B%z5B&1d=eyOD@TPGJjgZ*nV`-H3)bDmdZ!tl4M@XZ*LpExu@C3D}Mh0G4F?6 literal 0 HcmV?d00001 diff --git a/funkey_gpio_management.o b/funkey_gpio_management.o new file mode 100644 index 0000000000000000000000000000000000000000..2b3da56d8516f094b4eaafd992e33781843f881f GIT binary patch literal 1636 zcma)6OKTHR6h4zln>4=KTD7)5hE}DucC1qIv5>}S6sZ*jSAxk+a+_Y7Ooo{oX%#ex z3k4Vc1pNiNQBV;De}Uk_rGKF=R47=#ljQ0oD-WFc&Ue0Z&wVEMFU)5x%OYbIP0&9^ z^f2C3dS;t2L7Sf2+cY+kPo8|AZM>%sjaQFQ_bdM< zew?DL!S9NggK7)a7LR04tnIN9Ys0a`+K`>h4rE8NoLyCK)w=q}t#8qpMwe*n z$7j=l#)q>`dtP3DMhBJYjN=C~3}xwvQ>;kgDX;9*eMfjDN3JLh>bktIigfXyKBH0$FjjT+!r~gcjr$!jRmc)*{7PwJJSmUQJ8) z;=+yTP>bR+x#{ayT%mQK3Uw_*UVNuT?=DVj8&TEnxLLww*-;rRP9t5JD7C4lOYfn* z(E{jW9Xz@ko-fg%+SJ>{lXS41;b%915l4aCXm<^-DlwtY0+* z$oys(=W)hZe{2Yl`SULRx{K3d-CLHcxw5ZnxvKC)S@OlXMLJL-cRn*i2Q)29>6dGG zZWOArCn~umJi&?#$gk^=szP~fft06ouC6=?RF)bYeIMg;i$SfLE7rWl+@h+;R+-Uw z>X0fb)Y5CNBg`pJ%OI%x=w6b|o}IM59Rb!ROjS96|$e3eMxXj`z%Ojk)<1d_in_Ap9FoA?A8h_m#znaSyf` zIL9$2Fs?h&j9MSl`xGeGaXnic#Jqdvtg)xt2x!_QCnIL)HRP~1-$-0{!VsXT!&Uv= s1IxD{2oBn2>KM%)So(-W1HK6{uCIA6{Xjlrb0!FB4&)ODZ8QD;0Ac3u)Bpeg literal 0 HcmV?d00001 diff --git a/gpio-utils.o b/gpio-utils.o new file mode 100644 index 0000000000000000000000000000000000000000..b2c17884a423510ec3395d3768a7dc7c2ee27781 GIT binary patch literal 3632 zcmcgvYiJy06uq;LCXMO)wMqI&+f-6x_K|Lzq$}Dqb&9gKwNxnnXtIwARZnkG)uq*Z2_$i8~z@kbT3O1;dN(TlHNknLbBW%ltNte6vN53V>%63o zUXsuL?{T{O?>^V*w5{9g|q2)NoMc%HV23=F*-Z>s_ z^G?Px+J?q{59bE#8gfqXpgO_-V%-a_b*cN})wM0$Vf(J!ZH@Mwy!Rf*GQGDX)u`KN zxkTML`z-x)?(Def+`!R`C)K`5U@b;-8IUidS=#S|Q{WUl1cgEH%cHQwN z)#J+a0Uvz50o~r&E7SXY-%am}a(8W=`$Z*;-L3b+@-^stZ;d9YUzv_0Iv)LGYUYuZ zlk^AFoW1y7VtP}i5vN)2VZ^ds*!==~%X(3#v-j4qLOHk3#&|TK*W5le$S*5YI$8>) z%tWaa8Z2b#p46D7YL?DKpJcG0PJ@OdoLBk%CITS0;VIbX?FBoc0s&Cpjl1&+zr*dDH1cK7yfZ*JXXB(sTJb2Qi;>}ZdK+tNm|YdEsm7Nmz2F<~TF;dsk$H7BJ+<0=Pn~b6Z@IQYTjdRC4O*k8$-7!xJ8y#~!P3zoE0F|RMH@4YRW!_? zWsF!7Oed^_1e2wb1dDl_r1C>UMh?DQ-ZFx__dL~JvJ$Do671RkL@;4l#cXoeGD?_7 zRdd&JpG?iT-QGEsUc`$(ck_zRP2u&+!a0gxmQ?YT;DL(fmnPUPF5X##4lcpUbGi|>d1y^9}&eZ$2M!T!U= zD<%xD)VL}5yeeKRyk0z$0X$1#6Hh-gG|uNMJexft&j9KF!EplV{|V0<@E-uuKLz|5JW%Gma2l@F zM42z(;>(TwmsasW6;~g0`>>TYOTm=1q$L>d4f7S@t3z7wO~iY*@D=52D_`6A>g217 zuWr5~b}!W}(xDX9D-u;h^p#7SsuL&&#e7jpxk53Uvj*hZV%9PwW#&tEf$6JMLYA;T zl$$=3IXe%DUB8qMWvfh!Mj|~MqRJCKeG_F#1v)j#A@*pAY_4xMMZ(Hw#Vi@dVHqx& zhEWiy#U6%m?dpMH;8I{6KDxEk;oLwSct7>kBHO6X7uil7xP$r{5#IYcbmD!lTPNyX zhVB!=&w_-3$EYLkOF-s*g*xz6>d1SBI`X|s9e9p9@_tH0-U%Y|{s;_Vve$uO;0@}C z`<;mV^Kky51+al(;6fntuO=c7YN*Py6Bt4<(t%-MoI3J6O+=mn`WNBe(htm0N1hYZ zaq&)42fj=lc~4VEF?*dl@a?jGmWX+OPCv%EOh52T>KN}T5#wE_ADjOR{lH(TV?6Ny zQ2-l>$g>?7S|;)^Fbv#99eMT>k>?Qo%SDp(0|%%hPl1R-JVC^KUmzmidqB?XeIVy` zfjaVCCL-TA^sf;4mVV$>>d1GKi2jZEHbW@dYk^^43y}SzMD%~0i1;KC>o`Wl@7)<< z8^$L-DDn{z`Tl8RD7L6lA)~M-ki%)dvVke!KMwnzQknoc&AG#7f5zb&%BC`RQrvP3 z=xmH-!<1FL@Pmb3somDmd<3VW9h)yh*JZ?w9JIosS|W6EwMK3IJTxUHleoMveoVP-^cFF zLLbw^+W^ z)j6b4aM9_;b3`Zb00p41xdt;gX723y&$1cCJ-5+FznLGg7`pi(Tq?wB}y?7y#n z%m2OpR0~~{LDA_UrCPaX1u}AELC1$*eHeWhKo5kPNA#`8ctVZdQ1^3h|6ci>2UPG!-HzZ|LU+<7Q()_#kG7nO4^W-@G z-Z=T3UK^(1n#s&=3NDz;sC)FS;3bo~$~Exc?`2m{XLj2WSLSRynC*z+1Q=(c%BVT- z70r5)rx~r-5p5uge0OHleX$HOqTn;9{khutyafW|o%X33!aig=OVQg43ax6#(Vu(ZvSkX*KwZgIiGNQzRNM^bvTY&^j#unpJMw|E9I!oXV~UtL(-6H zoh|g$V8Oqg&Yr(BYv)#(>oFb5o_{JQ=bYDlG~4mx!>&VdaX05yasp3-QZkplX+l3d zeMCGbcFfX(j+r;h+Gg$ADE^MqKCQgCbi6LOaGMW#L~Jc&lDoK zFLV8n>L&EjFa;jh$HRzY>|*KMQdgBY94JSZxUw_)!E#&Y?2$)YY*}1NoA2NmebjGT zI6LdYsiVLqDX+U{Io2*Jom=RpJ?u|40V9J6{Q#ZO58#b)<2~eD7fzepa~9slo57iO z%x3E#)X z+v{dtCAtjm7F~F6ovU7fd*gBayJ5Dp&)3i91owo#KWt{pnF#3gSgyy_3a>xXeDJr= zp&AO(?9pLf%`LvDkA&^n^VpdQ{b=~EX}d>0_#F-JBiuf?Ctb+-Mg7_EYx?v4*MJp` z`*0hTadzhWXjoUY3N^muYx;=8rUW&P`Z<=V&9nTiw(O!fz5zZ9?6m;5-$?VtQH~mQ z9-UX`QPlaulv&9au`Bkv`ITrgR8S$`t`w}uWl)7m@~3FIA_Qm;@*qARm7iXo^ET~} zWg|H(N5lj{2>b{?%zOuhWAVFr>5`le;w{HfMQS>XA9Qw5;Xk-LVwW zmX?+q{k5%fmny~m^`RR=8`o_J2cvS=_5B;xm;!3zUmlVyb*Ut*#kBakbxl;_Ep74$ zWiD^glA@);=Y(bMN})>dxvJgEg%u?=0)^6peVWt-)KVrY_ADjGLYh3FQ79^D5{0_b zX$qwhCh1P}^~rJQ;t5R-ZE3$_U0Rd6dnwd(+m}O0i zrs9J2is@@PEl-LG$A*^YWW}W9<~$Lo*Z6C$=K}va_c!$zP@ z1^VU!-d4c374SO?_>KbJS->AE;Dwi7yvw-Vz>6uT%d@`X@?GJY^48uk8`SZq{davEFxDRMdeFL zVP4NZ*HX74sc|$drlvJJF%&7K({f6S^hjz9w|zYNC3%q2gK16fqht!vBlG;?iKuMK zd(0lo1Ia{6Gw0}9M2_Ak=enOr%JCfOjwRBvnYs0`vG%VI-^~rtQ_9Q-E4fPuu zB(E0_bXWR91umN}5`K5q@tcUTVl zXITy$VGetKui0;u`BL+44FeB?vtKRVUvGfu3ycV^SR9upc~=u%1zf)j_bo6C472G>c@~g29%d3bEvm7|aawPu-BYuUPWPKUYDb@quviRE;Kg%5P z-e(T{19K12hs=ThWDY<6bh5t($oBZ%ZP=GHhuu=zsFmfw zt;}(~Z(|O;oB1lDdzk~H%weZ62PT1DY{me~7Z5$ja^S-jf6U@fGKc-s%z^uXUVO9< zupDtmSq?nO@(|H`jA5crSPy%h^}uF)P?(EA=HFtDx}RbWd;#d)Nc01iBafF^4m`{p z_G8R}CxC2slI75!Vma_F=Fq>*9QZzv^Zd|~&sg%mTXGj{xX&d(?z120twUc~jvolE zEC=4ga{MUS&v-4)2V(=#5#ahOh+YSVfp4%Jc9V?P5q->h#68D)pckK7@AcSM#v5=> zfxKU9fxKVanWK)onFIG*{D8&ZWsX>9nFBrWVf%$ZwqL;<`%uFic#Wm!*sK>V{jHWh z$sBPs=D`1Ttc0O}2Wc1sCDUHSum{>}jB5PlW8P>moHM-Br}%7uvp?IREwtL=P#NQt zBNhwTmPZf|+dJ*{vceknx;T1<4_-54aJ(^V&S2YND-1if=kXwdb1wGab@^$s(3XFn zlW+_>zpp@s+>*A6?QmRj!?s%tiCqIL--Vr&v&z@Y_I3@dz8=lwcMe;L{~nullmofP P&Un9G2s?+Pz3#sN5ot_i literal 0 HcmV?d00001 diff --git a/keydefs.o b/keydefs.o new file mode 100644 index 0000000000000000000000000000000000000000..5a2d0cb358519facb6a87406358805f29e856372 GIT binary patch literal 11532 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 C|F!@C literal 0 HcmV?d00001 diff --git a/smbus.c b/smbus.c new file mode 100755 index 0000000..a85d727 --- /dev/null +++ b/smbus.c @@ -0,0 +1,224 @@ +/* + smbus.c - SMBus level access helper functions + + Copyright (C) 1995-1997 Simon G. Vogl + Copyright (C) 1998-1999 Frodo Looijaard + Copyright (C) 2012-2013 Jean Delvare + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA. +*/ + +#include +#include +#include "smbus.h" +#include +#include +#include +#include + +/* Compatibility defines */ +#ifndef I2C_SMBUS_I2C_BLOCK_BROKEN +#define I2C_SMBUS_I2C_BLOCK_BROKEN I2C_SMBUS_I2C_BLOCK_DATA +#endif +#ifndef I2C_FUNC_SMBUS_PEC +#define I2C_FUNC_SMBUS_PEC I2C_FUNC_SMBUS_HWPEC_CALC +#endif + +__s32 i2c_smbus_access(int file, char read_write, __u8 command, + int size, union i2c_smbus_data *data) +{ + struct i2c_smbus_ioctl_data args; + __s32 err; + + args.read_write = read_write; + args.command = command; + args.size = size; + args.data = data; + + err = ioctl(file, I2C_SMBUS, &args); + if (err == -1) + err = -errno; + return err; +} + + +__s32 i2c_smbus_write_quick(int file, __u8 value) +{ + return i2c_smbus_access(file, value, 0, I2C_SMBUS_QUICK, NULL); +} + +__s32 i2c_smbus_read_byte(int file) +{ + union i2c_smbus_data data; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data); + if (err < 0) + return err; + + return 0x0FF & data.byte; +} + +__s32 i2c_smbus_write_byte(int file, __u8 value) +{ + return i2c_smbus_access(file, I2C_SMBUS_WRITE, value, + I2C_SMBUS_BYTE, NULL); +} + +__s32 i2c_smbus_read_byte_data(int file, __u8 command) +{ + union i2c_smbus_data data; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_BYTE_DATA, &data); + if (err < 0) + return err; + + return 0x0FF & data.byte; +} + +__s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value) +{ + union i2c_smbus_data data; + data.byte = value; + return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BYTE_DATA, &data); +} + +__s32 i2c_smbus_read_word_data(int file, __u8 command) +{ + union i2c_smbus_data data; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_WORD_DATA, &data); + if (err < 0) + return err; + + return 0x0FFFF & data.word; +} + +__s32 i2c_smbus_write_word_data(int file, __u8 command, __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_WORD_DATA, &data); +} + +__s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + if (i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_PROC_CALL, &data)) + return -1; + else + return 0x0FFFF & data.word; +} + +/* Returns the number of read bytes */ +__s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values) +{ + union i2c_smbus_data data; + int i, err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_BLOCK_DATA, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; +} + +__s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, + const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > I2C_SMBUS_BLOCK_MAX) + length = I2C_SMBUS_BLOCK_MAX; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BLOCK_DATA, &data); +} + +/* Returns the number of read bytes */ +/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you + ask for less than 32 bytes, your code will only work with kernels + 2.6.23 and later. */ +__s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length, + __u8 *values) +{ + union i2c_smbus_data data; + int i, err; + + if (length > I2C_SMBUS_BLOCK_MAX) + length = I2C_SMBUS_BLOCK_MAX; + data.block[0] = length; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : + I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; +} + +__s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, + const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > I2C_SMBUS_BLOCK_MAX) + length = I2C_SMBUS_BLOCK_MAX; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_I2C_BLOCK_BROKEN, &data); +} + +/* Returns the number of read bytes */ +__s32 i2c_smbus_block_process_call(int file, __u8 command, __u8 length, + __u8 *values) +{ + union i2c_smbus_data data; + int i, err; + + if (length > I2C_SMBUS_BLOCK_MAX) + length = I2C_SMBUS_BLOCK_MAX; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + + err = i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BLOCK_PROC_CALL, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; +} diff --git a/smbus.h b/smbus.h new file mode 100755 index 0000000..18a5305 --- /dev/null +++ b/smbus.h @@ -0,0 +1,61 @@ +/* + smbus.h - SMBus level access helper functions + + Copyright (C) 1995-97 Simon G. Vogl + Copyright (C) 1998-99 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA. +*/ + +#ifndef LIB_I2C_SMBUS_H +#define LIB_I2C_SMBUS_H + +#define I2C_API_VERSION 0x100 + +#include +#include + +extern __s32 i2c_smbus_access(int file, char read_write, __u8 command, + int size, union i2c_smbus_data *data); + +extern __s32 i2c_smbus_write_quick(int file, __u8 value); +extern __s32 i2c_smbus_read_byte(int file); +extern __s32 i2c_smbus_write_byte(int file, __u8 value); +extern __s32 i2c_smbus_read_byte_data(int file, __u8 command); +extern __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value); +extern __s32 i2c_smbus_read_word_data(int file, __u8 command); +extern __s32 i2c_smbus_write_word_data(int file, __u8 command, __u16 value); +extern __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value); + +/* Returns the number of read bytes */ +extern __s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values); +extern __s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, + const __u8 *values); + +/* Returns the number of read bytes */ +/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you + ask for less than 32 bytes, your code will only work with kernels + 2.6.23 and later. */ +extern __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length, + __u8 *values); +extern __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, + const __u8 *values); + +/* Returns the number of read bytes */ +extern __s32 i2c_smbus_block_process_call(int file, __u8 command, __u8 length, + __u8 *values); + +#endif /* LIB_I2C_SMBUS_H */ diff --git a/smbus.o b/smbus.o new file mode 100644 index 0000000000000000000000000000000000000000..b6a30c11a86dfdf7e889df26183e645a6fa9b21f GIT binary patch literal 2636 zcmcIm-D@0G6hE`GU)e-RlN7g`s+(*ou}g-uskCtgn`WJ&sD(g55!}p7Ms~ZO&d$>9 zF0m{4(1Mhu^-1c3FTP2O5|9qHFa81c!H48&AAD81P;kkB>p3%bGLy|lMf8T7bARXj z&c{9HX2|u|-x4{F17~qC4=w`uJZxD4XDl%fqY#GH){XmcueaV@9~Dh)QZzKPkrY>%iIwwSH0TNW?W4fDj|W?+`HI6c|C0!eNMe|J)i zsJO`Z2jjww?ZJyqRLXD1we!2teSaC-^}#MwjC!iNTMu=|tjb`<_N6RNEiRvU&JFm3 zIc^T~nG{p4)D7bkZw}jcc#dIwKkFwXeLr1#(qDp(;mLIyd)vbqG}cXRw-M@2;Z1tj zH0EzxZ~6bYXOKC8DUvCy>MzVxuMGE zYNuYZ6|h2I6-kxk9B?P`7&yDI0>MaVCCrWZBK`^g6nB(+mXC7BxR`I6Kh8ZLoaI2M zUMuR7j8fNZnRQN@S`c)#u7j{4=@JNXwF-h#E*8}i>Plr@6)wJWd7-LHN*;ujwYLRH z*R`Bn)77f=f!p`X`yKQ{x9>Ib`@WI@JpOnW4}KW&Dh}|2`>Z?!25<<*P(wAW;hw5lA@?M)?8W93y{gEnpP@j3S~vobLEnUcU8;jYUZO_4oB^JYpS%7k+12h zM`tq!lzYUC^_1KQE_={oxm+!48-oVhWtgR+mFYGaMJg0L71_!0Qu*Pb)`@)nanF!_|pHogJk?J!x# znG^0XiQ)dydI4D&5`v6P?{v=301D?gjb{uG=W)|Ij{notQId}QiAVqDoM0Hsu-3ay z0EUT6D~X%SHHM#{HY#!CR&S_`advj@O60rP@as-8#Ln?g%JHz? literal 0 HcmV?d00001 diff --git a/uinput.c b/uinput.c index 4e1b808..962fbd6 100644 --- a/uinput.c +++ b/uinput.c @@ -30,7 +30,8 @@ #include #include #include -#include +//#include +#include "uinput_linux.h" //#include "config.h" //include "daemon.h" #include "uinput.h" diff --git a/uinput.o b/uinput.o new file mode 100644 index 0000000000000000000000000000000000000000..1eb0463bf6d9efeefd53a28ae9c132b872955060 GIT binary patch literal 3660 zcmb7He{54#6h5zAw^2!)Fku@%EbC0BbKPK7U?pY~DMmpUqEUmP-TF+2T|3)17?j{d zg9a00j4?)y8VvlQ5ex}`2u?^OV$>L8j1U5*8ls6NWGn_7NSNRE-g&c|sXy*=`)fQ4Z{$(8PY6&c_OKqw&Dxh&@3}$hP-s-gYnc_In*^Sass{UvSCd8 zac$yMF;;Q97z;~F)mc{~Zv=lUfUj6Jp6EF_USSxGWWCY9$DN)MS6epjQ;jq2eCvLH zK3gv1!6_L%Wi!66agW;>rEJ`uDRJdjk}XK^R51~*pHk`RVxp;BrH>#o5jHwFiq=HS zkLM!`>Y}o!YkbpP9M!o1yXwV`duyZDe_3@hI1*XlZG5-5J`h=805>RZRD1~N?7J7M z+GI3D%gsGct2BDbMfeNu+{oC}5HkXdlwe)7YCN@iH2Tu093MII?1ys52u5O&q_-t_ z#@M%^7#x%1-5!y3=#QYA=$Ww@-m9^7V-p?6Vl@SS@M_Em9*bR9Aagb5hwUpEU>SET zCdUH-S>()?kNFG5Iw&&J8FIg8| zHSQ_9!s^KtGSXe$h`p{oSl4iDIqHn;&L`hEoZlTu=Hr4&1$DYJG$gAoReNiq_0gKL z=f_i!vFD21x4NaH(UH-SBfIU~!%4$l<8ablYhAS3j^J9HnB|>X=Mm|NS1`qP6$mYCUWCfgb4&-7U-K4A{snu`w%rcC&% zZ_D;ubX`AZrV|frPxl2{11havxw13Re7D)#A5RCuq2-|^t&7`R5@zqRp~bg2gmm+j zjGOV^elc!^>08>`EtUSN?rLL($6qn4qSm<4nCq=G>Wv1^JnwvCVP&Hsq1^TXE8YvV zvJNI)D{H1gmN{%mC=s{f66($6B$UlKPG4qVz)V9+XDl^LiJMFE52#* zKDnth0D2RA=Vyn4Pj12Ie42LiNys&AH0*rscvqZ;4TaHF;xC5(B$iPCdQkCl;BDwm z^U0ksdQj|oAobP26^@8c-=syuD^=6{%4vSJtO3J4o`V`@!FsqPg8TB=G(R!T-!jdA za+<#lem!#U1v39Lz)SEqss94dZJh6A^!?E91v36^R|HbuKh1w1{#xu;BarcWX+nK4 zaJ4p@Tcs(X_Tvc&ty$U5kH!30B2AX?_G~ay^gC>aSBYL&`qTZ^X1$x4K{G9b_6-#0 zf)1DiITPbkra34$yOW{Jc%Qjlh8(FcmC2cI8ru=)nrd7(Zm*RYK=qGR z|4j8SRR3D_3#wmK9S^dd|FY^c@s+T?IY7?e0Ob4&$)o-|Rli5|HL9;y-6GBt*+Ctf zvWq(KD0$>PNgnw=ClCCJJo27X{b$vGRsEvsm&xOLTp5;5*Q#e+cRJq%>tPspRr&&jhs^1yG%qs}wr5qFL}@B;ZoIO{mmQZCeor2C{Xib`|3n`6D|ys$QTcJ@uc&`b{Yt!X9Onme z+${Q-e-3@%Le(2pZw9iCCFHp;!QO6eY7?&mw+({nsd&uKQVJ~^$i{ugiUmJf9 zaD>EtS;Mg3K@PXMCYFro4cZPq7 + * + * Changes/Revisions: + * 0.5 08/13/2015 (David Herrmann & + * Benjamin Tissoires ) + * - add UI_DEV_SETUP ioctl + * - add UI_ABS_SETUP ioctl + * - add UI_GET_VERSION ioctl + * 0.4 01/09/2014 (Benjamin Tissoires ) + * - add UI_GET_SYSNAME ioctl + * 0.3 24/05/2006 (Anssi Hannula ) + * - update ff support for the changes in kernel interface + * - add UINPUT_VERSION + * 0.2 16/10/2004 (Micah Dowty ) + * - added force feedback support + * - added UI_SET_PHYS + * 0.1 20/06/2002 + * - first public version + */ +#ifndef _UAPI__UINPUT_H_ +#define _UAPI__UINPUT_H_ + +#include +#include + +#define UINPUT_VERSION 5 +#define UINPUT_MAX_NAME_SIZE 80 + +struct uinput_ff_upload { + __u32 request_id; + __s32 retval; + struct ff_effect effect; + struct ff_effect old; +}; + +struct uinput_ff_erase { + __u32 request_id; + __s32 retval; + __u32 effect_id; +}; + +/* ioctl */ +#define UINPUT_IOCTL_BASE 'U' +#define UI_DEV_CREATE _IO(UINPUT_IOCTL_BASE, 1) +#define UI_DEV_DESTROY _IO(UINPUT_IOCTL_BASE, 2) + +struct uinput_setup { + struct input_id id; + char name[UINPUT_MAX_NAME_SIZE]; + __u32 ff_effects_max; +}; + +/** + * UI_DEV_SETUP - Set device parameters for setup + * + * This ioctl sets parameters for the input device to be created. It + * supersedes the old "struct uinput_user_dev" method, which wrote this data + * via write(). To actually set the absolute axes UI_ABS_SETUP should be + * used. + * + * The ioctl takes a "struct uinput_setup" object as argument. The fields of + * this object are as follows: + * id: See the description of "struct input_id". This field is + * copied unchanged into the new device. + * name: This is used unchanged as name for the new device. + * ff_effects_max: This limits the maximum numbers of force-feedback effects. + * See below for a description of FF with uinput. + * + * This ioctl can be called multiple times and will overwrite previous values. + * If this ioctl fails with -EINVAL, it is recommended to use the old + * "uinput_user_dev" method via write() as a fallback, in case you run on an + * old kernel that does not support this ioctl. + * + * This ioctl may fail with -EINVAL if it is not supported or if you passed + * incorrect values, -ENOMEM if the kernel runs out of memory or -EFAULT if the + * passed uinput_setup object cannot be read/written. + * If this call fails, partial data may have already been applied to the + * internal device. + */ +#define UI_DEV_SETUP _IOW(UINPUT_IOCTL_BASE, 3, struct uinput_setup) + +struct uinput_abs_setup { + __u16 code; /* axis code */ + /* __u16 filler; */ + struct input_absinfo absinfo; +}; + +/** + * UI_ABS_SETUP - Set absolute axis information for the device to setup + * + * This ioctl sets one absolute axis information for the input device to be + * created. It supersedes the old "struct uinput_user_dev" method, which wrote + * part of this data and the content of UI_DEV_SETUP via write(). + * + * The ioctl takes a "struct uinput_abs_setup" object as argument. The fields + * of this object are as follows: + * code: The corresponding input code associated with this axis + * (ABS_X, ABS_Y, etc...) + * absinfo: See "struct input_absinfo" for a description of this field. + * This field is copied unchanged into the kernel for the + * specified axis. If the axis is not enabled via + * UI_SET_ABSBIT, this ioctl will enable it. + * + * This ioctl can be called multiple times and will overwrite previous values. + * If this ioctl fails with -EINVAL, it is recommended to use the old + * "uinput_user_dev" method via write() as a fallback, in case you run on an + * old kernel that does not support this ioctl. + * + * This ioctl may fail with -EINVAL if it is not supported or if you passed + * incorrect values, -ENOMEM if the kernel runs out of memory or -EFAULT if the + * passed uinput_setup object cannot be read/written. + * If this call fails, partial data may have already been applied to the + * internal device. + */ +#define UI_ABS_SETUP _IOW(UINPUT_IOCTL_BASE, 4, struct uinput_abs_setup) + +#define UI_SET_EVBIT _IOW(UINPUT_IOCTL_BASE, 100, int) +#define UI_SET_KEYBIT _IOW(UINPUT_IOCTL_BASE, 101, int) +#define UI_SET_RELBIT _IOW(UINPUT_IOCTL_BASE, 102, int) +#define UI_SET_ABSBIT _IOW(UINPUT_IOCTL_BASE, 103, int) +#define UI_SET_MSCBIT _IOW(UINPUT_IOCTL_BASE, 104, int) +#define UI_SET_LEDBIT _IOW(UINPUT_IOCTL_BASE, 105, int) +#define UI_SET_SNDBIT _IOW(UINPUT_IOCTL_BASE, 106, int) +#define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int) +#define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*) +#define UI_SET_SWBIT _IOW(UINPUT_IOCTL_BASE, 109, int) +#define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int) + +#define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload) +#define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload) +#define UI_BEGIN_FF_ERASE _IOWR(UINPUT_IOCTL_BASE, 202, struct uinput_ff_erase) +#define UI_END_FF_ERASE _IOW(UINPUT_IOCTL_BASE, 203, struct uinput_ff_erase) + +/** + * UI_GET_SYSNAME - get the sysfs name of the created uinput device + * + * @return the sysfs name of the created virtual input device. + * The complete sysfs path is then /sys/devices/virtual/input/--NAME-- + * Usually, it is in the form "inputN" + */ +#define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 44, len) + +/** + * UI_GET_VERSION - Return version of uinput protocol + * + * This writes uinput protocol version implemented by the kernel into + * the integer pointed to by the ioctl argument. The protocol version + * is hard-coded in the kernel and is independent of the uinput device. + */ +#define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 45, unsigned int) + +/* + * To write a force-feedback-capable driver, the upload_effect + * and erase_effect callbacks in input_dev must be implemented. + * The uinput driver will generate a fake input event when one of + * these callbacks are invoked. The userspace code then uses + * ioctls to retrieve additional parameters and send the return code. + * The callback blocks until this return code is sent. + * + * The described callback mechanism is only used if ff_effects_max + * is set. + * + * To implement upload_effect(): + * 1. Wait for an event with type == EV_UINPUT and code == UI_FF_UPLOAD. + * A request ID will be given in 'value'. + * 2. Allocate a uinput_ff_upload struct, fill in request_id with + * the 'value' from the EV_UINPUT event. + * 3. Issue a UI_BEGIN_FF_UPLOAD ioctl, giving it the + * uinput_ff_upload struct. It will be filled in with the + * ff_effects passed to upload_effect(). + * 4. Perform the effect upload, and place a return code back into + the uinput_ff_upload struct. + * 5. Issue a UI_END_FF_UPLOAD ioctl, also giving it the + * uinput_ff_upload_effect struct. This will complete execution + * of our upload_effect() handler. + * + * To implement erase_effect(): + * 1. Wait for an event with type == EV_UINPUT and code == UI_FF_ERASE. + * A request ID will be given in 'value'. + * 2. Allocate a uinput_ff_erase struct, fill in request_id with + * the 'value' from the EV_UINPUT event. + * 3. Issue a UI_BEGIN_FF_ERASE ioctl, giving it the + * uinput_ff_erase struct. It will be filled in with the + * effect ID passed to erase_effect(). + * 4. Perform the effect erasure, and place a return code back + * into the uinput_ff_erase struct. + * 5. Issue a UI_END_FF_ERASE ioctl, also giving it the + * uinput_ff_erase_effect struct. This will complete execution + * of our erase_effect() handler. + */ + +/* + * This is the new event type, used only by uinput. + * 'code' is UI_FF_UPLOAD or UI_FF_ERASE, and 'value' + * is the unique request ID. This number was picked + * arbitrarily, above EV_MAX (since the input system + * never sees it) but in the range of a 16-bit int. + */ +#define EV_UINPUT 0x0101 +#define UI_FF_UPLOAD 1 +#define UI_FF_ERASE 2 + +struct uinput_user_dev { + char name[UINPUT_MAX_NAME_SIZE]; + struct input_id id; + __u32 ff_effects_max; + __s32 absmax[ABS_CNT]; + __s32 absmin[ABS_CNT]; + __s32 absfuzz[ABS_CNT]; + __s32 absflat[ABS_CNT]; +}; +#endif /* _UAPI__UINPUT_H_ */ \ No newline at end of file