From 9d8e39cc882a75e477cbd7a6824e5ef089db46ba Mon Sep 17 00:00:00 2001 From: nakst <> Date: Thu, 14 Oct 2021 21:50:52 +0100 Subject: [PATCH] ps/2 scrolling --- desktop/desktop.cpp | 2 +- drivers/ps2.cpp | 39 ++++++++++++++++++++++++++++++--------- res/Theme Source.dat | Bin 520096 -> 519468 bytes res/Theme.dat | Bin 29272 -> 29472 bytes 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index ae556e3..89a05d8 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -2946,7 +2946,7 @@ void DesktopMessage(EsMessage *message) { EsDateComponents reading; uint64_t linear; - if (ES_SUCCESS == EsDeviceControl(message->device.handle, ES_DEVICE_CONTROL_CLOCK_READ, &reading, &linear)) { + if (ES_SUCCESS == EsDeviceControl(handle, ES_DEVICE_CONTROL_CLOCK_READ, &reading, &linear)) { // TODO Scheduler timer is not particularly accurate, so we should periodically resynchronize with the clock. api.global->schedulerTimeOffset = (linear ?: DateToLinear(&reading)) - api.global->schedulerTimeMs; } diff --git a/drivers/ps2.cpp b/drivers/ps2.cpp index 9699e23..ff0561d 100644 --- a/drivers/ps2.cpp +++ b/drivers/ps2.cpp @@ -5,7 +5,7 @@ struct PS2Update { union { struct { - volatile int xMovement, yMovement; + volatile int xMovement, yMovement, zMovement; volatile unsigned buttons; }; @@ -25,6 +25,7 @@ struct PS2 { void WriteByte(KTimeout *timeout, uint8_t value); bool SetupKeyboard(KTimeout *timeout); bool SetupMouse(KTimeout *timeout); + bool SetMouseRate(KTimeout *timeout, int rate); bool PollRead(uint8_t *value, bool forMouse); void WaitInputBuffer(); @@ -202,6 +203,7 @@ void PS2MouseUpdated(EsGeneric _update) { KMouseUpdateData data = { .xMovement = update->xMovement * K_CURSOR_MOVEMENT_SCALE, .yMovement = update->yMovement * K_CURSOR_MOVEMENT_SCALE, + .yScroll = update->zMovement * K_CURSOR_MOVEMENT_SCALE, .buttons = update->buttons, }; @@ -316,7 +318,7 @@ bool PS2IRQHandler(uintptr_t interruptIndex, void *) { if (ps2.channels == 1 && interruptIndex == 12) return false; if (interruptIndex == 12) { - static uint8_t firstByte = 0, secondByte = 0, thirdByte = 0; + static uint8_t firstByte = 0, secondByte = 0, thirdByte = 0, fourthByte = 0; static size_t bytesFound = 0; if (bytesFound == 0) { @@ -331,9 +333,13 @@ bool PS2IRQHandler(uintptr_t interruptIndex, void *) { } else if (bytesFound == 2) { if (!ps2.PollRead(&thirdByte, true)) return false; bytesFound++; + if (ps2.mouseType == 3) return true; + } else if (bytesFound == 3) { + if (!ps2.PollRead(&fourthByte, true)) return false; + bytesFound++; } - KernelLog(LOG_VERBOSE, "PS/2", "mouse data", "Mouse data: %X%X%X\n", firstByte, secondByte, thirdByte); + KernelLog(LOG_VERBOSE, "PS/2", "mouse data", "Mouse data: %X%X%X%X\n", firstByte, secondByte, thirdByte, fourthByte); KSpinlockAcquire(&ps2.lastUpdatesLock); PS2Update *update = ps2.lastUpdates + ps2.lastUpdatesIndex; @@ -345,6 +351,7 @@ bool PS2IRQHandler(uintptr_t interruptIndex, void *) { update->buttons = ((firstByte & (1 << 0)) ? K_LEFT_BUTTON : 0) | ((firstByte & (1 << 1)) ? K_RIGHT_BUTTON : 0) | ((firstByte & (1 << 2)) ? K_MIDDLE_BUTTON : 0); + update->zMovement = -((int8_t) fourthByte); KRegisterAsyncTask(PS2MouseUpdated, update, false); @@ -434,6 +441,20 @@ bool PS2::SetupKeyboard(KTimeout *timeout) { return true; } +bool PS2::SetMouseRate(KTimeout *timeout, int rate) { + WaitInputBuffer(); + ProcessorOut8(PS2_PORT_COMMAND, PS2_WRITE_SECOND); + WaitInputBuffer(); + ProcessorOut8(PS2_PORT_DATA, PS2_MOUSE_SAMPLE_RATE); + if (ReadByte(timeout) != 0xFA) return false; + WaitInputBuffer(); + ProcessorOut8(PS2_PORT_COMMAND, PS2_WRITE_SECOND); + WaitInputBuffer(); + ProcessorOut8(PS2_PORT_DATA, rate); + if (ReadByte(timeout) != 0xFA) return false; + return true; +} + bool PS2::SetupMouse(KTimeout *timeout) { // TODO Mouse with scroll wheel detection. @@ -444,16 +465,16 @@ bool PS2::SetupMouse(KTimeout *timeout) { if (ReadByte(timeout) != 0xFA) return false; if (ReadByte(timeout) != 0xAA) return false; if (ReadByte(timeout) != 0x00) return false; + if (!SetMouseRate(timeout, 200)) return false; + if (!SetMouseRate(timeout, 100)) return false; + if (!SetMouseRate(timeout, 80)) return false; WaitInputBuffer(); ProcessorOut8(PS2_PORT_COMMAND, PS2_WRITE_SECOND); WaitInputBuffer(); - ProcessorOut8(PS2_PORT_DATA, PS2_MOUSE_SAMPLE_RATE); - if (ReadByte(timeout) != 0xFA) return false; - WaitInputBuffer(); - ProcessorOut8(PS2_PORT_COMMAND, PS2_WRITE_SECOND); - WaitInputBuffer(); - ProcessorOut8(PS2_PORT_DATA, 100); + ProcessorOut8(PS2_PORT_DATA, 0xF2); if (ReadByte(timeout) != 0xFA) return false; + mouseType = ReadByte(timeout); + if (!SetMouseRate(timeout, 100)) return false; WaitInputBuffer(); ProcessorOut8(PS2_PORT_COMMAND, PS2_WRITE_SECOND); WaitInputBuffer(); diff --git a/res/Theme Source.dat b/res/Theme Source.dat index bc6f27f28e985eaaa4d892934deb3d6ce827d461..9f99efcfbf142adc10fdf8d4441c039bbeacb32a 100644 GIT binary patch delta 172 zcmZ2*Uw+Lkc`il<1_pO#1_l|{$@A*WHact(WfYt~F@{-X`ras3_Q@e03ez*5vYSu8 zpUkKM>^8!i! zY$k@n$p=}CCkOayH1o8!^RzMoF%u9o12GE_vjQ>OcAi%D6p85p3)l@NJFs(1?^wVd WGX220 delta 161 zcmZ2;OMbz9c`il<1_lpi1_l|{>3vfe%{Dr05uNNHbY#236V?Zej2EU~+{)rVy~c<| zV|qXWYs7Q~J4S=e7bL{9nHUQv7gj}2zSCIIyr-poPYWXuGXXI(5VHU=D-g47-_yeW zMtu4Ke|C1(fc(t7lF5c;DnL^|`m;w*uF0&NUMtARF+Fz%`*fyXEYs~4u$xVGVCUHW JU=F)a008`SJ&phX diff --git a/res/Theme.dat b/res/Theme.dat index f7c65510d75393acbbdc39e8310a46c1d9969c02..407a390b2b979d0e5a918fba2e7873a9d4c9e517 100644 GIT binary patch delta 3258 zcmZ9OZA?>F7{|{&y@jfvRh;5{V}luFh!`=V12-K;7M&I-P-&GyTc9tzIN8QFW;G*` z4<<7{Y%v)zUBVKQq0z_^H+As?X1eKy3CT#N*@(@yWauzsnadRSzqhnppVRzX_?_qN zJm=igjz*QpuS&S4^3um0LWt#%rB#T1W{JOq2xDlURxl@H>0k<8#<2|SsygGVU}S;) zW>z&bB_6K;>>Gofo}>uyx&dk)C1BsFPbVn_yQ!Lls+!F4fOfDS48AIc3+$GGY4N;Z zpPNlWn1m_r+t!NocM#Bo5r>^H^sp6ofo)BiS)CT}7}(+@74c@e)eBaqC7EUl>hA}; z9P2`&s~5m(HM@d@v!Vn9q=2ucJ+fpIIMO zurc(<=$is|S54Mj5}TC`w$YG12_qlu4^`^>mRL_A;62vxSHS*ctQ2e|db?u9lFWF~ zHn1Z}Pj9pxY@H#oR+S6vL1H1X{K5^G%$&Vof1xwRByC_Hp)>J~){bW<*e86W!Tx4N z9|QX*kytB5h~r_vf0^M)u>Tl~fIVi;ePBxa2-ZU#>Q>>2I`vuJz z&^RuE9boJVm_lVqX)m<0nH!k-kg;J}r=}H;U}g;~ViYXMtZ##vSU00|L`@4%VrD*z z@DS`Svla&gPUO=MnFTDFWl8~?#h4YWlI2(kHpk3P>N3DomLv;o9y=WQV4t!i1z_`; zZxPrX#!A3eCw!+*YAN802^ia{U0`e2^XdRgV|FgEXP8|R*kYEr4QvTx9bv$wEMOfpW&0)`6H`sG5;Bl~{tkpeWnFc%U@#+QhBc8tg*u$=fKEU-XaX;7wtj>6=4}xtp z1l0O<3G5bQLtvX&ylY@D&DhbrWOMN_Sn&))O^O%=d)u(>T8=2#%gk<^%93%4F|z}= zv$0C`4SX%I2v)GGh6q|K(!pM3c3EKWF_sVZzQI?ks1WQOvniaox-?h<_!(PvDcE)v z&`>_@h`ey}}8 zJ6s}zU}1BT7G}C=Mckk#gk>%k~H{SFZtYUc8iD@&CkZ406xQr8b+5+EzN033|Nyq8zc&it>QDunhMTjcr&@ zk;MyP5>kfgj_slxET@+Fi|A}wkrJhQWou<&g>K(lA;f}d`*9hu)0v8|WLKqbeAr$j z2P^4o`+jMy(kCXX^ofbeBAHc9c~zTbS9Of+glTom)Dbhqhc%NPSFe?&dnwNmFc0iC zraD`roAo$pZe6*&;-v3uYNXdiInG0J$VGGWR?)CCS6cVclygd2YR^x(Y82UCtD8q^ zb@LK8&8|Hp``kJlcI&XcjyAgwDI@fyyFzBy>r?i6ZAy7am+QjP;h`<{<+9sDC+hQ3 z2R*UQPCY@V=|S#N%1BkE#Y^|=1JdTDEsf>MH9GAHN~=%%N4kB~;@zg)pmW|@X=$JZ zzC799K-+u)wEDEqDT^9uc0)j(Y@~04yXlcHMH#1C4MC-Vwl-DBt|rZ0PBhUOPc}_8 zZj*(6J#M#OpP2NcZ>vuDb7fY5^8DyD_C)S9|Tjq~#< zExD%f5YF9Un-JqrA5N0HT!=v^3fXW{+U-K*R|?SuMWINQ5R*`TH5e3yA`URfjqUEL z5#kjmo=9i{YI6xOq-mcJ8MTN94MR3J^0~F!x()?EBT#ld0zfKu$N_aj+HPfd;RyW# z75IecfJPxp12{Ac6*UTR5>lJs3-v-4KYqtS5oi+158$U1Gzs+tQDE?SfDl#>r8f%^ Og8HFHkOPexfc^&nD1Mj# delta 3340 zcmZ9Pe@v8h9LK-U_nrq(F+o65Q6b4l52lMI7UV%XX_6cqzq~v7b^JKEJ4D06A`Vtf z*O=ix*k~EU%{I1Z(WK@d*Tx@ewrHVaixn=MtlYW`&CC{Q@8{s|zJ9;#&GEdR&#&+2 z^E_W*@E2ujR`FU(eebt3#@0cm7RC-}96vGU#nM0X!E6#UgDLnDR|(ifHSDWk*};C* zRNYJo#&d&xE!YK;v;lr2K;5GQ>|6EGBwb+NsRpL11}zw{2kd*nSH-f6H; zGy`J>W(fKYwIKa91Tac*B}S--7w*<1SdE@!ktwKu2JEYa zE`+)|2UexqWrmy;Wgc*Y6fpWAV>wddc=}w4^CsiYPbgi(3YKmJs~6JiWn_W^k}*`tAa|p+@R1pEM0n+d%@x)yFRc4$!-uVQA#`nwpwB%Ucj|d zz)`Su5<3sJOnM*3z*3}um%)xntsV#4DA?(*-XvHP;sy4(&Cl=Ry%oV5O2>K3KWL z%!kiem%O@LnWvO}33MVlV&zh-;9o)yvC<0ZM8O)GDI8RysoU)0t!BDq{*p%(1^8Ie zAomwhOYACYFV5DIim?saR**;&#qnAzt~kYJJV}pP^0Y}@t)$!LJv6s|iceVr{-%UM z?kfrS&+Uz&ic%x@mr#bDF@6`%FAW+gMmkew;r24>Oy5LfTU1Iek5PPpYpI|-i~GyM zPUWIgg@t!j(7lRgZMH(pe{+A(ijQ0Av5ZYL;W29Wtqk4I-M*2`wVC|1jqcbw(VSe{ zQ`B!a@_aj8vOnOa%5#?vSQS288F1`sNmnaHzm6)pTGgpcQ%aRZi>elH4ObJd>C{_U zV^ON{J&uwy;sd#RY6L@NE4@?e<-N5O;V9-~wPbZ)5QB9C}+1#m3RNqeMH7 zD+6_>CsMLAi?cc!aHi2fU7nIpDRma!Uq_Wqd5TI$>#Mk_o_?&);KTK_w4qsvq9YA9 z-qt`@8=Cn<1HI5_RZ{7LMwjMp6l3}t10mArBd1Gib&9vfoPk>yP7{XHL@l1@xUY#` zudh_%>14Bmk2cf2<^d&*PPuG+#6@>p1ITgGZR2J)-Ewc{XYsKnjq*I3`J_AGpXmX~ zp@Yj4c(sQfc&vPOfqZ6Pb?(y^i@`g;kFoQGjHQ|xn}+&}81qB=({~&iwlL-_Vax|5 zmEv85jAdYu4@xQrgN%40`XS$b#@aFYaVX8k*bp?Y%g$H@COZs8RUtMsU4=6~3o|_r zMPp>ukPphPWvmw(gZxkh<}wUDUdNal8i8W!@jnSP3`I3C)&@;L+30sKGzpo|;67*y jGB%-T=rUw%MuAY8>j?lCcJF4)44s8$piB>fK(o;Qa&?kU