📄 piodrv.c
字号:
#include "pioDrv.h"IMPORT DAADIO daadio;IMPORT PIO pio;LOCAL int pioDrvNum = ERROR;STATUS pioDrv(base, intLevel, intVector) char * base; int intLevel; int intVector; { int pioClose(), pioRead(), pioWrite(), pioIoctl(); int pioOpen(); if (daadio.initialized == FALSE) { if (daadioInit(base, intLevel, intVector) == ERROR) return (ERROR); } if (pio.initialized == FALSE) { if (pioInit(0) == ERROR) return (ERROR); } if (pioDrvNum == ERROR) { if((pioDrvNum = iosDrvInstall(pioOpen, 0, pioOpen, pioClose, pioRead, pioWrite, pioIoctl)) == ERROR) return (ERROR); } return (OK); }STATUS pioDevCreate(name, port, mode) char * name; int port; BOOL mode; { PIO_DEV * pPioDev; UINT8 portBit; UINT8 * pOutputEnablePort; UINT8 * pPort; if (pioDrvNum == ERROR) { printf ("pioDrv() must be called first\n"); return (ERROR); } if (port < PORT_A || port >= PIO_MAX_PORTS) { printf ("Invalid port number: %d\n", port); return (ERROR); } /* Initialize the port: clear the port register, if output * port set the corresponding bit in the output enable register * (otherwise, reset it), and update the mode field in the * PIO data structure. */ pOutputEnablePort = (UINT8 *) daadio.baseAddr + PIO_OUTPUT_ENABLE_OFFSET; portBit = 1 << port; if (semTake (pio.mutexSem, WAIT_FOREVER) == ERROR) return (ERROR); if (mode) { pPort = (UINT8 *) daadio.baseAddr + PIO_PORT_NUM_TO_OFF(port); *pPort = (UINT8) 0; *pOutputEnablePort |= portBit; } else *pOutputEnablePort &= ~portBit; if (semGive (pio.mutexSem) == ERROR) return (ERROR); if ((pPioDev = (PIO_DEV *) malloc (sizeof (PIO_DEV))) == NULL) return (ERROR); bzero ((char *)pPioDev, sizeof (PIO_DEV)); pPioDev->port = port; return (iosDevAdd(&pPioDev->devHdr, name, pioDrvNum)); }int pioOpen(pDevHdr, name, mode) DEV_HDR * pDevHdr; char *name; int mode; { PIO_DEV * pDev = (PIO_DEV *) pDevHdr; PIO_CH * pCh; int port = pDev->port; int channel; /* skip leading front slash */ while (*name == '/') name++; channel = *name - 0x30; if (channel < 0 || channel >= PIO_MAX_CHANNELS_PER_PORT) { printf ("pioOpen: Invalid channel: %d\n", channel); return (ERROR); } if ((pCh = (PIO_CH *) malloc (sizeof (PIO_CH))) == NULL) return (ERROR); pCh->pDev = pDev; pCh->channel = channel; return ((int)pCh); }STATUS pioClose (devId) int devId; { free ((void *) devId); return (OK); }pioRead(devId, buf, nBytes) int devId; char *buf; int nBytes; { PIO_CH * pCh = (PIO_CH *)devId; BOOL value; if ((value = pioGet (pCh->pDev->port, pCh->channel)) == ERROR) return (ERROR); *buf = (char) value; return (1); }pioWrite(devId, buf, nBytes) int devId; char *buf; int nBytes; { PIO_CH *pCh = (PIO_CH *) devId; if (nBytes == 0) return (0); if (pioSet (pCh->pDev->port, pCh->channel, (BOOL) *buf) == ERROR) return (ERROR); return (1); }pioIoctl(devId, cmd, arg) int devId; int cmd, arg; { PIO_CH *pCh = (PIO_CH *) devId; int status; int channel = pCh->channel; int port = pCh->pDev->port; UINT8 * pOutputEnablePort; pOutputEnablePort = (UINT8 *) daadio.baseAddr + PIO_OUTPUT_ENABLE_OFFSET; switch (cmd) { case IS_ON: status = pioGet (port, channel); if (arg) *(int *)arg = status; break; case IS_OFF: status = !pioGet (port, channel); if (arg) *(int *)arg = status; break; case IS_INPUT: status = ((*pOutputEnablePort & (1 << port)) == 0) ? TRUE : FALSE ; if (arg) *(int *)arg = status; break; case IS_OUTPUT: status = (*pOutputEnablePort & (1 << port)) ? TRUE : FALSE ; if (arg) *(int *)arg = status; break; case TURN_ON: status = pioSet (port, channel, ON); break; case TURN_OFF: status = pioSet (port, channel, OFF); break; case GET_CHANNEL: status = channel; if (arg) *(int *)arg = status; break; case SET_TO_ARG: status = pioSet (port, channel, (BOOL) arg); break; default: errnoSet (S_ioLib_UNKNOWN_REQUEST); status = ERROR; break; } return (status); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -