From ecf19954a66be45303680769a88c2c397a320fd6 Mon Sep 17 00:00:00 2001 From: Jaybee- Date: Mon, 11 Apr 2022 17:08:47 +1200 Subject: [PATCH 1/2] ps2 mouse initialize_and_move 1 second at 1MHz. Initialize a ps2 mouse, configure it; the mouse then reports movement data. - host resets device, waits for reset to complete - host sets sample rate to 200, 100, 80 - this activates reporting scroll wheel data is available - host sets device to maximum sample rate: 200; resolution=1: 2 count/mm; 1:1 scaling, stream mode - host gets device id, enable data reporting - after a delay, the mouse is moved, and reports it's changing location, in sequences of 4 bytes: - flags, x movement, y movement, z (scroll wheel) movement. - the sample data does not include any button presses or scroll wheel movement --- ps2/mouse/README.md | 28 ++++++++++++++++++ ...ps2_microsoft_mouse_initialize_and_move.sr | Bin 0 -> 5208 bytes 2 files changed, 28 insertions(+) create mode 100644 ps2/mouse/README.md create mode 100644 ps2/mouse/ps2_microsoft_mouse_initialize_and_move.sr diff --git a/ps2/mouse/README.md b/ps2/mouse/README.md new file mode 100644 index 0000000..5a7f1f8 --- /dev/null +++ b/ps2/mouse/README.md @@ -0,0 +1,28 @@ +-------------------------------- +PS/2 Mouse +-------------------------------- + +This is a collection of PS/2 mice communication examples. + +For details see: +http://www-ug.eecg.utoronto.ca/desl/nios_devices_SoC/datasheets/PS2%20Protocol.htm +http://www-ug.eecg.utoronto.ca/desl/nios_devices_SoC/datasheets/PS2%20Mouse%20Protocol.htm + + +ps2_microsoft_mouse_initialize_and_move.sr +------------------------------ + +This file contains setup and communication between a Windows host and a microsoft mouse. +The host releases the clock simultaneous to pulling the data low, which makes it challenging to +distinguish between "request-to-send" and a regular start-bit. + +Initialize a ps2 mouse, configure it; the mouse then reports movement data. + +- host resets device, waits for reset to complete +- host sets sample rate to 200, 100, 80 - this activates reporting scroll wheel data is available +- host sets device to maximum sample rate: 200; resolution=1: 2 count/mm; 1:1 scaling, stream mode +- host gets device id, enable data reporting +- after a delay, the mouse is moved, and reports it's changing location, in sequences of 4 bytes: + - flags, x movement, y movement, z (scroll wheel) movement. + - the sample data does not include any button presses or scroll wheel movement + diff --git a/ps2/mouse/ps2_microsoft_mouse_initialize_and_move.sr b/ps2/mouse/ps2_microsoft_mouse_initialize_and_move.sr new file mode 100644 index 0000000000000000000000000000000000000000..c1b6562bd2372d800f98becf2dc00f1d90d9c49f GIT binary patch literal 5208 zcmeHLXH-+$whoABlpK#iKtL=&5Rw3D0Huk5;7KA!dP47D=+Yt`X%-|LA_)p2M5=@m z>X9HIC?H5P5Ja$1g@8dyP(yp0bMAe2ygSDI^M1V_Z|$+hUVE%Lv)7ty?(h3DO|iR# z_JMZVo$D!pCWb*q*IqAZ+csBweuKY|9AVAn44cw8Lj^Q3qtRE zsz=G3VKh0JzkY3-N7?4JMfE-9ZafH(=5%<$R*Esv@zIG}Y}Nh$bpHSQ|0V))ITbCN z{BB9CDJXdFPUw_ZIi_bxjmH&pJ|?#U%Y)g7`S<7v3YxF zz})ql0cVKwrQ=iMMb4Vd^`P$MDsyX*lVUIQid)7z4dIK^tF9wRUvZ87*-3+*<9xpV zx5Su@D!){eaeo_ny-1c|2*Ld6^eCw%tpJ6K;?326U!F3}bRFqnDC651spIkfeLc{o z(6c!CoVRHkuIo*%Bm5?HGB<$x2Ii-jUh6vY`Z$@CS}>nB0`Bf4j@&LVV%_}x)$4R4 z7Qbfdm7_vCV++~-?c=_+E}L_qUiiie8s|WmQZhZo@Nk$|rpe5LwQ3Dx-ps_@ zb9{GAVC)Yc@tBi+=bBJQPVGk|8?n~t#aCVg9I#E zhHYpBZd6B1+CJTu3R5qwV^DyLrcsu-g8=`R+GmHi0Ws0jeB&>sEt?->nwQy&x+}y` z$WcyD>^LfbmKnH-vfW-9TZKj#L&Wr=jhYi52^)IET$(R70KvXaurP-U3S$cWtv=e#sJlk|;L#|w`} zcx+V*hMyE6BP203MLfm0aC=&l^Ci0qwU`_C-$}~jBG!q#bi_LeGnoV1B-^wIW41sL z3`EyrSA{>L7o=9|aB9f>Pgb)iDK#-npk-%~!Mqum#G8Ftp&$34vDP{?sE~vR)xr(7 z<;|VkC|r(@|NH4?qg45l7swP z_0PrmHP-55Pn(Qd30&&K&PrN^Uk6ialUeZbc$ndXyikbXD+(VMn*CU4o+D0F1P~`wQF5U`1DPDQi7Ne$UL1T(wzih- zmsT4}Ri%}^G<{H0>I{A^oSqDWV5Oy~7|uXfD>*GU1jnSi5c-Kj5g`r>uJ8x-0G~b*saGueb^{ly$olxu?PGR zQXn1{e9yTHeJ-={?mp^!!HP{Mw6@N?6YnmQ8QB>z^i!vS^%+Q&WLN`vXX#W|DeBsJ z2*y_X*A(axJ7hKV#KV4(=gG;i$hCNw^u_+d#5 zp~vy8t?e`g0i#BUY%AGIt*o9Ygq3Qqg=m>Az=rzW6dRz=3m~#5#~&sJL;dZT(jlL$ zV^R6++9#&%ZwI9^^ypdpARbN^8A5xhJ@?&2ANClG>73t$l`RJB{VH!-lh#jJxbVaE z>%yz*qaV^gm+YFtfWipC`|)rmlg@xzZTZM=f0Rj6KdKONn!|oCi`K(1+<~NthsDW= zEcFjfQ^T-m^+bQ@{SkzeiTnJ9DpA_r7y`*kIQ;};S&YOXxFIJQUwv*Rl(--Cs zP}gE%<#O;xZ+Klcrc58jt_RtYAT^}lY#bzKCS(8TcBte}Aee=XTYrpYsmRS$guFG4 zAPRgOInKPSh>)VHOvkfpL*8}<^tI_+h4*Z@KG>HHJu+8Oc5$y45Y88@5dycP@czBP znWfb@L!UpAe)c(|hxJxa7J5TDi#5(&rnc3{-vlDOZACFF%uoxlL7TzRTH<>T*5JUq zs)F8E5MjBmAb2v>S9_0ZtzvyxDGx!VvTUi$xUD{RS3v2`rIh*-k#THPfc3QXBQoo6e;+3 zRa33YevG5L?++tf43wDH#)Q+!!w%rSl^(*O`6%$G_czY1psiWml(I_@4_!E3Pz`Bw zCsfAl+7l94V^gx%H=ngW1-q>3%JH&7KUEg5N|{jsPUj!!zucK+ujpSAS`M8ID*W-p zw6}Rnt(2z2Js3dRLC6O)^{Pd^lk>raKXN&xl`Q-FTyKf~68kRAb6-A-Ol!lf1r^#c zGuIl(;qMj7cfl$BB{8sZuHOOc*ulK^yDv)SqTeTbM+8q{;_L}yQwUtplb4Ul!>G~P z;WE98u=ftJYg#MUG7$u+LuTQ@9SaQ5$T4QwQtzZ&FwAc4(VHLkO3f*l3bmEzA<=i? zxay;n&)0)j5dwV5<>nw5rE@q2M#u~fza`Zi|YB-NVh=Zof zIub~M`<-89vO6iY(tTkB?wJf_@dqna_FaDIMFwD!)`be8Q^d@$LGvD~U+1OM*fbNm z)}HZ##%cYkguqg_xe8j?O!$(h8i0z@&C5D;f*rkk_lGQuZR8sF8cK{WpPd)Iu@jfM z_r%xJKGJ~^UFRIooR5Ag5~RkOJE=ujk1>OGvMq<;{l$XMv1 z@Q;1(d2WtI;Gn{im1Id@^NpZd`2 z3n}d{$*3jecVmzMlL%bJXPxRL;LTZFCBnL#4ZDgQHn7;V#q@(lw@P9VAr}>e`;vvTNgEuhmn2+o8WRZg4_ARj8hjBCcC_ z(rdLuk+A1OqUcbbSIOfRyHnx1@UVkzIUh%%NP*r~a>JbS^AmU$;smCo?8ho*FO?&G zBucuYn8S-iCNH<25fii&!YUk+!SZn9LqsI+m~8LmJ2J4tpOEQ4+s%ub9GBQzX=x!{j%}<%Ixmy=dPc|0g4@t1tEHlPb*qK&noO4&AES^;*k0%R*srHL! zRt*k_gQp#{=B7>N`U8t)mPQjS64sDifM}72^8@t7QJAStzo&TQsg^u%;sZw zS)WHs7Hr6R&dSnBABro*j;Sj^+5_Orx(g|xgB80*39p7M?a%`5C$&0 z=)-NQ?_?ka$gnOl$E>=*&edizFCfAHwvpy!k=#sHwLF##Gt?B>W15b<4U@-a4-4h! zV#TvfQcSv7{H!pGe)Fqb^H?TZAtmxxhbMU+;6IQLOpzLT6*h3Z$*1pX_~9o6)TqA3 zF*N(gR90b*GPVsGo(a3<4nBMY`Ey?KmlyBq{=7oh{LLiNAH0wS14l=Gtm7n+qQK>T zkm*xL;@Gv|c9*9ftz@ys`yDTOO?=1!H(e)gG-&NNk2W5L*zPDfu#swOvap8wS8YQN z@r&nCSuj?yLBnfpX*r$~(t@_P(=;d36(q8cdRei(@jeN~{A46S>hEdrvaEU8xPVk9GL2EIiW&C3cT!_RGD4!8rS&1lfy4tXlf{au)5hS z-6n})A`qu7Md5v_t*5VNTASM2-=vBZ7B~cMDV1`rbIL9je!0KS+;R*#ActXOaY zfMd3yC5yAOsPW`#r7{;VAO(_B_f5wq1TMk8rc!QtSvD|cvrvXgfT^RwgBqiPzj=-1 zsOfeT$BK}Oa5R{1uDuC+R)If$f!OA)KgZWklYFDkT zWX4=iXBZVE!$2$7`TOv(2@bY&<{VusfYj&^b?JlpVR2zJ5q3@-SSqN&JRI$_x!Pxn zu{8l7*xrR518{2j*)3W@qqZXeMYJP{qC4W6u4PA;qB1d~EWL15O$%1{icWr$C?ILA zU8lX^LWdtAG!yb&y6T|TgX00ed!lZI;Ly^!Tz=1?XtG|ypu>K-Ynf%ofSs>dwqcCW z2u#T{(`Tz|btW>{qPAcQ8bAxu+efINwjB2u9Ed2N%hvlB++Q|3f({dqu1Zq8U3SP_qWr3F4+CcNdXxC lvwZjOUjJT3` Date: Fri, 28 Apr 2023 15:57:41 -0700 Subject: [PATCH 2/2] ps2: Added QNX ps2 mouse example - Added example of host-to-mouse configuration and mouse-to-host movement packets - Updated README --- ps2/mouse/README.md | 19 ++++++++++++++++++ .../ps2_qnx_mouse_initialize_and_move.sr | Bin 0 -> 82825 bytes 2 files changed, 19 insertions(+) create mode 100644 ps2/mouse/ps2_qnx_mouse_initialize_and_move.sr diff --git a/ps2/mouse/README.md b/ps2/mouse/README.md index 5a7f1f8..d7d62d8 100644 --- a/ps2/mouse/README.md +++ b/ps2/mouse/README.md @@ -9,6 +9,25 @@ http://www-ug.eecg.utoronto.ca/desl/nios_devices_SoC/datasheets/PS2%20Protocol.h http://www-ug.eecg.utoronto.ca/desl/nios_devices_SoC/datasheets/PS2%20Mouse%20Protocol.htm +ps2_qnx_mouse_initialize_and_move.sr +------------------------------ + +This file contains setup and communication between a QNX host and a standard mouse. +The mouse packets are 3 bytes long (standard mouse, no scrollwheel) +The sample includes x movement, y movement, and a click. + +Initialize a ps2 mouse, configure it; the mouse then reports movement data. +- Power is turned on, mouse resets +- Host resets device, waits for reset to complete +- Host waits for GUI to start (about 90 seconds) +- Host sets sample rate to 40 samples/second +- Host sets resolution to 8 counts/mm +- Host enables data streaming +- After a delay, the mouse is moved, and reports its changing location in a sequence of 3 bytes: + - flags, x movement, y movement + - The sample includes x and y movement, as well as two left clicks + + ps2_microsoft_mouse_initialize_and_move.sr ------------------------------ diff --git a/ps2/mouse/ps2_qnx_mouse_initialize_and_move.sr b/ps2/mouse/ps2_qnx_mouse_initialize_and_move.sr new file mode 100644 index 0000000000000000000000000000000000000000..c40aa7a5056404ea681500c03882aca316a44806 GIT binary patch literal 82825 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