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
#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;
}
/*
* 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 <mdz@debian.org>, 07/2002
*
* Descriptive comments and miscellaneous fixes by David Anders
* <dave123@abcsinc.com>
*
*/
#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;
}
Attachment:
signature.asc
Description: Digital signature