📄 psgdrv.h
字号:
#define PSDataIODisable() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_DATA_ACT)
#define PSPowerUpClockOn() PSSetClockSpeed(); \
*(UINT16 *)SIM_CTRL_LO_REG |= (SIM_DATA_RTX); \
*(UINT16 *)SIM_IER_REG |= (SIM_INB_FULL_IE) ; \
SetTimer (TIMERA_BASE ,TMR_STOP|TMR_LOAD_WHOLE|TMR_INTEN|TMR_CLOCK_IN1|INTERVAL_TIMER, 7800) ; \
DEVICE_SPEC_ClearPendingInterrupts(eIRQ1_TIMERA, eIRQ2_NONE); \
DEVICE_SPEC_EnableInterrupts(eIRQ1_TIMERA, eIRQ2_NONE, eIRQ1_NONE, eIRQ2_NONE) ; \
ResumeTimer (TIMERA_BASE)
#define PSSetTxDMADelay(x) *(UINT16 *)SIM_DLY_REG = (x)
#define PSTxDelayEnable() *(UINT16 *)SIM_CTRL_HI_REG |= SIM_DELAY_EN
#define PSTxDelayDisable() *(UINT16 *)SIM_CTRL_HI_REG &= ~(SIM_DELAY_EN)
#define PSSetSIMResetLow() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_RESET_ACT)
#define PSSetSIMResetHigh() *(UINT16 *)SIM_CTRL_LO_REG |= SIM_RESET_ACT
//for power down
#define PSPowerDownClockOff() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_STP_H); \
*(UINT16 *)SIM_CTRL_LO_REG |= 0; \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT);
#define PSChangeIdletoTX()
#define PSChangeRXtoTX() *(UINT16 *)SIM_IER_REG &= ~(SIM_INB_FULL_IE)
#define PSChangeTXtoRX() *(UINT16 *)SIM_IER_REG &= ~(SIM_OUTB_EMP_IE);\
*(UINT16 *)SIM_IER_REG |= SIM_INB_FULL_IE
#define PSChangeRXtoIdle() *(UINT16 *)SIM_IER_REG &= ~(SIM_INB_FULL_IE)
#define PSChangeIdleToDeact() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_STP_H); \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT); \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_RESET_ACT);\
*(UINT16 *)SIM_IER_REG &= ~(SIM_INB_FULL_IE)
#define PSChangeToNull() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_RESET_ACT)
#define PSChangeDeactToRX() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CONVENTION); \
*(UINT16 *)SIM_CTRL_HI_REG |= SIM_CLK_DIV ; \
*(UINT16 *)SIM_CTRL_LO_REG |= (SIM_VCC_ACT|SIM_DATA_RTX|SIM_DATA_ACT); \
*(UINT16 *)SIM_IER_REG |= (SIM_INB_FULL_IE) ; \
SetTimer (TIMERA_BASE ,TMR_STOP|TMR_LOAD_WHOLE|TMR_INTEN|TMR_CLOCK_IN1|INTERVAL_TIMER, 7800) ; \
DEVICE_SPEC_ClearPendingInterrupts(eIRQ1_TIMERA, eIRQ2_NONE) ; \
DEVICE_SPEC_EnableInterrupts(eIRQ1_TIMERA, eIRQ2_NONE, eIRQ1_NONE, eIRQ2_NONE);\
ResumeTimer (TIMERA_BASE)
#define PSSetInverse() PSInverseMode = TRUE; \
*(UINT16 *)SIM_CTRL_LO_REG |= (SIM_CONVENTION | SIM_DATA_RTX)
#define PSSetDirect() PSInverseMode = FALSE; \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CONVENTION); \
*(UINT16 *)SIM_CTRL_LO_REG |= SIM_DATA_RTX
#if SIM_DEBUG == SIM_DEBUG_MAX
#define PSEnableClockHighSpeed() *(UINT16 *)SIM_CTRL_HI_REG &= ~(SIM_CLK_DIV); \
*(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_ACT; \
HighSpeedClockEnabled_Dbg = TRUE
#else
#define PSEnableClockHighSpeed() *(UINT16 *)SIM_CTRL_HI_REG &= ~(SIM_CLK_DIV); \
*(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_ACT
#endif
#if SIM_DEBUG == SIM_DEBUG_MAX
#define PSEnableClockLowSpeed() *(UINT16 *)SIM_CTRL_HI_REG |= SIM_CLK_DIV; \
*(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_ACT;\
HighSpeedClockEnabled_Dbg = FALSE
#else
#define PSEnableClockLowSpeed() *(UINT16 *)SIM_CTRL_HI_REG |= SIM_CLK_DIV; \
*(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_ACT
#endif
#if SIM_DEBUG == SIM_DEBUG_MAX
#define PSDisableClockLow() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_STP_H); \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT); \
DisableClockHigh_Dbg = FALSE
#else
#define PSDisableClockLow() *(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_STP_H); \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT)
#endif
#if SIM_DEBUG == SIM_DEBUG_MAX
#define PSDisableClockHigh() *(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_STP_H; \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT); \
DisableClockHigh_Dbg = TRUE
#else
#define PSDisableClockHigh() *(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_STP_H; \
*(UINT16 *)SIM_CTRL_LO_REG &= ~(SIM_CLK_ACT)
#endif
#define PSSend(x ) {t_InterruptSrc1 pending1; t_InterruptSrc2 pending2; \
PSTxChar = (x);\
*(UINT16 *)SIM_IER_REG &= ~(SIM_OUTB_EMP_IE);\
SetTimer (TIMERA_BASE, TMR_STOP|TMR_LOAD_WHOLE|TMR_INTEN|TMR_CLOCK_IN1|INTERVAL_TIMER, 0xffff);\
ResumeTimer (TIMERA_BASE); \
while (DEVICE_SPEC_GetAllPendingInterrupts(&pending1, &pending2), pending1 & eIRQ1_TIMERA) \
DEVICE_SPEC_ClearPendingInterrupts(eIRQ1_TIMERA, eIRQ2_NONE);\
SetTimer (TIMERA_BASE, TMR_STOP|TMR_LOAD_WHOLE|TMR_INTEN|TMR_CLOCK_IN2|INTERVAL_TIMER, PSGuardPeriod); \
PSGuardPeriod = PS_DEFAULT_GUARD_PERIOD; \
DEVICE_SPEC_EnableInterrupts(eIRQ1_TIMERA, eIRQ2_NONE, eIRQ1_NONE, eIRQ2_NONE); \
ResumeTimer (TIMERA_BASE);}
#define PSGet() PSInverseData ( *(UINT16 *)SIM_RXBUF_REG )
#define PSEnableOBEInterrrupt() *(UINT16 *)SIM_IER_REG |= (SIM_OUTB_EMP_IE)
#define PSEnableRxFailInterrupt() *(UINT16 *)SIM_IER_REG |= (SIM_ME_RX_FAIL)
#define PSDisableRxFailInterrupt() *(UINT16 *)SIM_IER_REG &= ~(SIM_ME_RX_FAIL)
#define PSSIMPresent() 1
#define PSGetStatus() *(UINT16 *)SIM_STAT_REG
#define PSEnaSIMInts() /* *(UINT16 *)SIM_IER_REG |= SIM_INB_FULL_IE */
#define PSDisSIMInts() /* IntShadow = *(UINT16 *)SIM_CTRL; \
*(UINT16 *)SIM_IER_REG = ~(SIM_OUTB_EMP_IE|SIM_INB_FULL_IE)
*/
#define PSSIMReset() *(UINT16 *)SIM_CTRL_HI_REG &= ~(SIM_BLK_RST)
#define PSEnableSIMClock() *(UINT16 *)SIM_CTRL_LO_REG |= SIM_CLK_ACT;
// Macro to set ETU clock cycles after PPS based on TA1
#define PSSetETUClockCycles( x ) *(UINT16 *)SIM_CTRL_HI_REG = (*(UINT16 *)SIM_CTRL_HI_REG & 0xFE00) | (x >> 8); \
*(UINT16 *)SIM_CTRL_LO_REG = (*(UINT16 *)SIM_CTRL_LO_REG & 0x00FF) | ((x & 0x0FF) << 8);
#define PS_RESET_LO_TIMEOUT 6
#define PS_RESET_HI_TIMEOUT 6
#define PS_TRANSFER_ALLOWED_RETRIES 3
#define PS_RESET_ALLOWED_RETRIES 3
#define PS_COMMAND_RETRY_COUNT 2
// The interval between the leading edge of any character sent by the card and
// the leading edge of the previous character (sent either by the card or by
// the interface device) shall not exceed 960 * WI (TC2 from the card) * (Fi/f).
// This maximum delay is named the "work waiting time".
// The default WI is 10, and default Fi is 372.
// The current f is 1.95 MHz
// #define PS_WORK_WAIT_FACTOR 20 * 10
// The work wait factor is 960 * (Fi/f)(= etu time) in milliseconds
// The default Fi is 372, and the current f is 1.95 MHz
#define PS_WORK_WAIT_FACTOR 183
#define SIMbuffLength 256
#define PS_DEFAULT_WI 10
/*------------------------------------------------------------------------*/
/*---------------------- Global Function Prototypes: ---------------------*/
extern void SimIH(void);
extern void (*TimerAIH)(void);
extern void SimDMAIH(void);
extern void SIMInitialize(void);
extern void SimResetTimerAIH( void );
extern void SimDataTimerAIH( void );
extern void PSSetCommandRetryCount(UINT8 count);
/*------------------------------------------------------------------------*/
/*---------------------------- Global Typedefs: --------------------------*/
// Type for SIM DMA data (character) buffer
typedef struct {
CHAR *BaseAddress; // Start of buffer
CHAR *EndAddress; // End of buffer
CHAR *pSIM_Src; // SIM input Data Register
CHAR *pSIM_Dest; // SIM output data buffer
USHORT Length; // Length of buffer (bytes for Xmit & Receive)
VOID *pDMARegs; // DMA Controller register base address
USHORT DMASelect; // DMA channel selection for the data path
BOOL BufferStatus; // Buffer status flag. For Tx, flag
// is TRUE whenever buffer contains data. For Rx,
// flag is set TRUE when data arrives between Reads.
} SIM_DMA_CONFIG_STRUCT;
/*--------------------------- Global Variables: --------------------------*/
extern void (*PSIntAction)(void);
extern void (*PSErrAction)(void);
extern UINT16 PSRemainingWorkTime;
extern UINT16 PSWorkWaitingTime;
extern INT16 PSTransferRemainingRetries;
extern BOOL PSRxDMAEnabled; /* To keep track if whem SIM receive DMA is active */
extern SIM_DMA_CONFIG_STRUCT *SIMConfigDataPtr;
/*------------------------------------------------------------------------*/
/*--------------------------- Global Variables: --------------------------*/
/*---------------------- Global Function Prototypes: ---------------------*/
//extern void SIMWriteToSIM(void);
//extern void SIMChangePar(void);
/*------------------------------------------------------------------------*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -