1) Add macros DEVNAME
2) Add generic functions
--
Alexandr Shadchin
Index: pms.c
===================================================================
RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
retrieving revision 1.12
diff -u -p -r1.12 pms.c
--- pms.c 5 Nov 2010 16:10:49 -0000 1.12
+++ pms.c 6 Nov 2010 17:42:02 -0000
@@ -38,6 +38,8 @@
#include <dev/wscons/wsconsio.h>
#include <dev/wscons/wsmousevar.h>
+#define DEVNAME(sc) ((sc)->sc_dev.dv_xname)
+
struct pms_softc { /* driver status information */
struct device sc_dev;
@@ -74,6 +76,14 @@ int pms_enable(void *);
void pms_disable(void *);
int pms_cmd(struct pms_softc *, u_char *, int, u_char *, int);
+int pms_get_devid(struct pms_softc *, u_char *);
+int pms_get_status(struct pms_softc *, u_char *);
+int pms_set_rate(struct pms_softc *, int);
+int pms_set_resolution(struct pms_softc *, int);
+int pms_set_scaling(struct pms_softc *, int);
+int pms_reset(struct pms_softc *);
+int pms_dev_enable(struct pms_softc *);
+int pms_dev_disable(struct pms_softc *);
int pms_setintellimode(struct pms_softc *sc);
@@ -96,23 +106,113 @@ pms_cmd(struct pms_softc *sc, u_char *cm
}
int
-pms_setintellimode(struct pms_softc *sc)
+pms_get_devid(struct pms_softc *sc, u_char *resp)
+{
+ u_char cmd[1];
+
+ cmd[0] = PMS_SEND_DEV_ID;
+ return (pms_cmd(sc, cmd, 1, resp, 1));
+}
+
+int
+pms_get_status(struct pms_softc *sc, u_char *resp)
{
- u_char cmd[2], resp[1];
- int i, res;
- static const u_char rates[] = {200, 100, 80};
+ u_char cmd[1];
+
+ cmd[0] = PMS_SEND_DEV_STATUS;
+ return (pms_cmd(sc, cmd, 1, resp, 3));
+}
+
+int
+pms_set_rate(struct pms_softc *sc, int value)
+{
+ u_char cmd[2];
cmd[0] = PMS_SET_SAMPLE;
- for (i = 0; i < 3; i++) {
- cmd[1] = rates[i];
- res = pms_cmd(sc, cmd, 2, NULL, 0);
- if (res)
- return (0);
+ cmd[1] = value;
+ return (pms_cmd(sc, cmd, 2, NULL, 0));
+}
+
+int
+pms_set_resolution(struct pms_softc *sc, int value)
+{
+ u_char cmd[2];
+
+ cmd[0] = PMS_SET_RES;
+ cmd[1] = value;
+ return (pms_cmd(sc, cmd, 2, NULL, 0));
+}
+
+int
+pms_set_scaling(struct pms_softc *sc, int scale)
+{
+ u_char cmd[1];
+
+ switch (scale) {
+ case 1:
+ default:
+ cmd[0] = PMS_SET_SCALE11;
+ break;
+ case 2:
+ cmd[0] = PMS_SET_SCALE21;
+ break;
}
+ return (pms_cmd(sc, cmd, 1, NULL, 0));
+}
- cmd[0] = PMS_SEND_DEV_ID;
- res = pms_cmd(sc, cmd, 1, resp, 1);
- if (res || resp[0] != 3)
+int
+pms_reset(struct pms_softc *sc)
+{
+ u_char cmd[1], resp[2];
+ int res;
+
+ cmd[0] = PMS_RESET;
+ res = pms_cmd(sc, cmd, 1, resp, 2);
+#ifdef DEBUG
+ if (res || resp[0] != PMS_RSTDONE || resp[1] != 0)
+ printf("%s: reset error %d (response 0x%02x, type 0x%02x)\n",
+ DEVNAME(sc), res, resp[0], resp[1]);
+#endif
+ return (res);
+}
+
+int
+pms_dev_enable(struct pms_softc *sc)
+{
+ u_char cmd[1];
+ int res;
+
+ cmd[0] = PMS_DEV_ENABLE;
+ res = pms_cmd(sc, cmd, 1, NULL, 0);
+ if (res)
+ printf("%s: enable error\n", DEVNAME(sc));
+ return (res);
+}
+
+int
+pms_dev_disable(struct pms_softc *sc)
+{
+ u_char cmd[1];
+ int res;
+
+ cmd[0] = PMS_DEV_DISABLE;
+ res = pms_cmd(sc, cmd, 1, NULL, 0);
+ if (res)
+ printf("%s: disable error\n", DEVNAME(sc));
+ return (res);
+}
+
+int
+pms_setintellimode(struct pms_softc *sc)
+{
+ static const int rates[] = {200, 100, 80};
+ u_char resp;
+
+ if (pms_set_rate(sc, rates[0]) ||
+ pms_set_rate(sc, rates[1]) ||
+ pms_set_rate(sc, rates[2]) ||
+ pms_get_devid(sc, &resp) ||
+ resp != 0x03)
return (0);
return (1);
@@ -158,7 +258,7 @@ pmsattach(struct device *parent, struct
printf("\n");
pckbc_set_inputhandler(sc->sc_kbctag, sc->sc_kbcslot,
- pmsinput, sc, sc->sc_dev.dv_xname);
+ pmsinput, sc, DEVNAME(sc));
a.accessops = &pms_accessops;
a.accesscookie = sc;
@@ -197,9 +297,6 @@ pmsactivate(struct device *self, int act
int
pms_change_state(struct pms_softc *sc, int newstate)
{
- u_char cmd[1], resp[2];
- int res;
-
switch (newstate) {
case PMS_STATE_ENABLED:
if (sc->sc_state == PMS_STATE_ENABLED)
@@ -213,22 +310,15 @@ pms_change_state(struct pms_softc *sc, i
if (sc->poll)
pckbc_flush(sc->sc_kbctag, sc->sc_kbcslot);
- cmd[0] = PMS_RESET;
- res = pms_cmd(sc, cmd, 1, resp, 2);
+ pms_reset(sc);
sc->intelli = pms_setintellimode(sc);
- cmd[0] = PMS_DEV_ENABLE;
- res = pms_cmd(sc, cmd, 1, NULL, 0);
- if (res)
- printf("pms_enable: command error\n");
+ pms_dev_enable(sc);
break;
case PMS_STATE_DISABLED:
case PMS_STATE_SUSPENDED:
- cmd[0] = PMS_DEV_DISABLE;
- res = pms_cmd(sc, cmd, 1, NULL, 0);
- if (res)
- printf("pms_disable: command error\n");
+ pms_dev_disable(sc);
pckbc_slot_enable(sc->sc_kbctag, sc->sc_kbcslot, 0);
break;
}