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

📄 uartt0.c

📁 HID-Ukey底层源码实现(st72651芯片) windows上层驱动
💻 C
字号:
/**********************************************************************************************
PC5 used as RST signal line for smart card
PE0/PC0(MCO) used as clock signal line for smart card
PC4 used as Data Interrupt In 
PD4 used as Data Output
***********************************************************************************************/

#include "Map_7265.h"
#include "UARTT0.h"
#include"HID_usb.h"
#include "DTC_Func.h"

#pragma DATA_SEG	CRD_RAM
extern unsigned char CardStateFlag;
extern unsigned char CardCommandFlag;


#pragma DATA_SEG UART_RAM
unsigned int WaitingTimeCount;

#pragma DATA_SEG SHORT CRD_BIT_RAM
unsigned char CrdFlags;
unsigned char CardDataNum;
unsigned char ParityFlag;
unsigned char SendDataLength;
unsigned char UARTTempData;
unsigned char ParityCount;

#pragma CODE_SEG CRD_ROM

/*********************************************************************************************
Delay 723 cycle
*********************************************************************************************/
void Delay1Etu()															//CALL long 6,
{
	asm
	{
		PUSH	X								// 3

		LD	X, #117						// 2
	Delay111:
		DEC	 X									// 3	
		JRNE Delay111							// 3
		
		POP		X								// 4
	}
}																				// return 6,

/*********************************************************************************************
Delay165 cycle
*********************************************************************************************/
void Delay165()							// 6
{
	asm
	{
		PUSH	X								// 3

		LD	X, #24							// 2
	Delay112:
		DEC	 X									// 3
		JRNE	Delay112						// 3
		
		POP X									// 4
	}
}																	// 6

/*********************************************************************
NAME:	 Crd_Initiate
IN/OUT: NONE
DESCRIPT: Initiate parameters for smart card reader
*********************************************************************/
void Crd_Initiate(void)
{                      
//		ITSPR2 &= ~0x0C;			// pc interrupt priority level 3
		MISCR3 |= 0x08;			// Falling edge of PC0 as data interrupt in										

		PCDDR &= ~0x10; 
		PCOR |= 0x10; 			// configue register to make PC4 interrupt in

		PCDDR |= 0x20;			// PC5 as RST & output High
		PCOR	 |= 0x20;
		PCDR &= ~0x20;

		PCDDR |= 0x02;
		PCOR |= 0x02;

		SetPC4Input;
		CardStateFlag = NOCOMMAND;
		Reset_bTxOutCompleteFlag;
		Set_bTxInCompleteFlag;
		Reset_bDataReadyFlag;  
}
  /**********************************************************************
 NAME:	Start Timer to calculate ETU for send data
 **********************************************************************/
 void StartSendETUCount(void)
 {
 	if ( TSR & 0x40 )	
		asm LD	A, OCLR1
	else if ( TSR & 0x08 )
		asm LD	A, OCLR2
	else if ( TSR & 0x20 )
		asm LD	A, CRL 
	
	CRL = 	0xff;			// RESET TIMER COUNT
	OCHR1 = 0x00;			//  0xb7 = 372/2-3
	OCLR1 = 0xb7;			// 
 	TCR1 |= 0x40;			// Output compare interrupt enable
 }
 /**********************************************************************
 NAME:	Start Timer to calculate ETU  
 **********************************************************************/
 void StartReceiveETUCount(void)
 {
 	if ( TSR & 0x40 )	
		asm LD	A, OCLR1
	else if ( TSR & 0x08 )
		asm LD	A, OCLR2
	else if ( TSR & 0x20 )
		asm LD	A, CRL 
	
	CRL = 0xff;							// RESET TIMER COUNT
	
	OCHR1 = 0x00;				//  0xb7 = 372/2-3
 //	OCLR1 = 0xb7;				// 
	OCLR1 = 0x90;				// @jin 
	TCR1 |= 0x40;				// interrupt enable
 }
/**********************************************************************
NAME	: Stop Timer
**********************************************************************/
void StopETUCount(void)
{
	if ( TSR & 0x40 )	
		asm LD	A, OCLR1
	else if ( TSR & 0x08 )
		asm LD	A, OCLR2
	else if ( TSR & 0x20 )
		asm LD	A, CRL 

	CRL = 0xff;							// RESET TIMER COUNT

	TCR1 &= ~0x78;		// OCIE = 0, TOIE = 0, timer compare interrupt disable and Overflow Interrupt disable
}
/************************************************************************************************************
VccOn
*************************************************************************************************************/
void CardPowerOn(void)
{
	MISCR1 |= 0x20;							// MCO output enable to provide CLK to smart card
	ReceiveDataLength = ATRLENGTH;				// 
	ParityFlag = 0;
	ParityCount = 0;
	ShiftBitFlag = 10;
	CardDataNum = 0;
	pUsbMessageBuffer = ATRBuffer;
	Reset_bCommunicateEndFlag;
	Reset_bCardSendFlag;
	ResetSmartCard;							// reset smart card after power on
	SetPC4Interrupt;								// enable PC4 interrupt in
}

/**********************************************************************************************************
CardReceive
**********************************************************************************************************/
void CardReceive(void)
{
	PDDDR &= ~0x10;
	ParityFlag = 0;
	ParityCount = 0;
	ShiftBitFlag = 10;
	CardDataNum = 0;
	pUsbMessageBuffer = &UsbMessageBuffer[LeData];
	Reset_bCardSendFlag;
	SetPC4Interrupt;								// enable PC4 interrupt in
}

/**********************************************************************************************************
CardSend
**********************************************************************************************************/
void CardSend(unsigned int SendLength, unsigned char *pBufferAddress )
{
	PCOR &= ~0x10;
	PCDDR &= ~0x10;
	PDDDR &= ~0x10;
	TCR1 |= 0x01;
	ShiftBitFlag = 0;
	ParityFlag = 0;
	ParityCount = 0;
	SendDataLength = SendLength;
	pUsbMessageBuffer = pBufferAddress;
	asm LD	A, [pUsbMessageBuffer.w]
	asm LD	UARTTempData, A
	Reset_bCommunicateEndFlag;
	Set_bCardSendFlag;
	StartSendETUCount();
}

/**********************************************************************************************************
Send Data to Card CALLED BY TIMER INTERRUPT ROUTINE
**********************************************************************************************************/
void T0SendData(void)
{
	asm {
		LD	A, ShiftBitFlag		// 3	
		JREQ	SendStartBit		// 3
		CP	A, #6			// 2
		JREQ	SendParity		// 3
		CP	A, #5			// 
		JREQ	IdleTime		// 
		CP	A, #3			// 2
		JREQ	GetError		// 3
		CP	A, #4			// 2
		JREQ	SendGuardTime		// 3
		CP	A, #3			// 2
		JRMI	SendGuardTime		// 3

SendData:									// send 8 bits data
		RRC	UARTTempData		// 5, C = current bit of Byte 
		JRNC	S0								// 3 
	S1:
		INC      ParityFlag		// 3
		BSET	TCR1, #0		// output 1 when next timer interrupt occurs
		DEC	 ShiftBitFlag		// 5
		RET											// 8
	S0:
		BRES	TCR1, #0		// output 0 when next timer interrupt occurs
		DEC	 ShiftBitFlag		// 5
		RET											// 8				//total 63 Fcpu

SendStartBit:
		CLR	 ParityFlag		// 5
		CLR	 ParityCount		// 5
		LD	A, #15			// 2
		LD	ShiftBitFlag, A		// 4			
		LD	A, SendDataLength	// 3
		JREQ	SendFinish		// 3
		BSET	TCR2, #7		// 
		BRES	TCR1, #0		// output 0 when next timer interrupt occurs
		DEC	 ShiftBitFlag		// 5
		RET				// 6 return		// total 48Fcpu
	SendFinish:
		CALL	StopETUCount		// 
		CALL	CardReceive		// initiate receive
		RET				// 8
		
IdleTime:
		DEC	ShiftBitFlag		// 5
		RET				// 
		
SendParity:
		RRC	ParityFlag		// 5
		JRNC	Parity0			// 3
	Parity1:
		BSET	TCR1, #0		// output 1 when next timer interrupt occurs
		DEC	 ShiftBitFlag		// 5
		RET				// 8
	Parity0:
		BRES	TCR1, #0		// output 0 when next timer interrupt occurs
		DEC	 ShiftBitFlag		// 5
		RET				// 8			// total	39Fcpu

SendGuardTime:
		BRES	TCR2, #7		// pd4 is a general I/O
		BSET	TCR1, #0		// 
		DEC	ShiftBitFlag		// 5
		RET											// 8		//total 55Fcpu or 60Fcpu

GetError:   
		DEC	 ShiftBitFlag
		BTJF	 PCDR, #4, Error1			// 5		if data line is low there is an error occur
	Correct:
		DEC	 SendDataLength			// 5
		INC	pUsbMessageBuffer:1		// 5
		LD	A, [pUsbMessageBuffer.w] // 6
		LD	UARTTempData, A			// 3
		RET											// 8
	Error1:
		DEC	 ShiftBitFlag						// 5
	}		
}
/**********************************************************************************************************
Receive Data from Card CALLED BY TIMER INTERRUPT ROUTINE
**********************************************************************************************************/
void T0ReceiveData(void)
{
	asm {
		LD	A, ShiftBitFlag				// 3
		JREQ	ReceiveFinish			// 3
		CP	A, #1							// 2
		JREQ	SendError				// 3
		CP	A, #2							// 2
		JREQ	GetParity					// 3
	
GetData:
		BTJF	PCDR, #4, Get0		// 5
	Get1:
		INC	ParityFlag					// 3
		LD	A, #1							// 2
		RRC	 A									// 3
		RRC	 UARTTempData			//	5 C->bit7, bit7->bit6
		DEC	 ShiftBitFlag						// 5
		RET										// 8
	Get0:
		LD	A, #0							// 2
		RRC	 A									// 3
		RRC	 UARTTempData			// 5
		DEC	 ShiftBitFlag						// 5
		RET										// 8

GetParity:
		BTJF	PCDR, #4, Parity0	// 5
	Parity1:
		BTJT	ParityFlag, #0, NoError	//5
		JRT		ParityError				// 3
	Parity0:
		BTJF	ParityFlag, #0, NoError	// 5
	ParityError:
		BSET	ParityFlag, #7			// 5
		DEC	 ShiftBitFlag						// 5
		RET										// 8
	NoError:
		BRES	ParityFlag, #7			// 5
		DEC	 ShiftBitFlag						// 5
		RET										// 8

SendError:             
		BTJF	ParityFlag, #7,	NoSendError	// 5
	Error:
		BSET	PCDDR, #4				// 5, change from input to output
		BRES	PCDR, #4				// 5, data line low means data parity error
	NoSendError:
		DEC	 ShiftBitFlag						// 5
		RET										// 8

ReceiveFinish:
		BSET	PCDDR, #4				// 5   
		BSET	PCOR, #4				// 5		pc4 interrupt in enable 
		BRES	PCDDR, #4				// 5
		CALL	 StopETUCount		// 
		LD	A, #10							// 2			ShiftBitFlag = 10
		LD	ShiftBitFlag, A				// 3
		BTJF	ParityFlag, #7, ReceiveOK
	ReceiveError:
		CLR		ParityFlag				// 5
		RET										// 8
	ReceiveOK:
		CLR		ParityFlag				// 5
		CLR	 ParityCount					// 5
		LD	A, UARTTempData		// 3
		LD	[pUsbMessageBuffer.w], A	// 5
		INC	pUsbMessageBuffer:1	 // 5
		INC	CardDataNum				//  5
		LD	A, CardDataNum			// 3
		CP	A, #1							// 2
		JREQ	ReceiveFirstByte		// 3
		CP	A, ReceiveDataLength // 4
		JREQ	ReceiveEnd				// 3
		RET										// 8

	ReceiveFirstByte:
		LD	A, UARTTempData		// 3
		CP	A, #$3B						// 
		JREQ	GetATR					// 
		CP	A, #$60						// 
		JREQ	GetWaitData			//
		LD	A, ReceiveDataLength
		CP	A, #2
		JREQ	GetSW
		LD	A, IccCommandINS		// 
		CP	A, UARTTempData		// 
		JREQ	GetINSOK
	GetINSError:
		LD	A, #2							// 
		LD	ReceiveDataLength, A
	GetATR:
	GetSW:
	GetINSOK:      
		LD	A, ReceiveDataLength
		CP	A, CardDataNum
		JREQ	ReceiveEnd
		RET										// 
	GetWaitData:
		CLR	 CardDataNum				// 
		DEC	 pUsbMessageBuffer:1	//
		RET	 
	ReceiveEnd:
		CLR	 ShiftBitFlag					// 5  
		CLR	 ParityCount					// 5
		BSET	PCDR, #4				// 
		BRES	PCOR, #4				// pc4 input interrupt disable
		BSET	CrdFlags, #0			 //5 Set bCommunicateEndFlag
	}
}


⌨️ 快捷键说明

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