[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);
}
}