[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: xircom cf ethernet



----- Original Message -----
From: "enami tsugutomo" <enami@but-b.or.jp>
To: "TAKEMURA Shin" <takemura@netbsd.org>
Cc: "Koji Suzuki" <suz@hpc.bs1.fc.nec.co.jp>;
<port-hpcmips-ja@jp.netbsd.org>
Sent: Monday, February 28, 2000 6:20 PM
Subject: Re: xircom cf ethernet


> wsconsio.h で WSMOUSEIO_SCALIBCOORDS が _IOR になっているから, kernel
> にちゃんと parameter が渡っていないんじゃないのかなあ.
>
> #define WSMOUSEIO_SCALIBCOORDS _IOR('W', 36, struct wsmouse_calibcoords)
> #define WSMOUSEIO_GCALIBCOORDS _IOR('R', 37, struct wsmouse_calibcoords)

はい。まったくそのとおりでした。すみません。
早速修正して commit しました。

----- Original Message -----
From: "Koji Suzuki" <suz@hpc.bs1.fc.nec.co.jp>
To: <port-hpcmips-ja@jp.netbsd.org>; <suz@hpc.bs1.fc.nec.co.jp>
Sent: Monday, February 28, 2000 4:04 PM
Subject: Re: xircom cf ethernet

> キャリブレーションは次のようにすれば良いのでしょうか?
>
> 1) WSMOUSEIO_GCALIBCOORDS してデータをセーブ。
> 2) x = rawx , y = rawy にしたデータでWSMOUSEIO_SCALIBCOORDS する。

ここは、samplelen = WSMOUSE_CALIBCOORDS_RESET としてください。
(動いてなかったので、tpcalib.c を修正しました。)

> 3) tap.c の動作で 5 点の座標を取って来る。
> 4) 採取した座標を rawx ,rawy にしたデータでWSMOUSEIO_SCALIBCOORDS する。

minx, maxx, miny, maxy はスクリーン座標系の範囲を指定してください。
たとえば、スクリーンが 640x480 の場合、補正後の座標が (640, 231) などに
なった場合などはこの min, max を用いて (639, 231) に修正されます。
(他のことには使っていません)

> err) 失敗したら、セーブしたデータで、WSMOUSEIO_SCALIBCOORDS する。

rc のどこかでファイルシステムからデータを boot の度にセットするようにする
必要がありますね。カードを複数のマシンで使いまわすことを考えるとデータを
セーブする場所はパスに機種を含むようにしたほうがよさそうです。

Takemura

テストプログラムでテストしたので、参考までに添付します。

#include <sys/types.h>
#include <sys/file.h>
#include <dev/wscons/wsconsio.h>

calib_dump(name, calib)
        char *name;
        struct wsmouse_calibcoords *calib;
{
        int i;

        printf("------- %s --------------------\n", name);
        printf("minx %3d ", calib->minx);
        printf("maxx %3d ", calib->maxx);
        printf("miny %3d ", calib->miny);
        printf("maxy %3d ", calib->maxy);
        printf("samplelen %d \n", calib->samplelen);
        for (i = 0; i < calib->samplelen; i++) {
                printf("    ");
                printf("x %3d ", calib->samples[i].x);
                printf("y %3d ", calib->samples[i].y);
                printf("rawx %3d ", calib->samples[i].rawx);
                printf("rawy %3d ", calib->samples[i].rawy);
                printf("\n");
        }
}

main()
{
        struct wsmouse_calibcoords calib, savecalib;
        int i, fd;

#define DUMPCALIB(cap) \
        memset(&calib, 0, sizeof(calib)); \
        if (ioctl(fd, WSMOUSEIO_GCALIBCOORDS, &calib)) { \
                perror(cap); \
                exit(1); \
        } \
        calib_dump(cap,&calib);

        if ((fd = open("/dev/wsmouse0", O_RDWR)) < 0) {
                perror("open()");
                exit(1);
        }

        if (ioctl(fd, WSMOUSEIO_GCALIBCOORDS, &savecalib)) {
                perror("(0)WSMOUSEIO_GCALIBCOORDS");
                exit(1);
        }

        DUMPCALIB("initial");

        memset(&calib, 0, sizeof(calib));
        calib.samplelen = WSMOUSE_CALIBCOORDS_RESET;
        if (ioctl(fd, WSMOUSEIO_SCALIBCOORDS, &calib)) {
                perror("(1)WSMOUSEIO_SCALIBCOORDS");
                exit(1);
        }

        DUMPCALIB("reset");

        calib.samplelen = 5;
        for (i = 0; i < calib.samplelen; i++) {
                calib.samples[i].rawx += 1;
                calib.samples[i].rawy += 1;
        }
        if (ioctl(fd, WSMOUSEIO_SCALIBCOORDS, &calib)) {
                perror("(2)WSMOUSEIO_SCALIBCOORDS");
                exit(1);
        }

        DUMPCALIB(" +1");

        if (ioctl(fd, WSMOUSEIO_SCALIBCOORDS, &savecalib)) {
                perror("(3)WSMOUSEIO_SCALIBCOORDS");
                exit(1);
        }
}