2a924d7179
The newer trackpoints from ALPS, Elan and NXP implement a very limited subset of extended commands and controls that the original trackpoints implemented, so we should not be exposing not working controls in sysfs. The newer trackpoints also do not implement "Power On Reset" or "Read Extended Button Status", so we should not be using these commands during initialization. While we are at it, let's change "unsigned char" to u8 for byte data or bool for booleans and use better suited error codes instead of -1. Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
170 lines
5 KiB
C
170 lines
5 KiB
C
/*
|
|
* IBM TrackPoint PS/2 mouse driver
|
|
*
|
|
* Stephen Evanchik <evanchsa@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published by
|
|
* the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef _TRACKPOINT_H
|
|
#define _TRACKPOINT_H
|
|
|
|
/*
|
|
* These constants are from the TrackPoint System
|
|
* Engineering documentation Version 4 from IBM Watson
|
|
* research:
|
|
* http://wwwcssrv.almaden.ibm.com/trackpoint/download.html
|
|
*/
|
|
|
|
#define TP_COMMAND 0xE2 /* Commands start with this */
|
|
|
|
#define TP_READ_ID 0xE1 /* Sent for device identification */
|
|
|
|
/*
|
|
* Valid first byte responses to the "Read Secondary ID" (0xE1) command.
|
|
* 0x01 was the original IBM trackpoint, others implement very limited
|
|
* subset of trackpoint features.
|
|
*/
|
|
#define TP_VARIANT_IBM 0x01
|
|
#define TP_VARIANT_ALPS 0x02
|
|
#define TP_VARIANT_ELAN 0x03
|
|
#define TP_VARIANT_NXP 0x04
|
|
|
|
/*
|
|
* Commands
|
|
*/
|
|
#define TP_RECALIB 0x51 /* Recalibrate */
|
|
#define TP_POWER_DOWN 0x44 /* Can only be undone through HW reset */
|
|
#define TP_EXT_DEV 0x21 /* Determines if external device is connected (RO) */
|
|
#define TP_EXT_BTN 0x4B /* Read extended button status */
|
|
#define TP_POR 0x7F /* Execute Power on Reset */
|
|
#define TP_POR_RESULTS 0x25 /* Read Power on Self test results */
|
|
#define TP_DISABLE_EXT 0x40 /* Disable external pointing device */
|
|
#define TP_ENABLE_EXT 0x41 /* Enable external pointing device */
|
|
|
|
/*
|
|
* Mode manipulation
|
|
*/
|
|
#define TP_SET_SOFT_TRANS 0x4E /* Set mode */
|
|
#define TP_CANCEL_SOFT_TRANS 0xB9 /* Cancel mode */
|
|
#define TP_SET_HARD_TRANS 0x45 /* Mode can only be set */
|
|
|
|
|
|
/*
|
|
* Register oriented commands/properties
|
|
*/
|
|
#define TP_WRITE_MEM 0x81
|
|
#define TP_READ_MEM 0x80 /* Not used in this implementation */
|
|
|
|
/*
|
|
* RAM Locations for properties
|
|
*/
|
|
#define TP_SENS 0x4A /* Sensitivity */
|
|
#define TP_MB 0x4C /* Read Middle Button Status (RO) */
|
|
#define TP_INERTIA 0x4D /* Negative Inertia */
|
|
#define TP_SPEED 0x60 /* Speed of TP Cursor */
|
|
#define TP_REACH 0x57 /* Backup for Z-axis press */
|
|
#define TP_DRAGHYS 0x58 /* Drag Hysteresis */
|
|
/* (how hard it is to drag */
|
|
/* with Z-axis pressed) */
|
|
|
|
#define TP_MINDRAG 0x59 /* Minimum amount of force needed */
|
|
/* to trigger dragging */
|
|
|
|
#define TP_THRESH 0x5C /* Minimum value for a Z-axis press */
|
|
#define TP_UP_THRESH 0x5A /* Used to generate a 'click' on Z-axis */
|
|
#define TP_Z_TIME 0x5E /* How sharp of a press */
|
|
#define TP_JENKS_CURV 0x5D /* Minimum curvature for double click */
|
|
#define TP_DRIFT_TIME 0x5F /* How long a 'hands off' condition */
|
|
/* must last (x*107ms) for drift */
|
|
/* correction to occur */
|
|
|
|
/*
|
|
* Toggling Flag bits
|
|
*/
|
|
#define TP_TOGGLE 0x47 /* Toggle command */
|
|
|
|
#define TP_TOGGLE_MB 0x23 /* Disable/Enable Middle Button */
|
|
#define TP_MASK_MB 0x01
|
|
#define TP_TOGGLE_EXT_DEV 0x23 /* Disable external device */
|
|
#define TP_MASK_EXT_DEV 0x02
|
|
#define TP_TOGGLE_DRIFT 0x23 /* Drift Correction */
|
|
#define TP_MASK_DRIFT 0x80
|
|
#define TP_TOGGLE_BURST 0x28 /* Burst Mode */
|
|
#define TP_MASK_BURST 0x80
|
|
#define TP_TOGGLE_PTSON 0x2C /* Press to Select */
|
|
#define TP_MASK_PTSON 0x01
|
|
#define TP_TOGGLE_HARD_TRANS 0x2C /* Alternate method to set Hard Transparency */
|
|
#define TP_MASK_HARD_TRANS 0x80
|
|
#define TP_TOGGLE_TWOHAND 0x2D /* Two handed */
|
|
#define TP_MASK_TWOHAND 0x01
|
|
#define TP_TOGGLE_STICKY_TWO 0x2D /* Sticky two handed */
|
|
#define TP_MASK_STICKY_TWO 0x04
|
|
#define TP_TOGGLE_SKIPBACK 0x2D /* Suppress movement after drag release */
|
|
#define TP_MASK_SKIPBACK 0x08
|
|
#define TP_TOGGLE_SOURCE_TAG 0x20 /* Bit 3 of the first packet will be set to
|
|
to the origin of the packet (external or TP) */
|
|
#define TP_MASK_SOURCE_TAG 0x80
|
|
#define TP_TOGGLE_EXT_TAG 0x22 /* Bit 3 of the first packet coming from the
|
|
external device will be forced to 1 */
|
|
#define TP_MASK_EXT_TAG 0x04
|
|
|
|
|
|
/* Power on Self Test Results */
|
|
#define TP_POR_SUCCESS 0x3B
|
|
|
|
/*
|
|
* Default power on values
|
|
*/
|
|
#define TP_DEF_SENS 0x80
|
|
#define TP_DEF_INERTIA 0x06
|
|
#define TP_DEF_SPEED 0x61
|
|
#define TP_DEF_REACH 0x0A
|
|
|
|
#define TP_DEF_DRAGHYS 0xFF
|
|
#define TP_DEF_MINDRAG 0x14
|
|
|
|
#define TP_DEF_THRESH 0x08
|
|
#define TP_DEF_UP_THRESH 0xFF
|
|
#define TP_DEF_Z_TIME 0x26
|
|
#define TP_DEF_JENKS_CURV 0x87
|
|
#define TP_DEF_DRIFT_TIME 0x05
|
|
|
|
/* Toggles */
|
|
#define TP_DEF_MB 0x00
|
|
#define TP_DEF_PTSON 0x00
|
|
#define TP_DEF_SKIPBACK 0x00
|
|
#define TP_DEF_EXT_DEV 0x00 /* 0 means enabled */
|
|
#define TP_DEF_TWOHAND 0x00
|
|
#define TP_DEF_SOURCE_TAG 0x00
|
|
|
|
#define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd))
|
|
|
|
struct trackpoint_data {
|
|
u8 variant_id;
|
|
u8 firmware_id;
|
|
|
|
u8 sensitivity, speed, inertia, reach;
|
|
u8 draghys, mindrag;
|
|
u8 thresh, upthresh;
|
|
u8 ztime, jenks;
|
|
u8 drift_time;
|
|
|
|
/* toggles */
|
|
bool press_to_select;
|
|
bool skipback;
|
|
bool ext_dev;
|
|
};
|
|
|
|
#ifdef CONFIG_MOUSE_PS2_TRACKPOINT
|
|
int trackpoint_detect(struct psmouse *psmouse, bool set_properties);
|
|
#else
|
|
inline int trackpoint_detect(struct psmouse *psmouse, bool set_properties)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_MOUSE_PS2_TRACKPOINT */
|
|
|
|
#endif /* _TRACKPOINT_H */
|