/* * * 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 #endif #ifndef _IOCTL_ #include #endif #include #include #include #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 */ };