📄 sysioport.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 + -