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

📄 isr.c

📁 基于D12的USB固件驱动
💻 C
字号:
#include <macros.h>    /* for CLI() SEI() _NOP() macro */
#include <string.h>    /* typedef unsigned int size_t; size_t is sizeof()'s return type*/
#include "usb100.h"
#include "mainloop.h"
#include "d12ci.h"

#define D12_INT_ENDP0OUT             0x01    
#define D12_INT_ENDP0IN              0x02
#define D12_INT_ENDP1OUT             0x04
#define D12_INT_ENDP1IN              0x08
#define D12_INT_ENDP2OUT             0x10
#define D12_INT_ENDP2IN              0x20
#define D12_INT_BUSRESET             0x40
#define D12_INT_SUSPENDCHANGE        0x80
#define D12_INT_EOT                  0x0100

#define D12_SETUPPACKET              0x20 

#define USB_IDLE            0
#define USB_TRANSMIT        1
#define USB_RECEIVE         2

//#define  SWAP(x) x        
#define  SWAP(x)    ((((x) & 0xFF) <<8 )|(((x)>> 8 ) & 0xFF))         
//#define  MSB(x)    (((x)>>8) & 0xFF))
//#define  LSB(x)    ((x) & 0xFF)

extern  EPPFLAGS bEPPflags;
extern  CONTROL_XFER ControlData;
unsigned short D12_ReadInterruptRegister(void);
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp);
unsigned char D12_ReadEndpointStatus(unsigned char bEndp);
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled);
void D12_AcknowledgeEndpoint(unsigned char endp);
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char *buf);
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char *buf);

/*INT3*/
#pragma interrupt_handler int3_usb_isr:5   
/*used by isr.c only*/
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    

  ###################################################################*/
/*General Endpoint Buffer*/
unsigned char idata_GenEpBuf[EP1_PACKET_SIZE];
/*Main Endpoint Buffer*/
unsigned char idata_EpBuf[EP2_PACKET_SIZE];
/*for Removing Warning*/
unsigned char ReturnValue;   
unsigned char marking;                  

/*###################################################################
        
                            int3_usb_isr  

  ###################################################################*/
void int3_usb_isr(void)
{
    unsigned int i_st = 0;
    
	CLI();
    
	bEPPflags.bits.in_isr = 1;   
    
	i_st = D12_ReadInterruptRegister();
    
	if (i_st != 0)
    {
        if (i_st & D12_INT_BUSRESET)	     
        {
		    bEPPflags.bits.bus_reset = 1;
		}
        
		if (i_st & D12_INT_SUSPENDCHANGE)
        {
		    bEPPflags.bits.suspend = 1;
		}        
        
		if (i_st & D12_INT_EOT)
        /* dma_eot(); */
        {
		    _NOP();
		}
        
		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;
        
		SEI();
    }
}   

/*********************************************************************
  Function:     ep0_rxdone
  Description:  EP0 Out Interrupt/RXD Done Routine                   
  Calls:        D12_ReadLastTransactionStatus(); D12_ReadEndpoint(); D12_SetEndpointStatus();
                D12_AcknowledgeEndpoint(); 
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void ep0_rxdone(void)
{
    unsigned char ep_last, i;
   
    ep_last = D12_ReadLastTransactionStatus(0);    
   
    if (ep_last & D12_SETUPPACKET)/*Receive SETUP Packet*/
    { 
        ControlData.wLength = 0;
        ControlData.wCount = 0;
        
	    i = sizeof(DEVICE_REQUEST);
        
		if (D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
           (unsigned char*)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST))
        {   /*SETUP PACKET ERROR,RETURN*/
            D12_SetEndpointStatus(0,1);   
                                             /*Stall EP0,Ep1,if Packet Error*/
			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);
        
		/*Give ACK In/Out of Control Endpoint*/      
        D12_AcknowledgeEndpoint(0);       
        D12_AcknowledgeEndpoint(1); 
       
	    ControlData.wLength = ControlData.DeviceRequest.wLength;      
        ControlData.wCount = 0;
       
        if (ControlData.DeviceRequest.bmRequestType           

               & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)    /*0X80*/
        {
            bEPPflags.bits.setup_packet = 1;
           
		    bEPPflags.bits.control_state = USB_TRANSMIT;
        }
        else
        {
            if (ControlData.DeviceRequest.wLength == 0)
            {
                bEPPflags.bits.setup_packet = 1; 
               
			    bEPPflags.bits.control_state = USB_IDLE;
            }
            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 Data*/
       } /*Without Read Request*/
   }/*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)
       {   /*Finish Data Receive*/
           bEPPflags.bits.setup_packet = 1; 
           bEPPflags.bits.control_state = USB_IDLE;
       }
   }
   else
   {
       bEPPflags.bits.control_state = USB_IDLE;
   }
}

/*********************************************************************
  Function:     ep0_txdone
  Description:  EP0 In Interrupt/TXD Done Routine
  Calls:        D12_ReadLastTransactionStatus(); D12_WriteEndpoint();
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void ep0_txdone(void)
{
    unsigned short i = ControlData.wLength-ControlData.wCount;
    /*Clear Interrupt Flag*/
    ReturnValue = D12_ReadLastTransactionStatus(1);           
   
    if (bEPPflags.bits.control_state == !USB_TRANSMIT)
    {
        /*No Transmit Status,Return*/
	    return;    
    }
   
    if (i >= EP0_PACKET_SIZE)
    {   /*Data >16 byte,Transmit 16 byte*/
        ReturnValue = 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)
        {   /*Transmit remanent Data*/
            ReturnValue = D12_WriteEndpoint(1, (unsigned char)i, ControlData.pData + ControlData.wCount);
            
		    ControlData.wCount += i;
           
		    bEPPflags.bits.control_state = USB_IDLE;
        }
        else 
        {   /*Finish Transmit,Transmit 0 Byte*/
            ReturnValue = D12_WriteEndpoint(1, 0, 0);
            
			bEPPflags.bits.control_state = USB_IDLE;
        }
    }
}/*TXD done Routine*/

/*********************************************************************
  Function:     ep1_rxdone
  Description:  EP1 Out Interrupt/RXD Done Routine
  Calls:        D12_ReadLastTransactionStatus(); D12_ReadEndpoint();
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/ 
void ep1_rxdone(void)
{
    unsigned char len;
   
    ReturnValue = D12_ReadLastTransactionStatus(2);
   
    len = D12_ReadEndpoint(2, sizeof(idata_GenEpBuf), idata_GenEpBuf);
   
    if (len != 0)
    {   
        /*Flag Received Data*/
        bEPPflags.bits.ep1_rxdone = 1;
    }      
}      
       
/*********************************************************************
  Function:     ep1_txdone
  Description:  EP1 In Interrupt/TXD Done Routine   
  Calls:        D12_ReadLastTransactionStatus();
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/    
void ep1_txdone(void)
{   
    /*Clear Interrupt Flags*/
    ReturnValue = D12_ReadLastTransactionStatus(3);   
}      

/*********************************************************************
  Function:     main_rxdone
  Description:  EP2 Out Interrupt/RXD Done Routine      
  Calls:        D12_ReadLastTransactionStatus(); D12_ReadEndpoint(); D12_ReadEndpointStatus(); 
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void main_rxdone(void)
{
    unsigned char len,epstatus;
  
    ReturnValue = D12_ReadLastTransactionStatus(4);    /*Clear Interrupt Flags*/
      
    len = D12_ReadEndpoint(4, 64, idata_EpBuf);   
  
    /*Read Buffer Status*/
    epstatus = D12_ReadEndpointStatus(4); 
  
    /*D12_BUFFERFULL=0x60*/
    epstatus &= D12_BUFFERFULL;           
  
    if(epstatus == 0x60)
    {
        ReturnValue = D12_ReadEndpoint(4,64,idata_EpBuf);
    }
   
    marking=0xff;
   
    NOP();
}      

/*********************************************************************
  Function:     main_txdone
  Description:  EP2 In Interrupt/TXD Done Routine   
  Calls:        D12_ReadLastTransactionStatus();
  Called By:    int3_usb_isr();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void main_txdone(void)
{   
    /*Clear Interrupt Flags*/
	ReturnValue = D12_ReadLastTransactionStatus(5);   
}      

⌨️ 快捷键说明

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