⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 piodrv.c

📁 Vxworks的培训教程,大家分享下啊,
💻 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 + -