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-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.