/*
*
* SunVersatec.c
*
* Copyright 1989, Xerox Corporation
* Dave Rumph, January 19, 1989 8:56:14 am PST
* last modified by Dave Rumph, November 5, 1990 8:23:32 pm PST
*
*
*/
#ifndef ←TYPES←
#include <sys/types.h>
#endif
#include <fcntl.h>
#include <xr/UIO.h>
#include <xr/ThreadsSlaveIOP.h>
#include "lpcmd.h"
#include "lpioctl.h"
#include "Versatec.h"
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define CDS←OnLine 0x1000
#define CDS←Ready 0x4000
typedef int BOOL;
static int fd = -1;
static unsigned int svTimeout = XR←WAIT←FOREVER;
XR←Slave slave;
void SVStartUp ()
{
slave = XR←SlaveStart();
};
/****************** Procs to be called on Slave IOP *******************/
BOOL SVInitializeProc ()
{
if ((fd = open("/dev/lpv0", O←WRONLY, 0)) >= 0) return TRUE;
return FALSE;
};
void SVFinalizeProc ()
{
if (fd >= 0) {
close(fd);
fd = 0;
};
};
void SVResetProc ()
{
if (fd >= 0) {
int command = LPC←MCLR;
ioctl(fd, LPCOMMAND, &command);
};
};
#define GetStatus(pregs) ioctl(fd, LPGETREGS, pregs)
BOOL SVOnLineProc ()
{
struct lpregs regs;
GetStatus(®s);
return (regs.cdsreg & CDS←OnLine);
};
BOOL SVReadyProc ()
{
struct lpregs regs;
GetStatus(®s);
return (regs.cdsreg & CDS←Ready);
};
void SVSetModeProc (mode)
int mode;
{
if (fd >= 0) {
int command;
switch (mode) {
case PRINT:
command = LPC←DVPT | LPC←DSPP; /* disable plot, disable SPP */
break;
case PLOT:
command = LPC←VPLT | LPC←DSPP; /* enable plot, disable SPP */
break;
case SPPPrint:
command = LPC←DVPT | LPC←VSPP; /* disable plot, enable SPP */
break;
case SPPPlot:
command = LPC←VPLT | LPC←VSPP; /* enable plot, enable SPP */
break;
default:
command = 0; /* no command! */
};
ioctl(fd, LPCOMMAND, &command);
};
};
BOOL SVSendRCommandProc (cmd)
int cmd;
{
int command;
if (fd < 0) return FALSE;
switch (cmd) {
case CLEAR:
command = LPC←VCLR;
break;
case RESET:
command = LPC←MCLR;
break;
case RLTER:
command = LPC←VLTR;
break;
case RFFED:
command = LPC←VTFF;
break;
case REOTR:
command = LPC←VEOT;
break;
default:
command = 0; /* nothing to do! */
};
ioctl(fd, LPCOMMAND, &command);
return TRUE;
};
BOOL SVSendOneByteProc (data)
char data;
{
if (fd >= 0) {
char temp = data;
if (write(fd, &temp, 1) == 1) return TRUE;
else return FALSE;
};
};
typedef struct {
long byteAddress;
long byteCount;
long dmaPerTransferCount;
} SV←BufProcArgs;
BOOL SVSendBufferProc (pArgs)
SV←BufProcArgs *pArgs;
{
if (fd >= 0) {
ioctl(fd, LPSETDMACOUNT, &(pArgs->dmaPerTransferCount));
if (write(fd, pArgs->byteAddress, pArgs->byteCount)
== pArgs->byteCount) return TRUE;
else return FALSE;
};
};
void SVAbortProc ()
{
/* do nothing for now */
};
/**************** Procs exported to Threads PCedar *******************/
BOOL SVInitialize ()
{
return (XR←SlaveCall(slave, SVInitializeProc, NIL, svTimeout));
};
void SVFinalize ()
{
XR←SlaveCall(slave, SVFinalizeProc, NIL, svTimeout);
};
void SVReset ()
{
XR←SlaveCall(slave, SVResetProc, NIL, svTimeout);
};
BOOL SVOnLine ()
{
return (XR←SlaveCall(slave, SVOnLineProc, NIL, svTimeout));
};
BOOL SVReady ()
{
return (XR←SlaveCall(slave, SVReadyProc, NIL, svTimeout));
};
void SVSetMode (mode)
int mode;
{
XR←SlaveCall(slave, SVSetModeProc, mode, svTimeout);
};
BOOL SVSendRCommand (cmd)
int cmd;
{
return (XR←SlaveCall(slave, SVSendRCommandProc, cmd, svTimeout));
};
BOOL SVSendOneByte (data)
char data;
{
return (XR←SlaveCall(slave, SVSendOneByteProc, data, svTimeout));
};
BOOL SVSendBuffer (byteAddress, byteCount, dmaPerTransferCount)
long byteAddress, byteCount, dmaPerTransferCount;
{
SV←BufProcArgs args;
args.byteAddress = byteAddress;
args.byteCount = byteCount;
args.dmaPerTransferCount = dmaPerTransferCount;
return (XR←SlaveCall(slave, SVSendBufferProc, &args, svTimeout));
};
void SVAbort ()
{
/* do nothing for now */
};