www.pudn.com > pdiusbd12 source.rar > ISR.C


/* 
   //************************************************************************* 
   // 
   //                  P H I L I P S   P R O P R I E T A R Y 
   // 
   //           COPYRIGHT (c)   1997 BY PHILIPS SINGAPORE. 
   //                     --  ALL RIGHTS RESERVED  -- 
   // 
   // File Name:	ISR.C 
   // Author:		Wenkai Du 
   // Created:		19 Dec 97 
   // Modified: 
   // Revision:		3.0 
   // 
   //************************************************************************* 
   // 
   // 98/11/25 		Added I/O mode Main endpoints access. (WK) 
   //************************************************************************* 
   */ 
#include  
#include  
 
#include                 /* special function register declarations   */ 
 
#include "epphal.h" 
#include "d12ci.h" 
#include "mainloop.h" 
#include "usb100.h" 
 
extern void bus_reset(void); 
 
extern void ep0_txdone(void); 
extern void ep0_rxdone(void); 
 
extern void ep1_txdone(void); 
extern void ep1_rxdone(void); 
 
extern void main_txdone(void); 
extern void main_rxdone(void); 
 
extern void dma_eot(void); 
 
/* 
//************************************************************************* 
//  Public static data 
//************************************************************************* 
*/ 
 
EPPFLAGS bEPPflags; 
 
/* Control endpoint TX/RX buffers */ 
extern CONTROL_XFER ControlData; 
 
/* ISR static vars */ 
unsigned char idata GenEpBuf[EP1_PACKET_SIZE]; 
unsigned char idata EpBuf[EP2_PACKET_SIZE]; 
IO_REQUEST idata ioRequest; 
unsigned char ioSize, ioCount; 
 
unsigned long ClockTicks = 0; 
unsigned char xdata MainEpBuf[256]; 
 
extern BOOL bNoRAM; 
 
timer_isr() interrupt 1 
{ 
	DISABLE; 
	ClockTicks++; 
	bEPPflags.bits.timer = 1; 
	ENABLE; 
} 
 
 
usb_isr() interrupt 0 
{ 
	DISABLE; 
	fn_usb_isr(); 
	ENABLE; 
} 
 
void fn_usb_isr() 
{ 
	unsigned int i_st; 
 
	bEPPflags.bits.in_isr = 1; 
 
	i_st = D12_ReadInterruptRegister(); 
 
	if(i_st != 0) { 
		if(i_st & D12_INT_BUSRESET) { 
			bus_reset(); 
			bEPPflags.bits.bus_reset = 1; 
		} 
 
		if(i_st & D12_INT_EOT) 
			dma_eot(); 
 
		if(i_st & D12_INT_SUSPENDCHANGE) 
			bEPPflags.bits.suspend = 1; 
 
		if(i_st & D12_INT_ENDP0IN) 
			ep0_txdone(); 
		if(i_st & D12_INT_ENDP0OUT) 
			ep0_rxdone(); 
		if(i_st & D12_INT_ENDP1IN) 
			ep1_txdone(); 
		if(i_st & D12_INT_ENDP1OUT) 
			ep1_rxdone(); 
		if(i_st & D12_INT_ENDP2IN) 
			main_txdone(); 
		if(i_st & D12_INT_ENDP2OUT) 
			main_rxdone(); 
	} 
 
	bEPPflags.bits.in_isr = 0; 
} 
 
void bus_reset(void) 
{ 
} 
 
void ep0_rxdone(void) 
{ 
	unsigned char ep_last, i; 
 
	ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag 
 
	if (ep_last & D12_SETUPPACKET) { 
 
		ControlData.wLength = 0; 
		ControlData.wCount = 0; 
 
		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), 
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { 
 
			D12_SetEndpointStatus(0, 1); 
			D12_SetEndpointStatus(1, 1); 
			bEPPflags.bits.control_state = USB_IDLE; 
			 
			return; 
		} 
 
		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); 
		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); 
		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); 
 
		// Acknowledge setup here to unlock in/out endp 
		D12_AcknowledgeEndpoint(0); 
		D12_AcknowledgeEndpoint(1); 
 
		ControlData.wLength = ControlData.DeviceRequest.wLength; 
		ControlData.wCount = 0; 
 
		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { 
			bEPPflags.bits.setup_packet = 1; 
			bEPPflags.bits.control_state = USB_IDLE;		/* get command */ 
		} 
		else { 
			if (ControlData.DeviceRequest.wLength == 0) { 
				bEPPflags.bits.setup_packet = 1; 
				bEPPflags.bits.control_state = USB_IDLE;		/* set command */ 
			} 
			else { 
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { 
					bEPPflags.bits.control_state = USB_IDLE; 
					D12_SetEndpointStatus(0, 1); 
					D12_SetEndpointStatus(1, 1); 
				} 
				else { 
					bEPPflags.bits.control_state = USB_RECEIVE;	/* set command with OUT token */ 
				} 
			} // set command with data 
		} // else set command 
	} // if setup packet 
 
	else if (bEPPflags.bits.control_state == USB_RECEIVE) { 
		i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE, 
			ControlData.dataBuffer + ControlData.wCount); 
 
		ControlData.wCount += i; 
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { 
			bEPPflags.bits.setup_packet = 1; 
			bEPPflags.bits.control_state = USB_IDLE; 
		} 
	} 
 
	else { 
		bEPPflags.bits.control_state = USB_IDLE; 
	} 
} 
 
void ep0_txdone(void) 
{ 
	short i = ControlData.wLength - ControlData.wCount; 
 
	D12_ReadLastTransactionStatus(1); // Clear interrupt flag 
 
	if (bEPPflags.bits.control_state != USB_TRANSMIT)  
		return; 
 
	if( i >= EP0_PACKET_SIZE) { 
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount); 
		ControlData.wCount += EP0_PACKET_SIZE; 
 
		bEPPflags.bits.control_state = USB_TRANSMIT; 
	} 
	else if( i != 0) { 
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount); 
		ControlData.wCount += i; 
 
		bEPPflags.bits.control_state = USB_IDLE; 
	} 
	else if (i == 0){ 
		D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ??? 
 
		bEPPflags.bits.control_state = USB_IDLE; 
	} 
} 
 
void dma_eot(void) 
{ 
} 
 
void ep1_txdone(void) 
{ 
	D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */ 
} 
 
void ep1_rxdone(void) 
{ 
	unsigned char len; 
 
	D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */ 
 
	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf); 
 
	if(len != 0) 
		bEPPflags.bits.ep1_rxdone = 1; 
} 
 
void main_txdone(void) 
{ 
	unsigned char len; 
 
	D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */ 
 
	len = ioSize - ioCount; 
	if(len == 0) { 
		if(bEPPflags.bits.dma_state == DMA_PENDING) 
			bEPPflags.bits.setup_dma ++; 
		else 
			bEPPflags.bits.dma_state = DMA_IDLE; 
	} 
	else { 
		if(len > 64) 
			len = 64; 
		if(bNoRAM) 
			len = D12_WriteEndpoint(5, len, EpBuf + ioCount); 
		else 
			len = D12_WriteEndpoint(5, len, MainEpBuf + ioCount); 
		ioCount += len; 
	} 
} 
 
void main_rxdone(void) 
{ 
	unsigned char len; 
 
	D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */ 
 
	if(bNoRAM) 
		len = D12_ReadEndpoint(4, 64, EpBuf + ioCount); 
	else 
		len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount); 
	ioCount += len; 
	if(bNoRAM) 
		len = D12_ReadEndpoint(4, 64, EpBuf + ioCount); 
	else 
		len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount); 
	ioCount += len; 
	if(ioCount >= ioSize) { 
		if(bEPPflags.bits.dma_state == DMA_PENDING) 
			bEPPflags.bits.setup_dma ++; 
		else 
			bEPPflags.bits.dma_state = DMA_IDLE; 
	} 
}