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

📄 sysioport.c

📁 wind river提供的MPC8260的BSP典型代码
💻 C
字号:
/* sysIOPort.c - SBC8260 I/O Port driver *//* Copyright 1984-2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01a,07jul01,g_h   created from James Linick application note.*//*DESCRIPTIONThis module contains the SBC8260 I/O port driver routines.*//* include */#include "vxWorks.h"#include "logLib.h"#include "drv/mem/m8260Siu.h"#include "drv/intrCtl/m8260IntrCtl.h"#include "drv/parallel/m8260IOPort.h"/* gobals *//* external *//* local */LOCAL void sysIOPortCISR(void);/* forward declaration */void   sysIOPortWritePin (char port, UINT8 pin, BOOL high);STATUS sysIOPortReadPin (char port, UINT8 pin);UINT32 sysIOPortGetPortAdrs (char port, UINT8 portNum);void   sysIOPortConnectISR (void);/************************************************************************* sysIOPortWritePin - write to pin** This routine write to the I/O pin.** RETURNS: None** SEE ALSO: sysIOPortCISR(), sysIOPortGetPortAdrs(), sysIOPortReadPin(), *           sysIOPortConnectISR()*/void sysIOPortWritePin    (    char  port,     UINT8 pin,     BOOL  high    )    {    UINT32 pinAdrs;    pinAdrs = sysIOPortGetPortAdrs (port, 32 - pin);    switch (port) 	{        case 'A':        case 'a':	    *M8260_IOP_PAPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PASO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PADIR(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            if (high)                *M8260_IOP_PADAT(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            else                *M8260_IOP_PADAT(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            break;        case 'B':        case 'b':            *M8260_IOP_PBPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PBSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PBDIR(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            if (high)                *M8260_IOP_PBDAT(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            else                *M8260_IOP_PBDAT(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            break;        case 'C':        case 'c':            *M8260_IOP_PCPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PCSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PCDIR(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            if (high)                *M8260_IOP_PCDAT(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            else                *M8260_IOP_PCDAT(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            break;        case 'D':        case 'd':            *M8260_IOP_PDPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PDSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PDDIR(INTERNAL_MEM_MAP_ADDR) |=  pinAdrs;            if (high)                *M8260_IOP_PDDAT(INTERNAL_MEM_MAP_ADDR) |= pinAdrs;            else                *M8260_IOP_PDDAT(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            break;        default:            break;        }    }/************************************************************************* sysIOPortReadPin - read from pin** This routine read the data from an I/O pin.** RETURNS: OK or ERROR** SEE ALSO: sysIOPortCISR(), sysIOPortGetPortAdrs(), sysIOPortWritePin(), *           sysIOPortConnectISR()*/STATUS sysIOPortReadPin    (    char  port,     UINT8 pin    )    {    UINT32 pinAdrs;    STATUS retVal = ERROR;    pin = 32 - pin;        pinAdrs = sysIOPortGetPortAdrs (port, pin);    switch (port)	{        case 'A':        case 'a':	    *M8260_IOP_PAPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PASO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PADIR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            if (*M8260_IOP_PADAT(INTERNAL_MEM_MAP_ADDR) & pinAdrs)		retVal = OK;            break;        case 'B':	case 'b':            *M8260_IOP_PBPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PBSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PBDIR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            if (*M8260_IOP_PBDAT(INTERNAL_MEM_MAP_ADDR) & pinAdrs)                retVal = OK;            break;        case 'C':        case 'c':            *M8260_IOP_PCPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PCSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PCDIR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            if (*M8260_IOP_PCDAT(INTERNAL_MEM_MAP_ADDR) & pinAdrs)                retVal = OK;            break;        case 'D':        case 'd':            *M8260_IOP_PDPAR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PDSO (INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            *M8260_IOP_PDDIR(INTERNAL_MEM_MAP_ADDR) &= ~pinAdrs;            if (*M8260_IOP_PDDAT(INTERNAL_MEM_MAP_ADDR) & pinAdrs)                retVal = OK;            break;        default:            break;	}    return (retVal);    }/************************************************************************* sysIOPortGetPortAdrs - get port address** This routine get the port address.** RETURNS: Port address** SEE ALSO: sysIOPortCISR(), sysIOPortReadPin(), sysIOPortWritePin(), *           sysIOPortConnectISR()*/UINT32 sysIOPortGetPortAdrs    (    char  port,     UINT8 portNum    )    {    UINT32 adrs = 0x00000000;    switch (port) 	{	case 'A':        case 'a':            if (portNum < 32)                adrs = PA0 >> portNum;            else                logMsg("Invalid port number for port A!\n", 0, 0, 0, 0, 0, 0);            break;        case 'B':        case 'b':            if (portNum < 32 && portNum > 3)                adrs = PB4 >> portNum;            else                logMsg("Invalid port number for port B!\n", 0, 0, 0, 0, 0, 0);            break;        case 'C':        case 'c':            if (portNum < 32)                adrs = PC0 >> portNum;            else                logMsg("Invalid port number for port C!\n", 0, 0, 0, 0, 0, 0);            break;        case 'D':        case 'd':            if (portNum < 32 && portNum > 3)                adrs = PD4 >> portNum;            else		logMsg("Invalid port number for port D!\n", 0, 0, 0, 0, 0, 0);            break;        default:            logMsg("Invalid port specified!\n", 0, 0, 0, 0, 0, 0);        break;        }    return (adrs);    } /************************************************************************* sysIOPortConnectISR - Connect port C to ISR** This routine connect port C to the ISR.** NOTE: In the following example the function sysIOPortConnectISR is used *       to configure the interrupt and connect the handler. Pin A32 is *       connected to pin C32 and calls to sysIOPortWritePin('A', 32, 1) *       and then sysIOPortWritePin('A', 32, 0) are used to transition pin *       A32 state and generate an interrupt through pin C32. Because the *       SIEXR bit is high, the interrupt will only occur on a high to low *       transition.** RETURNS: None** SEE ALSO: sysIOPortCISR(), sysIOPortGetPortAdrs(), sysIOPortWritePin(), *           sysIOPortReadPin()*/void sysIOPortConnectISR    (    void    )    {    UINT32 pinAdrs;    intConnect (m8260InumToIvec(INUM_PC0), (VOIDFUNCPTR)sysIOPortCISR, 0);    pinAdrs = sysIOPortGetPortAdrs ('C', 0);    *M8260_IOP_PCSO(INTERNAL_MEM_MAP_ADDR)   &= ~pinAdrs;    *M8260_IOP_PCDIR(INTERNAL_MEM_MAP_ADDR)  &= ~pinAdrs;    *M8260_IOP_PCPAR(INTERNAL_MEM_MAP_ADDR)  &= ~pinAdrs;    *M8260_SIEXR(INTERNAL_MEM_MAP_ADDR)      |=  pinAdrs;    *M8260_SIMR_H(INTERNAL_MEM_MAP_ADDR)     |=  pinAdrs;    intEnable (INUM_PC0);    }/************************************************************************* sysIOPortCISR - Port C ISR** This routine is Port C ISR.*\** RETURNS: None** SEE ALSO: sysIOPortGetPortAdrs(), sysIOPortWritePin(), *           sysIOPortReadPin()*/LOCAL void sysIOPortCISR    (    void    )    {	/* TO DO - Add you code here */    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -