diff options
-rw-r--r-- | usr.sbin/moused/moused.c | 73 | ||||
-rw-r--r-- | usr.sbin/moused/moused.h | 36 |
2 files changed, 89 insertions, 20 deletions
diff --git a/usr.sbin/moused/moused.c b/usr.sbin/moused/moused.c index 8974e980319..3b65231f4c1 100644 --- a/usr.sbin/moused/moused.c +++ b/usr.sbin/moused/moused.c @@ -187,7 +187,7 @@ mouse_t mouse = { proto : P_UNKNOWN, baudrate : 1200, old_baudrate : 1200, - rate : 0, + rate : MOUSE_RATE_UNKNOWN, resolution : MOUSE_RES_UNKNOWN, zmap: 0, wmode: 0, @@ -329,8 +329,6 @@ mouse_fill_mousemode(void) /* default settings */ mouse.mode.protocol = P_UNKNOWN; - mouse.mode.rate = -1; /* unknown */ - mouse.mode.resolution = MOUSE_RES_UNKNOWN; mouse.mode.accelfactor = 0; /* no accel */ if (strcmp(mouse.portname,PMS_DEV) == 0) { @@ -358,6 +356,47 @@ mouse_fill_mousemode(void) } if (mouse.proto != -1) mouse.mode.protocol = mouse.proto; + + /* resolution */ + + switch (mouse.resolution) { + case MOUSE_RES_HIGH: + case MOUSE_RES_MEDIUMHIGH: + case MOUSE_RES_MEDIUMLOW: + case MOUSE_RES_LOW: + mouse.mode.resolution = mouse.resolution; + break; + case MOUSE_RES_DEFAULT: + case MOUSE_RES_UNKNOWN: + /* default to low resolution */ + mouse.mode.resolution = MOUSE_RES_LOW; + break; + default: + if (mouse.resolution >= 200) + mouse.mode.resolution = MOUSE_RES_HIGH; + else if (mouse.resolution >= 100) + mouse.mode.resolution = MOUSE_RES_MEDIUMHIGH; + else if (mouse.resolution >= 50) + mouse.mode.resolution = MOUSE_RES_MEDIUMLOW; + else mouse.mode.resolution = MOUSE_RES_LOW; + } + + /* sample rate */ + + if (mouse.rate != MOUSE_RATE_UNKNOWN) { + if (mouse.rate >= 200) + mouse.mode.rate = MOUSE_RATE_VERY_HIGH; + else if (mouse.rate >= 100) + mouse.mode.rate = MOUSE_RATE_HIGH; + else if (mouse.rate >= 80) + mouse.mode.rate = MOUSE_RATE_MEDIUM_HIGH; + else if (mouse.rate >= 60) + mouse.mode.rate = MOUSE_RATE_MEDIUM_LOW; + else if (mouse.rate >= 40) + mouse.mode.rate = MOUSE_RATE_LOW; + else + mouse.mode.rate = MOUSE_RATE_VERY_LOW; + } } static void @@ -1010,13 +1049,27 @@ mouse_init(void) } break; - case P_BM: + case P_BM: + break; + case P_PS2: - if (mouse.rate >= 0) - mouse.mode.rate = mouse.rate; - if (mouse.resolution != MOUSE_RES_UNKNOWN) - mouse.mode.resolution = mouse.resolution; - /* XXX Rate and resolution are not set ! (pms driver can't) XXX */ + + /* now sets the resolution and rate for PS/2 mice */ + + /* always sets resolution, to a default value if no value is given */ + + c = PS2_SET_RES; + write(mouse.mfd, &c, 1); + c = mouse.mode.resolution; + write(mouse.mfd, &c, 1); + + if (mouse.rate != MOUSE_RATE_UNKNOWN) { + c = PS2_SET_RATE; + write(mouse.mfd, &c, 1); + c = mouse.mode.rate; + write(mouse.mfd, &c, 1); + } + break; default: @@ -1868,7 +1921,7 @@ main(int argc, char **argv) if (strcmp(optarg, "high") == 0) mouse.resolution = MOUSE_RES_HIGH; else if (strcmp(optarg, "medium-high") == 0) - mouse.resolution = MOUSE_RES_HIGH; + mouse.resolution = MOUSE_RES_MEDIUMHIGH; else if (strcmp(optarg, "medium-low") == 0) mouse.resolution = MOUSE_RES_MEDIUMLOW; else if (strcmp(optarg, "low") == 0) diff --git a/usr.sbin/moused/moused.h b/usr.sbin/moused/moused.h index 1f983a1d8c3..30499b9f05a 100644 --- a/usr.sbin/moused/moused.h +++ b/usr.sbin/moused/moused.h @@ -273,12 +273,28 @@ typedef struct { /* Mouse resolutions */ -#define MOUSE_RES_UNKNOWN (-1) -#define MOUSE_RES_DEFAULT 0 -#define MOUSE_RES_LOW (-2) -#define MOUSE_RES_MEDIUMLOW (-3) -#define MOUSE_RES_MEDIUMHIGH (-4) -#define MOUSE_RES_HIGH (-5) +#define MOUSE_RES_DEFAULT 254 +#define MOUSE_RES_UNKNOWN 255 +#define MOUSE_RES_LOW 0 +#define MOUSE_RES_MEDIUMLOW 1 +#define MOUSE_RES_MEDIUMHIGH 2 +#define MOUSE_RES_HIGH 3 + +/* Mouse report rates */ + +#define MOUSE_RATE_UNKNOWN 255 +#define MOUSE_RATE_DEFAULT 80 +#define MOUSE_RATE_VERY_LOW 20 +#define MOUSE_RATE_LOW 40 +#define MOUSE_RATE_MEDIUM_LOW 60 +#define MOUSE_RATE_MEDIUM_HIGH 80 +#define MOUSE_RATE_HIGH 100 +#define MOUSE_RATE_VERY_HIGH 200 + +/* PS/2 rate and resolution */ + +#define PS2_SET_RATE 0xf3 +#define PS2_SET_RES 0xe8 /* serial PnP ID string */ typedef struct { @@ -308,8 +324,8 @@ typedef struct mousehw { typedef struct mousemode { int protocol; /* MOUSE_PROTO_XXX */ - int rate; /* report rate (per sec), -1 if unknown */ - int resolution; /* MOUSE_RES_XXX, -1 if unknown */ + unsigned char rate; /* report rate (per sec), -1 if unknown */ + unsigned char resolution;/* MOUSE_RES_XXX, -1 if unknown */ int accelfactor; /* accelation factor (must be 1 or greater) */ int packetsize; /* the length of the data packet */ unsigned char syncmask[2]; /* sync. data bits in the header byte */ @@ -323,8 +339,8 @@ typedef struct mouse_s { int proto; /* MOUSE_PROTO_XXX */ int baudrate; int old_baudrate; - int rate; /* report rate */ - int resolution; /* MOUSE_RES_XXX or a positive number */ + unsigned char rate; /* report rate */ + unsigned char resolution; /* MOUSE_RES_XXX or a positive number */ int zmap; /* MOUSE_{X|Y}AXIS or a button number */ int wmode; /* wheel mode button number */ int mfd; /* mouse file descriptor */ |