psm: Support detection of Synaptics touchpad v7.5 and above
Starting with firmware v7.5, the "Read TouchPad Modes" ($01) and "Read Capabilities" ($02) commands changed: previously constant bytes now carry variable information. We now compare those bytes to expected constants only for firmware prior to v7.5. Tested by: Zeus Panchenko <zeus@gnu.org.ua> MFC after: 1 week
This commit is contained in:
parent
af3c786c47
commit
778dcb1c13
@ -239,6 +239,10 @@ typedef struct synapticspacket {
|
||||
#define SYNAPTICS_QUEUE_CURSOR(x) \
|
||||
(x + SYNAPTICS_PACKETQUEUE) % SYNAPTICS_PACKETQUEUE
|
||||
|
||||
#define SYNAPTICS_VERSION_GE(synhw, major, minor) \
|
||||
((synhw).infoMajor > (major) || \
|
||||
((synhw).infoMajor == (major) && (synhw).infoMinor >= (minor)))
|
||||
|
||||
typedef struct synapticsaction {
|
||||
synapticspacket_t queue[SYNAPTICS_PACKETQUEUE];
|
||||
int queue_len;
|
||||
@ -867,7 +871,9 @@ doopen(struct psm_softc *sc, int command_byte)
|
||||
if (sc->hw.model == MOUSE_MODEL_SYNAPTICS) {
|
||||
mouse_ext_command(sc->kbdc, 1);
|
||||
get_mouse_status(sc->kbdc, stat, 0, 3);
|
||||
if (stat[1] == 0x47 && stat[2] == 0x40) {
|
||||
if ((SYNAPTICS_VERSION_GE(sc->synhw, 7, 5) ||
|
||||
stat[1] == 0x47) &&
|
||||
stat[2] == 0x40) {
|
||||
/* Set the mode byte -- request wmode where
|
||||
* available */
|
||||
if (sc->synhw.capExtended)
|
||||
@ -4383,7 +4389,7 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
|
||||
return (FALSE);
|
||||
if (get_mouse_status(kbdc, status, 0, 3) != 3)
|
||||
return (FALSE);
|
||||
if (status[1] != 0x47) {
|
||||
if (!SYNAPTICS_VERSION_GE(synhw, 7, 5) && status[1] != 0x47) {
|
||||
printf(" Failed to read extended capability bits\n");
|
||||
return (FALSE);
|
||||
}
|
||||
@ -4439,7 +4445,7 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
|
||||
return (FALSE);
|
||||
if (get_mouse_status(kbdc, status, 0, 3) != 3)
|
||||
return (FALSE);
|
||||
if (status[1] != 0x47) {
|
||||
if (!SYNAPTICS_VERSION_GE(synhw, 7, 5) && status[1] != 0x47) {
|
||||
printf(" Failed to read mode byte\n");
|
||||
return (FALSE);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user