Re: Is oncheck source available?
Matt Zimmerman <[email protected]>
| Newsgroups | gmane.linux.debian.devel.3com-pilot |
|---|---|
| Message-ID | <[email protected]> |
On Wed, Jan 28, 2004 at 02:18:16PM +0300, ?????? ?????? wrote: > Hallo! You mentioned on sharp zaurus web page that you rewrote oncheck utility. > Is the source available? If yes, where I can download it? Attached, along with the source for ztsd, which translates the touchscreen events from the Zaurus into what xfree86 supports (probably patching xfree86 is a better long-term solution). -- - mdz
oncheck.c
(text/x-csrc, 2 KB)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
/* oncheck.c - Check reset status of Sharp SL-5xxx
*
* Copyright (C) Matt Zimmerman, 07/2002
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Based on arch/arm/mach-sa1100/collie_apm.c
*/
/* include/asm-arm/sharp_apm.h */
#define APM_IOC_GET_ON_MODE 0x4128
/* Reset Controller Status Register, from
* include/asm-arm/arch-sa1100/SA-1100.h */
#define RCSR_HWR 0x00000001 /* HardWare Reset */
#define RCSR_SWR 0x00000002 /* SoftWare Reset */
#define RCSR_WDR 0x00000004 /* Watch-Dog Reset */
#define RCSR_SMR 0x00000008 /* Sleep-Mode Reset */
int main(int argc, char *argv[]) {
int on_mode;
int fd = -1;
const char *status;
if ((fd = open("/dev/apm_bios", O_RDWR)) < 0) {
perror("open: /dev/apm_bios");
return 1;
}
if ((on_mode = ioctl(fd, APM_IOC_GET_ON_MODE, NULL)) < 0) {
perror("APM_IOC_GET_ON_MODE");
return 1;
}
if (on_mode & RCSR_HWR)
status = "HW Reset";
else if (on_mode & RCSR_SWR)
status = "SW Reset";
else if (on_mode & RCSR_WDR)
status = "WD Reset";
else if (on_mode & RCSR_SMR)
status = "SL Reset";
else
status = "Reset?";
printf("%s\n", status);
return 0;
}
ztsd.c
(text/x-csrc, 4.3 KB)
/* * ztstransd - Convert Zaurus touchscreen events into iPAQ touchscreen * events * * ipaq_ts_dev should be a named pipe (fifo), from which programs * (such as the X server) will read touchscreen events * * Automatically calibrates based on coordinate minima and maxima. * Drag toward each corner to ensure proper calibration. * * Matt Zimmerman <[email protected]>, 07/2002 * * Descriptive comments and miscellaneous fixes by David Anders * <[email protected]> * */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <string.h> typedef struct { unsigned short pressure; unsigned short x; unsigned short y; unsigned short pad; } TS_EVENT; typedef struct { long x; long y; long pressure; long long millisecs; } TS_EVENT_ZAURUS; static int daemonize = 1; /* /dev/sharp_ts is the touch screen node used on the Sharp * and OpenZaurus builds. */ static const char *real_ts_dev = "/dev/sharp_ts"; /* /dev/ts should be a named pipe (fifo) */ static const char *ipaq_ts_dev = "/dev/ts"; static const char *pidfile = "/var/run/ztsd.pid"; static int calibrated = 0; static long min_x = 0, max_x = 1000, min_y = 0, max_y = 1000; static int debug = 0; static void convert_event(const TS_EVENT_ZAURUS *zaurus_event, TS_EVENT *ipaq_event) { /* This was determined by using the ipaq event structure from the * xfree86 code and comparing it to the touch screen header files * in the kernel for the zaurus, improved through trial and error */ ipaq_event->y = (zaurus_event->x - min_x) * 240 / (max_x - min_x); ipaq_event->x = 320 - ((zaurus_event->y - min_y) * 320 / (max_y - min_y)); ipaq_event->pressure = zaurus_event->pressure; if (debug) fprintf(stderr, "converted: x=%ld, y=%ld, pressure=%ld\n", ipaq_event->x, ipaq_event->y, ipaq_event->pressure); } static void calibrate(long x, long y) { if (x < min_x) min_x = x; else if (x > max_x) max_x = x; else if (y < min_y) min_y = y; else if (y > max_y) max_y = y; if (debug) fprintf(stderr, "calibrate: x=(%ld,%ld) y=(%ld,%ld)\n", min_x, max_x, min_y, max_y); } int main(int argc, char *argv[]) { int ch; int real_fd = -1; int ipaq_fd = -1; int pidfile_fd = -1; while ((ch = getopt(argc, argv, "fhvd")) != -1) { switch (ch) { case 'd': debug = 1; /* fall through */ case 'f': daemonize = 0; break; case 'h': fprintf(stderr, "ztsd is used to translate Zaurus touch\n"); fprintf(stderr, "screen events into iPAQ events for use with an\n"); fprintf(stderr, "XFree86 built using the iPAQ touch screen driver\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, "-d - debug\n"); fprintf(stderr, "-f - don't fork\n"); fprintf(stderr, "-v - version\n"); return 0; case 'v': printf("ztstransd 0.1\n"); return 0; } } real_fd = open(real_ts_dev, O_RDONLY); if (real_fd == -1) { perror(real_ts_dev); return -1; } ipaq_fd = open(ipaq_ts_dev, O_RDWR); if (ipaq_fd == -1) { perror(ipaq_ts_dev); return -1; } if (daemonize) { switch (fork()) { case 0: daemon(0,0); break; case -1: perror("fork"); return -1; default: return 0; } } pidfile_fd = open(pidfile, O_WRONLY|O_CREAT, 0644); if (pidfile_fd == -1) { perror(pidfile); return -1; } /* XXX GNU-ism */ dprintf(pidfile_fd, "%ld", getpid()); close(pidfile_fd); for(;;) { static TS_EVENT_ZAURUS zaurus_event; static TS_EVENT ipaq_event; static int ret; memset(&ipaq_event, 0, sizeof(ipaq_event)); memset(&zaurus_event, 0, sizeof(zaurus_event)); ret = read(real_fd, &zaurus_event, sizeof(zaurus_event)); if (ret == -1) { perror("read"); return -1; } else if (ret < sizeof(zaurus_event)) { continue; } if (debug) fprintf(stderr, "x: %ld, y: %ld, pressure: %ld, ms: %ld\n", zaurus_event.x, zaurus_event.y, zaurus_event.pressure, zaurus_event.millisecs); calibrate(zaurus_event.x, zaurus_event.y); convert_event(&zaurus_event, &ipaq_event); ret = write(ipaq_fd, &ipaq_event, sizeof(ipaq_event)); if (ret == -1) { perror("write"); return -1; } } /* NOT REACHED */ return 0; }
signature.asc
(application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAF99oArxCt0PiXR4RAv6rAKCgpU+sGqMejktfCT4NyTB4GiquCgCgsz5A t9ncedqPBGlfD+oODvzBF2Y= =WBZk -----END PGP SIGNATURE-----