📄 piolib.c
字号:
#include "pioLib.h"IMPORT DAADIO daadio;PIO pio;STATUS pioInit (outputEnableMask) UINT8 outputEnableMask; /* Mask to set which are output ports */ { UINT8 * pOutputEnablePort; UINT8 * pPort; int port; /* If daadioInit() has not been called, fail */ if (daadio.initialized == FALSE) { printf ("daadio not initialized\n"); return (ERROR); } /* If mutex semaphore has not been created, do it now */ if (pio.mutexSem == NULL) { if ((pio.mutexSem = semMCreate (SEM_Q_PRIORITY|SEM_DELETE_SAFE| SEM_INVERSION_SAFE)) == NULL) return (ERROR); } /* Initialize <pOutputEnablePort> to point to the output enable register */ pOutputEnablePort = (UINT8 *)daadio.baseAddr + PIO_OUTPUT_ENABLE_OFFSET; /* Set the output enable register to the mask the user passed us */ *pOutputEnablePort = outputEnableMask; /* Reset all output channels */ for (port=0; port<PIO_MAX_PORTS; port++, outputEnableMask>>=1) { if (outputEnableMask & 1) { pPort = (UINT8 *) daadio.baseAddr + PIO_PORT_NUM_TO_OFF (port); *pPort = (UINT8)0; } } pio.initialized = TRUE; return (OK); }STATUS pioSet (port, channel, state) int port, channel; BOOL state; { UINT8 *pPort; /* pointer to port register */ int channelBit; /* bit which reflect which channel is being set */ /* Error checking... * Ensure pioInit() routine has been called * and the port and channel are within range. */ if (pio.initialized == FALSE) { printf ("pio not initialized\n"); return (ERROR); } if (port < 0 || port > PIO_MAX_PORTS) { printf ("port number out of range\n"); return (ERROR); } if (channel < 0 || channel > PIO_MAX_CHANNELS_PER_PORT) { printf ("channel number out of range\n"); return (ERROR); } if ((*((UINT8 *)daadio.baseAddr + PIO_OUTPUT_ENABLE_OFFSET) & (1 << port)) == 0) { printf ("can not set an input port\n"); return (ERROR); } /* Initialize <pPort> to point to the appropriate port */ pPort = (UINT8 *) daadio.baseAddr + PIO_PORT_NUM_TO_OFF (port); /* Set a bit in <channelBit> which reflects which channel is being set, i.e. if channel 0, set bit 0; if channel 1, set bit 1; and so on. */ channelBit = 1 << channel; /* Update the port register pointed to by <pPort> to be set or unset based on the value of <state>. Since this is a read/modify/write operation, mutual exclusion needs to be assured. */ if (semTake (pio.mutexSem, WAIT_FOREVER) == ERROR) return (ERROR); if (state) *pPort |= channelBit; else *pPort &= ~channelBit; semGive (pio.mutexSem); return (OK); }int pioGet (port, channel) int port, channel; { UINT8 *pPort; /* pointer to port register */ int channelBit; /* bit which reflects which channel is being tested */ BOOL state; /* whether channel is ON or OFF */ /* Error checking... * Ensure that pioInit() routine has been called * and the port and channel are within range. */ if (pio.initialized == FALSE) { printf ("pio not initialized\n"); return (ERROR); } if (port < 0 || port > PIO_MAX_PORTS) { printf ("port number out of range\n"); return (ERROR); } if (channel < 0 || channel > PIO_MAX_CHANNELS_PER_PORT) { printf ("channel number out of range\n"); return (ERROR); } /* Initialize <pPort> to point to the appropriate port */ pPort = (UINT8 *) daadio.baseAddr + PIO_PORT_NUM_TO_OFF (port); /* Set a bit in <channelBit> which reflects which channel is being set, i.e. if channel 0, set bit 0; if channel 1, set bit 1; and so on. */ channelBit = 1 << channel; /* Set <state> to be ON or OFF depending on the state of the channel */ state = (*pPort & channelBit) ? ON : OFF; return (state); }void pioPoll (port, msgQId) int port; MSG_Q_ID msgQId; { PIO_MSG_Q_DATA msgQData; UINT8 * pPort; /* ???????????????????? */ /* Error checking */ if (pio.initialized == FALSE) { printf ("pio not initialized\n"); return; } /* Fail if not an input port, i.e. if the corresponding bit in the output enable register is on */ if (*((UINT8 *)daadio.baseAddr + PIO_OUTPUT_ENABLE_OFFSET) & (1 << port)) { printf ("port not an input port\n"); return; } /* Initialize <pPort> to point to the appropriate port */ pPort = (UINT8 *) daadio.baseAddr + PIO_PORT_NUM_TO_OFF (port); FOREVER { /* ???????????????????? */ } }STATUS pioMsgSend (msgQId, pMsgQData) MSG_Q_ID msgQId; PIO_MSG_Q_DATA * pMsgQData; { IMPORT int errno; if (msgQSend (msgQId, pMsgQData, sizeof (PIO_MSG_Q_DATA), NO_WAIT, MSG_PRI_NORMAL) == ERROR) { /* If failure was because queue is full, print warning otherwise return error. */ if (errno == S_objLib_OBJ_UNAVAILABLE) printf ("Msg Queue full, dumping data port %d, channel %d, status is %s at clock tick %d\n", pMsgQData->port, pMsgQData->channel, (pMsgQData->state) ? "ON" : "OFF", pMsgQData->timeStamp); else return (ERROR); } return (OK); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -