* reworked parallel port access: invert logic to make it more natural

* explicit ppdev locking
* support for inclusion by C++ code


git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1543 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.0
Stéphane Fillod, F8CFE 2003-09-28 15:34:44 +00:00
rodzic 52d15c1aaa
commit f9478f5e97
3 zmienionych plików z 82 dodań i 19 usunięć

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib Rotator backend - Fodtrack parallel port * Hamlib Rotator backend - Fodtrack parallel port
* Copyright (c) 2001-2003 by Stephane Fillod * Copyright (c) 2001-2003 by Stephane Fillod
* *
* $Id: fodtrack.c,v 1.5 2003-08-25 22:26:42 fillods Exp $ * $Id: fodtrack.c,v 1.6 2003-09-28 15:34:44 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -49,6 +49,10 @@
#define PARPORT_CONTROL_STROBE 0x1 #define PARPORT_CONTROL_STROBE 0x1
#endif #endif
#ifndef CP_ACTIVE_LOW_BITS
#define CP_ACTIVE_LOW_BITS 0x0B
#endif
/* ************************************************************************* */ /* ************************************************************************* */
/** outputs an direction to the interface */ /** outputs an direction to the interface */
@ -56,6 +60,8 @@ static int setDirection(port_t *port, unsigned char outputvalue, int direction)
{ {
unsigned char outputstatus; unsigned char outputstatus;
par_lock (port);
// set the data bits // set the data bits
par_write_data(port, outputvalue); par_write_data(port, outputvalue);
@ -64,7 +70,7 @@ static int setDirection(port_t *port, unsigned char outputvalue, int direction)
outputstatus = PARPORT_CONTROL_AUTOFD; outputstatus = PARPORT_CONTROL_AUTOFD;
else else
outputstatus=0; outputstatus=0;
par_write_control(port, outputstatus); par_write_control(port, outputstatus^CP_ACTIVE_LOW_BITS);
// and now the strobe impulse // and now the strobe impulse
usleep(1); usleep(1);
@ -72,14 +78,16 @@ static int setDirection(port_t *port, unsigned char outputvalue, int direction)
outputstatus = PARPORT_CONTROL_AUTOFD | PARPORT_CONTROL_STROBE; outputstatus = PARPORT_CONTROL_AUTOFD | PARPORT_CONTROL_STROBE;
else else
outputstatus = PARPORT_CONTROL_STROBE; outputstatus = PARPORT_CONTROL_STROBE;
par_write_control(port, outputstatus); par_write_control(port, outputstatus^CP_ACTIVE_LOW_BITS);
usleep(1); usleep(1);
if (direction) if (direction)
outputstatus= PARPORT_CONTROL_AUTOFD; outputstatus= PARPORT_CONTROL_AUTOFD;
else else
outputstatus=0; outputstatus=0;
par_write_control(port, outputstatus); par_write_control(port, outputstatus^CP_ACTIVE_LOW_BITS);
par_unlock (port);
return RIG_OK; return RIG_OK;
} }
@ -118,9 +126,9 @@ const struct rot_caps fodtrack_rot_caps = {
.rot_model = ROT_MODEL_FODTRACK, .rot_model = ROT_MODEL_FODTRACK,
.model_name = "Fodtrack", .model_name = "Fodtrack",
.mfg_name = "XQ2FOD", .mfg_name = "XQ2FOD",
.version = "0.1", .version = "0.2",
.copyright = "LGPL", .copyright = "LGPL",
.status = RIG_STATUS_NEW, .status = RIG_STATUS_STABLE,
.rot_type = ROT_TYPE_OTHER, .rot_type = ROT_TYPE_OTHER,
.port_type = RIG_PORT_PARALLEL, .port_type = RIG_PORT_PARALLEL,
.write_delay = 0, .write_delay = 0,

Wyświetl plik

@ -4,7 +4,7 @@
* Parts of the PTT handling are derived from soundmodem, an excellent * Parts of the PTT handling are derived from soundmodem, an excellent
* ham packet softmodem written by Thomas Sailer, HB9JNX. * ham packet softmodem written by Thomas Sailer, HB9JNX.
* *
* $Id: serial.c,v 1.36 2003-08-25 22:35:55 fillods Exp $ * $Id: serial.c,v 1.37 2003-09-28 15:34:44 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -84,6 +84,22 @@
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
#include <linux/ppdev.h> #include <linux/ppdev.h>
#include <linux/parport.h>
/*
* These control port bits are active low.
* We toggle them so that this weirdness doesn't get get propagated
* through our interface.
*/
#define CP_ACTIVE_LOW_BITS 0x0B
/*
* These status port bits are active low.
* We toggle them so that this weirdness doesn't get get propagated
* through our interface.
*/
#define SP_ACTIVE_LOW_BITS 0x80
#endif #endif
@ -620,6 +636,7 @@ int ser_dcd_get(port_t *p, dcd_t *dcdx)
int par_open(port_t *port) int par_open(port_t *port)
{ {
int fd; int fd;
int mode;
if (!port->pathname) if (!port->pathname)
return -RIG_EINVAL; return -RIG_EINVAL;
@ -627,14 +644,16 @@ int par_open(port_t *port)
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
fd = open(port->pathname, O_RDWR); fd = open(port->pathname, O_RDWR);
if (fd < 0) { if (fd < 0) {
rig_debug(RIG_DEBUG_VERBOSE, "Opening device \"%s\": %s\n", port->pathname, strerror(errno)); rig_debug(RIG_DEBUG_ERR, "Opening device \"%s\": %s\n", port->pathname, strerror(errno));
return -RIG_EIO; return -RIG_EIO;
} }
if (ioctl(fd, PPCLAIM) < 0) { mode = IEEE1284_MODE_COMPAT;
rig_debug(RIG_DEBUG_VERBOSE, "Claiming device \"%s\": %s\n", port->pathname, strerror(errno)); if (ioctl (fd, PPSETMODE, &mode) != 0) {
rig_debug(RIG_DEBUG_ERR, "PPSETMODE \"%s\": %s\n", port->pathname, strerror(errno));
close(fd); close(fd);
return -RIG_EIO; return -RIG_EIO;
} }
#elif defined(WIN32) #elif defined(WIN32)
fd = (int)CreateFile(port->pathname, GENERIC_READ | GENERIC_WRITE, fd = (int)CreateFile(port->pathname, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL); 0, NULL, OPEN_EXISTING, 0, NULL);
@ -653,7 +672,6 @@ int par_open(port_t *port)
int par_close(port_t *port) int par_close(port_t *port)
{ {
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
ioctl(port->fd, PPRELEASE);
#elif defined(WIN32) #elif defined(WIN32)
CloseHandle((HANDLE)(port->fd)); CloseHandle((HANDLE)(port->fd));
return RIG_OK; return RIG_OK;
@ -703,7 +721,8 @@ int par_write_control(port_t *port, unsigned char control)
{ {
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
int status; int status;
status = ioctl(port->fd, PPWCONTROL, &control); unsigned char ctrl = control ^ CP_ACTIVE_LOW_BITS;
status = ioctl(port->fd, PPWCONTROL, &ctrl);
return status == 0 ? RIG_OK : -RIG_EIO; return status == 0 ? RIG_OK : -RIG_EIO;
#elif defined(WIN32) #elif defined(WIN32)
unsigned char ctr = control; unsigned char ctr = control;
@ -735,7 +754,9 @@ int par_read_control(port_t *port, unsigned char *control)
{ {
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
int status; int status;
status = ioctl(port->fd, PPRCONTROL, control); unsigned char ctrl;
status = ioctl(port->fd, PPRCONTROL, &ctrl);
*control = ctrl ^ CP_ACTIVE_LOW_BITS;
return status == 0 ? RIG_OK : -RIG_EIO; return status == 0 ? RIG_OK : -RIG_EIO;
#elif defined(WIN32) #elif defined(WIN32)
char ret; char ret;
@ -756,7 +777,9 @@ int par_read_status(port_t *port, unsigned char *status)
{ {
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
int ret; int ret;
ret = ioctl(port->fd, PPRSTATUS, status); unsigned char sta;
ret = ioctl(port->fd, PPRSTATUS, &sta);
*status = sta ^ SP_ACTIVE_LOW_BITS;
return ret == 0 ? RIG_OK : -RIG_EIO; return ret == 0 ? RIG_OK : -RIG_EIO;
#elif defined(WIN32) #elif defined(WIN32)
unsigned char ret; unsigned char ret;
@ -773,6 +796,34 @@ int par_read_status(port_t *port, unsigned char *status)
} }
int par_lock(port_t *port)
{
#ifdef HAVE_LINUX_PPDEV_H
if (ioctl(port->fd, PPCLAIM) < 0) {
rig_debug(RIG_DEBUG_ERR, "Claiming device \"%s\": %s\n", port->pathname, strerror(errno));
return -RIG_EIO;
}
return RIG_OK;
#elif defined(WIN32)
return RIG_OK;
#endif
return -RIG_ENIMPL;
}
int par_unlock(port_t *port)
{
#ifdef HAVE_LINUX_PPDEV_H
if (ioctl(port->fd, PPRELEASE) < 0) {
rig_debug(RIG_DEBUG_ERR, "Releasing device \"%s\": %s\n", port->pathname, strerror(errno));
return -RIG_EIO;
}
return RIG_OK;
#elif defined(WIN32)
return RIG_OK;
#endif
return -RIG_ENIMPL;
}
int par_ptt_set(port_t *p, ptt_t pttx) int par_ptt_set(port_t *p, ptt_t pttx)
{ {

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib Interface - serial communication header * Hamlib Interface - serial communication header
* Copyright (c) 2000-2002 by Stephane Fillod and Frank Singleton * Copyright (c) 2000-2002 by Stephane Fillod and Frank Singleton
* *
* $Id: serial.h,v 1.21 2003-08-25 22:35:55 fillods Exp $ * $Id: serial.h,v 1.22 2003-09-28 15:34:44 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -26,6 +26,7 @@
#include <hamlib/rig.h> #include <hamlib/rig.h>
#include "iofunc.h" #include "iofunc.h"
__BEGIN_DECLS
extern HAMLIB_EXPORT(int) serial_open(port_t *rs); extern HAMLIB_EXPORT(int) serial_open(port_t *rs);
extern HAMLIB_EXPORT(int) serial_setup(port_t *rs); extern HAMLIB_EXPORT(int) serial_setup(port_t *rs);
@ -53,6 +54,9 @@ extern HAMLIB_EXPORT(int) par_write_control(port_t *p, unsigned char control);
extern HAMLIB_EXPORT(int) par_read_data(port_t *p, unsigned char *data); extern HAMLIB_EXPORT(int) par_read_data(port_t *p, unsigned char *data);
extern HAMLIB_EXPORT(int) par_read_control(port_t *p, unsigned char *control); extern HAMLIB_EXPORT(int) par_read_control(port_t *p, unsigned char *control);
extern HAMLIB_EXPORT(int) par_read_status(port_t *p, unsigned char *status); extern HAMLIB_EXPORT(int) par_read_status(port_t *p, unsigned char *status);
extern HAMLIB_EXPORT(int) par_lock(port_t *p);
extern HAMLIB_EXPORT(int) par_unlock(port_t *p);
__END_DECLS
#endif /* _SERIAL_H */ #endif /* _SERIAL_H */