/*
*
* SunDR11W.c
*
* Copyright 1989, Xerox Corporation
* Dave Rumph, January 19, 1989 8:56:14 am PST
* last modified, November 5, 1990 8:23:24 pm PST
*
*
*/
#ifndef ←TYPES←
#include <sys/types.h>
#endif
#ifndef ←IOCTL←
#include <sys/ioctl.h>
#endif
#include <fcntl.h>
#include <xr/UIO.h>
#include <xr/ThreadsSlaveIOP.h>
#include "drreg.h"
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
typedef int BOOL;
static int fd = -1;
static unsigned int drTimeout = XR←WAIT←FOREVER;
XR←Slave slave;
void DRStartUp ()
{
slave = XR←SlaveStart();
};
BOOL DRInitializeProc ()
{
if ((fd = open("/dev/dr100", O←WRONLY, 0)) >= 0) return TRUE;
return FALSE;
};
void DRFinalizeProc ()
{
if (fd >= 0) {
close(fd);
fd = 0;
};
};
void DRResetProc ()
{
if (fd >= 0) {
u←short control = DR←INIT;
ioctl(fd, DR←IOCWSTAT, &control);
};
};
#define GetStatus(pstatus) ioctl(fd, DR←IOCRSTAT, pstatus)
void DRGetStatusProc (pstatus)
u←short *pstatus;
{
if (fd >= 0) {
ioctl(fd, DR←IOCRSTAT, pstatus);
};
};
void DRSetupProc ()
{
if (fd >= 0) {
u←short control = DR←FCN2;
ioctl(fd, DR←IOCPULSE, &control);
};
};
BOOL DRReadyProc ()
{
u←short status;
GetStatus(&status);
return (status & DR←RDY);
};
static u←short dr11wControl = 0;
void DRSetControlProc (control)
u←short control;
{
if (fd >= 0) {
dr11wControl |= control;
ioctl(fd, DR←IOCWSTAT, &dr11wControl);
};
};
void DRClearControlProc (control)
u←short control;
{
if (fd >= 0) {
dr11wControl &= ~control;
ioctl(fd, DR←IOCWSTAT, &dr11wControl);
};
};
static u←short onWrite = DR←ISWRITE;
void DRSetOnWriteProc (control)
u←short control;
{
if (fd >= 0) {
onWrite |= control;
ioctl(fd, DR←IOCISWRITE, &onWrite);
};
};
void DRClearOnWriteProc (control)
u←short control;
{
if (fd >= 0) {
onWrite &= ~control;
ioctl(fd, DR←IOCISWRITE, &onWrite);
};
};
BOOL DRSendOneWordProc (data)
u←short data;
{
if (fd >= 0) {
u←short temp = data;
if (write(fd, &temp, 2) == 1) return TRUE;
else return FALSE;
};
};
typedef struct {
long byteAddress;
long byteCount;
} DR←BufProcArgs;
BOOL DRSendBufferProc (pArgs)
DR←BufProcArgs *pArgs;
{
if (fd >= 0) {
if (write(fd, pArgs->byteAddress, pArgs->byteCount)
== pArgs->byteCount) return TRUE;
else return FALSE;
};
};
void DRAbortProc ()
{
/* do nothing for now */
};
/**************** Procs exported to Threads PCedar *******************/
BOOL DRInitialize ()
{
return (XR←SlaveCall(slave, DRInitializeProc, NIL, drTimeout));
};
void DRFinalize ()
{
XR←SlaveCall(slave, DRFinalizeProc, NIL, drTimeout);
};
void DRReset ()
{
XR←SlaveCall(slave, DRResetProc, NIL, drTimeout);
};
void DRGetStatus (pstatus)
u←short *pstatus;
{
XR←SlaveCall(slave, DRGetStatusProc, pstatus, drTimeout);
};
void DRSetup ()
{
XR←SlaveCall(slave, DRSetupProc, NIL, drTimeout);
};
BOOL DRReady ()
{
return (XR←SlaveCall(slave, DRReadyProc, NIL, drTimeout));
};
void DRSetControl (control)
u←short control;
{
XR←SlaveCall(slave, DRSetControlProc, control, drTimeout);
};
void DRClearControl (control)
u←short control;
{
XR←SlaveCall(slave, DRClearControlProc, control, drTimeout);
};
void DRSetOnWrite (control)
u←short control;
{
XR←SlaveCall(slave, DRSetOnWriteProc, control, drTimeout);
};
void DRClearOnWrite (control)
u←short control;
{
XR←SlaveCall(slave, DRClearOnWriteProc, control, drTimeout);
};
BOOL DRSendOneWord (data)
u←short data;
{
return (XR←SlaveCall(slave, DRSendOneWordProc, data, drTimeout));
};
BOOL DRSendBuffer (byteAddress, byteCount)
long byteAddress, byteCount;
{
DR←BufProcArgs args;
args.byteAddress = byteAddress;
args.byteCount = byteCount;
return (XR←SlaveCall(slave, DRSendBufferProc, &args, drTimeout));
};
void DRAbort ()
{
/* do nothing for now */
};