[Patch] psm(4) ClickPad detection (was Re: Lenovo W540 so far)
Anthony Jenkins
Scoobi_doo at yahoo.com
Tue Jun 17 13:02:32 UTC 2014
On 06/17/2014 07:23, Eric McCorkle wrote:
> Thanks again. That did it. The touchpad is now completely working :D
>
> Only thing is it seems you can't use it along with moused/sysmouse. I assume this is because whatever protocol moused speaks is pre-multitouch.
>
> I suppose that would also mean that you couldn't plug in a USB mouse and have it just work with this setup. This also seems to keep the trackpoint from working (not that I ever use it...)
>
> On 06/16/2014 19:21, Ivan Rokotov wrote:
>> 2014-06-16 21:41 GMT+02:00 Eric McCorkle <eric at metricspace.net>:
>>> There's no virtual scrolling though. Has that been added to the driver yet,
>>> or am I missing some config items?
>>
>> Eric, what do you mean by virtual scrolling? In my case, two-finger
>> scrolling and edge scrolling are working (both horizontal and
>> vertical).
>>
>> Option "VertEdgeScroll" "on"
>> Option "HorizEdgeScroll" "on"
>> Option "VertTwoFingerScroll" "1"
>> Option "HorizTwoFingerScroll" "1"
>> Option "VertScrollDelta" "-50"
>> Option "HorizScrollDelta" "-60"
>>
>> (minus is for mac-style 'natural scrolling').
>>
>> Or you mean something else?
>> Ivan
>>
The moused/sysmouse bit is what I was going to work on first. I used to have patches to sysutils/hald and x11-drivers/xf86-input-synaptics that would check moused(8) to see if Synaptics functionality was enabled and report the input device as a "touchpad" rather than a "mouse", which would allow the Synaptics driver to load. The move from hald to our homebrew device detection code means I have to re-learn how to do this.
In the meantime, I did manage to patch psm(4) to at least detect a ClickPad (and some other properties we weren't detecting). No idea if it'd make a difference to software higher up; it'd have to know about the new struct fields I added. I'm also pretty sure I'd have to add code to handle the ClickPad clicks and report it as an additional button.
Patch /shouldn't/ represent an ABA change because I stuck the additional fields at the end of the synapticshw_t struct and advertise/guard their availability with a HAS_EXT_0C_CAPS macro, but I'm new to submitting driver patches...anyway it's not ready yet, just showing I'm workin' on it :-)
[root at ajenkins-hplaptop /usr/src]# svn diff sys/sys/mouse.h sys/dev/atkbdc/psm.c
Index: sys/sys/mouse.h
===================================================================
--- sys/sys/mouse.h (revision 267519)
+++ sys/sys/mouse.h (working copy)
@@ -49,6 +49,7 @@
#endif
#define MOUSE_SYN_GETHWINFO _IOR('M', 100, synapticshw_t)
+#define HAS_EXT_0C_CAPS 1
/* mouse status block */
typedef struct mousestatus {
@@ -110,6 +111,16 @@
int capMiddle;
int nExtendedButtons;
int nExtendedQueries;
+#ifdef HAS_EXT_0C_CAPS
+ /* Extended (0x0c query) capabilities */
+ int capClickPad;
+ int capClickPad2Btn;
+ int capMaxDimensions;
+ int capMinDimensions;
+ int capAdvGesture;
+ int capReducedFiltering;
+ int capImageSensor;
+#endif
} synapticshw_t;
/* iftype */
Index: sys/dev/atkbdc/psm.c
===================================================================
--- sys/dev/atkbdc/psm.c (revision 267519)
+++ sys/dev/atkbdc/psm.c (working copy)
@@ -3623,20 +3623,13 @@
static int
mouse_ext_command(KBDC kbdc, int command)
{
- int c;
+ int c, i;
- c = (command >> 6) & 0x03;
- if (set_mouse_resolution(kbdc, c) != c)
- return (FALSE);
- c = (command >> 4) & 0x03;
- if (set_mouse_resolution(kbdc, c) != c)
- return (FALSE);
- c = (command >> 2) & 0x03;
- if (set_mouse_resolution(kbdc, c) != c)
- return (FALSE);
- c = (command >> 0) & 0x03;
- if (set_mouse_resolution(kbdc, c) != c)
- return (FALSE);
+ for (i = 6; i >= 0; i -= 2) {
+ c = (command >> i) & 0x03;
+ if (set_mouse_resolution(kbdc, c) != c)
+ return (FALSE);
+ }
return (TRUE);
}
@@ -4470,7 +4463,7 @@
buttons = 0;
synhw.capExtended = (status[0] & 0x80) != 0;
if (synhw.capExtended) {
- synhw.nExtendedQueries = (status[0] & 0x70) != 0;
+ synhw.nExtendedQueries = (status[0] & 0x70) >> 4;
synhw.capMiddle = (status[0] & 0x04) != 0;
synhw.capPassthrough = (status[2] & 0x80) != 0;
synhw.capSleep = (status[2] & 0x10) != 0;
@@ -4480,15 +4473,19 @@
if (verbose >= 2) {
printf(" Extended capabilities:\n");
- printf(" capExtended: %d\n", synhw.capExtended);
- printf(" capMiddle: %d\n", synhw.capMiddle);
+ printf(" capExtended: %d\n", synhw.capExtended);
+ printf(" capMiddle: %d\n", synhw.capMiddle);
printf(" nExtendedQueries: %d\n",
synhw.nExtendedQueries);
- printf(" capPassthrough: %d\n", synhw.capPassthrough);
- printf(" capSleep: %d\n", synhw.capSleep);
- printf(" capFourButtons: %d\n", synhw.capFourButtons);
- printf(" capMultiFinger: %d\n", synhw.capMultiFinger);
- printf(" capPalmDetect: %d\n", synhw.capPalmDetect);
+ printf(" capPassthrough: %d\n",
+ synhw.capPassthrough);
+ printf(" capSleep: %d\n", synhw.capSleep);
+ printf(" capFourButtons: %d\n",
+ synhw.capFourButtons);
+ printf(" capMultiFinger: %d\n",
+ synhw.capMultiFinger);
+ printf(" capPalmDetect: %d\n",
+ synhw.capPalmDetect);
}
/*
@@ -4496,7 +4493,7 @@
* supports this number of extended queries. We can load
* more information about buttons using query 0x09.
*/
- if (synhw.capExtended && synhw.nExtendedQueries) {
+ if (synhw.capExtended && synhw.nExtendedQueries >= 1) {
if (mouse_ext_command(kbdc, 0x09) == 0)
return (FALSE);
if (get_mouse_status(kbdc, status, 0, 3) != 3)
@@ -4508,12 +4505,45 @@
* if capMiddle support bit is set.
*/
buttons = synhw.nExtendedButtons + synhw.capMiddle;
- } else
+ } else {
/*
* If the capFourButtons support bit is set,
* add a fourth button to the total button count.
*/
buttons = synhw.capFourButtons ? 1 : 0;
+ }
+#ifdef HAS_EXT_0C_CAPS
+ if (synhw.capExtended && synhw.nExtendedQueries >= 4) {
+ if (mouse_ext_command(kbdc, 0x0c) == 0)
+ return (FALSE);
+ if (get_mouse_status(kbdc, status, 0, 3) != 3)
+ return (FALSE);
+ synhw.capClickPad = (status[0] & 0x10) != 0;
+ synhw.capClickPad2Btn = (status[1] & 0x01) != 0;
+ synhw.capMaxDimensions = (status[0] & 0x02) != 0;
+ synhw.capMinDimensions = (status[1] & 0x20) != 0;
+ synhw.capAdvGesture = (status[0] & 0x08) != 0;
+ synhw.capReducedFiltering = (status[1] & 0x04) != 0;
+ synhw.capImageSensor = (status[1] & 0x08) != 0;
+ if (verbose >= 2) {
+ printf(" Extended capabilities (0x0c query):\n");
+ printf(" capClickPad: %d\n",
+ synhw.capClickPad);
+ printf(" capClickPad2Btn: %d\n",
+ synhw.capClickPad2Btn);
+ printf(" capMaxDimensions: %d\n",
+ synhw.capMaxDimensions);
+ printf(" capMinDimensions: %d\n",
+ synhw.capMinDimensions);
+ printf(" capAdvGesture: %d\n",
+ synhw.capAdvGesture);
+ printf(" capReducedFiltering: %d\n",
+ synhw.capReducedFiltering);
+ printf(" capImageSensor: %d\n",
+ synhw.capImageSensor);
+ }
+ }
+#endif /* HAS_EXT_0C_CAPS */
}
if (verbose >= 2) {
if (synhw.capExtended)
More information about the freebsd-mobile
mailing list